Internal forks  / field guide
Practitioner field guide · 21 September 2026

When the internal fork wins

Between April 2016 and March 2026, Netflix moved nine of its best known platform components into maintenance mode, into another organisation, or into a read-only archive, and explained why in about a dozen sentences of README prose. This guide reconstructs that decade from the repository record alone: the order the signals arrive in, which of them actually predicts abandonment, and where the function goes once the library is finished.

38 primary sources 5 organisations 12 dated status changes Evidence through September 2026 Read: 22 min
01

The territory

You depend on components that somebody else built for their own production and published as a side effect. Every health signal you can see about them was written by the party whose incentives changed the day their internal copy stopped matching yours.

1.5.18
Last public Hystrix release, made to realign Maven Central with the 1.5.11 that Netflix actually ran
52
Open pull requests on that same library, eight years after it announced it would merge none
48/239
Archived repositories in the Netflix organisation, against its public repository count
10.4 yr
From Ribbon's maintenance notice to today, with the repository still not archived

The Hystrix README carries one sentence that should change how an architect reads every other dependency they inherit. Announcing the library's final release, it says Netflix made it "so that the latest version in Maven Central is aligned with the last known stable version used internally at Netflix (1.5.11)". The final public release was 1.5.18. Seven patch releases had gone out to the world that Netflix was not running, and the way that fact reached the public was a farewell note in November 2018. Anybody who had upgraded to stay current was, by definition, further from Netflix's production than somebody who had not.

That is the shape of the whole decade, and it is why this guide is filed under platform rather than under governance. The question is not whether an open-source project is "healthy". It is where the component's centre of gravity sits: inside the publishing company's own build, or in the artefact you consume. Once those two separate, everything visible from outside, the release feed, the star count, the lifecycle badge, becomes a lagging report on a system nobody is operating.

Why Netflix, and why now. Netflix published the reference implementation of the fat client library: discovery, load balancing, bulkheads, configuration and metrics compiled into every service, which an entire generation of JVM platforms copied, most visibly through Spring Cloud Netflix. Ten years later that model has been dismantled in public, one dated commit at a time, and the last pieces are being archived as this is written. Turbine and Asgard were archived on 19 December 2025, and ConsoleMe and Weep were scheduled for archive on 1 March 2026. The estate is now complete enough to read as a single record instead of a series of announcements.

What this guide covers. The public repository record: READMEs and the commits that changed them, lifecycle metadata files, build files, one security advisory, issue threads and pull requests, across the Netflix organisation and the downstream projects that consumed it. What it deliberately does not cover: Netflix's internal architecture, its video pipeline, its content delivery network, and its production incidents. That exclusion is not editorial. This session's network policy reached github.com and raw.githubusercontent.com and no other host, which means no engineering blog, no conference talk, no paper and no outage report was available. The guide is built from the layer that remains, and says plainly where that layer cannot see.

The finding to carry out of section 1

The earliest reliable signal of abandonment is not a badge, a release gap or an archive flag. It is a sentence in the README admitting that an internal wrapper or an internal fork exists. Ribbon published that sentence in April 2016 and has still not been archived in September 2026. The badge lies for a decade; the prose told the truth on day one.

Figure 1 · Ten years of status changes, as the repositories record them

2016 · April
Ribbon to maintenance

2018 · January and November
Hystrix dashboard relocated after a Critical advisory
Hystrix to maintenance, Eureka 2.0 discontinued

2021 · March and September
Simian Army archived, Security Monkey archived

2022 · May
Titus and its control plane archived

2023 · March and December
Fenzo archived, Conductor archived for its internal fork

2025 · September and December
Dispatch archived, Turbine and Asgard archived

2026 · March
ConsoleMe and Weep archived for divergence

Signal: a status line
added to a README

Signal: an archive flag,
no stated cause

Signal: a dated announcement
naming the internal fork

2016 · April
Ribbon to maintenance

2018 · January and November
Hystrix dashboard relocated after a Critical advisory
Hystrix to maintenance, Eureka 2.0 discontinued

2021 · March and September
Simian Army archived, Security Monkey archived

2022 · May
Titus and its control plane archived

2023 · March and December
Fenzo archived, Conductor archived for its internal fork

2025 · September and December
Dispatch archived, Turbine and Asgard archived

2026 · March
ConsoleMe and Weep archived for divergence

Signal: a status line
added to a README

Signal: an archive flag,
no stated cause

Signal: a dated announcement
naming the internal fork

Notice how the announcement itself changes across the decade: the three dotted boxes mark the shift from a status line quietly added to a README, through an archive flag with no stated cause, to a dated announcement naming the internal fork. Dates from Ribbon's commit history, the NFLX-2018-001 advisory, the Hystrix README commit, and the archive banners on Simian Army, Security Monkey, Titus, Fenzo, Conductor, Dispatch, Turbine, Asgard and ConsoleMe.
Diagram source
02

The lifecycle is the architecture

Across nine components the same six stages recur in the same order, each with a different public signal and a different amount of warning for the people downstream.

Reading the estate component by component produces a list. Reading it stage by stage produces a machine. Every component in this corpus that reached an archive passed through the same sequence, and the useful part is that each stage has a distinct observable, visible from outside, with a different lead time. The sequence is mine, reconstructed across the repositories; no Netflix document describes it. What is reported, in Netflix's own words, is the transition at each step.

Figure 2 · The six stages, and what each one looks like from outside

observable: one README sentence

observable: a version gap

a commercial sponsor exists

1. Built for
internal use
2. Published
as a library
3. Internal wrapper
or fork appears
4. Versions
diverge
5. Maintenance mode
or archive notice
6. Read-only
archive

'internal wrappers on
top of Ribbon', 2016

public 1.5.18 against
internal 1.5.11, 2018

Stewardship leaves
the organisation

observable: one README sentence

observable: a version gap

a commercial sponsor exists

1. Built for
internal use
2. Published
as a library
3. Internal wrapper
or fork appears
4. Versions
diverge
5. Maintenance mode
or archive notice
6. Read-only
archive

'internal wrappers on
top of Ribbon', 2016

public 1.5.18 against
internal 1.5.11, 2018

Stewardship leaves
the organisation

Stage 3 is where the outcome is decided and stage 5 is where most consumers first notice, which is the gap this guide exists to close. The stage names are a reconstruction; the quoted transitions come from Ribbon, Hystrix, Conductor and ConsoleMe.
Diagram source

Stage 3 · The wrapper appears

Ribbon's README, April 2016: "we have wrapped them in a Netflix internal http client and we are not adding new functionality"; new work "has been added to internal wrappers on top of Ribbon". The published artefact is now a dependency of the real thing rather than the real thing.

Observable: prose, not metadata. Lead time to archive: years, sometimes longer than a decade. Source

Stage 4 · The versions separate

Hystrix shipped 1.5.12 through 1.5.18 to Maven Central while Netflix ran 1.5.11. The gap was only disclosed when the final release was made to close it. Conductor's divergence was disclosed on the day the repository went read-only.

Observable: a version or a refactor mentioned in passing. Lead time: zero to two years. Source

Stage 5 · The notice

Early notices are a heading edit with no date and no cause. Later ones name the date, the cause and the recommended action: ConsoleMe's says the open-source versions "no longer reflect how we use or operate these tools" and tells readers to fork.

Observable: a README diff. Lead time to archive: same day, in four of the last five cases. Source

Where the function goes. None of these components disappeared; their responsibility moved, and it moved to one of four places. Knowing which of the four is in play tells you what your own migration will cost, because the four cost wildly different amounts. Moving to a platform service means an operational dependency you did not have before. Moving to an ecosystem standard means a rewrite against a foreign API, but one with other vendors behind it. Moving to a control loop means deleting configuration you spent years tuning, which is cheaper than it sounds. Moving to a vendor means your dependency now has a price list.

Figure 3 · The four destinations a retired library's job moves to

The 2016 service process

Ribbon
load balancing

Hystrix
bulkheads

Eureka client
discovery

Servo
metrics

Simian Army
chaos and hygiene

Ecosystem standard
gRPC interceptors

Control loop
adaptive concurrency limits

Platform service
Chaos Monkey, Swabbie, Spinnaker

Successor library
Spectator, old one made a no-op

The 2016 service process

Ribbon
load balancing

Hystrix
bulkheads

Eureka client
discovery

Servo
metrics

Simian Army
chaos and hygiene

Ecosystem standard
gRPC interceptors

Control loop
adaptive concurrency limits

Platform service
Chaos Monkey, Swabbie, Spinnaker

Successor library
Spectator, old one made a no-op

The 2016 service compiled all five concerns into its own process; by 2026 each one has left the application in a different direction, which is why there is no single migration and no single replacement library. Destinations from Ribbon, concurrency-limits, Simian Army, Servo and Security Monkey.
Diagram source

Two of those destinations are worth dwelling on. The move from Hystrix to adaptive limits is not a library swap, it is a change of control strategy: the concurrency-limits README argues that in autoscaling systems a tuned request-per-second ceiling "quickly goes out of date and the service falls over", and replaces it by "equating a system's concurrency limit to a TCP congestion window". A team that migrates by looking for a drop-in Hystrix replacement will reimplement the thing Netflix left. The move from Servo to Spectator shows the opposite discipline: rather than removing the dead library, Netflix made its default registry a no-op "to minimize the overhead for legacy apps that still happen to have some usage of Servo". Leaving a harmless corpse on the classpath is a deliberate and underrated migration tool.

Concern2016 form2026 formStated reasonEvidence
Load balancing and discoveryRibbon plus Eureka client, in-processgRPC with load-balancing and discovery interceptors, internal"multi-language support and better extensibility/composability through request interceptors"Ribbon README, 2016
Fault isolationHystrix thread pools and tuned settingsAdaptive concurrency limits, latency driven"adaptive implementations that react to an application's real time performance rather than pre-configured settings"concurrency-limits
Metric collectionServo, JMX orientedSpectator, dimensionalServo "receives minimal maintenance"; new projects directed to SpectatorServo README
Metric aggregation for bulkheadsTurbine stream aggregatorNothing published; Turbine archived December 2025No cause publishedTurbine
Container schedulingTitus on Mesos, scheduled by FenzoNothing published; both repositories archivedNo cause publishedFenzo
Cloud resource hygieneSimian Army, one processSeparate services, two of them in the Spinnaker organisationFunctionality "moved to other Netflix projects"Simian Army
Cloud security postureSecurity MonkeyThe cloud provider's own service"For AWS users, please make use of AWS Config"Security Monkey

Three rows in that table say "nothing published", and they are the honest centre of this guide. Netflix's public account of its own platform stops at the moment of retirement. The gRPC stack promised in 2016 ("when we reach that level of confidence we hope to open-source this new approach") has not appeared in the organisation's repositories. Whatever schedules containers after Titus, and whatever aggregates resilience metrics after Turbine, are not described anywhere a repository can reach. An architect copying "the Netflix architecture" in 2026 is copying the part Netflix was willing to publish, which is now mostly the part it no longer runs.

03

The decisions that matter

Six forks in the road, each taken in public by Netflix with a stated reason, and the condition under which the rejected option is the right one for you.

Decision: where does a cross-cutting concern live, in the client library or in the transport?

Chosen
  • Netflix moved to "an RPC solution on top of gRPC" with load-balancing and discovery as interceptors, disclosed April 2016
  • Stated reasons: multi-language support, and extensibility through interceptors
Rejected
  • Continuing to invest in Ribbon, the in-process Java client
  • It had become "not Netflix-agnostic", with the real features living in an internal wrapper
Flips when
  • You are genuinely single-language and can redeploy every caller, which is when a library is still the cheapest place to put a policy
  • Note the cost Netflix accepted: the interceptor stack stayed internal, so nobody outside can copy it

Decision: tuned bulkheads, or a closed loop that sets its own limit?

Chosen
  • Adaptive limits using TCP congestion-control algorithms, Vegas and Gradient2, measuring queueing through latency
  • Hystrix's own README directs new work here and to resilience4j
Rejected
  • Per-dependency thread pools and hand-set request ceilings
  • In autoscaling fleets the tuned value "quickly goes out of date"
Flips when
  • Capacity is fixed and human-tuned config can keep pace, which is true of a single-tenant service on fixed hardware
  • Also flips when you cannot measure latency cleanly, because the control loop's input is the latency signal

Decision: maintain an open-source fork alongside a diverging internal one, or stop?

Chosen
  • Stop. Conductor, December 2023: resources realigned "with our internal Conductor fork"
  • ConsoleMe, 2026: maintaining "two divergent versions" is "no longer sustainable for the team"
Rejected
  • Continuing to publish releases cut from a codebase the team does not operate
  • Which is precisely what produced the Hystrix 1.5.18 against 1.5.11 gap
Flips when
  • The published artefact is the same artefact you run, with no internal fork, which is the only configuration that survives
  • Or when a sponsor with a commercial interest takes the maintainer seat, as Orkes did for Conductor

Decision: fix an unmaintained component with a Critical vulnerability, or relabel it?

Chosen
  • Relabel. NFLX-2018-001 lists the remediation as moving hystrix-dashboard to another GitHub organisation "to emphasize that it is an optional and unmaintained component"
  • The advice given is deployment advice: do not run it except behind authorization checks
Rejected
  • Patching the server-side request forgery in the proxy.stream and monitor.html endpoints
Flips when
  • The component is enabled by default in anybody's production, in which case relocation changes nothing and a patch is the only remediation
  • For a consumer, the rule is simpler: treat an advisory whose fix is a repository move as an instruction to remove the component

Decision: finish the rewrite, or keep the version that works?

Chosen
  • Keep 1.x. The Eureka wiki records that work on 2.0 "is discontinued" and that the released 2.x artefacts are "use at your own risk"
  • Eureka 1.x is still not archived and still described as "a core part of Netflix's service discovery system"
Rejected
  • The published 2.0 architecture, abandoned after artefacts had already been released
Flips when
  • The rewrite's new capability is on the critical path of something already funded, which is the only force that reliably finishes one
  • The consumer-side rule: never adopt a major version whose motivation document is more recent than its last release

Decision: keep scheduling on your own framework, or on the ecosystem's?

Chosen
  • Leave. Titus and its control plane were archived in May 2022 and Fenzo, the Mesos scheduling library beneath them, in March 2023
  • The order matters: the platform was archived first, the library that served it eleven months later
Rejected
  • Continuing to carry a bespoke scheduler for a framework the industry left
Flips when
  • Your scheduling constraints are genuinely unrepresentable in the ecosystem scheduler, which is rarer than teams believe and is a claim worth testing before it is asserted
  • Neither repository states a cause, so treat this row as inference from the archive dates rather than as a reported decision

Figure 4 · Reading a dependency you did not write

yes

no

cannot tell

yes

yes

no

Does the README mention
an internal wrapper, fork
or 'alignment'?

Plan the exit now.
Budget a fork or a replacement
within two release cycles.

Is the publisher's own
deployment the published
artefact?

Ask in an issue.
The answer, or its absence,
is the signal.

Is the concern
cross-cutting and
multi-language?

Expect it to leave the library
for the transport or the platform.
Keep call sites thin.

Depend on it, and monitor
merge rate rather than
commit count.

yes

no

cannot tell

yes

yes

no

Does the README mention
an internal wrapper, fork
or 'alignment'?

Plan the exit now.
Budget a fork or a replacement
within two release cycles.

Is the publisher's own
deployment the published
artefact?

Ask in an issue.
The answer, or its absence,
is the signal.

Is the concern
cross-cutting and
multi-language?

Expect it to leave the library
for the transport or the platform.
Keep call sites thin.

Depend on it, and monitor
merge rate rather than
commit count.

Every terminal node is an action rather than a judgement, and the first question is deliberately not about activity: a busy repository with an internal fork behind it is in more danger than a quiet one without.
Diagram source
DecisionChosenRejectedBecauseEvidence
Home of load balancing and discoverygRPC interceptors, internalRibbon client libraryMulti-language support and composabilityRibbon README, 2016-04-18
Overload protectionAdaptive concurrency limitsTuned thread poolsTuned values go stale under autoscalingconcurrency-limits
Two forks of one systemStop publishingKeep releasing from the diverged tree"no longer sustainable for the team"ConsoleMe, 2026
Critical vulnerability in an optional componentRelocate and labelPatch itComponent declared optional and unmaintainedNFLX-2018-001, 2018-01-10
Discovery rewriteKeep 1.xShip 2.02.x declared "use at your own risk"Eureka wiki
Metrics library replacementMake the old one a no-opRemove itMinimise overhead for apps still importing itServo README
Stewardship of a healthy projectHand it to a sponsorKeep maintaining it in-houseMetaflow is "now supported by Outerbounds"; Conductor by OrkesMetaflow README
04

What broke, and for whom

No production outage is available in this corpus. What is available is six failures of the shared-library strategy itself, each with a dated artefact, and each of which transferred cost to somebody who did not choose it.

Be clear about what these cards are, because the distinction matters when you cite them. They are not incident reviews of a running system; this session could not reach a single Netflix outage report. They are retrospective accounts, written by the team that operated the thing, of why a component stopped, plus the traces that decision left in other people's repositories. Four classes account for all six: silent divergence, where the public and internal copies separate without disclosure; the unfinished rewrite; the zombie, which accepts contributions it will never merge; and the orphan with a vulnerability. The fifth and sixth cards are downstream consequences of the first class rather than new classes, and they are where most readers will feel the cost.

Figure 5 · The zombie contribution path, as PR #2033 actually ran

"Netflix internal build"Maintainers"Netflix/Hystrix"Contributor"Netflix internal build"Maintainers"Netflix/Hystrix"Contributor2018-11-19 maintenance notice published1368 days open, defect still presentdownstream2022-11-12 opens PR 2033, Java11 thread pool fix1review requested2no review, per the stated policy3internal code continueson its own path42026-08-11 deletes the fork, PRcloses unmerged5
"Netflix internal build"Maintainers"Netflix/Hystrix"Contributor"Netflix internal build"Maintainers"Netflix/Hystrix"Contributor2018-11-19 maintenance notice published1368 days open, defect still presentdownstream2022-11-12 opens PR 2033, Java11 thread pool fix1review requested2no review, per the stated policy3internal code continueson its own path42026-08-11 deletes the fork, PRcloses unmerged5
A genuine Java 11 defect fix, opened four years after the maintenance notice, closed 1,368 days later by the contributor deleting their fork rather than by any maintainer decision. Reconstructed from pull request 2033 and the 87 closed unmerged pull requests.
Diagram source
Postmortem

Class 1: the public version ran ahead of the one anybody operated

AssumptionThat the latest release of a company-published library is the version that company runs.
What happenedHystrix published up to 1.5.18 while Netflix ran 1.5.11 internally. The gap became public only in the farewell note, which describes the final release as making Maven Central "aligned with the last known stable version used internally".
Blast radiusEvery consumer who upgraded to stay current, across a library with 24.5k stars and 4.7k forks as of 21 September 2026. Detection gap: the seven releases were live for months before the disclosure.
FixOne final release cut to realign the public artefact, then maintenance mode.
Design ruleFor any dependency published by an operator, find out which version that operator runs. If nobody can tell you, the release feed is a development branch you are consuming in production.
Postmortem

Class 1: the divergence disclosed on the day the lights went out

AssumptionThat an actively released project with 12.8k stars has a maintainer with an interest in its future.
What happenedConductor's announcement and its archive banner carry the same date, 13 December 2023. The stated cause is "realigning our resources to better serve our business objectives with our internal Conductor fork".
Blast radius12.8k stars, 2.3k forks, and every open issue frozen where it stood, including bug reports filed in the days before the archive.
FixNone from Netflix. The community fork at conductor-oss, stewarded by Orkes, carries the project on.
Design ruleZero notice is a legitimate outcome, so the contingency has to exist before the announcement. Know, for each critical dependency, whether a credible fork already exists and who would run it.
Postmortem

Class 2: the rewrite that was published and then abandoned

AssumptionThat a published architecture document plus released artefacts mean a major version is on its way.
What happenedEureka 2.0's motivations and architecture were published, artefacts were released from the 2.x branch, and the work stopped. The wiki now records that the artefacts are "considered use at your own risk".
Blast radiusAnybody who planned a migration to 2.x. A user opened an issue in October 2018 asking why the work was discontinued; the thread carries no published answer.
Fix1.x continues, unarchived and still described as core to Netflix's service discovery.
Design ruleAdopt a major version on evidence of use, not on evidence of design. A design document is a proposal; a release the publisher runs is a commitment.
Postmortem

Class 3: the repository that accepts work it will never merge

AssumptionThat a repository which declares it will not merge pull requests will stop receiving them.
What happenedHystrix has 87 closed and unmerged pull requests and 52 still open, eight years after the notice. PR 2033, a real Java 11 defect fix, sat for 1,368 days and closed when its author deleted their fork.
Blast radiusUnquantified contributor effort, and a defect that remains in the artefact everyone downstream still resolves from Maven Central.
FixNone. The repository is neither archived nor merging, which is the worst of the available states because it keeps the door open.
Design ruleMeasure a dependency by merge rate, not commit count or issue volume. If you are considering upstreaming a fix, check the date of the last merged external pull request first.
Postmortem

Class 4: the Critical advisory whose remediation was a repository move

AssumptionThat a vendor advisory rated Critical comes with a patched version.
What happenedNFLX-2018-001, dated 10 January 2018, reports unauthenticated server-side request forgery in hystrix-dashboard's proxy.stream and monitor.html endpoints. Its patch section describes moving the component to the Netflix-Skunkworks organisation "to emphasize that it is an optional and unmaintained component".
Blast radiusEvery deployment of the dashboard, which was widely run beside Hystrix. The relocated repository still carries the warning and the code.
FixDeployment guidance: do not run it except behind authentication and authorization.
Design ruleRead the remediation field of an advisory before the severity field. A remediation that changes the project's location or label, rather than its code, is an end-of-life notice with a CVSS score attached.
Postmortem

Downstream: the framework named after a company that now ships one of its parts

AssumptionThat a widely adopted integration layer insulates you from its upstream's internal decisions.
What happenedSpring Cloud Netflix, once the standard way to consume this stack, now builds only Eureka client and server modules. Its feature list in the README contains nothing but service discovery.
Blast radiusEvery Spring Boot service that adopted the Netflix stack through starters had to replace fault tolerance, load balancing and gateway components, on somebody else's schedule.
FixThe ecosystem re-homed each concern: resilience4j for fault tolerance, which deliberately dropped Hystrix's thread pool isolation and is "based on a semaphore".
Design ruleAn integration layer inherits its upstream's lifecycle and adds latency to the bad news. When the upstream announces, your framework's migration is still months away.
The signal that fails silently

Netflix repositories carry a machine-readable lifecycle marker, an OSSMETADATA file holding one of active, maintenance or archived, which is rendered as a badge in the README. Conductor's file, read at HEAD on 21 September 2026, says osslifecycle=active. The repository has been read-only since December 2023. Archiving freezes the file that would have said otherwise, so the badge on a dead project reports it alive forever. Four of the projects in this corpus, including Maestro and Metaflow, carry no such file at all. Never let an automated dependency check read a health signal that the project itself publishes into its own repository.

05

Numbers you can plan against

Dates and counts, all read from the repositories on 21 September 2026. The lags in the last column are the ones worth stealing for your own dependency review.

ComponentNoticeArchivedAdoption at checkNotice to archiveSource
Ribbon2016-04-18Not archived4.6k stars10.4 years, openrepo
Hystrix2018-11-19Not archived24.5k stars, 4.7k forks7.8 years, openrepo
hystrix-dashboard2018-01-10Relocated, not archivedAdvisory severity CriticalRelocation was the remedyadvisory
Simian ArmyRetired, undated2021-03-048.0k starsNot statedrepo
Security MonkeyEnd of life in 20202021-09-174.4k starsAbout 2 yearsrepo
Titus control planeNone published2022-05-14319 starsNo noticerepo
FenzoNone published2023-03-31698 starsNo noticerepo
Conductor2023-12-132023-12-1312.8k stars, 2.3k forksSame dayrepo
DispatchDated announcement2025-09-016.5k starsAnnounced in advancerepo
TurbineNone published2025-12-19833 stars7.1 years after Hystrixrepo
AsgardDeprecated, undated2025-12-192.2k starsSame day as Turbinerepo
ConsoleMe and WeepDated announcement2026-03-013,200+ stars, self-reportedAnnounced in advancerepo
MetricValueKindContextAs ofSource
Archived repositories in the organisation48 of 239MeasuredPublic repositories only2026-09-21search
Closed and unmerged pull requests, Hystrix87MeasuredWhole repository history2026-09-21query
Days pull request 2033 stayed open1,368Derived2022-11-12 to 2026-08-11, counted as 1,461 days for four years less 932026-09-21PR 2033
Public Hystrix release minus internal release1.5.18 vs 1.5.11ReportedSeven patch versions of drift at the point of disclosure2018-11README
Spring Cloud Netflix modules that remain5 of them, all EurekaMeasuredCounted from the build file, excluding dependencies and docs2026-09-21pom.xml
Maestro workflow schedulingHundreds of thousands of workflows, millions of jobs dailySelf-reported, undatedNetflix data platformRead 2026-09-21README
Metaflow use inside NetflixOver 3,000 AI and ML projectsSelf-reported, undatedStewardship now with OuterboundsRead 2026-09-21README
Read these carefully

Star and fork counts are adoption proxies, not measurements of use, and they are here only to compare orders of magnitude. The two scale figures are self-reported in a README with no date attached to the number, so they date only to the day the file was read. Everything in the "notice to archive" column is arithmetic on two dates I read from the repositories, not a figure anyone published.

What nobody has published, and what therefore cannot be planned against: the cost of running any of these systems, the internal version history of any replacement, and the operational consequence of any of these retirements. If a claim in this guide sounds like it describes a production outcome, check the wording; it is either inference or it is not there.

06

The evidence wall

Every source behind this page was fetched on 21 September 2026 from github.com or raw.githubusercontent.com, the only hosts this session's network policy allowed. Filter by kind. There are no blogs, talks or papers here, and section 1 says why.

Retrospective Netflix2018-11-19

Hystrix README, "Hystrix Status"

The estate's central document. It announces maintenance mode, states that Netflix will not review issues or merge pull requests, gives the reason as a shift to "adaptive implementations that react to an application's real time performance", and discloses that the final release existed to realign Maven Central with the internally used 1.5.11.

Carry forwardAsk which version the publisher runs. The answer is rarely the latest one, and the difference is your untested surface.
https://github.com/Netflix/Hystrix
Retrospective Netflix2018-01-10

NFLX-2018-001, server-side request forgery in hystrix-dashboard

Severity Critical, affecting all versions. The patch section describes relocating the component to another GitHub organisation "to emphasize that it is an optional and unmaintained component", and the mitigation offered is to run it only behind authorization checks.

Carry forwardAn advisory whose remediation is a repository move is an end-of-life notice. Remove the component rather than tracking the fix.
https://raw.githubusercontent.com/Netflix/security-bulletins/master/advisories/nflx-2018-001.md
Retrospective Netflix2023-12-13

Conductor: discontinuation announcement and archive

Announcement and archive banner share a date. The cause is named without euphemism: resources are being realigned "with our internal Conductor fork". A project with 12.8k stars and 2.3k forks went read-only the same day its users learned of the decision.

Carry forwardZero notice is a legitimate outcome. The fork plan has to exist before the announcement, not after it.
https://github.com/Netflix/conductor
Retrospective Netflix2026-03-01

ConsoleMe and Weep archive notice

The fullest statement of the pattern in the corpus. The internal versions "evolved significantly, especially following a major refactor last year", the open-source versions "no longer reflect how we use or operate these tools", and maintaining two divergent versions is "no longer sustainable for the team". Readers are told to fork.

Carry forwardAn internal refactor is the event that kills the public copy. Watch for refactor announcements, not for release gaps.
https://github.com/Netflix/consoleme
Retrospective Netflixchecked 2026-09-21

Eureka wiki, "Eureka 2.0 (Discontinued)"

A rewrite that reached released artefacts and then stopped. The wiki records that the 2.x work "is discontinued" and its artefacts are "use at your own risk", while 1.x remains "a core part of Netflix's service discovery system".

Carry forwardAdopt a major version on evidence of use, not on evidence of design. Released artefacts are not a commitment.
https://github.com/Netflix/eureka/wiki
Retrospective Netflixarchived 2021-09-17

Security Monkey end-of-life notice

The clean case of a library replaced by the cloud provider's own service: "For AWS users, please make use of AWS Config", and Cloud Asset Inventory for Google Cloud. The notice predates the archive by roughly two years.

Carry forwardWhen a provider ships the capability natively, a third-party tool for it has a two-year horizon at best.
https://github.com/Netflix/security_monkey
Retrospective Netflixarchived 2021-03-04

Simian Army, "PROJECT STATUS: RETIRED"

The decomposition case. Chaos Monkey became a standalone service, Janitor Monkey's job moved to Swabbie in the Spinnaker organisation, and Conformity Monkey's was folded into Spinnaker backends. One library became three services under two owners.

Carry forwardRetirement is often decomposition. Map each function to its new home separately; there is no single replacement to adopt.
https://github.com/Netflix/SimianArmy
Source Netflix2016-04-18

Ribbon README and the commit that added its status

The earliest divergence disclosure in the estate, added by the commit "Add maintenance project status to README". It admits internal wrappers hold the new functionality, that components were "replaced by non-OSS solutions over time", and that the team is building an RPC stack on gRPC for multi-language support and interceptor composability.

Carry forwardThe phrase "internal wrapper" in a README is the earliest reliable abandonment signal. It arrived here a decade before any archive.
https://github.com/Netflix/ribbon/commits/master/README.md
Source Netflix2022-11 to 2026-08

Hystrix pull request 2033 and the unmerged queue

A Java 11 defect fix, opened four years after maintenance mode, closed after 1,368 days when the author deleted their fork. It sits among 87 closed and unmerged pull requests, with 52 more still open on a repository that promised in 2018 to merge none of them.

Carry forwardMerge rate is the liveness metric. Commit count and issue traffic both keep moving long after a project stops accepting work.
https://github.com/Netflix/Hystrix/pull/2033
Decision record Netflixchecked 2026-09-21

concurrency-limits README

The argument for the strategy that replaced Hystrix: request-per-second ceilings go stale under autoscaling, so the limit is inferred instead, by "equating a system's concurrency limit to a TCP congestion window" and applying Little's Law, with Vegas and Gradient2 as the two algorithms.

Carry forwardThe replacement for a tuned constant is usually a control loop, not a better constant. Budget for the latency signal it needs.
https://github.com/Netflix/concurrency-limits
Decision record Netflixread at HEAD 2026-09-21

OSSMETADATA lifecycle markers across the estate

A one-line file per repository holding active, maintenance or archived, rendered as a README badge. Conductor's says active while the repository is read-only; Hystrix, Ribbon and Servo say maintenance; Maestro, Metaflow and the DGS framework carry no file at all.

Carry forwardSelf-published health metadata freezes at death. Read the archive flag and the merge log instead.
https://raw.githubusercontent.com/Netflix/conductor/HEAD/OSSMETADATA
Source Netflixchecked 2026-09-21

Servo README, "# DEPRECATED"

Directs new work to Spectator and, more usefully, records the migration tactic: since version 0.13.0 the default monitor registry is a no-op "to minimize the overhead for legacy apps that still happen to have some usage of Servo".

Carry forwardNeutering a dependency in place is cheaper than removing it from every caller, and it converts a migration into a cleanup.
https://github.com/Netflix/servo
Source Netflixarchived 2022-05-14 and 2023-03-31

Titus control plane and Fenzo archive banners

The container platform's public source stops in May 2022; Fenzo, the Mesos scheduling library under it, is archived eleven months later. Neither repository states a cause and no successor repository appears in the organisation.

Carry forwardA platform archived with no successor published is the strongest available evidence that the work moved to an ecosystem standard.
https://github.com/Netflix/titus-control-plane
Source Netflixarchived 2025-12-19

Turbine and Asgard, archived on the same day

Turbine aggregated Hystrix's metric streams and outlived its own reason to exist by seven years. Asgard had carried the note "Asgard is deprecated at Netflix. We use Spinnaker" for far longer. Both went read-only on 19 December 2025, which is what a housekeeping sweep looks like rather than a decision about either system.

Carry forwardArchive dates cluster. Treat an archive flag as evidence of administrative attention, and read the README for the actual decision date.
https://github.com/Netflix/Turbine
Source Spring Cloudchecked 2026-09-21

spring-cloud-netflix build file and README

The downstream record of the whole decade in one file. The module list contains only Eureka client, Eureka server and their starters, and the README's feature list is two lines of service discovery. The integration layer that carried Hystrix, Ribbon, Zuul and Archaius to a generation of Spring Boot services now carries one component.

Carry forwardCheck the integration layer's build file, not its documentation. Modules disappear from the build before the prose catches up.
https://raw.githubusercontent.com/spring-cloud/spring-cloud-netflix/HEAD/pom.xml
Source resilience4jchecked 2026-09-21

resilience4j README

The successor the Hystrix notice points at, and it is not a reimplementation. Its bulkhead "is based on a semaphore, and unlike Hystrix, does not provide 'shadow' thread pool option". Its own reading list includes talks titled "Resilience patterns in the post-Hystrix world" and "Hystrix is dead, now what?".

Carry forwardThe replacement usually drops the expensive feature rather than reproducing it. Check that your design did not depend on the thing dropped.
https://github.com/resilience4j/resilience4j
Source conductor-oss and Orkeschecked 2026-09-21

conductor-oss/conductor README

The afterlife. The fork that took over from the archived repository is "actively maintained by Orkes and the community", and has repositioned the product as "a durable execution platform for microservices, AI agents, and adaptive workflow graphs".

Carry forwardA vendor-stewarded fork is a real continuation path, and it comes with a roadmap set by the vendor's product rather than your use case.
https://github.com/conductor-oss/conductor
Case study Netflix and Outerboundschecked 2026-09-21

Metaflow README

The successful exit, and one of only two scale figures in the corpus: "At Netflix alone, Metaflow supports over 3000 AI and ML projects", with stewardship now at Outerbounds, the company built around the project.

Carry forwardThe projects that survive leaving their creator are the ones somebody sells. Check who employs the top committers before you commit.
https://github.com/Netflix/metaflow
Case study Netflixchecked 2026-09-21

Maestro README

What Netflix publishes in the 2020s: not a library to embed but the source of a managed platform service, "a fully managed workflow-as-a-service" that "schedules hundreds of thousands of workflows, millions of jobs every day".

Carry forwardA published platform service carries a different risk from a published library: you inherit its operational model, not its API surface.
https://github.com/Netflix/maestro
Source Netflixchecked 2026-09-21

DGS framework releases

The counter-example to every card above. The library Netflix still maintains in public rides somebody else's release train: version 11 is "built on top of Spring Boot 4", and releases continued through September 2026. Its support table retires versions by Spring Boot generation rather than by Netflix's internal calendar.

Carry forwardThe company-published libraries that last are the ones whose upstream is a framework, because the external cadence keeps the two copies aligned.
https://github.com/Netflix/dgs-framework/releases
Source Netflixchecked 2026-09-21

OSS Tracker README

Netflix published a tool that measures precisely the signals this guide relies on: "days since last commit, and average time to resolve issues and pull requests", aggregated across an organisation for a community manager to act on.

Carry forwardThe metrics an OSS office tracks internally are the metrics you should track about your dependencies. Time to resolve is the one that matters.
https://github.com/Netflix/osstracker
Source GitHub and Netflixquery run 2026-09-21

Repository search: org:Netflix archived:true

48 archived repositories against 239 public ones. The list is the estate's index: Conductor, Simian Army, Dispatch, Security Monkey, ConsoleMe, Asgard, Titus, Turbine and the rest, in one page, each with a date one fetch away.

Carry forwardOne search enumerates a vendor's graveyard. Run it against every organisation you depend on before you depend on it further.
https://github.com/search?q=org:Netflix+archived:true&type=repositories
07

Audit your own estate, then harden it

Seven rungs. The first three are an afternoon with a script; the crossing to real work happens at rung four, where you stop measuring and start changing something.

Pull the archive flag and the merge log for your top thirty dependencies

One request per repository for the archive state, the default branch's last commit, and the date of the most recently merged pull request from outside the owning organisation.

Done when: you can sort your dependency list by days since the last external merge.  Teaches: liveness is a merge metric; commit count moves long after the door closes.

Grep every dependency README for the divergence vocabulary

Search for "internal", "wrapper", "our fork", "maintenance mode", "alignment", "no longer reflect", "we encourage you to fork". Ribbon's 2016 sentence and ConsoleMe's 2026 notice both match.

Done when: you have a shortlist and a named owner for each.  Teaches: the leading indicator is prose written by an engineer, not metadata written by a tool.

Compare each project's self-reported health against its archive flag

Read whatever lifecycle file or badge the project publishes, then read the repository's actual state. Conductor is the worked example: marker says active, repository is read-only.

Done when: you have found at least one dependency whose badge disagrees with reality.  Teaches: a health signal published by the patient freezes at the moment of death.

Map one fat client library's functions to their likely destinations

Take the heaviest in-process dependency you have and split it: which functions belong in the transport, which in a platform service, which become a control loop, which stay.

Done when: every function has a named destination and an owner.  Teaches: there is no single replacement, which is why these migrations are estimated badly.

Replace one static limit with an adaptive one in staging

Put a latency-driven concurrency limiter in front of one dependency and inject latency until the limit moves. Compare what it settles on against the constant you had tuned.

Done when: you can show the limit tracking injected latency, and the number it converges to.  Teaches: why the sources describe tuned ceilings as going stale rather than as being wrong.

Run the fork drill on one critical dependency

Fork it, build it from source, publish it to your internal repository, apply one real patch, and run a service on it. Time the whole thing and write down what broke.

Done when: a production-shaped service runs on your fork and you know the elapsed hours.  Teaches: what "we encourage you to fork the repository" actually costs, before you are told to do it at zero notice.

Write the divergence policy for the code you publish

If you publish anything, state now what happens when your internal copy diverges: who is told, how long the notice is, and whether the artefact is archived or handed over.

Done when: the policy names a trigger and a notice period, and a named person owns it.  Teaches: the entire failure catalogue above is one unwritten policy, observed nine times.

08

Keep hunting

These are the queries that produced this page, in the order they were run. They work against any organisation, which is the point of shipping them.

Enumerate the graveyard

  • https://github.com/search?q=org:ORGNAME+archived:true&type=repositories
  • https://github.com/ORGNAME/REPO (read the grey archive banner for its date)
  • https://raw.githubusercontent.com/ORGNAME/REPO/HEAD/OSSMETADATA

Date the decision, not the archive

  • https://github.com/ORG/REPO/commits/master/README.md
  • https://github.com/ORG/REPO/commits/master/README.md?since=2018-01-01&until=2019-01-01
  • https://raw.githubusercontent.com/ORG/REPO/HEAD/README.md

Measure whether anything still merges

  • https://github.com/ORG/REPO/pulls?q=is:pr+is:closed+is:unmerged+sort:updated-desc
  • https://github.com/ORG/REPO/pulls?q=is:pr+is:merged+sort:updated-desc
  • https://github.com/ORG/REPO/issues?q=is:issue+discontinued+OR+deprecated+OR+fork

Find the divergence in prose

  • grep -i "internal wrapper|internal fork|no longer reflect|alignment" README.md
  • https://raw.githubusercontent.com/ORG/SECURITY-REPO/master/advisories/ (read the Patch field)
  • https://raw.githubusercontent.com/DOWNSTREAM/PROJECT/HEAD/pom.xml (count surviving modules)

Two notes on method. First, the commit history of a single file is the most underused view on GitHub: it converts an undated status line into a dated decision, and it is how the April 2016 and November 2018 dates in this guide were established. Second, when a page renders an announcement, fetch the raw file as well, because the rendered page and the file can disagree about what is a banner and what is a heading, and only the file is quotable.

09

References

  1. Netflix, Hystrix README and project status GitHub. Status notice added 2018-11-19. Checked 2026-09-21.
  2. Netflix, commit adding the Hystrix maintenance notice GitHub, 19 November 2018. Checked 2026-09-21.
  3. Netflix, Hystrix pull request 2033, closed unmerged GitHub. Opened 2022-11-12, closed 2026-08-11. Checked 2026-09-21.
  4. Netflix, Hystrix closed and unmerged pull requests GitHub query. Run 2026-09-21.
  5. Netflix, NFLX-2018-001: unauthenticated server-side request forgery in Hystrix-Dashboard Netflix security bulletins, 10 January 2018. Checked 2026-09-21.
  6. Netflix-Skunkworks, hystrix-dashboard README GitHub. Checked 2026-09-21.
  7. Netflix, Ribbon README, "Project Status: On Maintenance" GitHub. Notice added 2016-04-18. Checked 2026-09-21.
  8. Netflix, Ribbon README commit history GitHub. Checked 2026-09-21.
  9. Netflix, Eureka wiki, "Eureka 2.0 (Discontinued)" GitHub. Checked 2026-09-21.
  10. Netflix, Eureka issue 1129, "Why was Eureka 2.0 discontinued?" GitHub, opened October 2018. Checked 2026-09-21.
  11. Netflix, Conductor README and archive banner GitHub, archived 13 December 2023. Checked 2026-09-21.
  12. Netflix, Conductor OSSMETADATA at HEAD GitHub raw. Checked 2026-09-21.
  13. Netflix, ConsoleMe and Weep archive notice GitHub, archive dated 1 March 2026. Checked 2026-09-21.
  14. Netflix, Dispatch archive notice GitHub, archive dated 1 September 2025. Checked 2026-09-21.
  15. Netflix, Security Monkey end-of-life notice GitHub, archived 17 September 2021. Checked 2026-09-21.
  16. Netflix, Simian Army, "PROJECT STATUS: RETIRED" GitHub, archived 4 March 2021. Checked 2026-09-21.
  17. Netflix, Titus control plane archive notice GitHub, archived 14 May 2022. Checked 2026-09-21.
  18. Netflix, Fenzo README and archive banner GitHub, archived 31 March 2023. Checked 2026-09-21.
  19. Netflix, Turbine archive banner GitHub, archived 19 December 2025. Checked 2026-09-21.
  20. Netflix, Asgard README and archive banner GitHub, archived 19 December 2025. Checked 2026-09-21.
  21. Netflix, Servo README, "# DEPRECATED" GitHub. Checked 2026-09-21.
  22. Netflix, Spectator README GitHub. Checked 2026-09-21.
  23. Netflix, concurrency-limits README GitHub. Checked 2026-09-21.
  24. Netflix, Maestro README GitHub. Checked 2026-09-21.
  25. Netflix, Metaflow README GitHub. Checked 2026-09-21.
  26. Netflix, DGS framework releases GitHub. Checked 2026-09-21.
  27. Netflix, Zuul README GitHub. Checked 2026-09-21.
  28. Netflix, OSS Tracker README GitHub. Checked 2026-09-21.
  29. GitHub repository search, org:Netflix archived:true GitHub. Run 2026-09-21.
  30. Spring Cloud, spring-cloud-netflix module list GitHub raw. Checked 2026-09-21.
  31. Spring Cloud, spring-cloud-netflix README GitHub. Checked 2026-09-21.
  32. resilience4j, project README GitHub. Checked 2026-09-21.
  33. conductor-oss, Conductor README GitHub. Checked 2026-09-21.
  34. Netflix, Falcor repository GitHub. No releases published; lifecycle marker reports active. Checked 2026-09-21.