r/elixir

Raxol: Same OTP app rendering as a terminal UI, LiveView, MCP server, Telegram bot, and Watch push
▲ 19 r/elixir+1 crossposts

Raxol: Same OTP app rendering as a terminal UI, LiveView, MCP server, Telegram bot, and Watch push

Update on Raxol, an OTP-native runtime I've been building.

Raxol lets you build a TEA module (Model, Update, View, i.e. the Elm Architecture) that renders to all of these:

  • A terminal UI via the Raxol VT100 emulator
  • A Phoenix LiveView in the browser
  • Auto-derived MCP tools for AI agents
  • Telegram inline keyboards
  • Apple Watch and Android push cards
  • A JSON API

Raxol's update/2 doesn't care where the message came from.
A keystroke, an LLM token, a x402 response, a sensor reading: all messages. When the Telegram bridge drops, the LiveView keeps rendering. When a job in raxol_symphony crashes, the orchestrator stays up.

Agents and human-facing apps want the same shape.
The human reacts to keystrokes.
The agent reacts to LLM tokens. update/2 can't tell them apart.
e.g. Raxol.Agent is Raxol.Core.Runtime.Application with a different message source. ReAct, chain of thought, an FSM with guards: different bodies, same shape.

Per-process wallets work on the BEAM in a way they don't elsewhere. raxol_acp gives you one supervised process per ACP job, a NonceServer GenServer per wallet so concurrent jobs don't race on the nonce, and DETS-backed memo persistence so restarts resume mid-flight. Every other ACP seller is a Python script with a threading. Lock and a polling loop.

... Anyways, if you're down to clown we're open to contributions!
Otherwise lmk your ideas-- happy to collaborate.

Github: Raxol 11 of 13 packages on Hex. raxol_acp and raxol_symphony still pre-alpha.

Nerdier, wordier, write-up with the cockpit framing & where this goes: https://droo.foo/posts/raxol-terminal-for-the-gundam

u/leMaritimer — 16 hours ago
▲ 14 r/elixir

Idiomatic way to see if a collection of values are all equal?

In my application I want to check if 3 variables equal to the same value, I mean I could try to chain a bunch of == but that seems very superfluous unnecessary. What is the proper way to see if a collection of values are all equal?

reddit.com
u/BrotherManAndrew — 2 days ago
▲ 26 r/elixir

Announcing: AshLua | Easily and safely provide Ash actions to a sandboxed lua script.

Works via the very excellent lua library by u/davydog187! See the guides for a very special element: integration with AshAI. Easily provide MCP tools for reading the docs of your new custom lua SDK as well as evaluating a script!

hexdocs.pm
u/borromakot — 3 days ago
▲ 27 r/elixir

Bunny.net Elixir library

I've been using bunny.net (an EU-based CDN service) from Elixir in a few projects so I thought it'd be a good idea to extract that into its own library. It's a simple wrapper on a public API modeled after Req and following the Elixir library guidelines. The surface area of the bunny.net API is pretty large, so I used LLMs to work my way through it all, and then created some Livebooks to smoke test it all.

It's new and will still need some kinks ironed out, but I've switched my projects over and it works great!

Blog post about it: https://jola.dev/posts/bunnyx-bunny-net-elixir Github repo: https://github.com/joladev/bunnyx

u/joladev — 3 days ago
▲ 53 r/elixir

Anyone else go from “Phoenix is magic” to “wait… what is this macro actually doing?” 👀

New BEAM There, Done That episode with Adi Iyengar, who spent 3.5 years rebuilding Phoenix from scratch to understand the layers underneath.

defmodule MyFramework do

  use Plug.Router

  # accidentally reinvent Phoenix

end

Really good discussion on:

  • Plug as the real core of Phoenix
  • when metaprogramming helps vs hurts
  • old BEAM web-server history (Yaws, Mochiweb, Inets)
  • why coding agents still misunderstand Phoenix in 2026

Worth it if you’ve ever wanted to understand Phoenix beyond the generators.

https://youtu.be/jSCo5NvH2jY

u/rtrusca — 6 days ago
▲ 13 r/elixir

Integrate Ash incrementally into standard Phoenix/Ecto project possible?

Per the title, our Phoenix app is growing and growing, esp. as we get more schemas, complex forms and data models, and now also thinking about opening the same data models to crud Rest endpoints. What is a good way forward?

reddit.com
u/allixender — 6 days ago
▲ 36 r/elixir

LiveStash v0.3.0 is out! Redis adapter and auto-stashing for LiveView

Hi everyone,

We just released v0.3.0 of LiveStash - our library built at Software Mansion to fix the problem of losing Phoenix LiveView state on WebSocket reconnects.

This update brings two heavy-lifting features for distributed apps and better DX:

  • Redis Adapter: State lives securely in Redis, while the browser only holds a lightweight reference.
  • Opt-in Automatic Stashing: LiveStash detects changes in stashed assigns and updates them automatically (no need for explicit stash/1 calls anymore).

If you have any questions feel free to reply here, create an issue, or start a new thread on GitHub discussions.

Links:

u/kraleppa — 7 days ago
▲ 21 r/elixir

[ANN] ExDatalog v0.2.0

ExDatalog is production-grade pure Elixir Datalog engine with semi-naive fixpoint evaluation, pluggable storage backends, and deterministic cross-backend results.

What's new in v0.2.0

  • Constraint types: type predicates (type_integer, type_binary, type_atom), string predicates (starts_with, contains), and membership (member) — all evaluated deterministically across backends.
  • ETS storage backend: off-heap per-relation ETS tables with O(1) membership, concurrent read support, and observability via :observer.
  • Capabilities system: each backend reports what it supports; merge and query capability sets with Capabilities.merge/2 and satisfies?/2.
  • Provenance: track which rule derived each fact with explain: true.
  • Telemetry: :telemetry events for query start, stop, and exceptions.
  • 601 tests, 0 failures, credo clean, dialyzer clean.

Breaking changes

  • Constraints.StringConstraints.StringPredicate
  • Telemetry.emit_stop/4 default arg removed; pass storage_type explicitly
  • Constraint behaviour evaluate/3 callback now uses Binding.t() not map()
  • Storage teardown callback return type widened to :ok | {:error, term()}

Bug fixes

  • ETS member?/3 was using :ets.match_object/3 instead of :ets.member/2 (O(n) instead of O(1), with an unreachable clause)
  • ETS teardown now raises ArgumentError with a clear message on post-teardown use instead of opaque :badarg
  • Constraint.valid_right?(:member, ...) now requires {:const, list}
  • Engine wraps evaluation in try/after to guarantee ETS table cleanup

Links

reddit.com
u/Shoddy_One4465 — 6 days ago
▲ 29 r/elixir

Where do Elixir devs find good remote jobs?

Hey folks,

I’m an Elixir developer with 3.5+ years of experience, mostly working with Phoenix + LiveView. Lately I’ve been thinking about switching jobs because I feel a bit underpaid in my current role, but I’m mainly looking for good remote opportunities.

Most openings I come across are either “US/UK remote only” or ask for 5–8+ years of experience, so I wanted to ask:

Where do Elixir devs usually find solid remote jobs that are open internationally?

Also, if anyone here knows of openings, is hiring, or wouldn’t mind referring me / giving me a shot at an interview, I’d really appreciate it.

Would also love to hear how others in the Elixir community found their remote roles. Btw I'm from India 🙂

Thanks!

reddit.com
u/Radiant-Witness-9615 — 8 days ago
▲ 26 r/elixir

wrote a phoenix liveview app that searches across youtube video transcripts and the real time search feels absurdly good

i work at a mid size marketing agency and we have about 200 youtube videos. client case study recordings, internal strategy sessions, conference talks from our founders, onboarding walkthroughs for new hires. all unlisted and shared through notion. nobody can find anything because the only way to search is by video title which is usually something useless like "Q3 strategy call sept 14."

i've been looking for an excuse to build something real in phoenix liveview so i used this.

the app is a single liveview page. search box at the top, results below. as you type, results update live through the socket. each result shows the video title, date, speaker, and a snippet of the transcript around the matching text with the match highlighted. click the result and it opens the youtube video.

the backend is postgres with full text search. tsvector on the transcript column, GIN index, ts_headline for the snippet extraction. the liveview handles the search with a debounce on the phx-change event so it's not hammering postgres on every keystroke. i set it to 250ms which feels right. fast enough that it seems instant but not so aggressive that it fires on every character.

for pulling the actual transcripts i use transcript api:

npx skills add ZeroPointRepo/youtube-skills --skill youtube-full

i wrote a mix task for ingestion. give it a youtube url and it pulls the transcript, parses it, and inserts it into the database. added a --file flag so i could point it at a text file with all 200 urls and let it run through them. the whole ingestion took maybe 3 minutes.

the thing that sold my coworkers on it was the liveview search. i demoed it in a meeting and people immediately started shouting out search terms to try. someone typed in a client name and found every video where that client was discussed. someone else searched for "attribution modeling" and found a conference talk from 2022 that nobody remembered existed.

the codebase is small. one liveview module, one context module with the search query, the mix task for ingestion, and two templates. maybe 300 lines of elixir total. deployed it on fly.io on the free tier since it's just internal and the traffic is light.

the part i keep coming back to is how well liveview fits this use case. server rendered search with live updates over websockets and zero javascript. the search box, the debounce, the result list, the highlighting, all just liveview. i would have needed react or vue for this in any other framework.

u/scheemunai_ — 8 days ago
▲ 13 r/elixir+1 crossposts

ex_data_sketch v0.8.0 — Deterministic Foundations

ex_data_sketch v0.8.0 is out. This release invests entirely in the substrate that all 15 existing sketches share, preparing the grounds for release v0.9.0 where we add streaming integrations for Broadway / GenStage support, ETS / DETS / Zarr.

What's new:

  • Deterministic hashing. Every sketch now goes through a validated, byte-stable hash layer. HLL, ULL, Theta, and CMS accept hash_strategy: :murmur3 for Apache DataSketches interop — this was silently ignored in v0.7.x. XXHash3 remains the default and fastest path (~30 M items/sec at p=14 on the Rust NIF).

  • Binary stability & corruption detection. Serialized sketches now carry a CRC32C trailer and an embedded hash metadata block (EXSK v2). Bit-flip corruption that previously would silently produce wrong estimates is now caught and returns a structured DeserializationError. v0.8.0 reads v1 frames; v0.7.x cannot read v2 — stage your rollout accordingly.

  • Murmur3 hot path. 8 new Rust NIFs extend in-Rust hashing to Murmur3. The Murmur3 path is within 8% of XXH3 throughput. No more falling off the fast path when you select :murmur3.

  • Precompiled NIFs for Windows. x86_64 and ARM64 MSVC targets join the matrix. 16 artifacts total (8 targets x 2 NIF versions). No Rust toolchain needed on any supported platform.

  • Property-locked guarantees. 14 StreamData properties lock HLL/ULL monotonicity and error bounds, KLL/REQ rank consistency, CMS overestimation-only, and Bloom/XorFilter/Cuckoo no-false-negative. A 200-mutation fuzz suite verifies that binary v2 corruption never silently propagates.

Breaking changes (2):

  1. EXSK v2 is one-way. v0.7.x readers can't decode v2 frames. Deploy readers first, then producers.
  2. hash_strategy: :murmur3 is no longer silently overridden to :xxhash3. Sketches that specified Murmur3 will now actually use it — estimates are correct but differ from v0.7.x.

One-liner upgrade:

{:ex_data_sketch, "~> 0.8.0"}

Most users need no code changes. Full migration guide ships in HexDocs.

Stats: 1,317 tests, 171 properties, 92.7% coverage, 0 credo issues.

GitHub | Hex | Docs

reddit.com
u/Shoddy_One4465 — 9 days ago
▲ 41 r/elixir+1 crossposts

Edge Core: a self-hostable control plane for distributed Linux fleets, built in Elixir

Hey guys! We finally opened up the codebase for something we've been working on for over a year.

I joined a company that spent 3 years (and counting) trying to ship products on locked down edge hardware. Every product kept hitting the same walls: deployments and monitoring were a black box, machines on the same LAN couldn't reliably find each other, and every new app had to reimplement the same WS/MQTT logics just to stay in touch with the cloud.

So we built Edge Core to solve these pain points. In V1, we used Headscale/Tailscale for the VPN. It worked mostly for what we wanted (remote execution, SSH, metrics aggregation, etc.), but couldn't scale past ~100 nodes (mesh explosion with O(n2)) and gave us no isolation between different projects (each project must spin up its own core, though ACLs exist). In V2 (current version), we moved towards Netmaker for a proper mesh/network segmentation solution, added a forward proxy + dynamic proxy chaining for cloud-to-edge communication, and built the whole orchestration layer on top.

OpenAPI/Swagger Docs

AsyncAPI docs

Some Elixir specific stuff that might interest you:
- Masterless clustering for the control plane: no (strong) leader election, no Raft consensus. Admins coordinate via `:syn` registry and Postgres. Each admin runs the same deterministic sharding algorithm and converges independently.
- Oban and Quantum for async background jobs
- API-first control plane with clustering HTTP/SOCKS5 proxy servers and first class fleet metrics discovery + scraping that are prometheus compatible
- MCP server that mirrors the full REST API, basically every API endpoint is also an MCP tool that AI agents can drive the whole fleet
- Webhook system and event broker integration for async system events with 7 adapters (NATS, Kafka, AMQP 0.9.1/RabbitMQ, Redis, MQTT, AWS SNS, and GCP Pub/Sub).
- Agent and shared libs are Apache 2.0. Admin is ELv2.

Links:
- Repo: https://github.com/wenet-ec/edge-core
- Docs: https://wenet-ec.github.io/edge-core/
- Learn about edge core's concepts: https://wenet-ec.github.io/edge-core/guide/
- Architecture: https://wenet-ec.github.io/edge-core/architecture/

reddit.com
u/Best_Recover3367 — 11 days ago
▲ 32 r/elixir+1 crossposts

Anyone here running Elixir + Rust in production?

New BEAM There, Done That episode with Florian Gilcher (Ferrous Systems) and Leandro Pereira (MDEx, BeaconCMS) dives into where Rust actually fits in Elixir systems — NIFs, ports, performance bottlenecks, and hybrid architectures.

case system do

  :cpu_bound -> Rust

  :distributed -> Elixir

  :both -> "why not both?"

end

Good discussion on when to stay on the BEAM vs when Rust genuinely helps instead of just adding complexity.

https://youtu.be/w5Pl09lpSmE

u/rtrusca — 13 days ago