Skip to content

feat(web): bootstrap TanStack Start app - #753

Closed
aXenDeveloper wants to merge 4 commits into
canaryfrom
claude/tanstack-start-i18n-stage-0-69jkga
Closed

feat(web): bootstrap TanStack Start app#753
aXenDeveloper wants to merge 4 commits into
canaryfrom
claude/tanstack-start-i18n-stage-0-69jkga

Conversation

@aXenDeveloper

Copy link
Copy Markdown
Owner

Adds apps/web, a new TanStack Start (Vite + Nitro) app that will
eventually replace the Next.js frontend. Stage 0 only - no VitNode
features are ported yet.

  • Vite config wiring tanstackStart, Tailwind 4 and Nitro, with
    workspace packages bundled rather than externalized for SSR.
  • TanStack Query set up in the router context and Wrap provider up
    front, so it does not have to be retrofitted later.
  • Tailwind entry reusing the VitNode design tokens from the Next app,
    with Geist served through Fontsource instead of next/font.
  • A home page and an /admin placeholder, which exist to exercise the
    two locale strategies landing in the next commit.

TanStack packages are pinned to releases older than the repo's
minimumReleaseAge policy cutoff, so no policy exemptions are needed.
vite and @vitejs/plugin-react are pinned to the versions already in
the lockfile to keep every existing resolution unchanged.

Co-Authored-By: Claude Opus 5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01WSPLXkitYKMftPVD4L3CVf

claude added 4 commits August 23, 2026 07:37
Adds `apps/web`, a new TanStack Start (Vite + Nitro) app that will
eventually replace the Next.js frontend. Stage 0 only - no VitNode
features are ported yet.

- Vite config wiring `tanstackStart`, Tailwind 4 and Nitro, with
  workspace packages bundled rather than externalized for SSR.
- TanStack Query set up in the router context and `Wrap` provider up
  front, so it does not have to be retrofitted later.
- Tailwind entry reusing the VitNode design tokens from the Next app,
  with Geist served through Fontsource instead of `next/font`.
- A home page and an `/admin` placeholder, which exist to exercise the
  two locale strategies landing in the next commit.

TanStack packages are pinned to releases older than the repo's
`minimumReleaseAge` policy cutoff, so no policy exemptions are needed.
`vite` and `@vitejs/plugin-react` are pinned to the versions already in
the lockfile to keep every existing resolution unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSPLXkitYKMftPVD4L3CVf
`@vitnode/i18n` carries the locale logic for the TanStack Start app,
built on `use-intl` so the existing `next-intl` message files and
`useTranslations` call sites port over later without being rewritten.

The default locale is served unprefixed (`/about`), every other locale
is prefixed (`/pl/about`), and `/api/*` and `/admin/*` are never
prefixed at all - they read the locale from the cookie instead. The
cookie is the only persistence: `localStorage` is invisible to SSR and
would flash the wrong language.

Split into three cores so the bundler can keep them apart: `shared` is
free of environment-specific imports and safe on both sides, `client`
holds the URL rewriting and isomorphic detection, and `server` holds the
request middleware that answers redirects before React starts rendering.

The formatting time zone is pinned rather than inherited from the host,
which otherwise differs between server and browser and turns every
formatted date into a hydration mismatch.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSPLXkitYKMftPVD4L3CVf
The locale lives only in the public URL: `rewrite.input` strips the
prefix before the router matches, and `rewrite.output` puts it back on
every href the router builds. So the route tree holds plain paths, and a
`<Link to="/">` renders `/pl` on a Polish page without any route knowing
that locales exist. An unknown prefix like `/xyz` is left alone, matches
nothing and 404s, rather than quietly falling back to English.

`src/start.ts` registers the locale request middleware, which is what
makes `/en/*` and `/pl/admin` answer with a 301 - a route can throw
`notFound()`, but by then the response has already started streaming.

The root loader resolves the locale and returns its messages, so they
travel to the client in the router's own SSR payload. The first client
render is identical to the server's, and an English visitor never
downloads the Polish chunk.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSPLXkitYKMftPVD4L3CVf
`pnpm-workspace.yaml` needs no change - its `apps/*` and `packages/*`
globs already cover both new workspaces.

Adds a `typecheck` task, which both new workspaces expose, and `.output`
to the cached build outputs so Turborepo knows what `vite build` leaves
behind.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSPLXkitYKMftPVD4L3CVf
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@vercel

vercel Bot commented Aug 23, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
vitnode-docs Error Error Aug 23, 2026 8:18am

@github-actions github-actions Bot added the 💡 Feature A new feature label Aug 23, 2026
@aXenDeveloper
aXenDeveloper deleted the claude/tanstack-start-i18n-stage-0-69jkga branch August 23, 2026 19:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

💡 Feature A new feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants