mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2026-07-04 10:04:50 +10:00
62f8270b3e
commit b2b0470a1d9267d042ec0ac66523c6635bf5b199
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Tue May 19 13:13:38 2026 +0200
chore: update .gitignore to include .vite-hooks and modify pnpm-lock.yaml for dependencies
commit d28fadb5cd8706c874e616102878b4a394ec84c1
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Tue May 19 13:08:04 2026 +0200
fix: remove timestamp conflict guard
commit c6998d9dbab19d09d3c8054feef1d2e4117555eb
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Tue May 19 12:11:51 2026 +0200
chore(release): v5.1.5
commit f33d168711804880e1f12e88d24290aae16cc258
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Tue May 19 11:58:35 2026 +0200
revert: compose.yml
commit d961e6535811a10c335525fb33a08d03e737278d
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Tue May 19 11:58:08 2026 +0200
refactor(agent): replace 'revert' terminology with 'restore' for clarity, resolves #3086
commit 17f351171be218e33f01c469d95e4164d4c8dc57
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Tue May 19 11:10:41 2026 +0200
refactor(pdf): simplify sidebar section filtering and update summary feature logic
commit d55179b9d76879e3204de185e8b53fadd0a107ed
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Tue May 19 09:53:37 2026 +0200
chore: update pnpm-lock.yaml and turbo.json
commit 7cade6980e1a04352536bd44ef773f338c4ef599
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Tue May 19 09:38:30 2026 +0200
fix(polyfill): add tested polyfill for Map Upsert methods
commit 26d175bb9c53d93225d1e907678445252c13d660
Merge: 1cf33dc6c 5b1297fa2
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Tue May 19 09:23:29 2026 +0200
Merge remote-tracking branch 'origin/main' into feat/explore-hono-orpc-migration
# Conflicts:
# packages/api/src/services/agent-url.ts
# packages/runtime-externals/package.json
commit 1cf33dc6c9d81735730ad656e16dab6501c6d6a1
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Tue May 19 09:22:12 2026 +0200
chore: preserve branch changes before main sync
commit b380a4b00fdbcdd81ff4f8ef72b330fd027ccda5
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Mon May 18 07:50:28 2026 +0200
chore: lot of fixes for monorepo migration
commit 8fcf0ec64e1c29572ebaff494338368bfcf75760
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Fri May 15 13:57:17 2026 +0200
chore: update knip version and refine web app routing with new SEO endpoints
commit 234e68086ff15610a93877354c98e2c020364533
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Fri May 15 12:10:06 2026 +0200
refactor(auth): update OAuth routes to include API prefix and remove unused schema endpoint
commit 91c84b9a8496b0ce21d71cae9f8b2a027638c9ac
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Fri May 15 11:54:29 2026 +0200
chore: update dependencies and enhance PWA metadata in web app
commit 150117d4a5a9dd6cd92c64891aad8cae90f6a7af
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Fri May 15 11:12:35 2026 +0200
docs: revise manifest-only pwa testing scope
commit 6b939a55661aec9dd8122b184e4b60a5c7325fb5
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Fri May 15 11:11:33 2026 +0200
docs: add manifest-only pwa design
commit 1422e1fc96c400948b273210a1067251087d15d4
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Fri May 15 11:05:04 2026 +0200
chore(dev): simplify server proxy config
commit bc2ff5a9f6fda41e6c40333c8f163aa23a6c5e48
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Fri May 15 11:04:50 2026 +0200
docs: add unsafe oauth redirect plan
commit 445359ebe9b96c1515bf1c4c3f73ba8a8448ec12
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Fri May 15 11:04:34 2026 +0200
feat(auth): add unsafe oauth redirect flag
commit 73fffdd24598e56b2793f7657919bc794835892e
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Fri May 15 10:55:02 2026 +0200
docs: design unsafe oauth redirect flag
commit c0066aa19c15fc8a4c8e5179ed49889c117519f4
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Fri May 15 10:22:04 2026 +0200
chore: update translation source paths
commit 9033da082418d252aafd6c2eed72f71f014be3d9
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Fri May 15 10:09:25 2026 +0200
refactor(arch): react spa + hono migration
commit 6f27936c11bda895977dc63ee550c3346d4ce24b
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Fri May 15 01:10:47 2026 +0200
docs: add docker nightly tagging design
commit ecc1fd9a88a0ee1dca2f1977dfc17f74527fe1da
Author: Amruth Pillai <im.amruth@gmail.com>
Date: Thu May 14 20:05:44 2026 +0200
feat: migrate to hono spa server
144 lines
6.4 KiB
Plaintext
144 lines
6.4 KiB
Plaintext
---
|
|
title: "Project Architecture"
|
|
description: "Understand the Reactive Resume monorepo, runtime boundaries, and package ownership model"
|
|
---
|
|
|
|
Reactive Resume is a pnpm/Turborepo monorepo. The product runs as one deployed Node.js process, while the source is split into a full-stack web app, a server adapter, and focused internal packages.
|
|
|
|
Internal packages are source-consumed through their `package.json` export maps. Import package subpaths, not another workspace's private `src` files.
|
|
|
|
---
|
|
|
|
## Runtime Shape
|
|
|
|
```mermaid
|
|
flowchart TD
|
|
Browser["Browser"] --> WebRoutes["apps/web routes"]
|
|
WebRoutes --> ORPCClient["oRPC client"]
|
|
ORPCClient --> RPC["/api/rpc"]
|
|
|
|
subgraph NodeProcess["Node process"]
|
|
Server["apps/server Hono adapter"]
|
|
API["packages/api feature routers"]
|
|
Auth["packages/auth"]
|
|
MCP["packages/mcp"]
|
|
PDFServer["@reactive-resume/pdf/server"]
|
|
end
|
|
|
|
Server --> RPC
|
|
RPC --> API
|
|
Server --> Auth
|
|
Server --> MCP
|
|
API --> PDFServer
|
|
API --> DB["packages/db"]
|
|
API --> Storage["File system or S3-compatible storage"]
|
|
DB --> Postgres["PostgreSQL"]
|
|
```
|
|
|
|
`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
|
|
|
|
| Workspace | Ownership |
|
|
| --- | --- |
|
|
| `apps/web` | TanStack Start routes, web features, browser PDF.js preview/viewer code, PWA setup, oRPC browser client |
|
|
| `apps/server` | Hono route composition, production HTTP adapters, MCP transport, OpenAPI/well-known handlers, static file serving, startup checks |
|
|
| `packages/api` | oRPC procedures and feature-owned business behavior under `src/features/*` |
|
|
| `packages/auth` | Better Auth config, auth helpers, and exported auth types |
|
|
| `packages/db` | Drizzle client and schema; root `migrations/` stores generated migrations |
|
|
| `packages/env` | Server environment validation and root `.env` loading |
|
|
| `packages/schema` | Zod schemas and typed resume/page/template models |
|
|
| `packages/resume` | Pure resume-domain helpers, including JSON Patch behavior and network icon mapping |
|
|
| `packages/pdf` | React PDF document, template primitives, templates, font registration, and browser/server generation adapters |
|
|
| `packages/docx` | DOCX export generation |
|
|
| `packages/mcp` | MCP tools, prompts, resources, server card, and tool metadata |
|
|
| `packages/ui` | Shared Base UI/shadcn-style primitives and hooks |
|
|
| `packages/ai` | AI provider types, prompts, resume parsing/sanitization helpers, and model-facing tool contracts |
|
|
| `packages/import` | Resume importers |
|
|
| `packages/fonts` | Font metadata |
|
|
| `packages/email` | Email transport and templates |
|
|
| `packages/utils` | Narrow cross-cutting utilities with explicit export subpaths |
|
|
| `packages/config` | Shared development configuration |
|
|
| `tooling` | Development-only scripts and repo tooling |
|
|
|
|
---
|
|
|
|
## 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's `src`.
|
|
- 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.
|
|
|
|
The checks are executable:
|
|
|
|
```bash
|
|
pnpm exec turbo boundaries
|
|
pnpm exec biome check biome.json turbo.json tooling/grit/no-cross-workspace-src-imports.grit apps/web/tsconfig.json apps/*/turbo.json packages/*/turbo.json
|
|
```
|
|
|
|
---
|
|
|
|
## Feature Placement
|
|
|
|
When adding code, choose the owner by behavior:
|
|
|
|
| Change | Put it here |
|
|
| --- | --- |
|
|
| Route, loader, route-level server handler, or web workflow | `apps/web/src/routes` plus `apps/web/src/features/<domain>` |
|
|
| API procedure or authenticated business behavior | `packages/api/src/features/<domain>` |
|
|
| Pure resume data logic | `packages/resume` |
|
|
| Resume schema or template list shape | `packages/schema` |
|
|
| React PDF template/rendering behavior | `packages/pdf` |
|
|
| PDF.js canvas/viewer UI | `apps/web/src/features/resume` |
|
|
| DOCX export behavior | `packages/docx` |
|
|
| MCP tool/prompt/resource behavior | `packages/mcp` |
|
|
| Shared UI primitive/hook | `packages/ui` |
|
|
| Cross-cutting helper | Prefer a domain package first; otherwise add an explicit `packages/utils` export |
|
|
|
|
---
|
|
|
|
## 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/browser` creates browser PDF blobs.
|
|
- `@reactive-resume/pdf/server` creates server PDF files.
|
|
- Template code stays under `packages/pdf/src/templates`.
|
|
|
|
Localized section-title resolution stays in the caller because it depends on web/server locale context. PDF.js preview and viewer code stays in `apps/web/src/features/resume`, not in `packages/pdf`.
|
|
|
|
DOCX export generation lives in `packages/docx`.
|
|
|
|
---
|
|
|
|
## MCP Boundary
|
|
|
|
MCP implementation lives in `packages/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`.
|