Active in a year = played ≥1 official event (TBA regional / district / district-championship / championship-division / Einstein). Offseason & preseason excluded.
Lifespan = first→last active year; interior gaps count as alive (gap-tolerant, robust to COVID sit-outs). Cohort = a team's rookie year. Confirmed dead = absent ≥2 completed seasons, so 2025–26 losses are provisional (hatched everywhere; a team that skips 2026 may simply return in 2027).
Caveat: TBA event rosters count registered teams, so 2020 is slightly inflated (events cancelled mid-season after registration). The gap-tolerant model correctly treats teams that sat out and returned as never-dead.
How many teams competed each season. Participation peaked in 2020 and has not recovered — the question the rest of this tool unpacks is why.
Each year decomposed into teams gained (new rookies + returners, above the axis) and lost (departures, below), with the net change as a line. Toggle to Rate to divide by the prior year's field — the honest way to compare across a growing base.
Each line is a rookie cohort; it shows the share still active as the cohort ages. Curves stop where the outcome isn't observable yet (right-censoring). Early attrition is steep but remarkably stable across 20 years — except the COVID cohorts.
Each line is teams of a given age, and its height is the share that left the next season. Younger teams churn far more than veterans — but watch the recent uptick across every band: even 11+ year veterans, normally the stickiest teams, have been leaving at a rising rate since COVID. That broad, gentle ramp is the real retention signal.
Why the crude rate misleads: with fewer rookies, the field aged dramatically — the median team age roughly doubled, and long-lived veterans came to dominate. Those veterans rarely leave, masking the across-the-board rise in per-team churn.
Data: The Blue Alliance API v3. EPA/competitiveness and regional breakdowns are deliberately out of scope for this first cut. Built as a single self-contained file.