Monorepo for Tim Cai's cinematic landing and future content studio.
apps/landing— current React/Vite portfolio landing with GSAP, Lenis, R3F, preload, Frame, and chapter runtime.apps/studio— Next App Router content surface for/blog,/work,/dashboard, RSS, sitemap, and OG images.packages/tokens— shared color/type/motion tokens consumed by both apps.packages/content— shared content schema and repository contracts.
npm install
npm run dev:landing
npm run dev:studio
npm run build:landing
npm run build:studio
npm run typecheck
npm run lint
npm run test:build
npm run test:smoke
npm run test:unitnpm run dev and npm run build intentionally target the landing app for Vercel compatibility.
npm run test:build runs the static architecture guards; npm run test:smoke verifies the deployed same-domain Studio rewrites and their /_next assets.
- Landing brand link: production uses same-origin
/blogso the public domain stays canonical; local dev can setVITE_STUDIO_URLforlanding:5173 → studio:5174/blog. - Studio brand link: set
NEXT_PUBLIC_LANDING_URLto the deployed Landing origin soTim Cai Studioreturns to the cinematic landing. - Local defaults already point
landing:5173 → studio:5174/blogandstudio:5174 → landing:5173; runnpm run dev:landingandnpm run dev:studioin two terminals for local cross-app navigation. The landing dev server uses a strict5173port so Studio's return link cannot drift to the wrong app.
The studio must never import the landing runtime stack: GSAP, Lenis, Three, R3F, or the landing preload system. Studio pages are content-first SSR/SSG surfaces; landing remains the tuned client-side cinematic entry.
plan/README.md— next-phase blueprint: Builder Graph OS, a GitHub-native growth graph and narrative system for builders.plan/01-north-star.md— product north star, target users, and emotional goals.plan/02-system-boundaries.md— Landing / Studio / GitHub / DB / AI boundaries.docs/— landing architecture and visual/runtime docs (mirrors current source).