Half-life of in-house infrastructure  / field guide
Practitioner field guide · 7 September 2026

The half-life of in-house infrastructure

A decade of Uber's platform, reconstructed entirely from its own public repositories: what it built, what it gave away, what it archived on a single day in December 2019, and what it left standing with no commits and no warning label. The systems Uber donated are the ones still running in 2026; several of the systems it kept are quietly dead.

47 primary artefacts 24 published systems 4 operator incident reports Evidence through September 2026 Read: 33 min
01

The territory

Past a certain size, every engineering organisation builds systems it could not buy. The expensive decision is not the build. It is deciding, five years later, which of those systems still earns its maintenance, and how to get out of the ones that do not.

Almost nobody publishes that second decision. Build announcements are a genre; retirement notices are not. Uber is the rare case where the whole arc is legible, because it published an unusually large fraction of its platform as open source and then, over ten years, let the repositories record what happened next. There are 176 repositories in the live uber organisation and 160 in a second organisation called uber-archive, whose profile reads, in full, "Uber's open source projects archive. Support and/or new releases are not available." Both counts were taken on 7 September 2026.

That ratio is the finding this guide is built around, and the sorting of the two piles is the surprise. The Uber-originated software that is unambiguously alive in 2026 is almost all software Uber gave to somebody else: Jaeger to the CNCF, Hudi to the Apache Software Foundation, Horovod and Ludwig to the LF AI & Data Foundation. The software it kept has fared worse. Cherami, its durable message queue, and Hyperbahn, the routing mesh for its in-house RPC protocol, were both archived on 18 February 2021. Peloton, its unified scheduler, has not taken a public commit since 1 October 2019 and still carries no deprecation notice at all. And Cadence, the workflow engine it neither kept close nor donated, was forked by its own creators into a venture-backed company and has since moved out of the uber GitHub organisation entirely.

160
repositories in uber-archive, against 176 in the live organisation
2,700
Uber microservices emitting about 10 billion spans per day
13
archived projects re-labelled "deprecated and not maintained" on one day, 3 Dec 2019
555
open pull requests in donated Hudi when its maintainers triaged the backlog

What this guide covers, and what it cannot

The corpus is the repository record and only the repository record. This session's network policy reached github.com and refused every other host tested, including uber.com. Uber's engineering blog, its conference talks and its papers are therefore absent, and so is every internal system that was never published: Schemaless, Docstore, Michelangelo, the domain-oriented service architecture, the move off its own data centres. None of those appear here, and no claim in this guide should be read as covering them.

Read positively, the constraint produced a better artefact than a blog survey would have. A company blog post is a sanctioned account written at the moment of maximum optimism about a system. A repository is an unsanctioned one, written continuously, and its most honest fields are the ones nobody edits on purpose: the date of the last commit, the presence or absence of an archive banner, the age of the oldest open pull request. Those fields are what this guide reads. They are also the fields your own architecture review should be reading about every dependency you are about to adopt.

The naming this guide adds

Retired infrastructure leaves by one of three doors, and the sources call them nothing at all because each company invents its own vocabulary. This guide names them donated, deprecated and drifted. Donated means transferred to a foundation with maintainers outside the originating company. Deprecated means archived with a dated, visible notice. Drifted means still presented as a live project, with stars, a README in the present tense and no warning, while the commits stopped years ago. Drift is the one that costs a stranger real money, and it is the most common.

Figure 1 · Three doors out of in-house infrastructure

yes

no

yes

no

Published
in-house system

Maintainers
outside the
company?

Donated
Jaeger, Hudi,
Horovod, Ludwig

Someone wrote
the exit note?

Deprecated
Cherami, Hyperbahn,
Makisu, Prototool

Drifted
Peloton, AresDB,
Ringpop, Zanzibar

Still shipping
in 2026

Dead, and
says so

Dead, and
does not say so

yes

no

yes

no

Published
in-house system

Maintainers
outside the
company?

Donated
Jaeger, Hudi,
Horovod, Ludwig

Someone wrote
the exit note?

Deprecated
Cherami, Hyperbahn,
Makisu, Prototool

Drifted
Peloton, AresDB,
Ringpop, Zanzibar

Still shipping
in 2026

Dead, and
says so

Dead, and
does not say so

The sorting is not by technical quality. It is by whether anyone outside the originating company was ever given a reason to maintain the code. Counts and dates from the uber-archive listing and the individual repositories, checked 7 September 2026.
Diagram source
02

How it was actually built

Reconstructing the platform from the repositories that implement it, layer by layer, with the fate of each layer attached. Every box below is a repository that exists and that was read for this guide.

By 2016 Uber had a full-stack, self-built platform, and it had built it in a specific and recognisable order: transport first, then coordination, then the things that ride on top. TChannel was the wire protocol, described in its own repository as "a multiplexing and framing protocol for RPC calls"; Hyperbahn was the router mesh in front of it, offering "service discovery and routing for large-scale microservice operations" plus timeouts, retries, load balancing, rate limiting and circuit breaking. Ringpop sat inside the application processes and provided "scalable, fault-tolerant application-layer sharding for Go applications" through gossip and a consistent hash ring. Cherami carried asynchronous work as "a distributed, scalable, durable, and highly available message queue system we developed at Uber Engineering to transport asynchronous tasks."

Every one of those four is now dead. Hyperbahn and Cherami were archived on the same day, 18 February 2021, which is itself informative: retirement at Uber happens in batches, on a date somebody scheduled, not continuously. Ringpop carries the parenthetical "(This project is no longer under active development.)" in its README but has never been archived, so it still appears in search results as a live library. TChannel's Go implementation has never been archived either, and the organisation listing shows it updated on 1 September 2026, which places a library in an odd state: the protocol client is nominally maintained while the router that gave the protocol its reason to exist has been read-only for five and a half years. Neither repository names a successor. Anyone reading only the repositories would not learn that the industry converged on gRPC.

The layer above is where Uber's building was most aggressive and where the record is most mixed. For scheduling it wrote Peloton, "a unified resource scheduler to co-schedule mixed types of workloads such as batch, stateless and stateful jobs in a single cluster", targeted at "millions of containers and tens of thousands of nodes" and built, decisively, on Mesos. The architecture in its README wires a host manager that "abstracts away Mesos details from other Peloton components" to Zookeeper and Cassandra. That is a 2018 bet against Kubernetes, made by a team with a credible reason to think Kubernetes would not reach their scale, and the public record of it ends on 1 October 2019 with a commit titled "Use mesos plugins to launch tasks in V0 API". No notice, no successor, no archive.

Two neighbouring components in the same layer went the other way, and the difference is instructive. Makisu, the unprivileged image builder "designed for unprivileged containerized environments such as Mesos or Kubernetes", was archived cleanly on 4 May 2021 once the ecosystem produced equivalents. Kraken, the peer-to-peer registry that distributes those images, is still receiving commits in 2026 and is one of the few Uber infrastructure repositories that publishes measured numbers: "in production at Uber since early 2018", "more than 1 million blobs per day", a peak of "20K 100MB-1G blobs in under 30 sec", and a 3 GB image reaching 2,600 concurrent hosts at p50 10 seconds, p99 18 seconds and p99.9 22 seconds. Kraken survived because no industry standard arrived to replace it. Makisu did not, because one did.

The data layer, and the donation pattern

Uber's data platform is the clearest demonstration that the survival of a component has almost nothing to do with how good it was. Marmaray, "a generic Hadoop data ingestion and dispersal framework and library", was archived on 5 January 2024. AthenaX, the SQL streaming platform, last moved in June 2020. AresDB, "a GPU-powered real-time analytics storage and query engine" with 3,100 stars, took its last public commit on 23 April 2020 and has no archive banner. uReplicator, the Kafka replicator Uber wrote because MirrorMaker's rebalance behaviour did not hold up, is unarchived and unmarked. Chaperone, the Kafka audit system, stopped in January 2021.

Hudi, the one piece of that stack Uber gave to the Apache Software Foundation, is a different animal in 2026: an active project with a formal RFC process, 111 numbered design proposals, and a tracker in which production data-loss reports arrive weekly. It is demonstrably alive, which is what the donation bought. Section 4 shows what it cost.

Figure 2 · The 2016 platform, with each layer's 2026 fate

runs

images

Zanzibar gateway
drifted

TChannel and Hyperbahn
archived 2021-02-18

Services, sharded
by Ringpop
drifted

Cherami queue
archived 2021-02-18

Cadence workflows
forked out to Temporal

Jaeger and M3
donated to CNCF

Marmaray into Hudi
archived, then donated

Peloton on Mesos
drifted 2019-10-01

Kraken registry
alive

runs

images

Zanzibar gateway
drifted

TChannel and Hyperbahn
archived 2021-02-18

Services, sharded
by Ringpop
drifted

Cherami queue
archived 2021-02-18

Cadence workflows
forked out to Temporal

Jaeger and M3
donated to CNCF

Marmaray into Hudi
archived, then donated

Peloton on Mesos
drifted 2019-10-01

Kraken registry
alive

The request path Uber built for itself is now almost entirely red, while the two green boxes are the observability stack it gave away and the one distribution problem no standard picked up. Fate follows the ownership boundary, not the depth in the stack. Reconstructed from the individual repositories listed in the evidence wall, checked 7 September 2026.
Diagram source

The transport layer is where in-house dies first

A wire protocol is the component with the strongest industry gravity, because its value is entirely in how many other things speak it. Uber's protocol, its router and its application-layer sharding library all stopped inside the same window.

Read at: tchannel-go, hyperbahn, ringpop-go

Distribution outlives orchestration

Peloton, which competed with Kubernetes, is silent. Kraken, which competes with nothing in particular and solves a bandwidth problem the standard registries never addressed, still ships and still publishes benchmarks.

Read at: peloton, kraken

Language and code health outlive systems

The longest-lived things Uber published are not distributed systems. The Go style guide has 17,700 stars, and NullAway, which promises build-time overhead "usually less than 10%", was still updated on 7 September 2026, nine years in.

Read at: uber-go/guide, NullAway

Where the record ends, and where it starts again

The last two years of the uber organisation look nothing like the first eight. The recent repositories are SubmitQueue, "a high-performance speculative merge queue that keeps your trunk consistently green at scale", updated 4 September 2026; tango, which computes changed targets for it; hermetic_cc_toolchain for cross-compiling under Bazel; scip-lsp. Alongside them sits ADR, "an enterprise security system for AI agents", with an accompanying MLSys 2026 paper and a README saying it is "deployed in production at Uber". Uber is no longer publishing distributed-systems primitives. It is publishing monorepo build tooling and agent security. That is what a platform organisation's output looks like once the primitives underneath it have become somebody else's problem, which is the state most large engineering organisations are moving toward and the state this whole guide is really about.

Figure 3 · Retirement happens in batches, not continuously

2019-10-01
Peloton stops
no notice

2019-12-03
13 projects relabelled
deprecated in one day

2020-04-23
AresDB stops
no notice

2021-02-18
Cherami and Hyperbahn
archived together

2021-05-04
Makisu archived

2022-03-04
Prototool archived
names Buf

2024-01-05
Marmaray archived

2025 to 2026
new output is build
tooling and agent security

2019-10-01
Peloton stops
no notice

2019-12-03
13 projects relabelled
deprecated in one day

2020-04-23
AresDB stops
no notice

2021-02-18
Cherami and Hyperbahn
archived together

2021-05-04
Makisu archived

2022-03-04
Prototool archived
names Buf

2024-01-05
Marmaray archived

2025 to 2026
new output is build
tooling and agent security

Two clustered dates carry most of the visible retirements. Drift, by contrast, has no date at all, which is exactly why it is dangerous. Dates from the archive banners and commit histories of each repository, checked 7 September 2026.
Diagram source
03

The decisions that matter

Four forks where the repository record shows both the choice and its consequence, each with the condition that would flip it for a reader facing the same call.

Decision: build the RPC substrate, or wait for the standard?

Chosen
  • Build TChannel and Hyperbahn, from 2015
  • Nothing off the shelf offered multiplexed framing plus a routing mesh with retries, rate limiting and circuit breaking in one layer
Rejected
  • Wait for an industry protocol
  • The record contains no rejection rationale, because Uber published the build and never published the retirement reasoning
Flips when
  • A multi-vendor standard covering most of your requirement reaches 1.0 before your in-house version reaches full internal adoption. Then the build becomes a migration you will pay for twice.

Decision: donate to a foundation, or keep it in the organisation?

Chosen
  • Donate Jaeger to the CNCF, Hudi to Apache, Horovod and Ludwig to LF AI
  • At graduation in 2019 Jaeger had "7 committers from 2 organizations, Uber and Red Hat", so the maintenance base was already not Uber alone
Rejected
  • Keeping them under the company organisation, as Peloton, AresDB and Zanzibar were kept
  • Every one of those is now silent
Flips when
  • The component encodes a competitive advantage, or you cannot fund the review load a foundation project generates. Hudi's 555 open pull requests are what that load looks like when nobody funds it.

Decision: open-source a system whose creators could capitalise it?

Chosen
  • Publish Cadence in 2017 under the company organisation, with no foundation
  • The engine's value was separable from Uber's data
Rejected
  • Foundation governance at publication time, which is what Jaeger got
  • The outcome: Temporal states plainly that it "originated as a fork of Uber's Cadence" and is "developed by Temporal Technologies, a startup by the creators of Cadence"
Flips when
  • The system is generic enough to be a product on its own. Then neutral governance at day one is the only thing that keeps the community with you rather than with the people who wrote it.

Decision: archive loudly, or let the repository drift?

Chosen
  • Both, inconsistently. Cherami, Hyperbahn, Makisu, Prototool and Marmaray got dated archive banners; Prototool's even names its successor, Buf
  • Peloton, AresDB, uReplicator, Zanzibar and Neuropod got nothing
Rejected
  • A uniform policy
  • The cost of the missing banner falls entirely on strangers evaluating the project
Flips when
  • Never. Archiving costs one action and is reversible. This is the one decision in this guide with no defensible other side.

Figure 4 · Should this be an in-house system?

yes

no

no

yes

no

yes

Candidate
in-house system

Converging industry
standard exists or is
credible within 2 years?

Adopt it. Budget the
gap as a wrapper,
not a platform.

Is the design
separable from
your data?

Build and keep.
Publish only if you
will staff the tracker.

Can you fund
2+ maintainers
for 5 years?

Donate at publication,
with neutral governance
from day one.

Publish, and write the
exit criteria into the
README now.

yes

no

no

yes

no

yes

Candidate
in-house system

Converging industry
standard exists or is
credible within 2 years?

Adopt it. Budget the
gap as a wrapper,
not a platform.

Is the design
separable from
your data?

Build and keep.
Publish only if you
will staff the tracker.

Can you fund
2+ maintainers
for 5 years?

Donate at publication,
with neutral governance
from day one.

Publish, and write the
exit criteria into the
README now.

Every terminal node is an action with an owner, not a judgement. The middle branch is the one Uber's record argues for most strongly, and the one most organisations skip. Derived from the outcomes in the evidence wall.
Diagram source
DecisionChosenOutcome by 2026Flips whenEvidence
RPC transportTChannel plus HyperbahnRouter archived 2021-02-18; client driftedA standard reaches 1.0 before your internal rollout completeshyperbahn
Application shardingRingpop gossip and hash ring"No longer under active development", never archivedYour sharding can move into the data layer or a service meshringpop-go
Cluster schedulingPeloton on MesosLast public commit 2019-10-01, no noticeThe standard's published ceiling exceeds your projected fleetcommit history
Image distributionKraken, peer-to-peerAlive, still publishing benchmarksRegistries solve your tail latency at 15k hosts, which they still do notkraken
Image buildingMakisu, unprivilegedArchived 2021-05-04An ecosystem builder ships the same unprivileged modemakisu
Protobuf toolingPrototoolArchived 2022-03-04, points to BufA funded competitor appears; hand over rather than competeprototool
TracingJaeger, donated to CNCFGraduated Oct 2019, 23.2k stars, activeYou cannot supply two organisations' worth of committersgraduation proposal
Workflow engineCadence, company org, no foundationForked into Temporal; repository left the uber orgThe creators can raise money on ittemporal
04

What broke in production

Four operator-filed incident reports and one standing design defect, grouped by failure class. Read the attribution carefully: none of these was written by Uber.

The absence is the finding

Uber has published no postmortem reachable in this corpus. A company that gave the industry Jaeger, Hudi, Horovod, Cadence and M3 has left the failure record of those designs to be written by other people, in other people's bug trackers, years after the design decision was made. Every incident below was filed by an operator running Uber-originated software, and two of them still have no maintainer response. If you are adopting a donated project, that tracker is your postmortem archive, and it is the thing to read before the README.

Class A: silent data loss when a restart overlaps its predecessor

Postmortem

Two write coordinators lived for ten minutes and one batch vanished

AssumptionA job reaching a terminal state has finished shutting down, so the replacement can safely take over.
What happenedA Flink job was stopped and immediately restarted. The JobManager reported CANCELLED, the new job started a second coordinator, and the old coordinator's close() did not complete for another ten minutes because HDFS was slow. Both wrote to the same table. The new coordinator's write events overwrote buffered events belonging to the old coordinator's instant, and that batch was silently dropped.
Blast radiusUnquantified production data loss on a MOR-Avro table, discovered the following day. One subtask logged marker files from two different instants inside the same checkpoint window.
FixStill open. The reporter proposed four options, of which only one is structural: distributed locking or fencing tokens per table.
Design ruleIf a component can be restarted while its predecessor is still shutting down, correctness cannot rest on the shutdown finishing. It needs a fencing token the storage layer checks. A timeout is a guess about the slowest dependency you have, and here that dependency was a filesystem.
Postmortem

A checkpoint captured an empty buffer and orphaned the files it described

AssumptionCheckpointed coordinator state is a faithful record of in-flight work.
What happenedThe write function requests an instant on the first record but sends its metadata event later. A checkpoint taken between those two moments serialises an entry whose slots are all null. On failover the recovered checkpoint overwrites the populated live buffer, and the instant never commits, "orphaning the already-written data/log files".
Blast radiusSilent loss of in-flight instants on every same-graph global failover; reported 7 July 2026 and assigned, not resolved.
FixProposed: exclude partially filled entries from the checkpoint until every subtask has reported, or keep the coordinator's heartbeat alive through failover so inflight instants can be retried.
Design ruleAny state that is written in two steps must be checkpointed in one. If your snapshot can catch a record between "reserved" and "described", the snapshot is a mechanism for losing the reservation, not for preserving it.

Figure 5 · How the ten-minute overlap dropped a batch

Hudi tableCoordinator 2 (newjob)TaskManagerCoordinator 1(closing)Hudi tableCoordinator 2 (newjob)TaskManagerCoordinator 1(closing)job state CANCELLED,close() still blocked on HDFSbatch for ...43462 never committeddiscovered the next daycommit instant ...238511create instant ...434622flush data against ...434623WriteResultEvents buffered4create own instant ...432205new events overwritebuffered ones6
Hudi tableCoordinator 2 (newjob)TaskManagerCoordinator 1(closing)Hudi tableCoordinator 2 (newjob)TaskManagerCoordinator 1(closing)job state CANCELLED,close() still blocked on HDFSbatch for ...43462 never committeddiscovered the next daycommit instant ...238511create instant ...434622flush data against ...434623WriteResultEvents buffered4create own instant ...432205new events overwritebuffered ones6
The loss needs no crash and no network partition. It needs only a slow close() and a scheduling gap, which is why a load test never finds it. Reconstructed from the timeline in Apache Hudi issue 19357.
Diagram source

Class B: backoff keyed to the wrong signal

Postmortem

A sixty-second blip cost hours, because the fleet re-synchronised

AssumptionLong backoff protects a saturated database, and any transient error is roughly like any other.
What happenedUnder chronic persistence saturation, ResourceExhausted triggers a long backoff curve whose side effect is desynchronising thousands of shards. A roughly sixty-second database switchover returned Unavailable and deadline errors instead. Only ResourceExhausted takes the long path, so every reader fell back to its fast path and discarded its accumulated backoff. On recovery the whole fleet became eligible at once, producing "an aggregate, fleet-wide synchronized burst whose combined read QPS exceeds the system persistence cap". Acknowledgement advancement competes through the same rate limiter as reads, so the queue could not drain.
Blast radiusMulti-hour stalls across all shards, affecting "workflow starts, signals, workflow-task completions, timer fires, and archival". Recovery required scaling the database or raising the QPS limit.
FixOpen as of 13 August 2026. Proposed: extend long backoff to all transient errors, add jitter to recovery, and give acknowledgement advancement a separate budget from reads.
Design ruleBackoff state must be keyed to the condition, not to the error code that usually accompanies it. And when backoff is also your only source of fleet desynchronisation, losing it is not a slowdown, it is a thundering herd you built yourself.
Postmortem

Metrics disappeared after a scale-down and a scale-up reused the disks

AssumptionScaling a replicated time-series store up and down is reversible, and new replicas start clean.
What happenedAn operator scaled from one to two replicas per isolation group, back down, then up again. The replicas provisioned in the third step reused disks from the first, which held index data but no metric data. A subset of series then became unqueryable while reads and writes both reported success.
Blast radiusSilent partial loss of queryable metrics on M3DB 1.3.0 with replication factor 3 and 64 shards; resolved only by editing the placement, deleting the old disks and scaling up on fresh storage.
FixNone. The issue was filed on 14 April 2022 and is still open with no maintainer root cause.
Design ruleReused storage is not empty storage. Any node that bootstraps from a disk it did not write must treat pre-existing index state as suspect, and an observability system that can silently drop series is worse than one that fails loudly, because it removes the signal you would have used to notice.

Class C: the failover path deletes what it could not save

Source

Archival is immutable across regions, and failed archival is followed by deletion

AssumptionA global domain's configuration is safe to replicate identically to every region.
What happenedThe archival URI is fixed once set and replicates unchanged. When a domain configured with one region's bucket fails over, the receiving region keeps writing to the original bucket. If that bucket is unreachable, archival fails, and, as the reporter puts it, "failed history archival is followed by deletion". Multi-region access point ARNs were tried as a workaround and failed URI parsing.
Blast radiusPermanent loss of workflow history, in the exact scenario the failover exists to survive. Filed 24 April 2026 against Cadence v1.4.0 and still open.
FixProposed: per-cluster URI overrides, and deletion conditional on archival succeeding.
Design ruleNever let a delete depend on an upload whose failure is not a hard stop. Then check which of your configuration values are global by accident: anything replicated identically to every region is, by construction, wrong in every region but one.
Source

The rejected fix for lossy cross-datacentre replication

AssumptionKafka delivers replication events losslessly between datacentres.
What happenedA Cadence engineer opened a pull request titled "New functionality for cross DC handling case if Kafka is not lossless", adding raw-history retrieval and replay APIs plus a re-replicator to recover the gap. It was closed unmerged on 19 December 2018. Reviewers objected that the APIs should not be exposed publicly without further discussion and that history deserialisation in that position was a layering violation; the author noted the change had grown too large.
Blast radiusNone directly. The interest is that the argument is preserved: a known gap in the durability of cross-region replication was identified, a fix was drafted, and it was rejected on interface-design grounds.
FixDeferred to a smaller change, per the author's closing note.
Design ruleRead the closed-unmerged pull requests on any system you depend on for cross-region durability. They are where you find out which failure modes the maintainers know about and have chosen to carry.

Class D: maintenance debt is the real cost of donation

Hudi's maintainers ran a full triage of their open pull request backlog on 16 July 2026 and published the verdicts: 555 open pull requests, of which 166 were closed as obsolete, 166 were converted to issues because they were still relevant but too stale to rebase, and 223 were kept. The oldest reviewed request dated to 26 February 2021. That is five years of contributor effort, most of it now unusable, in the flagship project of Uber's donated data stack. Donation does not remove the maintenance cost of a system. It moves the cost to a group of volunteers whose funding you no longer control, and the backlog age is the number that tells you how that is going. Check it before you adopt, and check it again annually.

05

Numbers you can plan against

Everything quantitative in this corpus, with its source and its date. Two of these rows are derived arithmetic and are labelled as such; there are no cost figures at all, because the repository record contains none.

MetricValueAtContextAs ofSource
Microservices instrumented for tracing2,700UberMeasured; the only public count of Uber's service estate in this corpus2019-09CNCF proposal
Spans collected per day~10 billionUberMeasured, across multiple datacentres2019-09CNCF proposal
Engineers on Jaeger at graduation7 full timeUberPlus "7 committers from 2 organizations"2019-09CNCF proposal
Blobs distributed per day> 1 millionUber, busiest Kraken clusterMeasured by the project2026-09kraken README
Peak burst20k blobs / 30 sUberBlobs of 100 MB to 1 GB2026-09kraken README
3 GB image to 2,600 hostsp50 10 s, p99 18 s, p99.9 22 sUberProject benchmark, at the configured speed limit2026-09kraken README
Hosts supported per registry cluster≥ 15,000UberClaimed capability, not an independent measurement2026-09kraken README
Static-analysis build overhead< 10%Uber"In our measurements"; the project's own figure, unverified elsewhere2026-09NullAway README
Repositories in the archive organisation160UberCounted from the listing header2026-09-07uber-archive
Repositories in the live organisation176UberCounted from the listing header; includes five archived in place2026-09-07uber
Archive to live ratio0.91UberDerived: 160 divided by 176. Excludes repositories deleted outright, so it understates retirement2026-09-07uber-archive
Same-day deprecation relabels13UberOn the first page of the archive sorted by last push, all dated 3 December 20192026-09-07uber-archive
Hudi design proposals, total111Apache57 completed, 18 under review, 12 ongoing, 9 in progress, 13 abandoned2026-09-07RFC index
Hudi proposal abandonment rate12%ApacheDerived: 13 abandoned of 111. A healthy figure for an open process, and a number most internal design processes cannot produce at all2026-09-07RFC index
Hudi open pull requests at triage555Apache166 closed obsolete, 166 converted, 223 kept; oldest from February 20212026-07-16issue 19306
Peloton, days between last commit and check~2,533UberDerived: 1 October 2019 to 7 September 2026, with no deprecation notice on the repository2026-09-07commit history
Mobile framework scaling claimhundreds of engineersUber"has proven to scale to hundreds of engineers working on the same codebase"; a claim, not a measurement2026-09RIBs README
Read these carefully

The Jaeger row is the strongest number here, because it was filed with a foundation as part of a graduation review rather than published as marketing, but it is seven years old and describes a service estate that has certainly changed. The Kraken figures are the project's own benchmarks and no independent reproduction exists. The two derived rows show their arithmetic. There is no cost figure anywhere in this corpus, so any statement about what Uber's platform cost to build or saved by retiring would be invention.

06

The evidence wall

Every source behind this page, graded, with what to carry forward. All of them resolve to one host, which is a real weakness of this corpus and is discussed in the ledger.

Postmortem Apache Hudi2026-07

Data loss on Flink job restart: two coordinators coexist

An operator's full timeline of a ten-minute coordinator overlap that silently dropped a batch, with the interleaving of instants reconstructed from marker files. Assigned, not fixed.

Carry forwardRestart safety needs a fencing token in the storage layer, not a shutdown timeout.
github.com/apache/hudi/issues/19357
Postmortem Apache Hudi2026-07

All-null coordinator buffer serialised into checkpoint state

Failover recovers a checkpoint taken between reserving an instant and describing it, overwriting the live buffer and orphaning files that were already written.

Carry forwardState written in two steps must be checkpointed in one, or the snapshot becomes the loss mechanism.
github.com/apache/hudi/issues/19215
Postmortem Temporal2026-08

A brief Unavailable blip resets backoff and starts a retry storm

The clearest metastable-failure write-up in this corpus. Long backoff was keyed to one error code, and that backoff was also the only thing desynchronising the fleet.

Carry forwardIf backoff is your desynchroniser, any path that skips it is a thundering herd with a delay fuse.
github.com/temporalio/temporal/issues/11547
Postmortem M32022-04

A subset of metrics disappears after scale up and down

Replicas provisioned onto reused disks carrying stale index data but no metric data. Reads and writes both reported success. Open with no root cause since 2022.

Carry forwardCheck what a bootstrapping node does with storage it did not write, and treat a silent observability gap as a severity-one class.
github.com/m3db/m3/issues/4103
Decision record CNCF2019-09

Jaeger graduation proposal

The single richest document in this corpus and the only place Uber's own scale figures appear: production since 2015, over 2,700 microservices, about 10 billion spans a day, seven full-time engineers, seven committers from two organisations.

Carry forwardFoundation review documents are where companies publish numbers they will not put on a blog.
github.com/cncf/toc/blob/main/projects/jaeger/jaeger-graduation-proposal.md
Decision record Apache Hudi2026-09

The RFC index: 111 proposals, 13 abandoned

A public design process with a visible abandonment rate. The abandoned entries name real forks in the road, including a table management service and a secondary index.

Carry forwardA design process with no visible abandonments is not a design process; it is a publication queue.
github.com/apache/hudi/blob/master/rfc/README.md
Decision record Temporal2026-09

The proposals repository

The fork runs a public proposal process, structured by surface, that the parent project never published. Governance visibility is one of the things the fork actually changed.

Carry forwardWhen comparing a fork with its parent, compare the design processes before comparing the features.
github.com/temporalio/proposals
Case study Uber2026-09

Kraken, the peer-to-peer registry

The rare in-house component that both survived and publishes measured figures: over a million blobs a day, 20k large blobs in 30 seconds, and a 3 GB image reaching 2,600 hosts at p99 18 seconds.

Carry forwardThe in-house systems that survive are the ones solving a problem no standard picked up, and they are usually about tail latency at fleet scale.
github.com/uber/kraken
Source Uber2026-09

The uber-archive organisation

160 repositories under a profile that reads "Uber's open source projects archive. Support and/or new releases are not available." Sorted by last push, thirteen of the first thirty share the date 3 December 2019.

Carry forwardRetirement is a scheduled batch activity at large companies, which means the absence of recent archiving tells you nothing about health.
github.com/orgs/uber-archive/repositories?sort=updated
Source Uber2019-10

Peloton commit history

The unified scheduler's last public commit is dated 1 October 2019. The repository has 647 stars, a full architecture section in the present tense, and no notice of any kind.

Carry forwardMake the last-commit date a mandatory field in your dependency review, and treat a live README with a dead history as a red flag rather than a neutral fact.
github.com/uber/peloton/commits/master
Source Uber2021-02

Hyperbahn, archived on 18 February 2021

The routing mesh for Uber's own RPC protocol, offering discovery, timeouts, retries, load balancing, rate limiting and circuit breaking. Archived the same day as Cherami.

Carry forwardA service mesh built in-house dies when the standard mesh arrives, and it takes the protocol underneath it with it.
github.com/uber-archive/hyperbahn
Source Uber2021-02

Cherami, archived on 18 February 2021

"A distributed, scalable, durable, and highly available message queue system we developed at Uber Engineering to transport asynchronous tasks." No successor named.

Carry forwardAn archive notice that names no successor leaves every adopter to re-derive the migration on their own.
github.com/uber-archive/cherami-server
Source Uber2022-03

Prototool, archived with a named successor

The only retirement in this corpus that hands users somewhere to go: "We recommend checking out Buf, which is under active development."

Carry forwardThe exit note costs one paragraph and is the difference between a retirement and an abandonment.
github.com/uber/prototool
Source Uber2026-09

Ringpop, unarchived and undead

"(This project is no longer under active development.)" sits inside the README of a repository that is not archived, has 880 stars, and still appears live in search.

Carry forwardA notice in prose is not a machine-readable signal. Archive the repository, or your warning reaches only the people who already scrolled.
github.com/uber/ringpop-go
Source Uber2020-04

AresDB, drifted since April 2020

A GPU-powered analytics engine with 3,100 stars whose last commit was "add middleware support (#365)" on 23 April 2020, and which carries no deprecation notice.

Carry forwardStar count is a measure of past attention, never of present maintenance. Sort your dependency list by last commit instead.
github.com/uber/aresdb/commits/master
Source Temporal2026-09

Temporal states its own origin as a fork of Cadence

"Temporal is a mature technology that originated as a fork of Uber's Cadence. It is developed by Temporal Technologies, a startup by the creators of Cadence." 22,900 stars against Cadence's 9,400.

Carry forwardPublishing a generic system without neutral governance is an option you have written for its authors, and they can exercise it.
github.com/temporalio/temporal
Source Cadence2026-09

Cadence has left the uber organisation

The repository now serves from cadence-workflow/cadence, and the organisation profile describes the project as "Originally developed by Uber", with maintainers, a technical steering committee and a CNCF Slack channel.

Carry forwardAn organisation transfer is the clearest public signal that a company has stopped treating a project as its own.
github.com/cadence-workflow
Source Cadence2018-12

Rejected: cross-datacentre handling when Kafka is not lossless

Closed unmerged on 19 December 2018. Reviewers objected to exposing raw-history APIs publicly and to history deserialisation crossing a layer boundary.

Carry forwardThe closed-unmerged queue is where a project records which failure modes it knows about and has decided to live with.
github.com/uber/cadence/pull/1322
Source Cadence2026-04

Archival URI immutable across clusters

A standing design defect in the failover path: history is deleted after archival fails, and the target bucket cannot differ per region.

Carry forwardAudit every configuration value that replicates identically across regions; in a failover, identical means wrong everywhere but home.
github.com/cadence-workflow/cadence/issues/8010
Source Apache Hudi2026-07

Open pull request backlog triage: 555 verdicts

166 closed as obsolete, 166 converted to issues, 223 kept. The oldest reviewed request was opened in February 2021.

Carry forwardBacklog age is the cheapest available proxy for whether a donated project is funded. Measure it before adopting.
github.com/apache/hudi/issues/19306
Source LF AI & Data2026-09

Horovod, created at Uber and hosted by a foundation

Distributed training with 14,700 stars, hosted by the LF AI & Data Foundation since the December 2018 announcement. Alive, and no longer Uber's problem.

Carry forwardDonation is a survival mechanism for the code and a cost-shedding mechanism for the company, and both parties usually get what they wanted.
github.com/horovod/horovod
Source Uber2026-09

NullAway, nine years and still committed to

"In our measurements, the build-time overhead of running NullAway is usually less than 10%." Last updated 7 September 2026, the day this guide was compiled.

Carry forwardTools with a stated and defended cost budget outlive platforms with none, because the budget is what makes the tool arguable rather than optional.
github.com/uber/NullAway
Source Uber2026-09

SubmitQueue, the current shape of Uber's platform work

"A high-performance speculative merge queue that keeps your trunk consistently green at scale", with companion repositories for changed-target computation and hermetic cross-compilation. Updated 4 September 2026.

Carry forwardOnce the primitives are commodities, the in-house advantage moves to the build and merge path, which no vendor can size to your monorepo.
github.com/uber/submitqueue
Source Uber2026-09

ADR, agent security as the newest published layer

"An enterprise security system for AI agents", covering employee-facing coding agents and customer-facing support agents, "deployed in production at Uber", with a paper accepted to MLSys 2026.

Carry forwardThe layer a company open-sources is the layer where it currently has more problems than vendors. In 2026 that layer is agent observability.
github.com/uber/ADR
Source Uber2026-09

The live organisation, 176 repositories

The denominator for the archive ratio, and the place to see that only a handful of retirements were archived in place rather than moved to the graveyard organisation.

Carry forwardTwo-organisation patterns hide retirement from anyone who only browses the main org. Check for a companion archive before concluding a company maintains everything it published.
github.com/orgs/uber/repositories?sort=updated
Source CNCF Jaeger2026-09

Jaeger, created at Uber and donated

"Jaeger is a distributed tracing platform created by Uber Technologies and donated to Cloud Native Computing Foundation." Incubating from September 2017, graduated October 2019, 23,200 stars.

Carry forwardGraduation is a governance milestone, not a quality one, but it is the only public evidence that maintenance survives its original sponsor.
github.com/jaegertracing/jaeger
07

Run the same excavation on your own estate

This method transfers. Six rungs, from an afternoon's inventory to a standing control in your architecture review. The line from exercise to real work is at rung four.

Inventory every repository you publish or depend on

Name, owner, last commit date, archived flag, open issue count, oldest open pull request. A listing page and an afternoon is enough for a hundred repositories.

Done when: you have one table and nothing in it is "unknown".  Teaches: how much of your surface area you had no owner for.

Compute the drift set

Everything with no commit in eighteen months and no archive flag or deprecation notice. For Uber that set includes Peloton, AresDB, Ringpop, Zanzibar and Neuropod.

Done when: every entry has a named owner or a scheduled archive date.  Teaches: that drift is a default, not a decision.

Rebuild the layer map from the repositories alone

Do it without consulting the architecture diagram. Then compare. The gaps are the parts of your platform that exist only in someone's head or in a wiki nobody updates.

Done when: you can say which layer each repository serves.  Teaches: where documentation and implementation have diverged.

Read the closed-unmerged pull requests on your top three dependencies

Sort by comment count, not by date. Cadence pull request 1322 took fifteen minutes to read and disclosed a known durability gap in cross-region replication.

Done when: you can name one failure mode each project knows about and has chosen to carry.  Teaches: that rejection reasons are the design document nobody writes.

Classify the data-loss reports in each dependency's tracker

Search the tracker for the phrase "data loss" and group what comes back by mechanism. Hudi's twelve open reports collapse into two or three classes, and both classes have the same shape as the failures in section 4.

Done when: you have a class list and know which classes your usage is exposed to.  Teaches: that a tracker is a failure catalogue with no index.

Write the exit note for one system you own, today

Two paragraphs: the condition under which this system should be retired, and the successor a reader should move to. Put it in the README while the system is healthy, because nobody writes it afterwards. Prototool has one; Peloton does not.

Done when: it is merged.  Teaches: that the exit note is the cheapest artefact in this entire guide and the one most consistently missing.

08

Keep hunting

The searches that actually produced this page. Most of them are repository URLs rather than search-engine queries, which is the point: the archaeology is in the listings and the filters, not in the search box.

Find the graveyard

  • github.com/<org>-archive
  • github.com/orgs/<org>/repositories?type=archived&sort=updated
  • github.com/orgs/<org>/repositories?sort=updated
  • "this project is deprecated and not maintained" <org>

Date the death

  • github.com/<org>/<repo>/commits/master
  • "This repository was archived by the owner on"
  • "no longer under active development" site:github.com
  • "we recommend checking out" deprecated site:github.com

Find the argument

  • github.com/<org>/<repo>/pulls?q=is:pr+is:closed+is:unmerged+sort:comments-desc
  • github.com/<org>/<repo>/issues?q=is:issue+"data loss"
  • github.com/<org>/<repo>/issues?q=is:issue+outage+OR+"root cause"
  • path:rfc README.md status abandoned

Find the numbers a company will not blog

  • github.com/cncf/toc/tree/main/projects
  • graduation proposal adoption "per day" site:github.com
  • "in production at" "since" README site:github.com
  • github.com/<org>/<repo>/blob/master/docs
09

References

Every artefact fetched for this guide. All were reachable on 7 September 2026. The full ledger, with the quote supporting each claim, is in sources.md beside this file.

  1. Uber, uber-archive organisation profile GitHub. Checked 2026-09-07.
  2. Uber, uber-archive repositories sorted by last push GitHub. Checked 2026-09-07.
  3. Uber, live organisation repositories GitHub. Checked 2026-09-07.
  4. Uber, archived repositories inside the live organisation GitHub. Checked 2026-09-07.
  5. Uber, cherami-server Archived 2021-02-18. Checked 2026-09-07.
  6. Uber, hyperbahn Archived 2021-02-18. Checked 2026-09-07.
  7. Uber, tchannel-go GitHub. Checked 2026-09-07.
  8. Uber, ringpop-go GitHub. Checked 2026-09-07.
  9. Uber, peloton GitHub. Checked 2026-09-07.
  10. Uber, peloton commit history Last commit 2019-10-01. Checked 2026-09-07.
  11. Uber, aresdb GitHub. Checked 2026-09-07.
  12. Uber, aresdb commit history Last commit 2020-04-23. Checked 2026-09-07.
  13. Uber, prototool Archived 2022-03-04. Checked 2026-09-07.
  14. Uber, makisu Archived 2021-05-04. Checked 2026-09-07.
  15. Uber, marmaray Archived 2024-01-05. Checked 2026-09-07.
  16. Uber, kraken GitHub. Checked 2026-09-07.
  17. Uber, zanzibar GitHub. Checked 2026-09-07.
  18. Uber, uReplicator GitHub. Checked 2026-09-07.
  19. Uber, neuropod GitHub. Checked 2026-09-07.
  20. M3, m3 GitHub. Checked 2026-09-07.
  21. M3 issue 4103, metrics disappear after scale up and down Filed 2022-04-14. Checked 2026-09-07.
  22. CNCF, jaeger GitHub. Checked 2026-09-07.
  23. CNCF, Jaeger graduation proposal Dated 2019-09-04. Checked 2026-09-07.
  24. Cadence, cadence GitHub. Checked 2026-09-07.
  25. Cadence, organisation profile GitHub. Checked 2026-09-07.
  26. Temporal, temporal GitHub. Checked 2026-09-07.
  27. Temporal, proposals GitHub. Checked 2026-09-07.
  28. Temporal issue 11547, backoff reset and retry storm Filed 2026-08-13. Checked 2026-09-07.
  29. Cadence pull request 1322, cross-datacentre handling if Kafka is not lossless Closed unmerged 2018-12-19. Checked 2026-09-07.
  30. Cadence issue 8010, archival URI immutable across clusters Filed 2026-04-24. Checked 2026-09-07.
  31. Cadence, closed and unmerged pull requests GitHub. Checked 2026-09-07.
  32. Apache Hudi, RFC index GitHub. Checked 2026-09-07.
  33. Apache Hudi, RFC directory GitHub. Checked 2026-09-07.
  34. Apache Hudi issue 19357, two coordinators coexist on restart Filed 2026-07-23. Checked 2026-09-07.
  35. Apache Hudi issue 19215, all-null coordinator buffer in checkpoint Filed 2026-07-07. Checked 2026-09-07.
  36. Apache Hudi issue 19306, open pull request backlog triage Filed 2026-07-16. Checked 2026-09-07.
  37. Apache Hudi, issues matching "data loss" GitHub. Checked 2026-09-07.
  38. Apache Hudi, repository GitHub. Checked 2026-09-07.
  39. LF AI & Data, horovod GitHub. Checked 2026-09-07.
  40. LF AI & Data, ludwig GitHub. Checked 2026-09-07.
  41. Uber, Go style guide GitHub. Checked 2026-09-07.
  42. Uber, NullAway GitHub. Checked 2026-09-07.
  43. Uber, piranha GitHub. Checked 2026-09-07.
  44. Uber, RIBs GitHub. Checked 2026-09-07.
  45. Uber, h3 GitHub. Checked 2026-09-07.
  46. Uber, submitqueue GitHub. Checked 2026-09-07.
  47. Uber, ADR GitHub. Checked 2026-09-07.
  48. CNCF Jaeger, issues matching span loss GitHub. Checked 2026-09-07.