QFM110: Elixir Reading List - April 2026
Source: Photo by Rowan Heuvel on Unsplash
Quiet but substantial month for Elixir. Two new arrivals expand the Ash ecosystem: ash_credo brings static code analysis as a Credo plugin, and the official ash_storage lands attachment and file management for Ash resources. agentjido/jidoka is an experimental spike for a Jido-based agent DSL, and elixir-test-critic packages test-quality rules for ExUnit projects.
Lotus is the month's most ambitious release: an embeddable business intelligence engine for Phoenix apps, with SQL editor, dashboards, charts, and AI query generation that mount directly in your app. ghostty_ex wraps libghostty-vt as NIFs for the BEAM — a terminal emulator library you can supervise. Mob v0.5.6 ships the latest cut of the mob-programming CLI.
Two practitioner reads close out the month: "Scotty, I need warp speed in three minutes" on Elixir performance under pressure, and Cyrus Radfar's "AI agents keep failing. The fix is 40 years old." — functional programming as the substrate AI agents need, not the curiosity it's been treated as.
As always, the Quantum Fax Machine Propellor Hat Key will guide your browsing. Enjoy!

Links
ash_credo is a Credo plugin that provides static code analysis checks for the Ash Framework, detecting anti-patterns, security issues, and missing best practices in Ash resources and domains. The plugin offers both AST-based checks and compiled-module introspection checks (which analyze fully-resolved DSL state after Spark transformations), with only two checks enabled by default (MissingChangeWrapper and MissingMacroDirective) while others are opt-in. Installation is straightforward via Igniter or manual dependency addition, though compiled-introspection checks require running mix compile before mix credo.
ash_storage is an Ash Framework extension that provides file attachment and blob storage management through a three-resource architecture: a BlobResource storing file metadata, an AttachmentResource linking blobs to records, and host resources declaring has_one_attached or has_many_attached relationships. The extension supports multiple attachment patterns including single-parent foreign keys, multi-resource shared attachments, and fully polymorphic attachments, with automatic URL calculation and file purging on replacement for single attachments.
Ghostty_ex is an Elixir library that wraps libghostty-vt, providing a BEAM-native terminal emulator with SIMD-optimized VT parsing, full Unicode support, and 24-bit color capabilities. Terminals are implemented as GenServers, allowing direct integration with OTP supervision trees, and support features like text reflow on resize, scrollback management, and multiple output formats (plain text, HTML, or raw cell grid for custom rendering). Precompiled NIF binaries are provided for x86_64 and aarch64 Linux and aarch64 macOS, with an API for writing data, capturing snapshots, managing cursor position, and receiving terminal effects as Erlang messages.
Lotus is an embeddable business intelligence engine for Elixir applications that provides SQL editing, dashboards, charts, and AI-powered query generation directly within Phoenix apps without requiring separate infrastructure like Metabase or Redash. It integrates in minutes through a simple dependency installation, configuration, database migration, and single router mount, providing production-safe read-only access to analytics and reporting capabilities including multi-turn AI conversations, interactive schema exploration, and customizable visualizations.
The author shares performance optimization lessons learned while building Ultravisor, an Elixir-based Postgres connection pooler that handles hundreds of thousands of queries per second, emphasizing the critical importance of flame graphs and call tracing tools like eFlambè and tprof for identifying performance bottlenecks in tight loops. Key findings include that reducing unnecessary operations, understanding telemetry costs, choosing appropriate data structures, and knowing the performance limits of Elixir primitives like ETS tables and GenServer calls are essential for achieving sub-millisecond query handling at scale.
Mob is an early-stage framework that runs the BEAM virtual machine and Elixir OTP directly on iOS and Android devices, with screen logic implemented as GenServers that render UI through native Compose and SwiftUI components via NIFs. Developers write Elixir code for business logic while the framework handles native rendering and gesture handling, enabling live development features like hot-pushing bytecode and remote state inspection via Erlang distribution. The framework provides device APIs for camera, location, push notifications, and other native capabilities, alongside built-in themes and navigation patterns, but is not yet production-ready.
Jidoka is an Elixir DSL layer built on top of Jido that simplifies LLM agent development by providing an approachable entry point requiring minimal boilerplate—developers can create a functional agent with just an agent ID and instructions, while progressively opting into advanced features like tools, memory, workflows, and structured output without forced complexity. The framework positions agents as OTP processes managed by a shared runtime supervisor, allowing flexible lifetime management tied to requests, sessions, or background jobs, and supports both module-based and JSON/YAML declarative configuration patterns.
Elixir Test Critic is a collection of 81 executable testing rules organized across 14 categories, each with paired good_test.exs and bad_test.exs examples that validate against ten foundational principles and run on every push across Elixir 1.16–1.19 and OTP 26–28. It functions as both a Claude Code skill for LLM-assisted test review and a browsable Markdown reference, with findings tied to specific rule IDs that provide fixes and principle citations rather than just complaints. All 162 example scripts execute in CI to prevent regressions, ensuring the corpus remains honest against language and dependency updates.
AI agents fail in production because they're deployed into codebases with hidden dependencies, mutable global state, and undeclared side effects that make their outputs non-deterministic and unverifiable. The problem isn't model capability but architectural design—agents can only work with explicit function contracts and have no way to discover implicit context that human developers accumulate over months. Applying functional programming principles (formalized as the SUPER framework and SPIRALS process) eliminates hidden state and makes code deterministic enough for agents to reason about and debug reliably.
Regards,
M@
[ED: If you'd like to sign up for this content as an email, click here to join the mailing list.]
Originally published on quantumfaxmachine.com and cross-posted on Medium.
hello@matthewsinclair.com | matthewsinclair.com | bsky.app/@matthewsinclair.com | masto.ai/@matthewsinclair | medium.com/@matthewsinclair | xitter/@matthewsinclair
Was this useful?