About
I'm Stephen Sawyer, a software engineer focused on practical systems and products that hold up outside the demo. I care about software that solves a real problem, can be operated by the people who own it, and stays legible when it needs to change.
Most of my work lands in three lanes. Python is where I move quickly on automation, integrations, APIs, and backend workflows. Go is for systems work, networking, observability, and long-running services. Browser-facing products use TypeScript, Bun, and Astro, with Vue added only when the interface genuinely needs richer client-side state.
What I care about
Ownership. I like software that can run on hardware you control, with data you can inspect and move when you need to.
Boring infrastructure. I prefer the deployment that is easy to explain and easy to recover, not the one that looks impressive in a diagram.
Explicit data models. Schemas, query paths, and storage decisions should make the system easier to reason about, not harder.
Shipping with discipline. I value iteration, but not chaos. The goal is to ship useful software and keep the complexity justified.
The stack
The default browser stack is TypeScript + Bun + Astro, with Vue reserved for interfaces that truly benefit from it. For terminal-heavy workflows, I like OpenTUI + TypeScript + Bun when an operator experience deserves more than a plain CLI.
For data, I default to PostgreSQL on products meant to grow and SQLite for local-first or embedded tools. Either way, I want the schema to be explicit and the data flow easy to trace.
On the frontend, Astro owns pages, delivery, and first render. I avoid adding client-side complexity unless the product clearly benefits from it.
This site itself runs on an Ubuntu VM using Astro static output, Docker, Caddy, and Cloudflare. That deployment shape says a lot about how I like to work: simple, inspectable, and dependable.