Dev Roadmap
Public dev log for thelingwu.com. Build in public — product decisions, tech choices, and the to-do list left in the open.
Manual operations (you handle these)
- Translation review — 13 articles are AI-translated (voice prompt applied); needs human review for tone and detail
- Project deck rebuild — HTML slides are low quality; rebuild from Figma source (Anchor especially)
Pending
- Side-by-side image component — needs new MDX component; no current article uses adjacent images, so deferred
- /subscribe route — Substack Building Flows landing; the /design hero subscribe CTA is parked until this ships
- Persona / format frontmatter on articles (per VI §8.6) — 14 mdx files need
persona: builder | designermigration
Done
2026-05 · Full VI design-system v1 landing
Brand library vendored intosrc/design-system/(tokens, Tailwind preset, six component primitives)Persona-aware ambient background: master orange / designer teal / neutral grey;/projectsflips to designer,/photosflips to neutral; 1.4s cross-fade on swapGradientMeshFlow replaces three.js + gsap (First Load JS 600 KB+ → 101 KB)BrandFlow — SVG streams + six accent-tinted particles, CSSanimateMotion, no JS animation loopCursorHalo accent-aware (rAF-coalesced pointermove, prefers-reduced-motion respected)TopNav rebuild: Bar + locale-aware Wordmark + per-item hover colour (writing orange / projects teal / photos grey)Footer restored to approved layout with token migrationPageTitle / PullQuote / CTAButton / Bar / Wordmark / Tag shared primitivesLocale-aware prose font: [lang="zh-Hant"] Noto Serif TC (its sibling-Latin handles English to harmonise; PingFang dropped to prevent sans bleed); [lang="en"] FrauncesBody 15px → 16px (VI §2.2 floor), strong 600 → 500 (BI §3 「重量點睛」), h3 family display → bodytext-content87% opacity sitewide (headings + body)
2026-05 · SEO + deploy
Article + Person + WebSite + SearchAction JSON-LD wired (generators existed but were never rendered)/en/feed.xml(zh + en RSS), enriched with dc:creator + category + content:encodedArticle description fallback chain (excerpt > meta_desc > body 160 chars; never falls back to title)SitemaplastModifiedlifted to build-time constant (wasnew Date()per fetch)Viewport export migrated to Next 15 schema with media-aware themeColorOG card token alignment (hex literals → VI palette + Bar mark + bilingual wordmark)CSPunsafe-evaldev-only fix (root cause of dead onClick / no hydration)CSP allowedstatic.cloudflareinsights.com(cleared every-page console error → Best Practices score)
2026-05 · Architecture + performance
Design-system vendored into thelingwu.com (cross-repofile:dep failed in CI)Dropped Noto Serif TC weight 700 (zero usages → ~36 KB gzip CSS saved)Dropped Fraunces SOFT axis (zero usages → ~20 KB woff2 saved)Rybbit script switched tolazyOnload(no longer competes for critical bandwidth)Article herofetchPriority="high"+ first photopriority(LCP rescue)25-filetext-neutral-*token migration (→ text-content / text-muted / border-line)
2026-04 · earlier
standalone output (Docker image 900MB → 65MB)Host migration (Alibaba Cloud HK → Hetzner Singapore)Google Search Console submissionCloudflare AI bot unblockGhost naming cleanup (ghost.ts → mdx.ts, GhostPost → Post, 0 lingering refs)Image blur placeholder (feature + inline, sharp blur + cache)Tailwind design system integration (semantic tokens, removed !important, removed typography plugin)Loading skeletons (sitewide pulse animation)Ghost CMS dead-code removal (kg-* CSS, ArticleBookmark, unused types)Footer social links (LinkedIn/Instagram/GitHub/RSS)Locale-aware date formattingBrand metadata update (Building Flows)next/image migrationArticle TOC + section anchorsllms.txtSitemap alternates (xhtml:link hreflang)RSS link in headBreadcrumb JSON-LDIndexNow pingSkip-to-content linkPWA manifestDynamic OG imagesError boundaryReading progress barWarm-grey background (Notion-style)Image blur placeholder (CSS fade-in)RSS/Atom feedhreflang alternate tagsCustom 404 pagezh / en bilingual supportNav scroll collapseLocale-switch preserves scroll positionPhotos gallery pageBrowser toolbar follows light/dark mode