Welcome to GigaElixir Gazette, your 5-minute digest of Elixir ecosystem news that actually matters 👋.

. WEEKLY PICKS.

🔥 Elixir Tops AI Coding Benchmarks Across 30+ Models - José Valim Explains Why

Tencent's AutoCodeBench study put 20 languages through 30+ LLMs and Elixir came out on top with a 97.5% problem completion rate. Claude Opus 4 scored 80.3% on Elixir versus 74.9% for C# and 72.5% for Kotlin. Not even close. José's take is that immutability is the secret weapon. In mutable OOP, every method call can silently change any object in the system - LLMs can't reason about spooky action at a distance any better than humans can. Elixir's explicit inputs and outputs mean what goes in and comes out is always visible. Pipe operators create linear, top-to-bottom data flow that reads like pseudocode. Pattern matching eliminates defensive nil-checking. The language was accidentally optimized for machine comprehension. Theo picked this up and ran with it.

⚡ Elixir v1.20 Hits 2x Compilation Speedup While Adding the Type Checker

Let that sink in: v1.20 compiles twice as fast as previous versions *and* it's running a type checker that didn't exist before. Usually adding static analysis slows your build. José pulled off the opposite. Thinking Elixir episode 291 covers the full scope - Membrane's YOLO plugin bringing AI object detection to video pipelines, Christian Alexander's Claude Skill for automating dependency updates through conversation, and José's experimental PR Quiz tool that turns code reviews into interactive learning exercises inspired by Anthropic's research. Also: AshPartition for database partitioning, building containers directly from Erlang/Elixir code, and the full ElixirConf EU lineup with 39 speakers.

🛠️ LiveDebugger v0.6.0 Lets You Inject Events Directly Into LiveView Processes

Software Mansion shipped the feature LiveView developers have been manually hacking around forever: inject custom events and messages straight into a LiveView process without clicking through your UI or waiting for background jobs. Test your `handle_info` and `handle_event` callbacks instantly. v0.6.0 also captures callback exceptions with full stack traces directly in the browser - no more jumping to terminal logs to figure out what crashed. The revisited highlighting extends to Active LiveViews and Streams, so hovering in the debugger spotlights the corresponding browser element. Temporary assigns finally get visibility too, which matters because the whole point of temporary assigns is that they disappear from the socket.

🎯 EMCP Ships Feature-Complete MCP Server - Plug-Based, Production-Ready, Stupidly Simple

PJUllrich built EMCP because existing MCP implementations were too complex to maintain and debug. It runs inside a Plug, reusing Bandit's connection handling for SSE - the same pattern LiveView and WebSockets use. Already running in production. Two days after launch it's feature-complete: Tools, Prompts, Resources, and ResourceTemplates all supported. The honest admission that Claude Code only exposes Tools to users is refreshing - most library authors would hide that detail. Community feedback is already pushing it toward pluggable session stores and per-module config using the Ecto Repo pattern (`use EMCP.Server, tools: [...]`) instead of global config.

🚀 Easel Brings Canvas 2D Drawing to LiveView and Wx With One API

Here's why this library nails it where previous LiveView animation libraries missed: instead of inventing a new API, jeregrine stole a battle-tested one. Easel takes the WebIDL spec for CanvasRendering2D from Firefox/Safari, converts camelCase to snake_case, and gives you the exact same canvas API every frontend developer already knows - but in Elixir. The kicker: LLMs one-shot every demo example because canvas is massively represented in training data. Opus 4.6 and Codex 5.3 generated complex animations without iteration. That's the payoff of choosing a well-known API surface - your AI tools already know it. The library works on both LiveView (browser canvas) and Wx (desktop), with the Wx port literally done by asking an LLM to translate the function calls.

Your CLI Needs rlwrap, Not Heroics

Every Elixir developer who's built a CLI tool or REPL has hit the same wall: you press up arrow expecting command history and get `^[[A` staring back at you like it's a mainframe terminal. Meanwhile IEx sits there with full readline support, taunting you. The natural instinct is to dig into how IEx does it - through `edlin`, `user_drv`, and `group.erl` - and replicate that in your Mix task. Don't.

You'd be reimplementing significant chunks of the Erlang shell infrastructure for a feature that's been solved at the Unix level since 2000. The pragmatic answer is `rlwrap`, a GNU readline wrapper that bolts command history, line editing, tab completion, and Ctrl+R search onto *any* CLI program. It's pure Unix philosophy - one tool, one job, done well. Matthew Sinclair lays out a three-tier approach: basic mode (raw `IO.gets/1`), rlwrap-enhanced mode for full readline support, and a fallback detection layer that nudges users toward the better experience.

The key insight is that your CLI code stays dead simple - no Erlang shell internals, no NIF bindings, no maintenance burden. What makes this worth your attention isn't just the trick itself - it's the engineering philosophy. OTP 26.1 finally made `edlin` a public API, which means the "pure Elixir" path is getting more viabe.

But viable doesn't mean practical. The rlwrap approach ships today, works everywhere, and lets you focus on the features your users actually care about instead of yak-shaving terminal handling. Sometimes the least clever solution is the smartest one.

Remember for next time you build a CLI:

  • Wrap your Elixir CLI with `rlwrap mix your_task` to instantly get command history, line editing, tab completion, and Ctrl+R search - zero code changes required

  • Don't try to replicate IEx's readline by digging into `edlin`/`user_drv`/`group.erl` - that's reimplementing the Erlang shell for a solved problem

  • Use a three-tier detection pattern: check if rlwrap is available, auto-wrap if it is, gracefully degrade with a helpful nudge if it isn't

  • Set an env var like `REPL_MODE=true` when launching your REPL to suppress noisy framework logging that clutters the interactive experience

. TIRED OF DEVOPS HEADACHES? .

Deploy your next Elixir app hassle-free with Gigalixir and focus more on coding, less on ops.

We're specifically designed to support all the features that make Elixir special, so you can keep building amazing things without becoming a DevOps expert.

See you next week,

Michael

P.S. Forward this to a friend who loves Elixir as much as you do 💜

Keep Reading