Four years in manufacturing CI. SPC dashboards that cut $70–85K in annual scrap. Quality inspection systems serving 40+ users across 4 departments. Building it all in the open, one commit at a time.
build systems.
ship tools.
share the work.
| Section | What you'll find |
|---|---|
| selected work | Process engineering and data projects — real outcomes, real numbers |
| courses | Structured learning paths built in public |
| field notes | Writing on lean, systems, AI, and building |
| about | Stack, background, and how to reach me |
| Layer | Tech |
|---|---|
| Framework | Astro 6 — static output, no SSR |
| Content | Astro Content Layer API |
| Styling | Scoped CSS + design tokens (src/styles/tokens.css) |
| Fonts | Major Mono Display · Fraunces · Space Mono |
| Hosting | GitHub Pages + Cloudflare DNS |
src/
├── components/ # Header, Footer, Base, Label, Button, Chip, Panel, CodeBlock, Badge
├── content/
│ ├── writing/ # Blog posts (.md with frontmatter)
│ ├── courses/ # Course metadata (.json)
│ └── projects/ # Project cards (.json)
├── pages/
│ ├── index.astro # Homepage — hero, work, field notes, about
│ ├── writing/ # Listing + individual article pages
│ ├── courses/ # Listing + bespoke landing pages
│ └── projects/ # Full projects listing
└── styles/
└── tokens.css # Design tokens — colors, spacing, type scale
npm install
npm run dev # http://localhost:4321
npm run build # production build → ./dist/
npm run preview # preview built output locallyCreate src/content/writing/[slug].md:
---
title: "Post title"
date: 2026-06-01
tag: "systems | ai | ie | build"
excerpt: "Max 160 chars — used on listing and meta description."
published: false
readingTime: 5
featured: false
---Create src/content/courses/[slug].json:
{
"title": "Course title",
"slug": "url-safe-slug",
"description": "Shown on listing card.",
"status": "live | coming-soon | draft",
"label": "badge text",
"accent": "green | red | gold | default",
"modules": 8,
"projects": 3,
"duration": "8–16 weeks",
"cost": "$5",
"repo": "https://github.com/..."
}Then create src/pages/courses/[slug].astro using zero-to-ai.astro as the structural template.
Create src/content/projects/[slug].json:
{
"name": "project name",
"slug": "url-safe-slug",
"lift": "red | green | gold | default",
"tags": ["tag1", "tag2"],
"blurb": "2-sentence max. What you built. Measured outcome.",
"href": "/writing/case-study-slug",
"status": "live | coming-soon | draft",
"featured": true
}featured: true shows on homepage (max 3). status: "draft" hides from all listings.
Lift color guide: red = cost/fix, green = build/growth, gold = capstone/leadership.
Branch flow: feature/* → dev → PR → main
Never commit directly to dev or main. Merges into main use regular merge — not squash — to keep the commit graph intact and prevent recurring conflicts.
git checkout -b feature/my-change
gh pr create --base dev # wait for CI
gh pr create --base main
gh pr merge --auto --merge # regular merge, not squashPush to main triggers GitHub Actions — builds and deploys to GitHub Pages automatically.