Engineering Decisions
Architecture decision records for this site — the constraints and tradeoffs behind how it's built, not just what it does.
Static export remains a constraint
accepted- Context
- This site deploys as a static export to S3 and CloudFront, with no live Node process at runtime. That rules out server-side API routes, middleware, and server actions that depend on a running server -- generateStaticParams and build-time data fetching are the only levers available.
- Decision
- All public features must work with Next.js static export to S3 and CloudFront unless a separate, explicitly approved backend is introduced.
- Consequences
- Content that needs to change per-request -- a contact form backend, real-time data -- requires either a separate service or explicit sign-off to break this constraint. Every new feature proposal starts from "can this be static?"
Content-driven architecture
accepted- Context
- Resume generation, the site's About/Experience/Work sections, and LinkedIn sync all need the same underlying facts about career history. Duplicating that content per surface would let them drift apart silently, with no single place to fix a fact once.
- Decision
- Professional content lives in typed src/lib modules (about.ts, skills.ts, experience.ts, resume.ts) and MDX (src/content/work/, src/content/notebook/); components render that content, they don't originate it.
- Consequences
- Any new page or generator -- including the resume DOCX output -- reads from the same source files rather than hardcoding its own copy. Content reviews check the data file, not every page that happens to render it.
Website content is the career source of truth
accepted- Context
- Without a designated source of truth, the site and a resume/LinkedIn profile can drift independently, and it's not obvious which one is authoritative when they disagree.
- Decision
- The website's own content is the single source of truth for career facts. Resume variants are generated from it; LinkedIn is synced manually, on request, with explicit approval before any change goes live -- never automated.
- Consequences
- A career fact only needs updating in one place to eventually propagate everywhere. LinkedIn updates stay a deliberate, reviewed action, not a background sync job that could publish something unreviewed.