dbradwood.com v1: from scaffold to repeatable publishing pipeline

Built a private, code-first executive site framework with design tokens + MDX content pipeline so publishing becomes a file-based, validated process (not a one-off project).

Outcome

  • A working site framework with consistent layout, metadata, and SEO plumbing.
  • A repeatable publishing pipeline: drop an .mdx file into content/ and it appears in the site.
  • Draft safety: drafts can live in the repo without being indexed/published.

Starting state

  • Blank Next.js scaffold.
  • Dev environment instability risk (multiple dev instances, stale locks, port collisions).
  • No content model; pages were placeholders.

Intervention

1) Stabilize development workflow

  • Standardized on next dev --webpack for predictable local behavior.
  • Cleared stale .next/dev/lock issues by terminating orphaned dev processes and removing .next/dev/ when needed.

2) Build site structure (information architecture)

  • Implemented routes:
    • / (home)
    • /about
    • /work + /work/[slug]
    • /writing + /writing/[slug]
    • /contact
  • Added a shared shell (header/nav/footer) to enforce consistency.

3) Create a design-token system (enforceable, not vibes)

  • Defined semantic tokens (background/surface/text/accent/border) with light/dark values.
  • Mapped tokens to Tailwind utilities so the implementation stays consistent (e.g., bg-bg, text-text, border-border).

4) Replace placeholders with a content pipeline

  • Added filesystem-backed content:
    • content/work/*.mdx
    • content/writing/*.mdx
  • Validated frontmatter with Zod so bad metadata fails at build time.
  • Rendered MDX server-side and generated lists/detail pages.
  • Ensured drafts are excluded from sitemap.xml and return 404 in production.

Measurement

Definition of done:

  • npm run lint passes.
  • npm run build passes.
  • Creating a new post is as simple as adding a file under content/.

Artifacts

  • Repo (private during build/sanitization): dbradwood.com
  • Design tokens: src/app/globals.css
  • Content pipeline + schemas: src/lib/contentfs.ts
  • Example templates:
    • content/work/case-study-template.mdx
    • content/writing/post-template.mdx

Notes

  • This is intentionally “boring” engineering: small choices that reduce friction and make future output inevitable.
  • The real leverage comes next: publishing a handful of operator-grade case studies and essays that are verifiable and reusable.