M18-2: Web app bootstrap (Vite + React 19 + TanStack + Base UI + Tailwind 4) #163

Closed
opened 2026-04-20 16:02:54 +00:00 by code-lead · 0 comments
Collaborator

As an operator, I want apps/web standing up on the t3code stack (React 19 + TanStack Router/Query + Base UI + Tailwind 4 + Vite), so that subsequent UI stories have a real frontend to build against.

Acceptance criteria

Stack

  • apps/web/ ships with:
    • Vite 5+ (React plugin)
    • React 19 + React DOM 19
    • TypeScript 5.x (strict)
    • Tailwind CSS 4 (via @tailwindcss/vite)
    • Base UI (@base-ui-components/react)
    • TanStack Router (file-based routing under src/routes/)
    • TanStack Query (server state)
    • Zustand (local UI state only; server state stays in Query)
    • Class Variance Authority + tailwind-merge
  • Path aliases: @/*src/*, @shared/*../../packages/shared/src/*
  • Design tokens from design/tokens.json (Tokyo Night Storm) land in apps/web/src/styles/tokens.css as CSS variables; no palette divergence from the current dashboard

Dev loop

  • cd apps/web && bun run dev starts Vite on port 5173 with a proxy to http://localhost:4500 for /task, /queue, /history, /events, /stats, /agents, /usage, /storage, /breakdown
  • Root just dev runs both apps together via Turbo; both hot-reload independently
  • apps/web has its own bun run builddist/ static assets

Production serving

  • apps/server gains a static-file route: in production, it serves apps/web/dist/ at /app/* (e.g. /app/monitor, /app/planner). Legacy / keeps serving src/dashboard.html until #M18-9
  • just qa runs typecheck + lint for both apps (pick Biome or Oxlint for web — document choice; don't ship a third linter)

Tests

  • Vitest + Testing Library wired for apps/web; one smoke test per route renders without crashing
  • Playwright skeleton installed (config only; #M18-3 adds the first end-to-end)

Out of scope

  • Real UI beyond a styled "Hello" landing page proving tokens + Base UI render
  • Routing between multiple top-level pages — one route (/) suffices here
  • Auth — #M18-8

Dependencies

  • Blocks on #M18-1 (monorepo restructure).
  • Unblocks #M18-3, #M18-4, #M18-5, #M18-6, #M18-7, #M18-8.

References

As an operator, I want `apps/web` standing up on the t3code stack (React 19 + TanStack Router/Query + Base UI + Tailwind 4 + Vite), so that subsequent UI stories have a real frontend to build against. ## Acceptance criteria ### Stack - [ ] `apps/web/` ships with: - Vite 5+ (React plugin) - React 19 + React DOM 19 - TypeScript 5.x (strict) - Tailwind CSS 4 (via `@tailwindcss/vite`) - Base UI (`@base-ui-components/react`) - TanStack Router (file-based routing under `src/routes/`) - TanStack Query (server state) - Zustand (local UI state only; server state stays in Query) - Class Variance Authority + `tailwind-merge` - [ ] Path aliases: `@/*` → `src/*`, `@shared/*` → `../../packages/shared/src/*` - [ ] Design tokens from `design/tokens.json` (Tokyo Night Storm) land in `apps/web/src/styles/tokens.css` as CSS variables; no palette divergence from the current dashboard ### Dev loop - [ ] `cd apps/web && bun run dev` starts Vite on port `5173` with a proxy to `http://localhost:4500` for `/task`, `/queue`, `/history`, `/events`, `/stats`, `/agents`, `/usage`, `/storage`, `/breakdown` - [ ] Root `just dev` runs both apps together via Turbo; both hot-reload independently - [ ] `apps/web` has its own `bun run build` → `dist/` static assets ### Production serving - [ ] `apps/server` gains a static-file route: in production, it serves `apps/web/dist/` at `/app/*` (e.g. `/app/monitor`, `/app/planner`). Legacy `/` keeps serving `src/dashboard.html` until #M18-9 - [ ] `just qa` runs typecheck + lint for both apps (pick Biome or Oxlint for web — document choice; don't ship a third linter) ### Tests - [ ] Vitest + Testing Library wired for `apps/web`; one smoke test per route renders without crashing - [ ] Playwright skeleton installed (config only; #M18-3 adds the first end-to-end) ## Out of scope - Real UI beyond a styled "Hello" landing page proving tokens + Base UI render - Routing between multiple top-level pages — one route (`/`) suffices here - Auth — #M18-8 ## Dependencies - **Blocks on #M18-1** (monorepo restructure). - **Unblocks #M18-3, #M18-4, #M18-5, #M18-6, #M18-7, #M18-8.** ## References - Spec: `specs/m18-ui-rewrite-and-architect.md` §Story M18-2 - t3code stack reference (MIT): https://github.com/pingdotgg/t3code
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
charles/claude-hooks#163
No description provided.