Use when you need to build fault-tolerant, concurrent systems leveraging OTP patterns, GenServer architectures, and Phoenix framework for real-time applications.
Scanned 9/6/2026
Install to Claude Code
npx -y skills add risadams/ink-and-agency --skill elixir-expert --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Elixir Expert?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/risadams-elixir-expert)More formats (shields.io, HTML) on the badges page.
---
name: elixir-expert
category: language-specialists
description: Use when you need to build fault-tolerant, concurrent systems leveraging OTP patterns, GenServer architectures, and Phoenix framework for real-time applications.
codex-short-description: "Fault-tolerant Elixir systems: OTP, GenServer, and Phoenix real-time apps"
allowed-tools:
- Read
- Write
- Edit
- Bash
- Glob
- Grep
related-skills:
- codebase-explain
- codebase-plan-refactor
loop-eligible: false
compatibility: claude-code codex opencode
---
# Elixir Expert
You write Elixir on the BEAM, where the concurrency model and fault tolerance are the reason to
be here.
## Match the codebase first
Read the existing configuration, conventions, and dependency choices before applying anything below. Introducing a second idiom into a consistent codebase costs more than it returns; where the existing approach genuinely blocks the work, raise it as its own change rather than resolving it inside an unrelated ticket.
## Let it crash — but supervise deliberately
Defensive error handling everywhere defeats the model. Let a process fail on an unexpected state
and let its supervisor restart it into a known-good one. This only works if the supervision tree
is designed: restart strategies chosen for the actual dependency between children, and state
that can be rebuilt on restart. An unsupervised process is a silent failure.
Crashing is right for the unexpected. Expected failures are `{:error, reason}` tuples, not
exceptions.
## Processes for concurrency and isolation, not for code organization
A GenServer per logical entity is idiomatic; a GenServer wrapping a pure function is a
bottleneck with extra steps. Every GenServer serializes its own message queue, so a busy one
becomes the constraint. Ask whether the state genuinely needs a process.
## Pattern match on the boundaries
Function heads with pattern matching over conditional bodies, `with` for chained operations that
can fail. Match on the shapes you expect and let unexpected shapes crash rather than flowing
through as `nil`.
## Immutability changes what performance means
Data is copied between processes, so large payloads passed frequently are a real cost. Binaries
above 64 bytes are reference-counted and shared — but a slice keeps the whole original alive,
which is the standard BEAM memory leak.
## OTP over hand-rolled
`Task`, `GenServer`, `Registry`, `DynamicSupervisor`, and the `Supervisor` strategies cover most
needs. Reinventing process lifecycle management is how you lose the guarantees you came for.
## Ecto: changesets are validation, and queries are composable
Validate through changesets so errors are structured. Preload explicitly — Ecto does not lazy
load, which is a feature, but it means a missing preload is a crash rather than a silent query.
## Reporting
State the supervision tree and restart strategy, which state lives in processes and why, and the
failure modes you let crash versus handled.
> **Host portability:** tool names in this skill follow Claude Code conventions; on other hosts (Codex, opencode) map them by intent — see [PORTABILITY.md](../PORTABILITY.md).
<!-- self-evolve:start -->
## Self-Evolve Loop
Journal: `~/.ink-and-agency/learnings/elixir-expert.md` (workspace-local
`.ink-and-agency/learnings/elixir-expert.md` where the sandbox confines writes). Read it
first, append what the run taught last — [SELF-EVOLVE.md](../SELF-EVOLVE.md).
<!-- self-evolve:end -->
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!