MIT (LICENSE.md, GitHub reports MIT). README also links a '$RAXOL token' page and ships crypto payment packages (x402, Permit2, Virtuals ACP) alongside the UI framework. hydepwns/raxol redirects to DROOdotFOO/raxol.
language
Elixir (termbox2 C NIF for the Unix terminal backend)
backing
Individual (GitHub user DROOdotFOO / axol.io); no foundation or disclosed funding. Author's own product Xochi (a cross-chain DEX) is built on it.
Closest philosophical twin with mature ideas (focus lens, derived tools, authorization, time-travel API) worth copying, but it is code-first Elixir and cannot replace a data-first, agent-authored Rust UI.
Borrow from it: take a specific idea, API or format.
the steelman: the best honest case for it
Raxol is the only project found that took the same bet as thc-scene seriously and at depth: one Elm-architecture source of truth, many projections, and the agent as a first-class surface rather than a screen scraper. Its MCP layer is principled, not bolted on: tools are derived from the live component tree with functor-law property tests, filtered by an attention-aware focus lens so the model sees ~15 relevant actions, and guarded by a fail-closed authorization model that thc-scene has not designed yet. It already ships what thc-scene has only planned: update-by-update time travel with diff/restore/export, asciicast recording and replay, an MCP test harness, and the same app served to terminal, browser (LiveView) and SSH. It sits on the BEAM, so crash isolation, hot code reload while running and distribution come free. For an Elixir shop that wants agents to operate a terminal app with semantic actions instead of keystrokes, it is already further along than anything else.
scores
UI as data
3 scene 5
view output is an Elixir data tree (and the structured screenshot is JSON-friendly), but the UI is authored as Elixir code, not a pushable wire value
Agent can drive it
4 scene 5
first-class operation of a live instance over MCP; creation/change of UI requires writing code, so not 5
Agent can see it
5 scene 5
text screen plus structured widget tree plus model and resources
Small, targeted edits
3 scene 5
id-addressed semantic actions on components, but no patching of the UI definition itself
Time travel
4 scene 0
rich history API (diff, jump, restore, export) usable from code; not exposed as MCP tools per docs
Live data rate
3 scene 5
5 ms full frame claimed; no streaming/patch-rate numbers
MCP server (`mix mcp.server`, stdio; SSE transport too) with tools derived automatically from the running component tree, plus headless session tools (raxol_start/screenshot/send_key/get_model/stop/list) and MCP resources for model projections. Also ACP server for its own coding agent.
Wiring it in
Low for an Elixir app: write the TEA module, run mix mcp.server, add it to Claude Code. High if you are not on the BEAM: the UI must be written in Elixir.
Seeing the result
Yes, structured: raxol_screenshot returns plain text plus a JSON-friendly widget summary (type, id, role, label, value, focused, children); raxol_get_model returns the model; resources stream state diffs; a ContextTree combines model, component tree, focus chain, agents and notifications.
Small edits
The agent addresses components by id and calls semantic actions on the live instance (type_into, click, select_row). It cannot push or patch the UI structure itself as data; changing the UI means changing Elixir code (hot-reloadable).
History
Raxol.Debug.TimeTravel records every update; step_back/step_forward/jump_to/diff/restore/export/import are an Elixir API, not documented as MCP tools. Agent-session journal supports --replay and /rewind for the coding agent. Terminal recording to .cast.
In short
The most agent-aware TUI framework found: every component is an MCP tool and the screen is readable as structure. But the agent operates a UI a developer wrote; it does not author or patch the UI as data at runtime.
architecture
An app is one TEA module (init/update/view) running as an OTP GenServer. view returns an Elixir element tree that is projected to four surfaces: terminal (termbox2 NIF), browser (Phoenix LiveView), SSH (Erlang :ssh) and agents (MCP). Each interactive component implements a ToolProvider behaviour, so the MCP server derives namespaced tools (e.g. component.search_input.type_into) from the live tree on every render and announces changes with tools/list_changed. Model state is published as MCP resources through app-declared projections and streamed as diffs. BEAM gives per-component crash isolation, hot code reload and distribution (CRDT swarm state).
Elm architecture on OTP: serializable-ish model, pure update, view tree; one source, many surfaces
MCP is a rendering target: tools auto-derived per component (Button click; TextInput type_into/clear/get_value; Table select_row/sort/get_rows; Scrubber seek/play/pause)
Focus lens filters 100+ derived tools to about 15 by focus, hover and modal stack; discover_tools meta-tool
Authorization: ALLOW/ASK/DENY authorizer, deny-by-default tool allowlist in production, destructive tools refuse to run without an authorizer
Time-travel debugging: snapshot per update (message, model before/after), step/jump/diff/restore/export
Recording to asciinema .cast with replay; MCP test harness (start_session |> type_into |> click |> assert_component)
Kitty graphics and sixel modules exist in raxol_terminal (emulator side) plus an image plugin
performance
Published microbenchmarks from an in-repo bench suite (measured 2026-08-07 at a stated commit). No numbers for agent-driven update rates, patches/s or streaming data throughput.
Full frame (create + fill + diff) 5.0 ms on Apple M1, 31% of the 60 fps budget; tree diff 100 nodes/1 changed 32 us; single cell write 1.4 us github.com ↗
adoption and upkeep
Adoption
Very small adoption: 80 stars and a few thousand Hex downloads. The two named users are the author's own product and one hobby BBS.
Used by: Xochi (author's own DEX trading surface), foglet-bbs (SSH bulletin board by Brendan Turner)
Maintainability
Extremely active and heavily documented (ADRs, golden render-determinism suite, dialyzer gate), but effectively a one-person project with a very wide scope (UI runtime, coding agent, payments, chat gateways, orchestration).
Releases: Roughly monthly Hex releases: 2.6.0 2026-07-11, 2.6.1 2026-08-07, 2.7.0 2026-09-10; raxol-cli tags v0.2.6 2026-08-09 to v0.2.10 2026-09-10 · Contributors: 14 entries in the GitHub contributors API including anonymous and dependabot; DROOdotFOO has 2,241 commits, next are ndreynolds 153 and merklebonsai 153 · Recent: 723 commits on master since 2026-07-11 (90 days); last push 2026-10-09 · Bus factor: low: one author wrote the large majority of commits
weaknesses
One author wrote the vast majority of 2,500+ commits; bus factor is low
Scope sprawl: the same repo/umbrella covers a coding agent, crypto payments (x402, Permit2, on-chain escrow), a $RAXOL token page, chat gateways and an orchestrator, which dilutes focus and may deter adopters
Adoption is tiny (80 stars, ~21 Hex downloads last week)
UI is Elixir code: an agent cannot push a new UI as data; non-BEAM users must adopt Elixir/OTP
Time travel is a developer API; not documented as an MCP surface for agents
No published numbers for agent-driven update throughput or streaming data rates
Windows terminal driver described as 'usable, not yet tuned'
and thc-scene
Overlap
Elm architecture, a live process an agent drives, structured readback of screen and state, id-addressed components, recording/replay and time travel, hot code reload keeping state.
What scene would be reinventing
Agent-addressable history (raxol already records message + model before/after per update with diff/jump/restore/export); a fail-closed authorization model for agent tool calls; a pipe-friendly agent test harness; multi-surface rendering. Raxol's MCP surface is more mature than scene's current socket (which has no MCP server yet).
The gap it leaves
Raxol's UI is Elixir code; an agent cannot push a whole UI or patch a node definition as JSON at runtime, bind data sources to shell commands/JSON streams that bypass the model, or draw a kitty pixel layer with callouts/spotlights. thc-scene is language-neutral data-first; raxol is code-first.
What to borrow
Focus lens: limit exposed agent actions to the focused/hovered/modal region (~15 tools) plus a discover_tools meta-tool
Derive semantic MCP tools per component kind (click, type_into, select_row, seek) from scene's JSON nodes