Shipped share links, overhauled OG, polished LP
2026-02-24
Frontend — share links and OG overhaul
- Shipped the shared journal flow end-to-end:
ShareLinkSectionon the detail page (create/list/revoke with expirations) and a public"/share/:token"viewer with clean errors for expired/revoked/invalid. Also removed journal editing (auto-generated only). Closed the share-related issues along the way. - Massive pass on Open Graph images:
- Added default OG/Twitter images for all pages, then iterated hard on design (brand fonts, ink drop, flora, layout tweaks, author-focused card → Zenn-style card).
- Moved from edge runtime to Node.js and switched to local TTF fonts; added output file tracing for fonts so Vercel bundles correctly; hardened error handling (wrap whole handler, consume
ImageResponseto surface Satori errors). - Fixed the Satori multi-child hiccup (template literal instead of nested nodes) and killed the temporary
/debug-ogroute once things behaved.
- Cleaned up metadata/streaming quirks: stopped fetching inside
generateMetadataso OG tags land in<head>(Next 16 streaming gotcha), and syncedtwitter-imagewithopengraph-image. - UI polish:
- Replaced publish/draft with a simple status: grey “Generated” by default and green “Public” when share links exist; then dropped the always-on “Generated” badge entirely and normalized badge colors.
- Displayed journal titles everywhere (list/detail/share/tags) with a date fallback; updated types and tests/snapshots.
- Fixed CJK font FOUT for shared pages and a few misc leaks/dedupes; added snapshot tests around the shared journal client.
Overall: 1) shareable journals are in, 2) OG is robust and branded, 3) the journal UI is simpler and clearer.
Landing page — legal/SEO foundations, CTAs, and icons
- Legal + structure:
- MDX-based legal pages (privacy, terms, JP tokusho, CCPA do-not-sell) with typography styling.
- Added a sub-processor list (EN/JP) and enabled GFM tables for MDX.
- SEO/metadata and routing:
- Pricing + theming:
- Added a monthly/yearly pricing toggle (with the “2 months free” affordance). Tried dark mode, then reverted and kept just the pricing toggle for now.
- Integrations section:
- Designed 10 custom service icons and introduced an Active vs Coming Soon distinction (color vs dimmed with badge). Iterated on shapes/alignment (Weather, Bluesky, Steam, Google Photos, Linear) until the pixels snapped into place.
- Linked PR: #59.
Wrap
- 53 commits and 8 merged PRs across the app and LP. Big step: shareable journals with solid OG cards, plus LP is now dressed with the right legal/SEO scaffolding and clearer conversion paths.