
Elixir Idioms
OTP/BEAM patterns and Elixir idioms, GenServer, Supervisor, Task, Registry, pattern...
Install
npx skills add oliver-kriska/claude-elixir-phoenix --skill elixir-idioms -g -a claude-code -y- Repository
- oliver-kriska/claude-elixir-phoenix572
- Category
- Design
- Updated
- 5d ago
- License
- MIT
- Context cost
- Lightabout 1,139 tokens
- Runs scripts
- No, instructions only
What it does
OTP/BEAM patterns and Elixir idioms, GenServer, Supervisor, Task, Registry, pattern matching, with chains, pipes. Use when designing processes or debugging BEAM issues.
Elixir Idioms
Reference for writing idiomatic Elixir code with BEAM-aware patterns.
Iron Laws, Never Violate These
- NO PROCESS WITHOUT A RUNTIME REASON, Processes model concurrency, state, isolation, NOT code structure
- MESSAGES ARE COPIED, Keep messages small (except binaries >64 bytes)
- GUARDS USE
and/or/not, Never use short-circuit operators in guards (guards require boolean operands) - CHANGESETS FOR EXTERNAL DATA, Use
cast/4for user input,change/2for internal - RESCUE ONLY FOR EXTERNAL CODE, Never use rescue for control flow
- NO DYNAMIC ATOM CREATION,
String.to_atom(user_input)causes memory leak (atoms aren't GC'd) - @external_resource FOR COMPILE-TIME FILES, Modules reading files at compile time MUST declare
@external_resource - SUPERVISE ALL LONG-LIVED PROCESSES, Never bare
GenServer.start_link/Agent.start_linkin production. Use supervision trees - WRAP THIRD-PARTY LIBRARY APIs, Always facade external deps behind a project-owned module. Enables swapping without touching callers
- MIX TASKS START ONLY WHAT THEY NEED,
Mix.Task.run("app.config")+Application.ensure_all_started/1, neverMix.Task.run("app.start")(boots the FULL tree: endpoint port, Oban consuming) - CAPTURE LOCALE BEFORE SPAWNING, Gettext/CLDR locale is process-local. Read it in the caller and pass explicitly; a spawned Task/GenServer starts with the default locale
BEAM Architecture (Why Elixir Works This Way)
- Processes are cheap (2.6KB), Spawn liberally for concurrency/isolation
- Complete memory isolation, No shared state, no locks needed
- Messages are copied (except binaries >64 bytes), Keep messages small
- Per-process GC, No global GC pauses
- "Let it crash", Supervisors restart to known-good state


