Engineering Decisions

Architecture decision records for this site — the constraints and tradeoffs behind how it's built, not just what it does.

  1. 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?"
  2. 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.
  3. 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.