ElixirDrops is sharing sponsorship revenue with authors

Through December, ElixirDrops is sharing half of the net sponsorship revenue from individual Drop pages with authors. You need five published Drops in total to qualify, and earlier Drops count. Each author’s share depends on the monthly visitor counts for their Drops in Plausible. The dashboard is public.

You can sign in with GitHub and publish an Elixir, Phoenix or OTP tip directly on the site. The announcement explains how payouts work.

https://elixirdrops.net/d/sKtR6Gn8

Code BEAM Europe 2026: the Keynotes are published on our YT channel

That’s a wrap on Code BEAM Europe 2026! Thanks to everyone who came to Haarlem or joined online, and to our speakers, trainers and sponsors.

Watch the keynotes

Had a ticket? All the other talks are in the Swapcard agenda. They go public on YouTube after early access.

Code BEAM Europe 2027 News is coming soon. Join the waiting list to hear first about the dates, the Call for Talks and tickets: https://codebeameurope.com/#newsletter

In the meantime: the ElixirConf EU 2027 Call for Talks is open Lisbon and online, 22-23 April 2027. Submit your talk by 15 December: https://sessionize.com/elixirconf-eu-2027/

Xenia 0.2.0: lazy islands, TypeScript types and test helpers

Xenia 0.2.0 is on Hex. Xenia puts imperative JavaScript libraries (charts, editors, maps, date pickers) into LiveView pages: a small adapter per library, and Xenia handles props, events, commands, form fields and cleanup.

New in 0.2.0

  • Lazy islands: lazy=”visible” starts an island only when it scrolls near the screen; with code splitting (now documented), its library downloads only then too. In the examples app’s production build, a page downloads 0.59 MB of JavaScript up front instead of 7.9 MB.
  • TypeScript: a generic Adapter<Instance, Props, Events, Commands> types an adapter for any npm package, in a .ts file or in plain JS with a JSDoc comment. The 16 official adapters are typed, and mix xenia.install adds Xenia’s types to tsconfig.json.
  • Xenia.Test: ExUnit helpers for pages with islands: xenia_props/2, render_xenia_event/4, assert_xenia_command/5, xenia_call/5.
  • Existing apps: mix xenia.install –islands-only adds just the hooks, the import and the formatter entry.
  • Connection: consumes: [“connection”] tells an island when its LiveView is disconnected, for example to make an editor read-only.
  • ctx.signal: an AbortSignal per island. Requests and document listeners that use it are cleaned up when the island goes.
  • Large data: the guide shows how to send changes as commands. For a 10,000-point chart, a new point is 99 bytes as a command and 109 KB as a prop.

One breaking change: multi-value form fields (Tom Select multiple, flatpickr ranges, SortableJS) now submit a list (post[tags][]), so an Ecto {:array, _} field casts it directly. Remove any Jason.decode/1 of those fields.

{:xenia, "~> 0.2.0"}

Every example in the examples app now shows the code behind it.

Feedback is welcome, especially from anyone wrapping a library Xenia has no adapter for.

Camelot AI W44: GitHub issue loop verified end to end, landing rebuilt

Camelot AI is an Elixir/Phoenix app that manages AI coding agents from a kanban board, with human approval at plan and PR.

This week the GitHub issue loop was verified end to end on a controlled issue: plan comment on the issue, human approval, pull request, issue close.

The rebuilt landing page is live, leading with that plan-first promise.

Repo at 14 stars. GPL-2.0, self-hostable; cloud free during beta.

https://camelotai.tech

Docs: https://docs.camelotai.tech

GitHub: https://github.com/T0ha/camelot)

Stampede 1.2: find how many users your Phoenix app holds (400k on one server)

Stampede is a load testing library that speaks Phoenix Channels and LiveView, with scenarios in plain Elixir. 1.2 adds –find-limit, which raises the load step by step until your thresholds break and tells you the most users your app held, plus a README badge with the result, Markdown comparisons for pull requests, and a warning when the load test itself is too busy to trust.

I tested it on AWS: one stock Phoenix server with 4 cores and 32 GB held 400,000 Channels users with 0 errors, joins in 12ms at p95, and 24% CPU. Everything to rerun it is in the repo.

https://github.com/mandar1045/stampede

Stampede 1.2: find how many users your Phoenix app holds (400k on one server)

Stampede is a load testing library that speaks Phoenix Channels and LiveView, with scenarios in plain Elixir. 1.2 adds –find-limit, which raises the load step by step until your thresholds break and tells you the most users your app held, plus a README badge with the result, Markdown comparisons for pull requests, and a warning when the load test itself is too busy to trust.

I tested it on AWS: one stock Phoenix server with 4 cores and 32 GB held 400,000 Channels users with 0 errors, joins in 12ms at p95, and 24% CPU. Everything to rerun it is in the repo.

https://github.com/mandar1045/stampede

Local-First Means Three Different Things

My first real blog post is up! Got five minutes? Come break some stuff. I put five demos in it, and they’re meant to be played with. Kill the network and keep editing, or double-book a plane seat on two phones and see who finds out at the gate.

The post itself is about local-first, and why people talk past each other when they use the word. It means three different things, and everyone picks one.

And the demos are Hologram components. Of course!

The post, demos included: https://hologram.page/blog/local-first-means-three-different-things

Supervising what you don't own: a controller loop in OTP

A deploy killed my OTP processes but not the Docker containers running my coding agents, so the board showed a task “executing” for 18 hours after its PR was already merged.

The fix: a reconciler GenServer on a 60s tick, container adoption through an exit-marker file, and a pure decide/4 — the incident is now a unit test with the real timestamps.

https://t0ha.dev/en/elixir/devops/2026/09/04/supervising-what-you-dont-own.html

Xenia – JavaScript libraries and pages from folders for Phoenix LiveView

Hey everyone!

I’ve released Xenia (0.1, MIT). I got tired of writing the same JavaScript hook every time I wanted an editor, chart or map in LiveView, so I turned the reusable part into a library.

The idea: Phoenix stays in charge of your data and pages, the JavaScript library keeps doing what it’s good at (cursors, undo, zoom), and Xenia is the contract between them.

  • JS islands. You write a small adapter saying how your library is created, updated and destroyed. Xenia does the wiring: props from your assigns (only changed ones reach the library), events back to handle_event, commands to one component, form fields, loading and error states, and cleanup on navigation. Any npm library works, and 16 come ready-made (Monaco, Chart.js, Leaflet, Tiptap, …):

    <.chartjs id="sales" type="bar" data={@sales} on_point_click="bar_clicked" />
  • Pages from folders page.ex files become your live routes, a layout.ex frames the pages below it, and a persistent.ex stays alive while you move between them, so a sidebar or an open editor keeps its state. Underneath, it’s plain Phoenix routes and sticky LiveViews.

  • Getting started: run mix xenia.install in a fresh mix phx.new app.

I’d love feedback, especially from anyone who has fought hooks for editors or maps.

GitHub: https://github.com/uzaydurdu/xenia

Hex: https://hex.pm/packages/xenia

Docs: https://xenia.hexdocs.pm

Stampede 1.1: load testing Phoenix with a live dashboard

Stampede is a load testing library that speaks Phoenix Channels and LiveView, with scenarios in plain Elixir. 1.1 adds a live dashboard, mixed workloads with –parallel, LiveView uploads, assert_load/2 for ExUnit, mix igniter.install stampede, and Elixir 1.18 support.

https://github.com/mandar1045/stampede

Choosing Elixir tools with elixir.menu

An introduction to elixir.menu, a guide to tools for Elixir applications with recommendations, limitations and documentation links. Includes an example of giving a coding agent the guide alongside a feature request.

https://elixirdrops.net/d/ZrQo16P3

Camelot AI: usage-aware card scheduling, and a GitHub issue workflow

Shipped this week in Camelot AI, an Elixir/Phoenix app that manages AI coding agents from a kanban board:

  • cards now schedule around your usage, with a weekly reserve, runing windows and start-at/deadline controls;
  • a GitHub issue can drive the whole flow, from plan review on the issue to a merge summary;
  • browser and LiveView errors flowing into PostHog.

6 PRs merged this week.

GPL-2.0, self-hostable; cloud free during beta.

https://camelotai.tech

Docs: https://docs.camelotai.tech

GitHub: https://github.com/T0ha/camelot

What the eMudhra CA Compromise Means for Elixir Developers

New versions of Hex and Elixir’s castore are available now. An update to Erlang’s certifi is pending. Details below:

https://paraxial.io/blog/emudhra-ca

DEW: Phoenix projects with only Docker on the host, features as Igniter cartridges

DEW (Dockerized Elixir Workbench) creates Phoenix projects and runs them with nothing on the host but Docker: every mix and git step runs in a container, and a LiveView console drives it all from the browser. Features come as cartridges, Igniter installers that patch the project through its AST in one commit each, so ejecting one is a revert. Each cartridge carries its reasoning: the need it answers, what it installs, and a DESIGN paper with sources. v0.19.4 is out today: health_probe’s probes now pass force_ssl in production, and clustering’s default DNS query names a headless Service that can exist. Critique of the cartridges is very welcome.

Monitoring the Health of Oban Applications

Drawing from tips that we’ve given to Oban users over the years, we’ve published an article on monitoring Oban health. https://oban.pro/articles/monitoring-oban-health

Code BEAM Europe starts tomorrow: 15% off virtual tickets with 15FORYOU

Code BEAM Europe opens tomorrow, Wednesday 21 October, at 9:00 CEST, live from PHIL Haarlem and streamed online.

Elixir highlights (times in CEST):

Not in Haarlem? Code 15FORYOU gives you 15% off the virtual ticket: both tracks live, Q&A with the speakers, online networking and lifetime access to the recordings.

Tickets: https://codebeameurope.com/#register

See you tomorrow!

Code BEAM Europe starts tomorrow: 15% off virtual tickets with 15FORYOU

Code BEAM Europe opens tomorrow, Wednesday 21 October, at 9:00 CEST, live from PHIL Haarlem and streamed online.

Elixir highlights (times in CEST):

Not in Haarlem? Code 15FORYOU gives you 15% off the virtual ticket: both tracks live, Q&A with the speakers, online networking and lifetime access to the recordings.

Tickets: https://codebeameurope.com/#register

See you tomorrow!

Camelot AI: usage-limit pause and resume, live model discovery via Nebulex

Shipped this week in Camelot AI, an Elixir/Phoenix app for managing AI coding agents from a kanban board: tasks now pause when a model provider rejects them for usage limits and resume at reset, instead of erroring. In review: live per-user model discovery, cached an hour with Nebulex, so new models reach the board without a redeploy. GPL-2.0, self-hostable; cloud free during beta.

https://camelotai.tech

Docs: https://docs.camelotai.tech

GitHub: https://github.com/T0ha/camelot

Keploy: record-and-replay API tests for Elixir and Phoenix apps

Keploy is an open-source testing tool that generates API tests and dependency mocks from real traffic.

For Elixir services, it records real HTTP and Ecto traffic from a running BEAM process and replays it as test assertions. It works at the network layer, so your app code stays unchanged.

Supports Phoenix, Plug and Cowboy on Elixir 1.14+.

Record: keploy record -c “mix phx.server”

Replay: keploy test -c “mix phx.server” –delay 10

Elixir guide: https://keploy.io/testing/elixir Phoenix guide: https://keploy.io/testing/phoenix GitHub: https://github.com/keploy/keploy

pix_brcode 0.2.0: tolerant Pix key parsing and alphanumeric CNPJ

pix_brcode generates, parses and validates Brazilian Pix “copia e cola” payloads (the BR Code behind every Pix QR code), with zero runtime dependencies.

Version 0.2.0 makes key handling follow “strict in what you generate, tolerant in what you receive”: formatted keys such as 123.456.789-09, +55 (11) 98765-4321 or Fulano@Exemplo.com are accepted and written in the canonical form of the Central Bank’s DICT. It also supports the new alphanumeric CNPJ (issued by the Receita Federal since July 2026) as a Pix key, validates CPF/CNPJ check digits when encoding, adds a :key_type option for ambiguous inputs, and ships typespecs for the whole public API.

An independent review before the release found that String.downcase/1 turned the Kelvin sign into a plain k, so garbage input could become a different, valid key. The fix and the reasoning are in this ElixirDrops tip.

Changelog: https://github.com/igorgbr/pix_brcode/blob/main/CHANGELOG.md

Next page