package.json export maps. Import package subpaths, not another workspace’s private src files.
Runtime Shape
apps/web owns the TanStack Start experience. apps/server owns the production Hono process and mounts RPC, auth, OpenAPI, MCP, static uploads, schema JSON, and the built web app.
Workspace Map
Boundary Rules
- Use
@reactive-resume/*package exports for cross-workspace imports. - Do not import another workspace through
apps/**,packages/**,@reactive-resume/*/src/**, or a TypeScript path alias to another workspace’ssrc. - Keep browser-only code in web features or explicit browser subpaths.
- Keep server-only code in server packages or explicit server subpaths.
- Keep environment-neutral domain packages free of DB, HTTP, DOM, and app imports.
- Add public package exports deliberately. Wildcard exports are reserved for leaf-style public surfaces such as UI components/hooks and schema resume files.
Feature Placement
When adding code, choose the owner by behavior:Web Layout
apps/web/src/routes stays route-owned. Route files handle URL shape, loaders, redirects, metadata, and SSR flags.
Domain UI and browser-heavy implementation code lives under apps/web/src/features. Current feature areas include resume preview/export/public pages, command palette, auth, settings, theme, locale, and user menu behavior.
Generic app-local components remain in apps/web/src/components; shared reusable primitives live in packages/ui.
Dialog runtime state is centralized in apps/web/src/dialogs/store.ts, while dialog schemas and renderers are registered by domain under apps/web/src/dialogs/{auth,api-key,resume}.
API Layout
packages/api/src/routers/index.ts exports the top-level oRPC contract. Feature modules under packages/api/src/features/* own their procedure modules, services, helpers, tests, and public package exports.
Avoid reintroducing technical-layer folders such as services/ or helpers/ at the package root. If a helper is used by one feature, keep it in that feature. If it becomes shared, name the shared capability explicitly and export it intentionally.
PDF And Export Boundaries
packages/pdf owns React PDF generation:
@reactive-resume/pdf/browsercreates browser PDF blobs.@reactive-resume/pdf/servercreates server PDF files.- Template code stays under
packages/pdf/src/templates.
apps/web/src/features/resume, not in packages/pdf.
DOCX export generation lives in packages/docx.
MCP Boundary
MCP implementation lives inpackages/mcp. It exposes canonical unprefixed tool names such as list_resumes, read_resume, and apply_resume_patch.
The server process imports MCP from @reactive-resume/mcp and injects the in-process oRPC router client. It must not import MCP code from apps/web/src.