Westerville, Ohio
About
I write software for the wrist, the phone, the dock and the kitchen table, and I test each one where it gets used. Most of it began as something that went wrong on a race course.
Where I am
I live in Westerville, Ohio. From 2021 to September 2026 I was a software engineer at JPMorgan Chase, mostly on account opening: I built a platform from nothing with five other engineers, and I owned the reconciliation and cutover for a legacy migration where losing one row was not an acceptable outcome. For four of those years I also led the Columbus site's early-careers program, a workstream of more than forty people.
That is where the habit comes from. I would rather prove a thing works than describe it working, which is why the projects below tend to arrive with a measurement attached.
I teach and coach at Hoover Sailing Club — US Sailing Level 3, the national-championship coaching credential. I direct the club's Junior Race Team and coach its high-school sailors, and two of the projects below exist because of them. The boat is an Interlake, sail number 1340, and it is the test rig for nearly everything else here.
I'm open to a full-time role and to contract work. What fits is the kind of work on this page: an app built end to end, from the database's access rules to the store listing, or a team's AI coding agents given the review steps and hard refusals that make their output safe to merge.
What I'm building
Most of it is for a sailing club: the race course, the dock, and the parents on shore.
The club's photo site, at photos.madcowsailing.com, is where parents and coaches send regatta and practice photos of the sailors. Nothing is public until it is approved, and no photo keeps the record of where it was taken.
Coaches' Dockbox replaces a paper attendance sheet and TeamSnap for the club's coaches. A coach marks each sailor with one thumb as they reach the dock, and anyone still missing at the start is one tap from a guardian's phone. Medical notes are readable only through a single server function that checks who is asking and logs every view. It pilots with the Junior Race Team in spring 2027.
Race Timer runs the ISAF and US Sailing start sequences on a watch, offline. The interesting part was accuracy. The worst signal in a race used to land 212 ms off its mark; across 150 cues on a real watch it now lands within 61 ms, because every cue is rendered ahead of time and scheduled against a monotonic anchor rather than polled. A horn on the gun and a horn near it are different products.
Buoyant is BLE control for robotic race marks, so a race officer can move a course from the committee boat instead of dragging anchors.
Burgee is the club and regatta software underneath the timer and the marks — entries, scoring, protests, and the committee-boat half that the desk-bound tools leave out.
Tender finds crew for a skipper with an empty seat on race day, and widens the search on its own as the start gets closer. A sailor's phone number stays hidden until a match forms, and Postgres enforces that rather than the app, so getting around the app does not get around the rule.
The sailing apps live on madcowsailing.com, which is a separate site for a separate reader.
Under all of it is Cairn, the record and the guardrails I build with. AI coding agents do a share of the work here, and Cairn decides what they may do without a review, refuses the rest at the tool call, and hands every finding they report to a second agent whose job is to prove it wrong. How that works.
Open for testing
Taskr has nothing to do with boats. It splits a household's chores by the time each person has, and when a fair split is not arithmetically reachable it says so instead of rounding until it looks fair. That refusal turned out to be the whole problem, and it is the part I want to get right.
It is far enough along for other households to use. Start one at taskr.madcowhq.com; it runs in a phone's browser.
Getting in touch
I'm open to a full-time role and to contract work. Email is the fastest route, and I answer it.