TanStack web backlog
Decompose epics into actionable tasks. Check off as you complete; prefer issues/PRs for assignment, this file as SSOT mirror.
Phase 0 — Hygiene
- Narrative: non-product UI paths described in SSOT/ADR without legacy stack names
-
Remove or rewrite
vox-codegen-htmlreferences (Cargo exclude comment, forward-migration charter, Ludus quests, CodeRabbit planner allowlist) - Link ADR 010 + this roadmap from AGENTS.md (optional one-liner)
Phase 1 — Examples
-
Create
examples/archive/and move non-golden.voxfiles -
Update
crates/vox-parser/tests/parity_test.rsMUST_PARSE(recursive walk) -
Document golden list in
examples/README.md -
examples/STYLE.md+FEATURE_INDEX.md+PARSE_STATUS.md; optionalVOX_EXAMPLES_STRICT_PARSE=1inparity_test
Phase 2 — TanStack Router
-
Emit
createRootRoute/createRoute/createRouter/RouterProviderfromroutes {(vox-codegen-ts/src/emitter.rs) -
Add
@tanstack/react-routertotemplates.rspackage_json; drop unused router dep fromislandspackage.jsontemplate -
Prefer
Appentry infs_utils::find_component_namewhenApp.tsxexists -
Integration tests:
routes {codegen assertions (pipeline.rs)
Phase 3 — pnpm workspace
-
Emit root
pnpm-workspace.yamlwhenislands/+ main app paths are known (frontend.rs) -
Document root
pnpm install/pnpm -r buildin ref-cli.md -
Align islands workspace paths: resolve
islands/orpackages/islands/(island_package_root,pnpm-workspace.yaml,build_islands_if_present)
Phase 4 — TanStack Start + SSR
-
Scaffold Start-compatible
vite.config/ entry (templates.rsvite_config(..., tanstack_start: true)+frontend.rs) -
routes {+ Start: manifest-first — codegenroutes.manifest.ts+ components +vox-client.ts; user-owned TanStack adapter + file routes +routeTree.gen.ts(emitter.rs,route_manifest.rs, CLItanstack.rsscaffold) -
Regenerate file-route
routeTree.gen.tsvia TanStack Router CLI (pnpm run routes:gen/tsr generate) for the no-routes {path —pnpm install/ build scripts run it when not using programmaticvoxRouteTree -
vox run: optional Vite upstream viaVOX_ORCHESTRATE_VITE=1+VOX_SSR_DEV_URL(see how-to) -
Generated Axum
serve_dispatch: GET non-/apiproxy toVOX_SSR_DEV_URLwhen set - Production Docker sketch — see TanStack SSR with Axum (multi-stage Node build + Rust binary; adjust paths to your crate/binary name)
-
CI:
pnpm install+vite buildonweb-vite-build-smoke(ubuntu-latestexception) withexamples/full_stack_minimal.vox(opt-in local:VOX_WEB_VITE_SMOKE=1)
Phase 5 — Query / Table (optional)
-
@loading: lexer/parser →Decl::Loading→Spinner.tsx+ TanStack RouterpendingComponentvia manifest / component wiring (route_manifest.rs,emitter.rs) -
TanStack Query helper emitted:
vox-tanstack-query.tsx(viaemitter.rs) definesuseVoxServerQuery— import from generated output next tovox-client.ts. -
Optional enhancement: Auto-wrap
useVoxServerQueryinside Path C reactive components that consume@querydata (not insideroutes.manifest.tsloaders, which must remain plainasyncfunctions — React hooks are invalid there). Until then, authors calluseVoxServerQuery(['key'], () => myQuery({...}))in components. LegacyserverFns.ts/ Wave F tasks intanstack-start-implementation-backlog.mdare superseded byvox-client.ts. -
Table-heavy UIs: TanStack Table — prefer for sort/filter/column-heavy grids when staying in React; hand-rolled
<table>or lightweight lists remain fine for simple cases (see vox-web-stack.md)
Phase 6 — v0
-
vox buildvalidates each present{Name}.tsxfor@v0against the named export contract;cargo test -p vox-cli v0_tsx_normalizecovers matchers; optionalvox doctorcheck whenVOX_WEB_TS_OUTpoints at the TS output dir -
Docs: @v0 links v0.dev, named exports, islands /
vox island, and doctor env
Phase 7 — Virtual File Routes + Complete TanStack Start
Full checklist (with truth table): tanstack-start-implementation-backlog.md
Spec / historical fate table: tanstack-start-codegen-spec.md — treat virtual-file-route emit as historical; shipped model is manifest + adapter.
-
Wave A — obviated / done in tree: Loader + pending +
not_found/error+ nestedroutes(field names:loader_name,pending_component_name). Deferred:under/layout_nameonRouteEntry;redirect/ wildcard parsing. - Partial — Wave B: Open
hir/nodes/decl.rsbefore executing backlog B-items; some deprecation noise intentionally remains for migration paths. - Partial — Wave C: Classic
@component fnand retired surfaces areError(see typeck / parser); emitter loops may still exist for migration — verify tree, do not assume checklist is greenfield. -
Wave D — obviated (shape): Scaffold files:
vox-clitemplates + optionalcodegen_ts/scaffold.rs; not the spec’s exclusive Start-onlyclient.tsx/router.tsxtrio from compiler alone. -
Wave E — cancelled: Compiler
__root.tsx/app/routes.tsvirtual program — replaced byroutes.manifest.ts+ file routes + optional manifest adapter. -
Wave F:
vox-client.ts+ Axum (GET@query, POST mutation/server). Residual ergonomics: docs / env constants — non-blocking. - Wave G: Docs drift vs manifest-first spec (roadmap, decorator pages, how-tos) — ongoing editorial.
-
Wave H:
web_routing_fullstack.vox,blog_fullstack.vox,v0_shadcn_island.vox+ pipeline tests.layout_groups.voxblocked until layout/redirect grammar unless expressed as nested paths only. - Partial — Wave I: No virtual route snapshots; instead
web_ir_lower_emit,include_01pipeline,axum_emit_contract. Add tests only if new grammar ships. - Partial — Wave J:
tanstack.rs,spa.rs,frontend.rsare live; revisit whenvox init --webchanges. - Wave K: ADR 010 / architecture-index links — spot-check when touching web ADRs.