[App Name]
Client-side React app. Authenticated, data-heavy, no SEO requirement.
Source of truth
Vercel deploys from main. The deployed bundle is the source of truth for what users see; rebuild + redeploy to change anything.
Tech stack
Vite 6 + React 19 + TypeScript. TanStack Router (file-based routing with type-safe links). TanStack Query for all server state (no Redux for server data). Zustand for local UI state (modal open, sidebar collapsed, etc). Tailwind v4 for styling. Deployed to Vercel as static output.
Deploy
git push origin main. Vercel runs npm run build (Vite outputs to dist/) and serves it. SPA routing handled via vercel.json rewrites: every path returns index.html.
File map
src/routes/file-based routes;__root.tsxis the layoutsrc/routes/_authed/authed pages (loader-protected)src/routes/login.tsxlogin pagesrc/api/typed fetch wrappers per resourcesrc/components/shared componentssrc/stores/Zustand storessrc/lib/auth.tstoken storage + refreshvite.config.tsplugins: TanStack Router, Tailwind, TypeScript pathsvercel.jsonSPA rewrite rule
.env keys
VITE_API_BASE_URLyour backend API baseVITE_PUBLIC_POSTHOG_KEYanalytics (optional)
Hard rules
- All server data flows through TanStack Query. No useEffect-fetch.
- All routes are typed via TanStack Router. No
<a href>for internal links. - Auth token in
localStoragewith a refresh interceptor. Never in URLs. - Bundle budget: under 250KB JS gzipped on first paint. Run
npm run analyzebefore each release. - No CSS-in-JS runtime. Tailwind + CSS Modules only.
Recent significant changes
- 2026-05-12: Scaffolded. Locked: TanStack Router over React Router (codegen + types). Zustand over Redux. No styled-components.
Next session: start here
- Set
VITE_API_BASE_URLin.env.localto your API. - Implement
src/lib/auth.tstoken storage matching your backend. - Build first route under
src/routes/_authed/. - Set up CI to run
npm run typecheck && npm run lint && npm run buildon every PR. - Deploy to Vercel, attach domain.