Monorepo Architecture
The six applications, the shared UI package, and the private template submodule.
Monorepo Architecture
VeriWorkly uses npm workspaces to manage six applications and one shared package in a single repository.
[!NOTE] The full repository structure can be explored on GitHub.
The workspace globs declared in the root package.json are apps/site, apps/studio,
apps/portfolio, apps/blog-platform, apps/docs-platform, apps/server, and packages/*.
Applications
1. Marketing site — apps/site
- Port: 3000 · Workspace:
@veriworkly/site· Framework: Next.js 16 (App Router) - Scope: the public face of the product — landing, pricing, features, how-it-works, FAQ, about, contact, roadmap, security/responsible-disclosure, public GitHub activity stats, a public style guide, legal pages, resume/cover-letter template showcase, and the affiliate and ambassador program pages.
- Notable: ships a machine-readable "AI answer engine" layer (
public/llms.txt,public/pricing.md) and arobots.tsthat explicitly allowlists AI crawlers.
2. Studio — apps/studio
- Port: 3001 · Workspace:
@veriworkly/studio· Framework: Next.js 16 (App Router) - Scope: the authenticated workspace. Resume and cover letter editors, Master Profile, ATS checker, AI tools, document sharing, billing and credits, developer API keys, affiliate and ambassador dashboards, and the internal admin area.
- Notable: local-first document storage in
localStoragewith a background sync engine; dual-engine templates (web preview plus@react-pdf/rendereroutput); an installable PWA manifest.
3. Portfolio — apps/portfolio
- Port: 3004 · Workspace:
@veriworkly/portfolio· Framework: Next.js 16 (App Router) - Scope: three surfaces in one app — the public template gallery and marketing pages, the
authenticated editor/dashboard/analytics/settings workspace, and the published portfolio sites
themselves, served on
*.veriworkly.comsubdomains and atportfolio.veriworkly.com/portfolio/{username}. - Notable: a
proxy.tsmiddleware rewrites both the subdomain host and the shared path onto the internal/portfolios/[username]/[[...slug]]route, and gates the workspace behind a session cookie.
4. API server — apps/server
- Port: 8080 · Workspace:
@veriworkly/server· Framework: Node.js / Express 4 / TypeScript - Scope: every backend capability — authentication, documents, share links, Master Profile, profile import, AI, ATS, portfolios, portfolio assets, billing, affiliates, ambassador, roadmap, changelog, GitHub stats, usage metrics, contact, and admin.
- Notable: PostgreSQL via Prisma 7, Redis for caching/quotas/locks, clustered across CPU cores
with
throngin production, and fivenode-cronbackground jobs guarded by Redis distributed locks.
5. Documentation platform — apps/docs-platform
- Port: 3002 · Workspace:
@veriworkly/docs-platform· Framework: Next.js 16 / Fumadocs - Scope: this site. MDX content under
content/docs, with the sidebar order driven bycontent/docs/meta.json, plus an OpenAPI-generated API reference undercontent/api-reference.
6. Blog platform — apps/blog-platform
- Port: 3003 · Workspace:
@veriworkly/blog-platform· Framework: Next.js 16 / Fumadocs - Scope: product updates, career content, and engineering posts.
Shared package — packages/ui
@veriworkly/ui is the design system consumed by site, docs-platform, blog-platform, and parts
of studio. It provides:
- Twelve UI primitives (Accordion, Badge, Button, Card, Checkbox, Input, Menu, Modal, Select, Switch, TextArea, Tooltip).
- Layout shells —
AppShell,Container,MarketingFooter, the marketing navbar suite,ThemeToggle, andSocialIcons. - The shared light/dark theme token set in
src/styles/themes.css. - Font configuration (
GeistandGeist Mono) exported asglobalFontVariables.
It is consumed directly from source ("main": "./src/index.ts") with no build step, so edits hot
reload in every consuming app. Because Tailwind CSS 4 defines the theme in CSS via @theme, there is
no tailwind.config.ts in this package.
See Shared Design System for the full component and token reference.
Private template submodule
apps/portfolio/template-library is a git submodule pointing at the private
VeriWorkly/portfolio-templates repository, pinned to a specific upstream commit. It holds the four
portfolio templates (Signal, Atelier, Nimbus, Cipher) and their registry.
Without access to that repository, you can scaffold stand-in mock templates using node scripts/mock-template-library.mjs to build and test apps/portfolio locally. Every other workspace builds and runs without it.
Repository structure
Why a monorepo
- Shared design system — one component library and one token set keeps six surfaces visually consistent without publishing a package.
- Shared types — the resume and portfolio content models are defined once and referenced by both the frontends and the backend validators.
- Independent deployment — each application still builds and deploys on its own schedule; the monorepo is a source-organisation choice, not a deployment coupling.