Volume I — Production of the Project to Product Playbook, made executable. Take Tracer, a link shortener built to inner-ring best practice, and promote it across the outer ring — containers, CI/CD, environments, IaC, observability, incident response, security — one lab at a time, diffing your work against a canonical answer key. Sibling to
Modern Coding QuickstartandModern E2E Quickstart.
New here? Start with docs/intro.md. The Readiness Manifest (the outer-ring deltas
R01–R14 the labs promote to product-grade) lives in scripts/readiness.manifest.json;
the full build plan and design rationale are in _internal/ (MODERN-PRODUCTION-PLAN.md,
LAB-DESIGN.md).
A link shortener with click analytics:
- Create —
POST /api/linksmints a unique slug for a target URL. - Resolve —
GET /:slug(root, the hot path) 302-redirects and records aClick. - Analytics —
GET /api/links/:id/clicksfeeds the detail view.
Three thin entities (User, Link, Click); no state machine (a link is active until expires_at
passes). An Nx monorepo: separated Angular web (zoneless, NgRx links feature) + NestJS API
(TypeORM/Postgres, JWT, Zod-first contracts in @tracer/common-models).
seed is the honest CLI-standard app: inner ring done well, outer ring dev-grade or absent. It runs
and is well-built — it simply isn't a product yet. The deliberately dev-grade bits — each one a lab's target:
- Persistence —
synchronize: true, no migrations - Logs — Nest's default logger, not structured JSON
- Config & secrets —
.envcommitted, defaults in code - Rate limiting —
@nestjs/throttlerinstalled but unconfigured - Delivery · infra · observability — none yet (no CI, IaC, or OpenTelemetry)
- Node 20 (
.nvmrc) and npm - Docker — for local Postgres (and, in later labs, the observability stack, Terraform,
act)
npm install
cp .env.example .env # config is env-only (R02/R03) — the API fails loud without it
npm run db:up # Postgres on localhost:5433 (host 5432 is often taken)
npm run migration:run # create the schema
npm run seed # add the demo user (below)
npm start # serve api (:3000) + web (:4200) together
# open http://localhost:4200Log in as demo@tracer.local / tracerdemo123 — or click Register to create your own account.
Starting the labs instead?
git checkout seed(the dev-grade starting point) ornpm run module:begin 01.
npm run verify # typecheck + lint + test + build across all projectsEach lab promotes one outer-ring capability. Use the tag harness:
npm run module:begin NN # check out lab NN's starting point on a my/NN branch
npm run module:compare NN # diff your work against the canonical NN-completeLicense: MIT.