01 / Data
Data & systems.
Schemas, migrations, integrations. The long-lived layer: domain models, the contracts between services, the data that outlasts whatever UI sits on top of it.

Full-stack software engineer at Herzog Railroad Services. I started out on ballast-train integrations and now work across the enterprise systems that keep rail operations running. On the side I build T5, a developer-tools organization where we ship our own projects. Outside work: hiking, climbing, tinkering. Most of my learning goes to AI right now. It's the biggest shift to the craft I've seen, and one I'd rather lead than chase.
Disciplines
01 / Data
Schemas, migrations, integrations. The long-lived layer: domain models, the contracts between services, the data that outlasts whatever UI sits on top of it.
02 / Interfaces
Web, desktop, and hardware-adjacent apps. Angular in the office, MAUI and WPF trackside, whichever environment the work actually lives in.
03 / Tooling
On the side I build T5, a developer-tools organization where we create different projects. It's also the bench where I experiment with AI as a craft shift: what sharpens us, what doesn't, what deserves to be kept.
View on GitHub
Featured projects
All workFull-stack feature work on a maintenance platform spanning invoicing, assets, scheduling, and reporting.
2026
Tablet-and-laptop solution for two-operator field work in low-signal environments.
2025
iOS app for remembering where you parked. Meter reminder, photo of the spot, walks you back.
Live
2026
A native iOS app built on nights and weekends and shipped to the App Store. Fully offline by design: no accounts, no servers, no tracking. State and photos live on the device, where they belong.
This site, designed and built from scratch and self-hosted out of my home.
Live
2026
Next.js portfolio with a typographic editorial feel, blur-in animations on every masthead, and a static-export build so there's no Node runtime to run. Self-hosted on a Raspberry Pi 4 over a Cloudflare Tunnel with no port forwarding, no inbound exposure, TLS terminated at Cloudflare's edge and plain HTTP inside a Docker network. Two containers on the Pi: Caddy serves the built `out/` folder, cloudflared keeps an outbound tunnel open. Updates are one `npm run build` and an `scp -r out` away.