<- all posts
Directive 2026-05-12

The "Bus Factor" of One: Engineering for the Solo Dev

"Bus factor of one" isn't a risk you mitigate with more headcount when there is no headcount to add. You mitigate it with architecture. The design constraint: if I stop touching the stack tomorrow, it keeps running for five years.

By AP39 / / 6 min read

If I get hit by a bus tomorrow, the product suite keeps running for five years without a single human touching it. No pager goes off. No dependency silently rots the build. No customer wakes up to a 500 error because a certificate expired and nobody was around to renew it. That's not a hypothetical I like to entertain for morbid reasons. It's the actual design constraint I build against, because "bus factor of one" isn't a risk you mitigate with more headcount when there is no headcount to add. You mitigate it with architecture.

The Corporate Answer Doesn't Apply to You

Ask a VC-backed team how they handle operational risk and the answer is always some version of "redundancy through people." An on-call rotation. A DevOps team. A platform engineering org whose entire job is making sure the infrastructure keeps breathing while the product team ships features. That answer is correct for them and completely irrelevant to a solo developer, because the entire premise assumes a resource that doesn't exist: more humans to throw at the problem.

When you are the only engineer, "hire more people" isn't a lever you can pull, it's a sentence that doesn't parse. The only lever available is designing systems that need fewer people in the first place, ideally approaching zero. That's not a scaled-down version of the corporate playbook. It's a fundamentally different discipline, closer to engineering a satellite than staffing a help desk: once it launches, nobody's going up there to fix it, so it has to be right, self-correcting, or gracefully degrading, by design, before it ships.

Zero-Maintenance Architecture, Piece by Piece

Automated CI/CD as the only deployment path. If a deploy requires you to remember a sequence of manual steps, it will eventually get skipped, botched, or forgotten entirely the moment you're heads-down in a different project for three weeks. A self-hosted pipeline (Woodpecker CI watching a Gitea repo, in my case) that runs tests, builds, and deploys on every merge to main removes the human from the loop entirely. The deploy isn't something you do. It's something that happens as a consequence of the code being correct, which means there's no step to forget and no 2am manual deploy that goes wrong because you were tired.

Static analysis as a standing guard, not a one-time audit. A linter and a type checker running in CI catch an entire category of bug before it ever reaches a device in someone's pocket, without requiring you to personally remember to check for it. This matters more for a solo dev than for a team, not less, because a team has a second pair of eyes on every pull request. You don't. Your second pair of eyes has to be automated, or it doesn't exist.

Error tracking that pages nobody unless it's real. Self-hosted Sentry sitting quietly, aggregating exceptions, deduplicating noise, and staying silent until something actually crosses a threshold worth caring about. The goal isn't visibility for its own sake, dashboards you have to remember to check are just another chore with a different name. The goal is a system that interrupts you only when interruption is warranted, and says nothing the rest of the time.

Boring, stable infrastructure over "modern" infrastructure. A single well-specced server (Ryzen-class hardware, comfortable RAM headroom) running Postgres and a FastAPI backend is not exciting. It will never be the subject of a conference talk. It is also not going to page you because a managed Kubernetes control plane rotated a certificate in a way that broke your ingress rules. Every extra moving part in an infrastructure stack is an extra thing that can fail while nobody is watching, and for a bus-factor-of-one operation, "nobody is watching" is not a rare edge case, it's the default state of the system at every moment you're not actively looking at it.

Design for graceful degradation, not perfect uptime. A five-nines SLA is a promise you make when you have an on-call rotation to back it up. You don't have one. So the design goal shifts: if a background job fails, the system should retry itself, log it, and move on, not cascade into a full outage that requires a human to intervene before service resumes. Idempotent jobs, retry-with-backoff as a default pattern, and services that fail closed into a safe, non-destructive state rather than failing open into corrupted data. None of that prevents every failure. All of it prevents a failure from requiring you.

Code Designed to Be Forgotten

The phrase that actually matters here isn't "zero maintenance," which oversells the idea slightly. It's "designed to be forgotten." Every system in the stack should be able to sit untouched for six months and still behave exactly as it did the day it was deployed, which means the code itself has to be written with a specific kind of paranoia: minimal external dependencies, because every dependency is a future breaking change you didn't author and won't be around to react to; pinned versions everywhere, because "latest" is a promise that something, somewhere, will eventually break silently; and business logic that lives in your own codebase instead of behind a third-party API whose pricing, terms, or existence you don't control.

This is also the real argument against chasing every new framework and platform trend. A dependency you add today is a maintenance obligation you're implicitly promising to honor for as long as the product exists, whether or not you remember making that promise. The fewer promises like that stacked on top of each other, the more of the system can genuinely be forgotten without consequence, and the longer it survives your own attention drifting elsewhere, which for a solo developer running close to forty concurrent projects, is not a hypothetical. It's Tuesday.

The Actual Blueprint

Strip it down to the pattern underneath all of it:

  • Deployment is automatic, not procedural. If it needs a human to remember steps, it will eventually fail from a human not remembering steps.
  • Correctness is checked by machines before it ever reaches you, not caught by you after the fact.
  • Monitoring interrupts you only when something is actually wrong, never as ambient noise you have to triage.
  • Infrastructure is boring on purpose. Boring doesn't page anyone at 3am.
  • Failures degrade gracefully and retry themselves, rather than cascading into something that needs manual intervention to unstick.
  • Every dependency added is treated as a maintenance liability accepted on behalf of a future version of you who might not be paying attention.

None of this is more sophisticated than what a well-funded platform team builds. It's less sophisticated, deliberately, because sophistication is exactly the thing a solo operation can't afford to maintain. The corporate mindset optimizes for velocity under the assumption that a standing team will always be there to catch what breaks. The solo-dev mindset has to optimize for the opposite assumption: that nobody will be there, possibly for a long stretch, and the system has to be engineered to not need anyone in the first place.

That's the part that should actually terrify the hire-more-people crowd, not that a solo developer can ship a product, plenty of solo developers can ship a product. It's that a solo developer, forced by circumstance to design for zero ongoing human intervention, ends up building something more resilient to their own absence than most funded teams build with a full on-call rotation standing behind it. The team has people to catch the failure. The solo dev has no choice but to build a system that doesn't fail in the first place, or fails in a way quiet enough that it fixes itself before anyone, including you, ever needs to know.