Software developer at Synaptic. I work on backend systems, infrastructure and developer tooling — mostly problems where the hard part is staying correct under failure: replication streams, offline nodes, exactly-once delivery. NSUT '26.
I own data collection, the customer-facing app, our MCP server, and an in-house BI platform that replaced Sigma. Recent work: cut a data-collection page load from 4.17s to 0.55s, migrated 149 live dashboard queries onto the new BI platform with zero regressions, and hardened the input schemas across all 24 MCP tools. Earlier, I migrated the Forge admin tool from MySQL to Postgres — database and application code — and folded its codebase into the main admin app, so there is one system to maintain instead of two.
gatecrash — offline-first event infrastructure that runs an entire venue off a single Raspberry Pi with no internet. Exactly-once ticket redemption on a SQLite compare-and-swap, a hash-chained audit log with Merkle inclusion proofs, BLE mesh over the Noise protocol, and a self-hosted CA, DNS, DHCP and captive portal. 32 Go packages, 5 clients (web, iOS, Android), and a deterministic simulator that injects power loss so recovery is proven rather than hoped for. Go, MIT — docs.
walcast — Postgres change data capture for Node, built on a pgoutput binary decoder I wrote by hand instead of wrapping wal2json. Async iterator with explicit LSN acknowledgment, plus sinks for webhooks, SSE, Kafka and gRPC across an 8-package monorepo. On npm as walcast — docs.
Desklock — macOS menu-bar screen lock that holds an IOKit power assertion, so a long-running agent session survives a locked screen. Salted SHA-256 PIN in the Keychain, input swallowed at the event-tap level. 15+ engineers at Synaptic use it in place of Caffeinate and Amphetamine.
pdf-actions — npm package for merging, splitting, rotating and numbering PDFs entirely in the browser, no upload. 42 releases, 300+ weekly downloads, 1,000+ users on the hosted app.
Agent tooling is part of how I ship, so I treat it like the rest of the codebase — versioned, reviewed, and scoped to the repo it lives in. In MemberStore that means a CLAUDE.md that is nothing but @-imports, an AGENTS.md carrying a machine-managed rules block that points agents at the framework docs vendored under node_modules, and five Agent Skills — one of which splits ~80 React performance rules into individual namespaced files so only the relevant ones ever get loaded. 15+ engineers at Synaptic use them. At work the same instinct shows up as owning our MCP server and tightening the input schemas across its 24 tools.
Go, TypeScript, Python, Swift · Postgres, SQLite, Kafka · Node, Next.js, React · Docker, Linux, Raspberry Pi