GovSpend
Grew engineering from 2 to 13 and launched six AI products; customers named the four primary ones as deciding factors in $10M+ of new sales and renewals.
Open case studyEngineering leader. I build teams and ship AI products at scale.

Grew engineering from 2 to 13 and launched six AI products; customers named the four primary ones as deciding factors in $10M+ of new sales and renewals.
Open case study
What I build with my own hands - an agent that runs incident response end to end.
Open case study
Change the Game. My animation framework took it from freezing phones to 60 FPS and unblocked launch.
Open case study
Platform for Google events
Open case studyEngineering leader. I build teams and ship AI products at scale.
GovSpend · Government procurement intelligence SaaS
Lattice · HR and performance management SaaS
Little Cinema Digital · Interactive streaming platform
Izllo · Marketplace startup
Earlier: AKQA (Audi USA), 2015 - 2017 · The Barbarian Group (Samsung US), 2015
How can I make myself replaceable?
My management philosophy comes down to one question I ask myself: how can I make myself replaceable? People grow most when they have clarity on what success looks like, the autonomy and trust to find their own way through, and consistent, pointed feedback along the way. My engineers would describe my style as collaborative, structured, trusting and autonomous. I am a hands-on coach early on, then I deliberately step back so people can grow into ownership.
Four tech leads I coached now own their roadmaps and operate without me in the room. At GovSpend I promoted two engineers to Staff and one to engineering manager. That is the measure I actually care about.
The hardest part of working this way is the discipline to refrain from stepping in, especially when you can see something about to go wrong and you know exactly how to fix it. Letting someone experience it and then coaching them through the reflection is almost always more effective than solving it for them. The risk is stepping back too early, before somebody is ready, and I guard against that by being explicit about what success looks like and staying closely observant at the start.
When somebody wants a decision from me, I ask for four things: the problem, the options they considered, the tradeoffs, and their recommendation. I call it the Decision Stack. People stop bringing me problems and start bringing me their call. They own the decision, and I weigh in if I see a risk they missed.
Telling whether a team is actually succeeding comes down to four things, and they build on each other. Clarity: everyone individually understands the why behind the mission. Metrics: measuring cause and effect, so we understand our impact and can realign when we need to. Synergy and ownership: an environment where everyone feels responsible for the outcome, with no egos and no gatekeeping, just a shared urgency to succeed together. And delivery: a target date is the focal point that closes the loop, because knowing the when informs both the strategy and the urgency.
Once a team has clarity, metrics and ownership, I rarely have to chase the date. They hit it on their own.
I evaluate engineers on two pillars. Impact, which is reliability, performance and scalability. And communication and leadership, which is alignment, clarity and knowledge-sharing. At the higher levels I expect engineers to design systems that other teams build on. I wrote these into a career matrix with four levels: Associate, Engineer, Senior and Staff. Using AI well is part of what I expect at every level.
On team structure, I aim for roughly thirty percent senior, forty percent mid and thirty percent junior. It creates growth paths without sacrificing delivery on complex work. I keep a primary and a secondary on every project so no single person is a point of failure. I change the structure as the business changes, and I keep each engineer's growth in mind when I do.
Across a larger org, I made RFCs mandatory for significant work and anchor my reviews on production risk, scale and maintainability: what happens if this fails, how do we mitigate it, what will this cost in production? I lean on the experts on my team. My job is to set things up so the right decisions get made, even when I am not in the room.
I lead engineering teams that ship. Most recently I was Director of Software Engineering at GovSpend, where I grew engineering from two people to thirteen across four product tracks and launched six AI products. Customers named the four primary ones as deciding factors in more than ten million dollars of new sales and renewals. Before that I managed a ten-person platform team at Lattice, led the team behind a no-code streaming-site builder at Little Cinema, founded a startup, and was a web engineer at Google.
With people, I start by learning what drives each person and where they want to grow. Then I set them up and step back. At GovSpend I promoted two engineers to Staff and one into engineering management. I am prouder of that than of anything I have shipped.
I still write code. I want to know the work I am asking my team to do. At GovSpend I built our AI evaluation layer on top of Mastra - golden datasets, blinded LLM-as-judge and human review, CI/CD gates - and on my own time I build agents like the AI Chief of Staff in the work section.
I have been taking things apart since I was six, starting with toys and old computers. I still like finding out how things work.
Outside work I dance, travel, play piano, train in martial arts, and try something new as often as I can.
Five pieces on TypeScript's error messages, static typing, and what to do with an engineer who is failing in the wrong role. Read over thirty thousand times.
30,000+reads on Medium
Poor Performer? You Might Just Have Them in the Wrong RoleI once managed a junior engineer who was struggling in a conventional software-development position.
The TypeScript Guide I Wish I Had
A Cheat sheet for Python and Typescript static typing
Conquering a complex error in TypescriptHow to read and understand the Object Literal error
How To Read Errors in TypeScriptTypeScript can be riddled with errors and warnings, for seemingly every little thing. Take this function for example:Hiring an engineering leader? Let's talk. I am open to Engineering Manager, Senior Engineering Manager and Director roles. Email is the most direct, my resume is a PDF you can download, and you can also find me on LinkedIn or GitHub.