Handing over the platform  / field guide
Practitioner field guide · 14 October 2026

Everything that survived has someone else’s name on it: ten years of Lyft’s platform

Between 2015 and 2026 Lyft built a service registry, a sidecar proxy, a global rate limiter, a secret store, a credential shim, a stats library, a config plane, an operations console, a workflow engine, a data catalogue and an asset graph, and published all of them. This guide reads the repositories and the package registries to establish which ones are still alive in 2026, what distinguishes them from the ones that are not, and what an architect should therefore decide differently the next time a platform team proposes to build a component.

38 primary artefacts 15 repositories 4 incident records Evidence through October 2026 Read: 20 min
01

The territory

A platform team builds the pieces its own company needs, and then has to decide, piece by piece, whether to keep them inside, hand them to someone else, or let them stop. Ten years of one company’s artefacts say which of those choices held.

0 / 5,517
Envoy commits in 2025 and 2026 authored from a lyft.com address, out of all commits in those two years
2,036
Commits to Clutch, Lyft’s operations console, before the archival announcement on 14 April 2025
4 yr 2 mo
Between Confidant’s last published container image and the day its repository was archived
921
Commits in 2026 to Cartography, the one Lyft-origin project that joined a foundation and grew

The pattern in those four numbers is the guide. Of the eleven published components examined here, the six that still ship in October 2026 are all owned by someone other than Lyft: the proxy and the rate limiter belong to the Envoy project, the validator belongs to Buf, the workflow engine belongs to the Flyte organisation and its commercial steward, the asset graph belongs to a CNCF project, and the stats library survives on one or two commits a year. The five that are dead or dormant all kept a lyft/ import path and a single operator. That is not a story about generosity. It is a measurement of what keeps infrastructure alive, and the answer the artefacts give is: other people running it.

The surprise sits one layer down. Donation did not preserve Lyft’s influence over the things it gave away, and the record is unusually precise about when that influence ended. Envoy’s governance file still lists eight lyft.com addresses, and every one of them is under Emeritus maintainers or Friends of Envoy; none is a current maintainer, extension maintainer or member of the security team. The project’s founder is still a senior maintainer, now listed with a personal address. The person stayed and the employer left. Meanwhile the DynamoDB filter Lyft contributed, the one its own 2016 documentation said it used “for all application communication with DynamoDB”, was moved out of the core tree into contrib/ in June 2022 by a maintainer at another company.

What this guide covers. Lyft’s published platform components from October 2015 to October 2026, as recorded in git history, repository files, and the package, container and module registries that date their distribution. What it does not cover. Lyft’s internal architecture, its request volumes, its cloud footprint and its costs. This session’s egress policy resolved only GitHub, PyPI, npm, the Go module proxy and index, Maven Central and Docker Hub; the engineering blog, the documentation sites, the conference and paper hosts were all unreachable. So there is no blog, talk, paper or financial evidence here, every claim about Lyft’s internal systems is a reconstruction from artefacts and is marked as one, and the reasons behind each retirement are absent from the record. The earlier company guides in this collection, on Uber and on Monzo, hit the same artefact-only boundary and found the same three exit doors: donation, a dated banner, or silence.

Figure 1 · Three fates, by owner rather than by age

Left without a notice

Amundsen
last release 2024-08

gostats
1-2 commits a year

Kept inside, archived

discovery
archived 2021-10-14

metadataproxy
no notice, last commit 2021

Confidant
archived 2025-02-14

Clutch
archived 2025-04-14

goruntime
last commit 2022-09

Owned elsewhere, still shipping

Envoy proxy
envoyproxy, 2017

Rate limit service
envoyproxy

protoc-gen-validate
Buf, maintenance mode

Flyte
flyteorg, now Flyte 2

Cartography
cartography-cncf, 2024

Left without a notice

Amundsen
last release 2024-08

gostats
1-2 commits a year

Kept inside, archived

discovery
archived 2021-10-14

metadataproxy
no notice, last commit 2021

Confidant
archived 2025-02-14

Clutch
archived 2025-04-14

goruntime
last commit 2022-09

Owned elsewhere, still shipping

Envoy proxy
envoyproxy, 2017

Rate limit service
envoyproxy

protoc-gen-validate
Buf, maintenance mode

Flyte
flyteorg, now Flyte 2

Cartography
cartography-cncf, 2024

Every component still shipping in October 2026 has a non-Lyft owner; every component that kept a single operator has either an archive banner or a dead commit log. Compiled from the repositories and registries listed in section 05.
Diagram source
02

The platform the artefacts describe

Nobody published a diagram of this. What follows is reconstructed from READMEs, package documentation and the shared project’s own 2016 docs, and the reconstruction is visible: each box names the artefact it comes from.

Start with the registry, because it dates the rest. lyft/discovery is a Flask application in front of DynamoDB with four routes: register a host, delete a host, list the hosts of a service, and update a host’s load-balancing weight. Hosts heartbeat, and a host that has not checked in for HOST_TTL seconds, 600 by default, is dropped. Reads are served from a 30-second cache. The README states what consumes it: the registered port is “the port on which the host expects connections, Envoy will connect to this port”, and a host carries an availability zone, a region, a canary flag and a weight between 1 and 100. That is a complete picture of a 2016 service mesh control plane: liveness by heartbeat with a ten-minute horizon, zone awareness, canary marking and weighted routing, all expressed as rows in a key-value store and polled over HTTP.

The data plane that polled it became Envoy, whose public history begins on 8 August 2016. Two details in its first documented year matter more than the famous ones. First, Lyft put application-protocol knowledge inside the proxy: filters that parsed DynamoDB and MongoDB traffic to produce per-table, per-operation and per-partition statistics, which the 2016 docs justify as “an invaluable source of data agnostic to the application platform and specific AWS SDK in use”. That is a deliberate architectural trade, buying uniform telemetry across a polyglot fleet at the price of protocol-specific code in a shared binary. Second, overload control was pulled out of the application into a separate decision service. The 2016 rate-limiting document states the condition precisely: circuit breaking per host is not enough “when a large number of hosts are forwarding to a small number of hosts and the average request latency is low”, so Envoy calls a global service, and “Lyft provides a reference implementation written in Go which uses a Redis backend”. That reference implementation is the repository now called envoyproxy/ratelimit.

Around those two pieces sat the parts that never left the company. Configuration was a filesystem: Envoy’s runtime mechanism, mirrored for Go services by lyft/goruntime, whose package documentation describes feature flags, kill switches, regional settings and experiment settings, usually one key-value pair per file, with a loader, a snapshot and a refresher watching for filesystem events. Metrics went through lyft/gostats. AWS credentials reached containers through lyft/metadataproxy, which intercepted the instance metadata service so that “scoped IAM roles” could be given to individual containers rather than to the host. Application secrets lived in Confidant, a secret store that, in its own words, “stores secrets in DynamoDB, encrypted at rest”. By 2020 there was a console in front of all of it: Clutch, which describes itself as an extensible platform for infrastructure management whose resolver pattern turns the many names a resource has into one lookup, and in which “basic auditing, authorization, stats, and logging come for free with every endpoint”.

The shape is consistent, and worth naming because the sources never name it: every cross-cutting concern was moved out of application code into a process or a file the application did not own. Routing and telemetry into a sidecar, admission into a remote service, configuration into a watched directory, credentials into a local proxy, secrets into a service, operations into a console, inventory into a graph. One team could then change policy fleet-wide without touching an application, and that is the strength. The cost, which the next sections quantify, is that each concern became a separate thing somebody had to keep alive, and the company could keep alive only the ones other people were also running.

Figure 2 · The platform around 2019, reconstructed from artefacts

Credentials

Control and config

per request

hosts, weights, canary

watched

goruntime

heartbeat

dynamo and mongo
protocol filters

gostats

Client
mobile and web

Edge Envoy

Sidecar Envoy
per service instance

Service process
Python, Go

Rate limit service
Go plus Redis

discovery
Flask plus DynamoDB
600s host TTL

runtime files
one value per file

metadataproxy
scoped IAM roles

Confidant
secrets in DynamoDB

Metrics pipeline

Credentials

Control and config

per request

hosts, weights, canary

watched

goruntime

heartbeat

dynamo and mongo
protocol filters

gostats

Client
mobile and web

Edge Envoy

Sidecar Envoy
per service instance

Service process
Python, Go

Rate limit service
Go plus Redis

discovery
Flask plus DynamoDB
600s host TTL

runtime files
one value per file

metadataproxy
scoped IAM roles

Confidant
secrets in DynamoDB

Metrics pipeline

Each concern sits outside the application process, which is what let one team change policy fleet-wide. Reconstructed from the discovery README, Envoy’s 2016 rate-limiting document and the goruntime package documentation.
Diagram source

Policy in the proxy, not the library

Routing, retries, zone awareness, protocol statistics and admission all sit in a process the application does not own, which is why a polyglot fleet could be changed centrally.

Evidence: Envoy 2016 DynamoDB filter document

Configuration as a watched directory

One value per file, a snapshot in memory, a refresher on filesystem events. Cheap to reason about, and it makes a config change an infrastructure operation rather than a deploy.

Evidence: goruntime package documentation

Inventory as a graph, late

Cartography arrived in 2019, after the mesh and the console, and answers questions about identity and exposure across providers. It is the only component of the set whose activity is still rising.

Evidence: Cartography README, 2026

03

The decisions that matter

Four forks, each with the artefact that records it and the condition that would reverse it. The reasons are rarely written down, so where a reason is inferred the wording says so.

Decision: where does the list of healthy hosts live?

Chosen
  • From 2016, the proxy’s own discovery API, eventually xDS over gRPC
  • One contract for host lists, routes, clusters and secrets, maintained by the project
Rejected
  • The in-house REST registry over DynamoDB, with a 600-second host TTL and a 30-second read cache
  • Archived with a one-line banner on 14 October 2021, on its 29th commit
Flips when
  • The registry has consumers the proxy cannot serve, such as batch schedulers or a CMDB, in which case keep the registry and feed the proxy from it
  • Heartbeat semantics are load-bearing for you: a ten-minute TTL and a 30-second cache are a deliberate staleness budget, and xDS does not make that choice for you

Decision: does a company-specific protocol filter belong in the shared project?

Chosen
  • Yes, in 2016: DynamoDB and MongoDB filters shipped in Envoy’s core tree
  • The payoff was telemetry that did not depend on each service’s SDK
Rejected
  • Keeping them out of tree as a private build
  • Which would have cost a fork to rebase against every release
Flips when
  • You can no longer staff the sponsor and two reviewers the project’s extension policy requires. The DynamoDB filter moved to contrib/ in June 2022, in the same window Lyft’s commit share fell to 3 percent; the MongoDB filter stayed in core and others still harden it, with a BSON depth limit added in July 2026

Decision: keep a component, or give it to a foundation?

Chosen
  • Give away the pieces other companies wanted: the proxy, the rate limiter, the validator, the workflow engine, the catalogue, the asset graph
  • All six still ship in 2026 under their new owners
Rejected
  • Keeping the registry, the credential shim, the secret store and the console in-house
  • All four are archived or have a dead commit log
Flips when
  • Nobody outside your company operates it. Then donation buys nothing, and the honest alternative is a dated retirement plan rather than a public repository
  • The component encodes a policy you need to control. You are handing over the roadmap, not just the maintenance

That last point is the part teams underestimate, and the record quantifies it twice. The validator Lyft started in 2017 is now Buf’s, and Buf has put it in maintenance mode and recommends that “new and existing projects transition to using protovalidate”, its own replacement, with a deprecation flag being compiled into generated code as of May 2026. The workflow engine Lyft started in 2019 is now on its second generation under a commercial steward: the README announces that Flyte 2 is generally available and tells anyone on the generation Lyft built to “go to the master branch, where Flyte 1 is now maintained”. In both cases the original author is now a consumer on someone else’s migration schedule, which is the same position as any other adopter, except that the adopter chose it knowingly.

Figure 3 · The decade, as dated artefacts

2015 · Confidant

2016 · metadataproxy, discovery,
Envoy, gostats

2017 · ratelimit, goruntime, PGV,
Envoy donated to CNCF

2019 · Amundsen, Flyte,
Cartography, Envoy Mobile

2020 · Clutch starts,
legacy rls proto deleted

2021 · discovery archived,
metadataproxy stops, v2 rls removed

2022 · dynamo filter to contrib,
Envoy Mobile folded in, goruntime stops

2024 · Amundsen releases stop,
Cartography joins CNCF

2025 · Confidant archived,
Clutch archived

2026 · Flyte 2 cutover, PGV deprecated,
gostats pruning fix

2015 · Confidant

2016 · metadataproxy, discovery,
Envoy, gostats

2017 · ratelimit, goruntime, PGV,
Envoy donated to CNCF

2019 · Amundsen, Flyte,
Cartography, Envoy Mobile

2020 · Clutch starts,
legacy rls proto deleted

2021 · discovery archived,
metadataproxy stops, v2 rls removed

2022 · dynamo filter to contrib,
Envoy Mobile folded in, goruntime stops

2024 · Amundsen releases stop,
Cartography joins CNCF

2025 · Confidant archived,
Clutch archived

2026 · Flyte 2 cutover, PGV deprecated,
gostats pruning fix

Donations cluster in 2017 to 2021 and retirements cluster in 2021 and 2025, which is what a batched platform decision looks like from outside. Dates from the commits cited in section 06.
Diagram source

Figure 5 · The test the artefacts imply, applied before you write the component

No

Yes, other teams only

Yes, other companies

Yes

No

Yes

No

Will anyone outside
your team operate it?

Build it, and write the
retirement date into the README now

Does it encode policy
you must control?

Can you staff a sponsor
plus two reviewers for 3 years?

Keep it internal,
fund it as a product

Adopt the standard instead,
budget its deprecation calendar

Donate to a foundation,
accept that the roadmap goes too

Publish out of tree,
expect relocation or removal

No

Yes, other teams only

Yes, other companies

Yes

No

Yes

No

Will anyone outside
your team operate it?

Build it, and write the
retirement date into the README now

Does it encode policy
you must control?

Can you staff a sponsor
plus two reviewers for 3 years?

Keep it internal,
fund it as a product

Adopt the standard instead,
budget its deprecation calendar

Donate to a foundation,
accept that the roadmap goes too

Publish out of tree,
expect relocation or removal

Every terminal node is an action with an owner and a date, which is what the archived repositories in this corpus lacked until the day they were archived. Derived from the outcomes tabulated in section 05.
Diagram source
DecisionChosenRejectedBecause, as recordedEvidence
Overload control for high fan-in pathsCentral gRPC rate-limit service with a Redis backendPer-host circuit breaking aloneHard to tune when many hosts call few hosts at low latencyEnvoy document, 2016
Credentials for containersLocal proxy in front of instance metadataHost-wide IAM role shared by every containerScoped roles per container rather than per hostmetadataproxy README
Secret storageIn-house service over DynamoDB with encryption at restNot recordedNot recorded; retired on 14 February 2025 with a dated notice and no stated reasonArchiving announcement
Mobile networkingRun the same data plane in the app, then fold it into the proxy’s own repositoryA separate mobile library with its own release trainStated only as a move notice, on the repository’s last commit, 2 December 2022Move notice
Protocol versions for the rate limiterDelete the legacy protocols on a scheduleCarrying them indefinitelyNot stated; the effect is two forced migrations for every operatorRemoval commit, 2021
Governance for the surviving asset graphMove to CNCF, publish governance guidelinesRemaining a company projectNot stated; activity rose from 96 commits in 2024 to 921 in 2026CNCF documentation commit
04

What broke, and in which plane

Lyft has published no incident reviews that this corpus can reach. What it can reach are the Envoy project’s two security postmortems, which are about the data plane Lyft built, and two failure records written into commits and registries. Three classes cover all four.

Postmortem

Two views of one header, and the check stopped matching the action

AssumptionThat the codec would reject malformed headers, and that a header value is one string.
What happenedEnvoy assumed its parsers rejected embedded NUL characters, which http-parser did not, and it “viewed header strings with a mixture of c_str() and string_view, allowing the possibility of inconsistent views between checks and resulting action”. Access control and route intent could be bypassed.
Blast radiusEmbargoed 18 February to 5 April 2019, fixed jointly with the Istio team in the 1.9.1 security release, affecting a subset of users with specific configuration patterns.
FixOne representation for header values, and a security release process refined after its first real run, which had been “originally borrowed from the Kubernetes project”.
Design ruleAuthorise on exactly the bytes you then act on. Any component that both checks and forwards needs a single canonical representation, and a test that proves the two paths cannot diverge.
Postmortem

A regular expression with unbounded cost on the request path

AssumptionThat a routing feature exposed to configuration is not also exposed to attacker-controlled input size.
What happenedRoute matching used std::regex, which is recursive, so “an HTTP request with sufficiently large header values may consume large amounts of stack memory and cause abnormal process termination”, appearing “when matching header values of 16Kb or more”. A second defect validated header size per header added, giving quadratic behaviour.
Blast radiusPublicly reported as a crash on 25 July 2019, resolved in the 1.11.2 security release in October 2019; every deployment using regex route matching was exposed.
FixDeprecate the general mechanism rather than bound it: 1.11.2 “deprecates the use of std::regex in user facing paths” and restricts the engine to RE2.
Design ruleAny expression language on the request path needs a worst-case cost guarantee, not a best-practice guideline. If the engine cannot give you one, remove the engine.
Source record

Ten years of unbounded metric cardinality in the stats library

AssumptionThat metric names are a bounded set, so a stats store never needs eviction.
What happenedThe October 2026 fix states it plainly: the store “keeps every unique counter/timer/gauge name it has ever seen for the life of the process, with no eviction”, so “a service that tags a Counter or Timer with a per-request value (user ID, request ID, region+use-case combinations, etc.) grows memory without limit”.
Blast radiusOne reported service, named only by an internal ticket id. The library had been in use since December 2016 and had taken one or two commits a year since 2023.
FixOpt-in idle pruning behind an environment variable, disabled by default, with a benchmark showing 5,000 live counters becoming zero; an LRU policy was considered and rejected as more expensive and a worse match for the observed failure.
Design ruleAny process-lifetime map keyed by something a request can influence is a memory leak with a delay. Bound it at the library, because the service that will break is the one that never read the library’s documentation.
Source record

Abandonment, announced by nobody and visible only in the registries

AssumptionThat a present-tense README and an installable package mean a component is maintained.
What happenedAmundsen’s packages last shipped between March and August 2024 and the repository took one commit in 2025 and two in 2026, with no deprecation notice anywhere. Confidant’s container images stopped in December 2020, four years and two months before the archive notice, and its client package shipped once more on 18 March 2025, a month after the server repository was archived.
Blast radiusUnknown and unknowable from outside: adopters of both are invisible in the corpus. The risk is a dependency that looks live and has no one to report a vulnerability to.
FixThe pattern that worked, twice, was shipping the retirement as a release: Confidant’s PyPI summary now begins “DEPRECATED” and version 7.0.0 exists only to say so.
Design ruleJudge a dependency by its last publication date, not its README, and when you retire something, publish the notice through the channel your users actually consume.
SourcePyPI metadata and Docker Hub tags, checked 14 October 2026

Figure 4 · The 2019 regex failure path, which is a configuration feature meeting a request

Upstream serviceRoute matcherEnvoy proxyClientUpstream serviceRoute matcherEnvoy proxyClientstack memorygrows with inputsizeevery connection on that proxy instance is lostHTTP request, header value of16Kb or more1match headers againstconfigured regex2recursive std::regexevaluation3abnormal process termination4request never forwarded5
Upstream serviceRoute matcherEnvoy proxyClientUpstream serviceRoute matcherEnvoy proxyClientstack memorygrows with inputsizeevery connection on that proxy instance is lostHTTP request, header value of16Kb or more1match headers againstconfigured regex2recursive std::regexevaluation3abnormal process termination4request never forwarded5
The vulnerable step is ordinary configuration: a regex route match. Only the input size is attacker-controlled. From the CVE-2019-15225 postmortem.
Diagram source
05

Numbers you can plan against

All of these are counted from the artefacts in section 06 on 14 October 2026. None of them is a figure about Lyft’s production traffic, because no reachable artefact carries one.

ComponentFirst commitLast commitCommitsOwner in 2026StateEvidence
Envoy2016-08-082026-10-1429,150Envoy projectShippinginitial commit
Rate limit service2017-01-302026-10-06359Envoy projectShippingREADME
Cartography2019-03-012026-10-132,196cartography-cncfGrowingREADME
Flyte2019-04-092026-10-125,253flyteorgSecond generationFlyte 2 cutover
protoc-gen-validate2017-10-032026-05-28591BufMaintenance modeREADME
gostats2016-12-282026-10-08112LyftOne or two commits a yearmodule versions
Amundsen2019-02-042026-09-102,713amundsen-ioDrifted, no noticelast release 2024-08-14
Envoy Mobile2019-03-042022-12-021,794Folded into EnvoyAbsorbedmove notice
Clutch2020-07-182025-04-142,036LyftArchivedannouncement
Confidant2015-10-082025-02-14451LyftArchivedannouncement
discovery2016-08-142021-10-1429LyftArchivedarchive notice
metadataproxy2016-03-022021-09-16169LyftDrifted, no noticeREADME
goruntime2017-01-262022-09-0832LyftDormantv0.3.0, 2022-09-08

The second table is the one that answers the question this guide opened with. It counts commits whose author address ends in lyft.com, by year, in the three projects Lyft seeded and handed over. The method undercounts, because contributors frequently commit from a personal or a GitHub-provided address: the founder of Envoy authored 331 of his 2016 and 2017 commits from a users.noreply.github.com address and only 95 from mklein@lyft.com. Treat every figure here as a floor on company participation and as a reliable indicator of direction rather than level.

YearEnvoy, lyft.com of totalFlyte, lyft.com of totalAmundsen, lyft.com of totalSource
201662 / 235not startednot startedenvoy history
2017172 / 1,271not startednot startedenvoy history
2019230 / 2,950267 / 367217 / 638flyte history
2020226 / 3,433390 / 73589 / 1,149amundsen history
2021264 / 3,26511 / 1,07741 / 607flyte history
202295 / 3,7451 / 9296 / 196dynamo to contrib
20241 / 3,3590 / 7173 / 40amundsen releases
20260 / 3,0100 / 5400 / 2envoy owners
Read these carefully

Measured: every commit count, date, release date, tag date and version number above, taken from the repository or the registry named beside it. Derived: the lyft.com shares, computed by me from author addresses, with the undercount explained above; and the four years and two months between Confidant’s last image and its archive notice, which is 21 December 2020 to 14 February 2025. Unknown: how many services ran the sidecar, how much any of it cost, whether Lyft still operates Envoy, the rate limiter or Flyte today, and why each retirement happened. The archive notices carry dates and wording but no reasons, and the only internal references in the whole corpus are two opaque ticket identifiers.

06

The evidence wall

Twenty artefacts, all retrieved on 14 October 2026 by anonymous clone or by fetching the registry endpoint shown. The full ledger, with one row per claim and the supporting quote copied out, is in sources.md beside this page.

Postmortem Envoy project2019-04

Security postmortem for CVE-2019-9900, CVE-2019-9901

An access-control and routing bypass traced to two different views of one header string, and the first real run of a security process borrowed from Kubernetes.

Carry forwardAuthorise on the same representation you forward, and prove the two paths cannot diverge.
raw.githubusercontent.com/envoyproxy/envoy/security/postmortems/cve-2019-9900.md
Postmortem Envoy project2019-11

Security postmortem for CVE-2019-15225, CVE-2019-15226

Recursive regular-expression matching crashed the proxy on header values of 16Kb or more, and a per-header size check gave quadratic behaviour. The remedy removed the engine.

Carry forwardExpression languages on the request path need a worst-case cost bound, or they do not belong there.
raw.githubusercontent.com/envoyproxy/envoy/security/postmortems/cve-2019-15225.md
Decision record Envoy project2019-04

Blameless security postmortem template

Added April 2019, adapted from the Google SRE book. Two postmortems were written against it, both in 2019, and none since.

Carry forwardA template is not a practice. Count the documents, not the process.
github.com/envoyproxy/envoy/commit/3a8128a8
Decision record Envoy project2026-10

EXTENSION_POLICY.md

Requires a sponsoring maintainer and two named reviewers per extension, explicitly so that “incentives are aligned”, with a six-month interval for removing one nobody maintains.

Carry forwardBefore contributing a component-specific extension upstream, check you can staff three people for its lifetime.
raw.githubusercontent.com/envoyproxy/envoy/EXTENSION_POLICY.md
Decision record Envoy project2026-10

api/API_VERSIONING.md

The versioning contract for the configuration API that every mesh operator inherits: independent package versions, no renames, no breaking changes within a major version.

Carry forwardWhen you adopt a project’s configuration API you adopt its deprecation calendar; budget the migrations in advance.
raw.githubusercontent.com/envoyproxy/envoy/api/API_VERSIONING.md
Decision record Cartography project2024-10

CNCF added to the documentation, then governance guidelines

October and November 2024, on the one Lyft-origin project whose activity was rising; the repository is now cartography-cncf/cartography.

Carry forwardFoundation governance arrives as commits before it arrives as a press release; the commits are the date that matters.
github.com/lyft/cartography/commit/fd9b0e9a
Source Envoy project2016-12

DynamoDB filter architecture document

The 2016 docs state that “at Lyft we use this filter for all application communication with DynamoDB” to get telemetry independent of each service’s SDK. The filter moved to contrib/ in June 2022.

Carry forwardA company-specific extension inside a shared project has the lifetime of your participation, not the project’s.
raw.githubusercontent.com/envoyproxy/envoy/docs/intro/arch_overview/dynamo.rst
Source Envoy project2022-06

dynamo: moving to contrib

Lyft’s own protocol filter demoted out of the core tree, authored by a maintainer at another company, in the year Lyft’s commit share fell to 3 percent.

Carry forwardWatch for your contributions being relocated; it is the earliest public signal that your seat at the table is gone.
github.com/envoyproxy/envoy/commit/352857fb
Source Envoy project2026-07

MongoDB proxy: BSON parsing depth limit

The other filter from Lyft’s 2016 data stack stayed in core, still hardened by people who do not work there.

Carry forwardComponents with users beyond their author keep getting fixes; that is the whole mechanism of survival.
github.com/envoyproxy/envoy/commit/fa68fb65
Source Envoy project2026-10

OWNERS.md, with its sections read as a map

Eight lyft.com addresses remain, every one under Emeritus maintainers or Friends of Envoy; in 2017 Lyft held the senior maintainer seat and five further entries.

Carry forwardGovernance files record influence precisely, if you read which section a name sits in rather than whether it appears.
raw.githubusercontent.com/envoyproxy/envoy/OWNERS.md
Source Envoy project2017

OWNERS.md as it stood in 2017

Six Lyft addresses, including the senior maintainer: the cleanest measure of a handover in this corpus is the diff against the current file.

Carry forwardKeep the old revision. A governance diff over years is evidence that no single snapshot provides.
raw.githubusercontent.com/envoyproxy/envoy/06d62d5c/OWNERS.md
Source Lyft2021-10

lyft/discovery, README and archive notice

A Flask and DynamoDB registry with heartbeats, a 600-second host TTL, zone tags, canary flags and weights, retired by a one-line banner on its 29th commit.

Carry forwardThe staleness budget in an in-house registry (TTL over cache interval) is a design decision you must re-make when you adopt a standard.
raw.githubusercontent.com/lyft/discovery/README.md
Source Lyft2021-09

lyft/metadataproxy README

A credential shim that gave containers scoped IAM roles before the platforms did. No deprecation notice; the commit log simply stops in September 2021.

Carry forwardComponents that compensate for a missing platform feature have a known end date; write it down when you build them.
raw.githubusercontent.com/lyft/metadataproxy/README.md
Source Lyft2025-02

Confidant archiving announcement

Dated, explicit, and shipped as release 7.0.0 so that the PyPI summary now starts with “DEPRECATED”. The container images had already stopped in December 2020.

Carry forwardPublish the retirement through the channel your users install from, not only in the repository.
raw.githubusercontent.com/lyft/confidant/docs/root/archiving_announcement.md
Source Lyft2025-04

Clutch archival announcement

Five years, 2,036 commits and 1,994 npm releases of an operations console, ended two months after the secret store, with a banner and a contact address.

Carry forwardTwo retirements two months apart is one budget decision; expect internal platforms to be cut in cohorts.
github.com/lyft/clutch/commit/b0bb7a16
Source Lyft2026-10

gostats: bound memory growth from high-cardinality tags

A full engineering account inside a commit message: the unbounded store, the rejected LRU alternative, three concurrency bugs found in review, benchmarks.

Carry forwardDefault-off safety features protect the library author, not the operator. Decide which one you are.
github.com/lyft/gostats/commit/1b83075e
Source Envoy project2026-10

envoyproxy/ratelimit README and deprecation history

Lyft’s reference implementation, now an Envoy-project repository with the module path github.com/envoyproxy/ratelimit, which records two protocol removals: the legacy proto in July 2020 and the v2 API in August 2021.

Carry forwardA donated service keeps deprecating its wire protocol on the project’s schedule; the migrations are yours to pay for.
raw.githubusercontent.com/envoyproxy/ratelimit/README.md
Source Flyte project2026-10

flyteorg/flyte README, Flyte 2 generally available

The generation Lyft built is now maintained on a side branch while the new stewards ship a replacement backend and a second-generation IDL, cut over in April 2026.

Carry forwardDonation transfers the roadmap. Plan to be an ordinary adopter of your own project within about five years.
raw.githubusercontent.com/flyteorg/flyte/README.md
Source Buf2026-05

bufbuild/protoc-gen-validate, maintenance mode

“Has reached a stable state and is in maintenance mode”, with users directed to the new owner’s own replacement. The Java artefacts still publish under the io.envoyproxy group id.

Carry forwardCheck who owns the successor before you adopt a vendor-stewarded project; the migration is theirs to define.
raw.githubusercontent.com/bufbuild/protoc-gen-validate/README.md
Source PyPI and Docker Hub2026-10

Distribution timelines for Confidant and Amundsen

Confidant images stop on 21 December 2020, the archive lands on 14 February 2025, and the client ships again on 18 March 2025. Amundsen’s three packages stop in 2024 with no notice anywhere.

Carry forwardPublication cadence is the liveness check for a dependency. A README is a claim; a release date is evidence.
pypi.org/project/confidant
Source npm and Go module proxy2026-10

@clutch-sh/core versions, and the lyft/ module paths

Clutch published 1,994 npm versions and its last one on the day of the archival announcement. The stats and config libraries still carry github.com/lyft/ module paths, and both have near-flat release histories.

Carry forwardThe import path is a durable statement about who is expected to maintain something. Read it as a risk signal.
registry.npmjs.org/@clutch-sh/core
What is missing, and why it matters

Not one engineering blog post, talk, paper or cost figure appears in this wall, because no host carrying them was reachable. Dates, counts and quoted file contents are therefore solid, and every statement about motive is either quoted from a commit or marked as inference. The artefacts do not carry the reasons, and neither does this page.

07

Run this audit on your own platform

The method transfers more cleanly than the conclusions do. Six rungs, from an hour of shell commands to a retirement you can actually execute.

Inventory what your organisation has published

Clone every public repository your company owns with --filter=blob:none, and tabulate first commit, last commit, commit count and whether an archive banner exists.

Done when: you have one row per repository and can name every one whose last commit is more than a year old.  Teaches: that the drifted components, not the archived ones, are the liability.

Add the distribution channels

For each component, fetch the last publication date from every channel people install it through: package registry, container registry, module proxy, internal artefact store.

Done when: you can show, for one component, a gap between the last release and the last commit.  Teaches: that repositories and distributions die on different days, and users notice the latter.

Count the operators, not the stars

For each component, write down how many teams outside the owning team run it in production, and how many organisations outside the company do.

Done when: every component has a number, and the single-operator ones are flagged.  Teaches: the one variable that predicted survival across this entire corpus.

Apply the extension-policy test to your upstream contributions

For every feature your company maintains inside a shared project, check whether you could staff a sponsor and two reviewers for the next three years. If not, plan for it to be relocated or removed.

Done when: each upstream feature has a named owner or an exit plan.  Teaches: that upstreaming converts a maintenance cost into a political one.

Price the upgrade clock you have adopted

For each third-party configuration API or wire protocol you depend on, list the last two breaking removals and how long you had. Turn that into a recurring budget line.

Done when: you can state, in engineer-weeks per year, the cost of staying current on each adopted contract.  Teaches: that the cheapest component to build is often the most expensive to keep.

Rehearse one retirement end to end

Pick your least-used internal component and retire it properly: a dated notice in the repository, a final release whose metadata says deprecated, a stopped image build, and a named replacement or an explicit none.

Done when: an outsider can tell the component is dead from the registry alone.  Teaches: that an honest exit is a deliverable with four artefacts, not an announcement.

08

Keep hunting

These are the commands and endpoints that produced this page, from a session that could reach only code hosts and package registries. They work on any organisation.

History without the payload

  • git clone --filter=blob:none https://github.com/ORG/REPO
  • git log --reverse --date=short --format='%ad %h %an %s' | head -5
  • git log --date=format:%Y --format='%ad' | sort | uniq -c
  • git log --date=short --format='%ad %s' -- README.md | head

Who is actually working on it

  • git log --date=format:%Y --format='%ad|%ae' | awk -F'|' '{t[$1]++; if ($2 ~ /lyft\.com$/) c[$1]++} END {for (y in t) print y, c[y], t[y]}' | sort
  • git log --since=2025-01-01 --format='%ae' | sed 's/.*@//' | sort | uniq -c | sort -rn
  • git show HEAD:OWNERS.md | awk '/^#/ {print NR": "$0} /lyft/ {print NR": >> "$0}'

Finding the retirement

  • git ls-tree -r --name-only HEAD | grep -iE 'postmortem|incident|archive|deprecat'
  • git log -i --grep='archiv' --date=short --format='%ad %h %s'
  • git log --diff-filter=A --date=short --format='%ad %s' -- PATH

Registries as a liveness check

  • curl -s https://pypi.org/pypi/PACKAGE/json | python3 -c "import json,sys; d=json.load(sys.stdin); print(d['info']['summary'])"
  • curl -s https://registry.npmjs.org/PACKAGE | python3 -c "import json,sys; t=json.load(sys.stdin)['time']; print(max(t.values()))"
  • curl -s https://hub.docker.com/v2/repositories/ORG/IMAGE/tags?ordering=last_updated
  • curl -s https://proxy.golang.org/MODULE/@v/list
09

References

  1. Envoy project, Security postmortem for CVE-2019-9900, CVE-2019-9901 envoyproxy/envoy, committed 2019-04-23. Checked 2026-10-14.
  2. Envoy project, Security postmortem for CVE-2019-15225, CVE-2019-15226 envoyproxy/envoy, committed 2019-11-11. Checked 2026-10-14.
  3. Envoy project, security: blameless postmortem template Commit 3a8128a8, 2019-04-17. Checked 2026-10-14.
  4. Envoy project, Envoy Extension Policy envoyproxy/envoy at 35ef062c. Checked 2026-10-14.
  5. Envoy project, API versioning guidelines envoyproxy/envoy at 35ef062c. Checked 2026-10-14.
  6. Envoy project, OWNERS.md envoyproxy/envoy at 35ef062c. Checked 2026-10-14.
  7. Envoy project, OWNERS.md as of 2017 envoyproxy/envoy at 06d62d5c. Checked 2026-10-14.
  8. Envoy project, Initial commit Commit a714b9c2, 2016-08-08. Checked 2026-10-14.
  9. Envoy project, DynamoDB architecture overview envoyproxy/envoy at bdaf31a4, 2016-12-22. Checked 2026-10-14.
  10. Envoy project, Global rate limiting architecture overview envoyproxy/envoy at bdaf31a4, 2016-12-22. Checked 2026-10-14.
  11. Envoy project, dynamo: moving to contrib (#21715) Commit 352857fb, 2022-06-16. Checked 2026-10-14.
  12. Envoy project, Add depth limit of 128 for BSON document parsing (#45214) Commit fa68fb65, 2026-07-10. Checked 2026-10-14.
  13. Envoy project, Envoy Rate Limit Service README envoyproxy/ratelimit at f4e76690. Checked 2026-10-14.
  14. Envoy project, Remove support for legacy v2 api (#278) Commit 4bb32826, 2021-08-03. Checked 2026-10-14.
  15. Envoy project, docs: add note to README about project being moved to the Envoy repo (#2715) Commit a9ce5f85, 2022-12-02. Checked 2026-10-14.
  16. Lyft, discovery README with archive notice lyft/discovery at c7eb20f1, 2021-10-14. Checked 2026-10-14.
  17. Lyft, metadataproxy README lyft/metadataproxy at 57045cb7, last commit 2021-09-16. Checked 2026-10-14.
  18. Lyft, Confidant archiving announcement lyft/confidant at 0185b8b8, 2025-02-14. Checked 2026-10-14.
  19. Lyft, Clutch Archival Announcement (#3272) Commit b0bb7a16, 2025-04-14. Checked 2026-10-14.
  20. Lyft, gostats: bound memory growth from high-cardinality tags with idle pruning (#189) Commit 1b83075e, 2026-10-08. Checked 2026-10-14.
  21. Cartography project, Add CNCF to docs (#1369) Commit fd9b0e9a, 2024-10-23. Checked 2026-10-14.
  22. Cartography project, README at the cartography-cncf organisation cartography-cncf/cartography, master. Checked 2026-10-14.
  23. Flyte project, README announcing Flyte 2 general availability flyteorg/flyte at cafacafc. Checked 2026-10-14.
  24. Flyte project, Flyte 2: Cut over to Flyte 2 new backend implementation (#6583) Commit 1dd04640, 2026-04-28. Checked 2026-10-14.
  25. Buf, protoc-gen-validate README, maintenance mode notice bufbuild/protoc-gen-validate at 414042a5. Checked 2026-10-14.
  26. Buf, Add deprecation flag to generation (#1381) Commit 7489dc6f, 2026-05-27. Checked 2026-10-14.
  27. PyPI, confidant project page Release 7.0.0 dated 2025-02-14; summary begins DEPRECATED. Checked 2026-10-14.
  28. PyPI, confidant-client project page Release 2.7.1 dated 2025-03-18. Checked 2026-10-14.
  29. PyPI, amundsen-databuilder project page Release 7.5.1 dated 2024-08-14. Checked 2026-10-14.
  30. PyPI, cartography project page Release 0.143.0 dated 2026-10-10; repository metadata points to cartography-cncf. Checked 2026-10-14.
  31. npm registry, @clutch-sh/core metadata 1,994 versions, last 2025-04-14. Checked 2026-10-14.
  32. Docker Hub, lyft/confidant tags 16 tags, latest updated 2020-12-21. Checked 2026-10-14.
  33. Docker Hub, envoyproxy/ratelimit tags 260 tags, most recent 2026-10-06. Checked 2026-10-14.
  34. Go module proxy, github.com/lyft/gostats version list 54 versions. Checked 2026-10-14.
  35. pkg.go.dev, github.com/lyft/goruntime v0.3.0 published 2022-09-08. Checked 2026-10-14.
  36. Maven Central, io.envoyproxy.protoc-gen-validate:pgv-java Versions 0.1.0 (2019-06-13) to 0.6.13 (2022-10-03) in this path. Checked 2026-10-14.