Open-Source Wikis

/

Bubble Tea

/

Lore

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 2020v0.1.0 published.
  • 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 declarative View fields.
  • Made View() return a tea.View struct (no longer a string).
  • Switched KeyMsg and MouseMsg from 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/ultraviolet package, 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 2024v2.0.0-alpha.1 first lands the new shape.
  • Apr 2025v2.0.0 final 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 e753b6a renamed the standard renderer to cursedRenderer. 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 alias uv is used consistently throughout the code.
  • Declarative views (Sep–Nov 2024) — The shift from imperative options to View fields 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.0 to v2.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.

Lore – Bubble Tea wiki | Factory