charmbracelet/bubbletea
Lore
A timeline of how Bubble Tea evolved. Dates are derived from git history and tag timestamps.
Eras
Era 1 — The first pass (Jan 2020 – May 2020)
The first commit (bee32ca, Jan 10 2020) is titled "Initial commit. First pass." and lays down the Elm-style Init/Update/View skeleton. The very first follow-ups added arrow-key navigation, escape-to-quit, and Ctrl+C handling — all present in the same form today.
By March 2020 (v0.1.0), the project had subscriptions and a multi-view example with a progress bar. Christian Rocha is the dominant contributor in this era.
Key events:
- Jan 10 2020 — Initial commit by Christian Rocha.
- Mar 2020 —
v0.1.0published. - May 2020 — Tutorials directory introduced (
tutorials/basics/main.go).
Era 2 — Filling out the API (mid 2020 – 2022)
Many of the now-classic tea abstractions appeared in this stretch: Cmd/Batch (commands.go), the alt screen, mouse handling (mouse.go), and the early renderer split into a dedicated file. The examples/ directory landed in Oct 2022 (examples/textinput's first commit) — although individual demos already existed scattered across the tree before then. Christian Muehlhaeuser ("muesli") is the second-largest contributor in this period.
Tagged minor versions ramped up: v0.6.x through v0.22.x shipped over roughly two years.
Era 3 — Production hardening (2023 – mid 2024)
A long string of bugfix releases (v0.23.x through v1.x) tightened up Windows support, signal handling, and renderer edge cases. The library was already in widespread production use during this time. Carlos Becker (caarlos0) was a frequent contributor.
Era 4 — The v2 redesign (Sep 2024 – Nov 2024)
The biggest single architectural change in the project's history. Starting in September 2024, Ayman Bagabas ("aymanbagabas") drove a rewrite that:
- Moved the module path to the vanity domain
charm.land/bubbletea/v2. - Replaced imperative startup options (
tea.WithAltScreen()) and toggle commands (tea.EnterAltScreen) with declarativeViewfields. - Made
View()return atea.Viewstruct (no longer astring). - Switched
KeyMsgandMouseMsgfrom structs to interfaces with typed sub-messages (KeyPressMsg,KeyReleaseMsg,MouseClickMsg, …). - Pulled the input reader, cell buffer, and ANSI primitives into a shared
github.com/charmbracelet/ultravioletpackage, which Bubble Tea now depends on. - Renamed the renderer to
cursedRenderer(e753b6a, Jan 23 2025) — a nod to the ncurses lineage and the project's house humor.
Two-step rollout:
- Oct 2024 —
v2.0.0-alpha.1first lands the new shape. - Apr 2025 —
v2.0.0final release; six beta and two RC tags appeared along the way.
The number of commits per month nearly tripled during this era, peaking at 111 in October 2024.
Era 5 — V2 polish (mid 2025 – present)
Post-v2, the work has shifted to incremental polish:
- Extended keyboard protocol support (#1626, May 2025).
- A long thread of dependency bumps for
ultraviolet,lipgloss,colorprofile. - Sweeping examples migration so all 60+ demos use the v2 API.
- Several signal-handling fixes (#1673 / #1674) and renderer optimizations (hard tabs, tab-stop restoration in
cursed_renderer.go). - Latest tag at the time of this wiki:
v2.0.6.
Longest-standing components
| Component | First appeared | Notes |
|---|---|---|
Model interface (Init/Update/View) |
Jan 2020 (bee32ca) |
The shape is unchanged; only the View return type evolved. |
Cmd / Batch |
early 2020 | commands.go predates v0.1.0. |
LogToFile |
mid 2020 | Same API today (logging.go). |
| Alt screen toggle | 2020 | Originally a command, now a View field. |
| Mouse support | 2020 | Migrated from struct messages to interface messages in v2. |
tutorials/basics |
Jul 2020 | The grocery-list tutorial. |
Deprecated or removed features
The v2 migration retired a long list of v1 APIs. The full reference lives in UPGRADE_GUIDE_V2.md. Highlights:
| What was removed | Replaced by | Era |
|---|---|---|
tea.WithAltScreen() |
view.AltScreen = true |
v2 (2024) |
tea.WithMouseCellMotion() / WithMouseAllMotion() |
view.MouseMode |
v2 |
tea.EnterAltScreen / ExitAltScreen (commands) |
view.AltScreen |
v2 |
tea.EnableMouseCellMotion / DisableMouse (commands) |
view.MouseMode |
v2 |
tea.HideCursor / ShowCursor |
view.Cursor = nil / &Cursor{...} |
v2 |
tea.SetWindowTitle("…") (command) |
view.WindowTitle |
v2 |
tea.WithInputTTY() |
Now automatic — Run opens the controlling TTY when stdin is not a terminal. |
v2 |
tea.WithANSICompressor() |
The cursed renderer handles compression. | v2 |
tea.MouseEvent |
tea.Mouse |
v2 |
tea.Sequentially(...) |
tea.Sequence(...) |
already deprecated in v1; removed in v2 |
p.Start() / StartReturningModel() |
p.Run() |
v2 |
v2.0.0-beta1 was retracted (go.mod's retract directive) because the version string was missing the dot before the 1.
Major rewrites
- The renderer rename (Jan 2025) — Commit
e753b6arenamed the standard renderer tocursedRenderer. The implementation had grown to 800+ lines and gained synchronized-output support, mouse-mode-aware enable/disable sequences, hard-tab optimization, and progress-bar handling. - The ultraviolet split (2024) — Most of the low-level event types and the cell buffer were extracted into
github.com/charmbracelet/ultraviolet. The package aliasuvis used consistently throughout the code. - Declarative views (Sep–Nov 2024) — The shift from imperative options to
Viewfields touched dozens of files and every example.
Growth trajectory
- 1,861 commits over ~6 years (Jan 2020 – Apr 2026), averaging ~25 commits per month.
- 79 published tags from
v0.1.0tov2.0.6. - The contributor base widened from 1 (Christian Rocha) in early 2020 to a steady cohort of ~6 frequent contributors plus dozens of one-off PRs by 2025.
- The
examples/module hit 66 demos by 2026, doubling as the library's most extensive integration test surface.
Built by Factory AutoWiki from public repository content. It is a generated preview for codebase exploration, not source-maintained documentation.