Breaking for forks that changed apps/web/src. The folders components/, hooks/, lib/, utils/, functions/, middleware/, og/ and data/ are gone. Code now lives in apps/web/src/features/<feature>/<feature>.<role>.ts(x), with the same feature names as the backend where one exists (todo, documents, billing, …), and in apps/web/src/platform/<area>/ for what has no domain (the oRPC client, session, i18n, errors, SEO, OG). Routes stay where they are and get thinner. No URL, route or translation key changes, and every route answers as before. The only visible copy change is the web code sample on the landing page (and in llms-full.txt), which now names apps/web/src/features/landing/landing.hooks.ts. If your fork edited a moved file, re-apply the change at its new path; git log --follow finds every file.
- Fixed roles. A feature has
*.queries.ts(query options and the loader's prefetch),*.hooks.ts(the logic),*.page.tsx, presentational components, pure model files and, for server-only code,*.server.ts(x). Components no longer import TanStack Query, the oRPC client or the auth client directly. Web conventions, ADR-0012. - Server-only code is named
.server. TanStack Start refuses*.server.*modules in the client build, so the name is checked by the framework. Client code reaches server code only through two isomorphic bridges (the session query and the docs page loader), and the web keeps zerocreateServerFn. Client/server boundary. - Rules with checks. A boundary test (
scripts/web-feature-boundaries.test.mjs) checks layers, cross-feature imports, the server suffix, barrels,.client.names, dynamic imports and stalevi.mockor worker URLs. The same test checks import cycles, and file size is a lint warning. The enforcement matrix lists W1–W13. - Locales stay central.
apps/web/src/locales/{en,de,fr}.tskeep every key; new keys use their feature's prefix. - A skill section for new screens. The
domain-featureskill gains a web section with templates for queries, hooks, the page and a thin route.
Known leftover: a comment in apps/mobile/src/lib/user-agent.ts still names the old web path; it changes with the next mobile change. Unused vendored components moved as they were; removing them is a separate decision.
Measurements (report): the client grows by 425 B gzip in total, and its entry chunk shrinks by 1,128 B because loaders import *.queries instead of the hooks. The server code grows by 850 B gzip, and no Effect module reaches the client. The docs pages added or edited with this change (ADR-0012, the web conventions, this entry and the updated guides) add about 23.6 KiB gzip to the server's docs chunk, so the server grows by about 24.5 KiB gzip in total; the docs do not reach the client.
Sources: platform moves, platform, second part, OG with server suffixes, feature folders, first of 23 moves, last feature move, boundary test, boundary test in the root tests, file size warning, bundle markers for web server modules, thin todos route, files gateway, root document, loaders out of routes, measurement.