raxol

One app. Terminal, browser, SSH, or agent.

Write a TEA module in Elixir. It renders everywhere: crash isolation, hot reload, AI agents, and distributed swarm from OTP.

$ ssh -p 2222 playground@raxol.io_

Zero install. Click to copy.

{:raxol, "~> 2.6"}
7 surfaces
12 packages
0 install
OTP native

Hello World

Every Raxol app follows The Elm Architecture: init, update, view.

counter.exs
defmodule Counter do
  use Raxol.Core.Runtime.Application

  @impl true
  def init(_ctx), do: %{count: 0}

  @impl true
  def update(:increment, model), do: {%{model | count: model.count + 1}, []}
  def update(:decrement, model), do: {%{model | count: model.count - 1}, []}
  def update(_, model), do: {model, []}

  @impl true
  def view(model) do
    column style: %{padding: 1, gap: 1} do
      [
        text("Count: #{model.count}", style: [:bold]),
        row style: %{gap: 1} do
          [button("+", on_click: :increment), button("-", on_click: :decrement)]
        end
      ]
    end
  end
end

That counter works in a terminal, Phoenix LiveView, and over SSH. One codebase.

Surfaces

One module, 7 surfaces.

Write the TEA module once. Render to a terminal, embed in Phoenix LiveView, serve over SSH, expose to agents over MCP, or reach a phone via Telegram, watch push, and voice. Same model. Same view.

Terminal termbox2 NIF
Browser Phoenix LiveView
SSH Erlang :ssh daemon
MCP JSON-RPC over stdio
Telegram Telegex HTTP
Watch APNS + FCM push
Speech TTS + STT
Zero install

Try it without installing anything.

Every Raxol app is one SSH connection away. Each session is a supervised BEAM process: crash-isolated, hot-reloadable, observable.

  • Auto-generated host keys, no setup
  • Supervised channel per connection
  • Survives client disconnects
  • One line to enable in your app
$ ssh -p 2222 playground@raxol.io_

Click to copy

Agent runtime

Agents are TEA apps.

Same init / update / view shape as a UI. The view is optional; headless agents skip rendering. Supervision, messaging, hot reload, and swarm discovery come free from OTP.

researcher.exs
defmodule Researcher do
  use Raxol.Agent

  @impl true
  def init(_ctx), do: %{notes: []}

  @impl true
  def update({:agent_message, _from, query}, model) do
    {model, [{:async, &llm(query, &1)}]}
  end

  def update({:llm_chunk, text}, model),
    do: {%{model | notes: [text | model.notes]}, []}
end

Streaming LLM output via :async commands. Inter-agent messages routed through a unique Registry. Bring your own key for Anthropic, OpenAI, OpenRouter, Ollama, Lumo, or Kimi, or run mock.

More capabilities

What OTP gives you.

01

Crash Isolation

Components crash and restart independently. Your UI keeps running.

02

Hot Code Reload

Change view/1, save. The running app updates without restart.

03

MCP Tools

Widgets auto-derive MCP tools. Agents interact with real UI programmatically.

04

Time-Travel Debug

Snapshot every update/2 cycle. Step back, forward, jump, restore.

05

Distributed Swarm

CRDTs, elections, discovery via gossip, DNS, or Tailscale.

06

Agent Payments

x402 micropayments, Xochi cross-chain, stealth addresses. Autonomous commerce.

07

Adaptive UI

Behavior tracking, layout recommendations, feedback loop. Self-evolving interfaces.

08

Session Replay

Asciinema v2 recording. Replay any session, scrub the timeline, ship as evidence.

Pick what you need

Full framework or just the parts that matter.

raxol

{:raxol, "~> 2.5"}

Full framework: TEA runtime, rendering, widgets, effects

raxol_agent

{:raxol_agent, "~> 2.5"}

AI agents, teams, strategies, LLM streaming

raxol_mcp

{:raxol_mcp, "~> 2.5"}

MCP server, tool derivation from widgets

raxol_payments

{:raxol_payments, "~> 0.1"}

x402, MPP, Xochi cross-chain, spending controls

raxol_liveview

{:raxol_liveview, "~> 2.5"}

Render TEA apps in Phoenix LiveView

raxol_sensor

{:raxol_sensor, "~> 2.5"}

Sensor fusion. Zero dependencies.

FAQ

Questions, answered.

What is Raxol?
An OTP-native runtime for building TUIs, AI agents, and live web apps from one Elixir module. The same init/update/view shape renders to a terminal, Phoenix LiveView, SSH, and MCP.
Do I need Elixir?
Yes. Raxol is an Elixir framework distributed via Hex. If you want to drive a Raxol app from another stack, you can talk to it over MCP (JSON-RPC).
Where do AI agents run?
In your BEAM, supervised. Same app, same node. Bring your own API key (Anthropic, OpenAI, OpenRouter, Ollama, Lumo, Kimi) or run mock for development. The framework streams tokens and routes inter-agent messages over a Registry.
Can I drop Raxol into an existing Phoenix app?
Yes. Add :raxol_liveview, mount your TEA module via TEALive or TerminalComponent. The terminal renders as an HTML <pre> diffed by LiveView.
Is this production-ready?
raxol, raxol_core, raxol_terminal, raxol_agent, raxol_mcp, raxol_liveview, raxol_plugin, and raxol_sensor are at v2.5 on Hex; raxol_speech, raxol_telegram, and raxol_watch at 0.2; raxol_payments at 0.1. raxol_acp and raxol_symphony are pre-alpha. raxol.io itself runs on Fly.
What does the SSH demo give me?
ssh -p 2222 playground@raxol.io drops you into the same widget catalog you can run locally with `mix raxol.playground`. Each connection is a supervised channel with its own crash boundary.

Try it

$ ssh -p 2222 playground@raxol.io # zero install
$ mix raxol.playground # interactive demos
$ mix run examples/demo.exs # BEAM dashboard