Generation UX, Share SEO, and Plan Gating
2026-02-25
Generation experience
- Overhauled the journal generation flow: added per-step pipeline progress (GitHub, Calendar, Slack, LLM) with rotating messages, bumped step legibility, and treated
generatinglikependingso we show the proper skeleton. - Smoothed the transition from skeleton to content using the View Transitions API and a height interpolation fallback; hid the “generating” label on initial load to reduce flicker.
- Reworked the completion animation: restored the original ink-seep and then replaced it with a cleaner clip‑path ink‑bleed effect when polling marks completion.
Sharing and SEO
- Server‑rendered the share page with proper SEO: JSON‑LD, dynamic metadata, and
robotsallow for/share/:token(commit). Also ensured content renders during font loading so SSR actually shows up. - Tightened the share UI: preview link in actions, SNS share dialog, dim/disable expired links, text‑only buttons, and cleaned up borders/alignments.
- Locale correctness: the share page now respects the journal’s locale instead of the browser’s guess.
- Added Basic Auth on staging with a
/share/*bypass so shared links remain viewable.
Plans, subscriptions, and models
- Introduced a global
SubscriptionProvider/useSubscriptionso plan info is fetched once and reused app‑wide. - Gated the webhook integration behind the Advanced plan and filtered it out from the generic OAuth list to avoid duplicate cards.
- Pulled available LLM models from
GET /available-models, filtered by plan tier, and aligned generation settings with the backend: replaced “tone” withformatand swapped in real models with Advanced gating. - Polished the settings/billing UI: redesigned plan cards with per‑card actions, period switching, and general cleanup.
- Also added a global
UserProvider/useUserand replaced the emoji with the real profile avatar in the header and settings.
Journal detail and metadata
- Redid the journal detail layout: skeleton lines for loading, generated timestamp in the footer, “Regenerate” moved into the ⋯ menu, share wrapped in a consistent card, and right‑aligned feedback.
- Surfaced provenance and generation details on the journal page (sources in/out, pipeline tasks with status/duration, model/format/temp/prompt/locale) (commit), then moved that metadata into a native
<dialog>opened from the ⋯ menu for a cleaner default view. Centered it properly by overriding Tailwind’s dialog reset.
Typography, CJK, and copy
- Switched the Japanese serif to Klee One and fixed font loader effects; updated the stack so weights map sensibly (commit).
- Prioritized CJK serif fonts over Crimson Pro for Latin glyphs in CJK locales to keep mixed‑script text visually consistent.
- Tuned body type: smaller sizes, tighter line‑height, centralized block spacing (lobotomized owl), and margin resets scoped to
.journal-proseto avoid skeleton/layout side‑effects. Links now use a hand‑drawn dashed underline with a dark‑mode halation fix. - Copy tweaks across JA: ジャーナル→日記, インテグレーション→連携. Also tightened padding/hover states and hid empty months in the sidebar.
— A big sweep today: UX polish for generation, share discoverability, plan‑aware features, and a bunch of typographic/copy cleanup that makes mixed‑script entries feel cohesive.