Skip to the content.

ADR 0013: Revert TUI framework to Rooibos

Status: Accepted Date: 2026-05-03 Supersedes: ADR-0010 Restores substance of: ADR-0008 (with a new framing)

Context

ADR-0010 (2026-05-02) chose bubbletea-ruby + lipgloss-ruby over Rooibos. Two reasons drove that decision:

  1. Workshop onboarding cost. Rooibos’s lambda-as-constant style (Init = ->, View = ->) was identified in ADR-0008 itself as unfamiliar to Rails developers. ADR-0010 cited this as a real cost for Blue Ridge Ruby 2026 attendees.
  2. Idiomatic Ruby surface. Bubbletea-ruby’s class/mixin shape (include Bubbletea::Model) was framed as a more natural Ruby surface for the workshop audience.

The Blue Ridge Ruby workshop concluded 2026-05-02. ADR-0010’s primary justification is no longer load-bearing. At the same time, a new feature has entered the v1 roadmap: a near-easter-egg “world map” view (issue #5) showing the locations of users who’ve kicked the tires on the tool. The feature itself ships post-v1 (until adoption is large enough for the data to be interesting), but the framework choice locks in now.

Stage 3 (the TUI work) has not started. The cost of changing the framework decision is at its lifetime minimum.

Decision

Use Rooibos as the TUI framework. ratatui_ruby is the rendering layer Rooibos sits on top of. This is the framework choice originally made in ADR-0008.

Reasoning

The workshop-onboarding argument is gone. The single biggest reason ADR-0010 gave for switching no longer applies. The lambda-as-constant style is a mild stylistic cost for any Ruby developer; it’s not a structural barrier. Maintainers and contributors going forward will be self-selected developers who chose to work on this codebase, not workshop attendees parachuted in for a weekend.

Preserving the world-map view as a future option. Rooibos sits on ratatui_ruby, which exposes the full Ratatui widget surface (canvas, custom blocks, programmable rendering). Bubbletea-ruby is a binding to a different rendering model with a narrower extension story. We don’t want to bet against a feature we already know we want to build.

ADR-0008’s original technical reasoning still stands.

Same maintainer as ratatui_ruby. Reduces the chance of cross-library impedance mismatch — the same property ADR-0008 cited.

Tradeoffs accepted

Alternatives considered

Consequences

On dependencies: add rooibos (~> 0.7.0) and ratatui_ruby to the gemspec. Remove bubbletea and lipgloss (which were never actually added — ADR-0010 was a paper decision, no code shipped against it).

On docs/design.md: Already framed in Rooibos terms (the bubbletea revision in ADR-0010 was never propagated through). Minor cleanup needed where doc text mentions bubbletea.

On docs/design-interface-layer.md: The TUI pipeline section refers to “bubbletea Command” and “bubbletea-ruby” — replace with Rooibos terminology. The Result-pattern-matching contract is unchanged (per ADR-0012, which is unaffected).

On CLAUDE.md: Already says Rooibos. No change needed.

On the workshop docs: Workshop is over; archive docs/archive/workshop.md and any workshop-specific framing.

On ADR-0010: marked Superseded by ADR-0013.

On ADR-0008: Already superseded by ADR-0010; that link stands. The fact that ADR-0013 restores ADR-0008’s substance is captured in this ADR’s header rather than reopening the older one.

What this doesn’t change