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.