Files
professional-website/docs/TASKS.md
Jason Woltje c800bef739 chore: bootstrap repo with PRD, tasks, design samples, and Mosaic scaffolding
Personal professional website for jasonwoltje.com, built on Payload CMS 3 +
Next.js 16 and deployed to w-docker0 (Docker Swarm) behind the existing
MosaicStack edge Traefik. Establishes the delivery contract before any
scaffold work begins:

- docs/PRD.md — stack, content model, routing, design system, CI, infra,
  acceptance criteria, assumptions, and escalation log
- docs/TASKS.md — milestone breakdown 0.0.1 → 0.1.0 MVP
- README.md, LICENSE (All Rights Reserved), .gitignore
- design-samples/ — stitch "Technical Editorial" mockups + DESIGN.md tokens
- images/ — source headshots (to be imported into Payload media on seed)
- .mosaic/ — orchestrator scaffolding (quality rails, repo hooks)

Scaffold (Next.js + Payload init) ships on feat/scaffold in a follow-up PR.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-13 21:05:06 -05:00

5.3 KiB

TASKS — jasonwoltje.com

Milestone: 0.0.1 — Bootstrap (repo, PRD, local scaffold) Next: 0.0.2 — Design system port + collections MVP target: 0.1.0 — Full site deployed on w-docker0, DNS live, all routes

Source of truth for scope: PRD.md.


Legend

Status Meaning
pending
in progress
done
🚫 blocked — see blocker column
deferred

Milestone 0.0.1 — Bootstrap

ID Task Status Owner Issue Blocker
BOOT-01 Create Gitea repo jason.woltje/professional-website orchestrator
BOOT-02 Commit PRD + TASKS + README + LICENSE + .gitignore orchestrator
BOOT-03 Push bootstrap commit to main orchestrator
BOOT-04 Create first feature branch feat/scaffold worker BOOT-03

Milestone 0.0.2 — Scaffold + design system

ID Task Status Owner
SCAFF-01 Initialize Next.js 16 + Payload 3 app in src/ worker
SCAFF-02 Configure pnpm workspace, TS strict, ESLint, Prettier worker
SCAFF-03 Tailwind v3 config: port M3 tokens from stitch HTML worker
SCAFF-04 next/font: Space Grotesk + Inter, CSS vars worker
SCAFF-05 Install lucide-react, @tailwindcss/forms, @tailwindcss/container-queries worker
SCAFF-06 Global utility classes: .ghost-border, .glass-card, .neon-cta, StatusTerminal baked vars worker
SCAFF-07 Payload Postgres adapter + local docker compose for dev DB worker
SCAFF-08 Health endpoint /api/health worker

Milestone 0.0.3 — Content model

ID Task Status Owner
CMS-01 Collections: users, media, categories, projects, posts, gear, contactSubmissions worker
CMS-02 Globals: home, about, contact, resume, navigation, seo worker
CMS-03 Payload hooks: revalidatePath on publish worker
CMS-04 Access control: admin-only for sensitive collections worker
CMS-05 Seed script: placeholder content for all collections/globals worker

Milestone 0.0.4 — Pages + sections

ID Task Status Owner
UI-01 Section components: HeroHeadline, ProjectBentoGrid, MakerMindsetCard, AudioSignalPath, StatusTerminal, ContactForm, NewsletterBand, SocialBento worker
UI-02 / page composition worker
UI-03 /about page composition worker
UI-04 /projects + /projects/[slug] worker
UI-05 /writing + /writing/[slug] worker
UI-06 /contact (form + Turnstile + honeypot + rate-limit) worker
UI-07 /resume + /resume.pdf (react-pdf or puppeteer) worker
UI-08 Sitemap, robots, RSS worker

Milestone 0.0.5 — CI + container

ID Task Status Owner
CI-01 Multi-stage Dockerfile (deps → build → runner, non-root, standalone Next output) worker
CI-02 .woodpecker/web.yml — lint/typecheck/build/audit/Kaniko/Trivy/link-package worker
CI-03 First CI run → image pushed to Gitea registry orchestrator
CI-04 Verify image path: jason.woltje dot handling orchestrator

Milestone 0.0.6 — Deploy

ID Task Status Owner
DEP-01 docker-compose.swarm.yml — web + postgres, traefik-public external, labels mirror mosaicstack-website worker
DEP-02 .env.example committed worker
DEP-03 ESC-01: Edge Traefik TLS config for jasonwoltje.com 🚫 Jason
DEP-04 Cloudflare DNS: A/CNAME for apex + www, proxied Jason
DEP-05 Portainer stack creation on w-docker0 (endpoint 7), env vars populated orchestrator
DEP-06 First deploy smoke test: /, /admin, /api/health, www→apex 301 orchestrator
DEP-07 Payload admin bootstrap: Jason creates first admin user Jason

Milestone 0.1.0 — MVP acceptance

See PRD.md §11 for full acceptance criteria. Gate conditions:

  • All routes render
  • Lighthouse thresholds met (Perf ≥85, A11y ≥95, SEO ≥95)
  • Contact form end-to-end (submit → Payload → email)
  • Headshots uploaded to media collection
  • At least 1 project + 1 post published
  • Release tag v0.1.0 pushed; CI tagged build deployed

Deferred (Phase 2)

Task Rationale
Auto-deploy via Portainer API Defer until manual deploys are stable
Health-check gate in CI Same
Umami analytics stack Separate repo/stack
Mautic newsletter integration Separate deploy; newsletter UI is stub until live
Offsite backups (B2/R2) v0.1.x concern
MinIO migration Triggered by volume growth

Active blockers / escalations

ID Description Unblocks
ESC-01 Edge Traefik TLS config for new domain jasonwoltje.com DEP-03 → DEP-05+
ESC-03 SMTP/Resend credentials for contact form notifications UI-06 email path
ESC-04 Turnstile site + secret keys UI-06 CAPTCHA

Unblocking these does not gate scaffold work — only deploy and contact form completion.