// senior software engineer

Chris Vouga

I build reliable software with AI coding agents, and the automated checks that keep it correct.

Open to conversations about staff roles

Phoenix, AZ · open to remote · US citizen · no sponsorship needed · UTC−7 (Arizona, no daylight saving)

Work

Geviti

Jan 2026 – Present

Senior Software Engineer

  • Shipped member-facing features on web and mobile for the Geviti member app: lab results, personalized protocols, prescriptions, and care-team coordination.
  • Built the path from a member's lab results to their personalized protocol: metrics they track over time, tied to the therapies their care team prescribes.

One Origin

2022 – 2025

Senior Software Engineer

  • Technical lead on Triangulator, which automates university transfer-credit evaluation: staff approve, adjust, or reject ranked suggestions instead of reviewing each course by hand.
  • Designed and built the learning-management-system integration for Orchard, ASU's assignment platform: single sign-on and grade sync, including recovery when a grade fails to post.
  • Reworked the backend of ASU Earned Admissions, where learners earn credit toward admission, and built its enrollment data sync and program opt-in flow.
  • Rebuilt payment processing for Study Hall, the learning platform ASU runs with Crash Course, cutting failed payments and making the flow safe to change.
  • Built the interactive schedule and news features of Sun Devils, ASU's athletics site.
  • Four quarterly recognition awards: 2024 Q1, 2024 Q2, 2024 Q3–Q4 (one award for both quarters), and 2025 Q1

Freelancing

2020 – 2022

Software Engineer

  • Delivered custom websites and web applications for small businesses, from scoping through launch and handoff.
  • Owned the client relationship alongside the code: requirements, timelines, and post-launch support.

Selected projects

Mockingbird documentation site: an install command and a request to the Stripe emulator

Realistic stand-ins for third-party services, so software can be tested end to end without calling the real thing.

Randomized walks check every emulator against the vendor’s own contract, so a passing test means something.

TypeScriptBunNode.jsSQLite
gamezilla in two phone-sized windows: one live chess game seen from each player’s side

A local-first multiplayer game platform for phones: a live space keeps working offline, then catches up on its own when the connection returns.

The specs, not the code, define the product: a rewrite that passes them is the same app.

TypeScriptReactPostgresTailwindWebSocketsBun+1
Workspace platform architecture: the repository and its CI gates, declared infrastructure, the hosted services, and the daily health loop

The monorepo and self-hosted platform behind this site and my side projects, where declared code is the only way to change infrastructure.

An AI coding agent cannot change production except through a pull request that passes every required check, and a daily drift report proves it.

TypeScriptOpenTofuNixOSGitHub ActionsDockerBun+6

Browse all 16 projects →

How I build

Specify first. Verify everything.

  1. Start from the spec.

    A change starts as written acceptance criteria, so a teammate or an AI coding agent works to a contract rather than a guess.

  2. Make verification automatic.

    Requirements become checks that run on every change. This site’s résumé fails the build if it spills onto a second page; its share card fails if text is clipped.

    5,438 tests across three public repositories.

  3. Let the pipeline decide.

    Nothing merges without passing continuous integration, whoever or whatever wrote it. AI coding agents draft; the pipeline is the gate.

    12 CI jobs behind 2 required checks on every pull request.

  4. Own the outcome.

    A daily read-only report compares the live platform with what the repository declares, and no plan can destroy a live database or bucket.

    16 health-check groups; 47 resources guarded against deletion.

AGENTS.md — the contract every AI coding agent in my repositories works under

A change, end to end

An agent’s change failed a CI test; the fix added tests; it merged green.

An agent co-authored a change that taught the CI infrastructure step to create the sign-in service’s database schemas before migrating them. (pull request #97) CI rejected it: the test that a schema bootstrap may only create empty schemas failed. (the failing run) The follow-up commit restructured the bootstrap so it could be tested, and added the tests that prove it. (fix commit 63c3757) It merged only once every required check was green.

When it failed

An agent broke a rule CI enforces, and a skipped check let it merge.

An agent co-authored change added direct cloud-provider calls to a deploy workflow, which breaks this repository’s rule that only declared infrastructure code may touch the cloud. (pull request #100) The policy test that forbids it already existed, but a path filter skipped the check for that pull request, so it merged. The check on the next, unrelated pull request caught it (pull request #101) and a fix removed the calls. (fix commit acc261f) What changed: the check no longer waits on a path filter; it runs on every pull request, whatever it touches. (the removed condition)

Tools. Day to day: Claude Code and Cursor, the co-authors named in this repository’s commit history. (74 and 78 co-author trailers.) One canonical command set is synced to every harness the repository supports. (6 harnesses: Claude Code, Cursor, OpenCode, Windsurf, GitHub Copilot, Codex / Agent Skills.)

Verified, not just shipped

These figures come from GitHub, computed by a script rather than typed by me. They count what the pipeline checked and stopped, not how much I committed.

  • 21pull requests failed CI, were fixed, then merged21% of 102 merged; none merged until every required check passed
  • 12CI jobs gate every mergebehind 2 required checks: Check, Fleet
  • 5,438tests in three public repositoriesworkspace, Mockingbird and headless-combobox
  • 38pull requests co-written with AI coding agentsof the 102, through the same gates

Merged pull requests in crvouga/workspace, from its first merged pull request, 2026-09-17 → 2026-10-26 · 33 automated snapshot pull requests excluded · computed 2026-10-26 by this script

Contribution calendar

Raw volume, for context: every contribution GitHub attributes to me, private repositories included. It shows activity, not quality.

25,393contributionsLast 12 months · 2025-10-26 → 2026-10-26

OctDecJanFebMarAprMayJunJulAugSepOct
Last 12 months: 25,393 contributions across 353 active days.

353 active days · longest streak 76 days · busiest day 1,587

Busiest day 2026-10-15: 1,587 contributions, against a typical active day of 34. 0% of the last twelve months' contributions are in private repositories, which GitHub counts but does not show.

Live data from the GitHub API at build time · 2026-10-26 · verify on GitHub

About

I'm based in Phoenix, AZ. My work has been in education and health software: university platforms for transfer credit, admissions and coursework, and tools that help people act on their lab results. In both, being wrong is expensive and quiet, which is why I build the checks first.

A degree in mathematics and statistics keeps me honest on the data-heavy parts. Away from the keyboard I play drums in a band.

EducationBachelor of Science in Mathematics & Statistics · Arizona State University · 2015–2020

Toolbox

AI-assisted engineeringClaude Code · Cursor · spec-driven development · CI-gated agent workflows · property-based testing
LanguagesTypeScript · JavaScript · PHP · Go · Python · Rust
FrontendReact · Nuxt · React Native · Tailwind · Vue · Astro
BackendBun · Node.js · Express · Flask · Graphene · GraphQL · WebSockets
DataPostgres · DynamoDB · SQLite · MySQL · Neo4j
Infra & CIAWS · Cloudflare · Docker · GitHub Actions · NixOS · OpenBao · OpenTofu · Playwright · Railway · S3
Also shipped with (9)

CSS · HTML · Bootstrap · Material UI · React Query · tRPC · Zod · Supabase · Heroku

Contact

Email me.

The address below goes straight to my inbox. There is no contact form and no recruiter screen in between.

Open to conversations about staff roles · Phoenix, AZ · open to remote · US citizen · no sponsorship needed · UTC−7 (Arizona, no daylight saving)