I build the unglamorous parts of software — the deploy systems, the SDKs, the build pipelines, and the internal tools the rest of the product depends on.
I am Theo Aldridge, a software engineer based in Berlin. For the last decade I have worked on infrastructure and developer tooling at companies where engineering taste is taken seriously. Stripe taught me how to write APIs that survive a decade of use. Vercel taught me how a small team can ship at a pace that looks unreasonable from the outside.
Right now I consult independently. I take on one project at a time, usually three to six months long, with teams who need an engineer who can both write the code and explain the decisions in a document that someone in six months can actually understand.
Berlin · open to remote · last updated May 2026
About
I started writing software the way many engineers in my cohort did — building small things on the side, falling in love with the part where you press save, hit refresh, and something you imagined exists. Twenty years later, the loop is still the most interesting one I know.
My professional career has been mostly in payments and developer platforms. At Stripe I worked on the API client libraries — the things that thousands of integrations call every second. At Vercel I worked on the build and deployment pipeline, the parts you only notice when they break. I am drawn to the layer of software that sits beneath the product, the layer where a single mistake propagates outward into thousands of incident reports.
Outside work I read more than I should, run middle distances badly, and maintain a few open-source TypeScript libraries that have lived longer than several of my employers. I am married, no children, two plants that have somehow survived since 2019.
Previously
Stripe — Senior Software Engineer, API Libraries (2 years)
JSConf EU 2024 · NodeConf Remote 2023 · TSConf 2022
Education
BSc Computer Science, Imperial College London, 2014
Languages
English (native) · German (B2, conversational) · Swedish (A2, polite)
Experience
2025 — Now
Independent Consultant
Self-employed·Berlin
Led the migration of a Series-B fintech's SDK monorepo from Lerna to a custom Turborepo + changesets pipeline, cutting CI time from 22 to 6 minutes.
Designed a typed event-sourcing layer for a healthcare scheduling platform, replacing a fragile webhook system that had caused three production incidents.
Currently working with a developer-tools company on the open-source release of their internal task runner.
2022 — 2025
Staff Software Engineer
Vercel·Remote
Owned the build pipeline that compiles, bundles, and deploys roughly a million projects per month. Reduced cold-build p95 by 41% across a calendar year.
Designed and shipped the incremental compile cache used by Turborepo, which is now relied on by the majority of large customers and most of the internal monorepo.
Hired and mentored four engineers onto the platform team, two of whom are now senior engineers in their own right.
2020 — 2022
Senior Software Engineer
Stripe·Remote
Maintained and extended the Node.js and TypeScript client libraries, used by more than a hundred thousand integrations in production.
Led the migration of the public reference docs onto a new TypeScript-first generator, reducing the time from API change to published documentation from days to hours.
Wrote the internal RFC that became the company-wide standard for SDK versioning and deprecation.
2016 — 2020
Software Engineer
Heroku (Salesforce)·London / Dublin
Worked on the buildpack subsystem and the Node.js runtime, including the migration to a Rust-based buildpack lifecycle.
Wrote the open-source memcached add-on integration that is still in use today, more than nine years after the first commit.
Mentored junior engineers and ran the internal hiring loop for the platform organisation for two years.
A typed, minimal task runner for TypeScript monorepos. Reads a small config file, builds a dependency graph, runs tasks in parallel with content-hashed caching, and gets out of your way. No plugins, no daemons, no opinions about your bundler.
I built grove because every existing task runner I tried either insisted on running its own dev server, or required a configuration file longer than the code it was orchestrating. It has been used in three production monorepos so far, and is the only tool on this list I would happily depend on tomorrow.
An opinionated linter for changesets. Reads your repository's changelog files and enforces a small set of rules: every changeset must reference at least one issue, version bumps must match the type of change described, and breaking changes must include a migration note.
The tool came out of a frustration shared with my team at Vercel — the changelog had drifted from being a record of what changed to a place where engineers said vague things to satisfy CI. lockstep does not solve culture, but it makes the cultural decision visible at the point it happens.
A small Rust library for content-addressed build caching. Stores artifacts keyed by the hash of their inputs and exposes a tiny stable API to JavaScript via N-API. Used internally at three companies and as the cache layer in grove.
I wrote this because the existing JavaScript-side caches I tried became the bottleneck once a monorepo got beyond a few hundred packages. The Rust core does the hashing and the disk IO; the JavaScript bindings stay deliberately thin. It is the smallest project on this list and probably the one that has earned the most CPU back per line of code.
A TypeScript code generator that reads a Postgres schema and produces a fully typed query layer — including row types, insert types, partial update types, and a small fluent query builder. No runtime dependency on an ORM, no decorators, no magic.
I built atlas-types after spending too many afternoons fighting with Prisma generators and Drizzle's type inference. It is intentionally less powerful than either of those projects. What it does, it does fast and predictably, with type errors that point to the column you misspelled.
A small CLI for sending operational pages from a terminal. Reads a YAML on-call roster, knows about your team's timezones, and writes a paging log that you can later review. Speaks Slack, Pushover, and PagerDuty as backends; speaks plain text to your shell when you are offline.
I built dispatch during a long winter at Heroku, after one too many incidents where the page went to the wrong person because the rotation calendar had not been updated. It is the project I am least proud of architecturally and the one I have re-used in the most places.
A small static analyser that reads pnpm and npm lockfiles and tells you which transitive dependencies have been added in the last week, which have changed major version, and which now have known CVEs. Designed to run in CI as a five-second pre-merge check.
I wrote lockfile-lens because dependency review on most teams is either nonexistent or theatre. This one runs fast enough that engineers actually read its output, and it is opinionated enough that it occasionally blocks a merge for a reason worth blocking on.
Consulting with a Series-B developer-tools company on the open-source release of their task runner. Three days a week through August.
Writing a short book on the design of typed SDKs. Around 30,000 words drafted, probably twice that before the first real edit.
Reading Designing Data-Intensive Applications (again) and Annie Ernaux's The Years.
Running three to four times a week, currently training for a half-marathon in September that I will almost certainly not enjoy.
Not on Twitter, Threads, or Bluesky. The Mastodon link in the sidebar is the only social account I check.
Get in touch
I am open to interesting infrastructure problems. Berlin or remote. The best brief is short and specific: a paragraph on the problem, a paragraph on the team, and a sentence on the timeline.