Skip to content

v2.3.0

Choose a tag to compare

@DROOdotFOO DROOdotFOO released this 27 Mar 19:44
· 326 commits to master since this release

This one's a big deal. 182 commits across one month -- the kind of release where the framework stops being a collection of parts and starts feeling like a real thing.

What happened

We went from a terminal UI library to an AGI-ready terminal framework. That sounds like marketing but here's what it actually means: you can now build AI agents as TEA apps, supervise them with OTP, connect nodes with CRDTs, and debug the whole thing with time-travel. On a terminal. Over SSH if you want.

The highlights

Distributed swarm subsystem

Raxol nodes can now discover each other and share state. libcluster integration with strategy presets for gossip, EPMD, DNS, and a custom Tailscale strategy that reads tailscale status --json for mesh networking. CRDTs (LWW-Register, OR-Set) keep shared state eventually consistent. Node health monitoring, seniority-based leader election, bandwidth-aware message routing. 2,100+ new lines across 11 modules.

AI agent framework

use Raxol.Agent gives you TEA-based AI agents with OTP supervision. Agents discover each other via Registry, communicate through typed messages, and can run headless or with a view. Three command types: async (streaming), shell (Port-based), and inter-agent messaging. Team supervision via Agent.Team. Backend.HTTP provides real SSE streaming across Anthropic, OpenAI, Ollama, Kimi, and Lumo (with full U2L encryption). Tiered backend detection falls through gracefully.

Interactive playground

28 demos across 8 categories (input, display, feedback, navigation, overlay, layout, visualization, effects). Search, filter by category and complexity, help overlay. Charts render as View DSL widgets. Serve the whole thing over SSH with mix raxol.playground --ssh. The playground is the docs now.

Time-travel debugging

Enable with Raxol.start_link(MyApp, time_travel: true). Every update/2 cycle gets snapshotted into a circular buffer -- message, model before, model after. Step back, step forward, jump to any point, restore historical state. Recursive map diffing shows exactly what changed. Zero cost when disabled.

Session recording and replay

Asciinema v2 format. Record terminal sessions with timestamps, play them back with pause/seek/speed controls. Stream replay, not just dump-and-render.

Sandboxed REPL

Code.eval_string wrapped with spawn_monitor timeout, IO capture via group_leader swap, persistent bindings. Three sandbox levels: unrestricted, standard (blocks dangerous ops), strict (whitelist-only, safe for SSH exposure). Available in the playground and as mix raxol.repl.

Nx/Axon adaptive ML

Optional Nx and Axon integration for the adaptive layout system. Vectorized sensor fusion via NxBackend, Axon MLP recommender for layout recommendations, FeedbackLoop training. All gated behind Code.ensure_loaded? -- zero impact if you don't have Nx.

Developer tooling

  • mix raxol.new -- project generator with 4 templates and flags
  • mix raxol.demo -- 4 built-in runnable demos
  • mix raxol.check -- unified quality gate (format, compile, credo, dialyzer, security, test)
  • Benchmark suite comparing against Ratatui, BubbleTea, and Textual

The boring-but-important stuff

  • Deleted ~35K lines of dead code (CQRS, EventSourcing, Pipeline leftovers from early experiments)
  • 746+ new tests across 21 modules (357 for core, 233 for runtime, 156 for plugins)
  • Fixed 6 flaky CI tests (race conditions, ETS cleanup, JIT warmup timing)
  • Found and fixed 3 real bugs through test coverage: converter pipe BadMapError, keyboard CaseClauseError, unreachable ctrl_c/ctrl_q clauses
  • Zero credo warnings, zero dialyzer regressions
  • Phoenix is now an optional dependency
  • All examples modernized to TEA pattern
  • Windows CI support (GPG path separators, IOTerminal backend)

Numbers

182 commits | 1,030 files changed
89,793 insertions | 129,283 deletions (net -39K LOC -- less code, more capability)
27,471 new test lines across 292 test files

Install / upgrade

# mix.exs
{:raxol, "~> 2.3"}
mix deps.get

Full docs: https://hexdocs.pm/raxol/2.3.0