From elixir-phoenix
Provides reference for Elixir idioms and OTP/BEAM patterns including GenServer, Supervisor, Task, Registry, pattern matching, pipes, with chains. Use when designing processes or debugging BEAM issues.
How this skill is triggered — by the user, by Claude, or both
Slash command
/elixir-phoenix:elixir-idiomsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Reference for writing idiomatic Elixir code with BEAM-aware patterns.
Reference for writing idiomatic Elixir code with BEAM-aware patterns.
and/or/not — Never use short-circuit operators in guards (guards require boolean operands)cast/4 for user input, change/2 for internalString.to_atom(user_input) causes memory leak (atoms aren't GC'd)@external_resourceGenServer.start_link/Agent.start_link in production. Use supervision treescase, then cond{:ok, _}/{:error, _} for expected errors, raise for bugsNeed patterns? → case (or function heads)
Multiple operations? → with
Boolean conditions? → cond (multiple) or if (single)
Expected failure? → {:ok, _}/{:error, _} tuples
Unexpected/bug? → raise exception (let supervisor handle)
External library? → rescue (only here!)
Need state?
├─ No → Plain functions
├─ Simple get/update → Agent or ETS
├─ Complex messages/timeouts → GenServer
└─ One-off async → Task
# Pattern match in function head
def process(%{status: :active} = user), do: activate(user)
def process(%{status: :inactive} = user), do: deactivate(user)
# with for happy path
with {:ok, user} <- get_user(id),
{:ok, order} <- create_order(user) do
{:ok, order}
end
# Task for async
Task.Supervisor.async_nolink(TaskSup, fn -> work() end)
|> Task.yield(5000) || Task.shutdown(task)
| Wrong | Right |
|---|---|
length(list) == 0 | list == [] or Enum.empty?(list) |
list ++ [item] | [item | list] |> Enum.reverse() |
String.to_atom(input) | String.to_existing_atom(input) |
spawn(fn -> log(conn) end) | ip = conn.ip; spawn(fn -> log(ip) end) |
unless condition | if !condition (unless deprecated in 1.18) |
For detailed patterns, see:
${CLAUDE_SKILL_DIR}/references/pattern-matching.md - Pattern matching, guards, binary matching${CLAUDE_SKILL_DIR}/references/otp-patterns.md - GenServer, Supervisor, Task, Registry${CLAUDE_SKILL_DIR}/references/error-handling.md - Tagged tuples, rescue, with${CLAUDE_SKILL_DIR}/references/with-and-pipes.md - When to use with and |> (idiomatic patterns)${CLAUDE_SKILL_DIR}/references/troubleshooting.md - Production BEAM debugging (memory, performance, crashes)${CLAUDE_SKILL_DIR}/references/anti-patterns.md - Common mistakes and fixes${CLAUDE_SKILL_DIR}/references/mix-tasks.md - Mix task naming, option parsing, shell output${CLAUDE_SKILL_DIR}/references/elixir-118-features.md - Duration module, dbg improvements (1.18+)npx claudepluginhub oliver-kriska/claude-elixir-phoenix --plugin elixir-phoenixProvides Elixir best practices and OOP-to-functional shifts: avoid unnecessary processes, use pattern matching/with for control flow, {:ok/:error} handling, behaviors/protocols for polymorphism.
Provides Elixir expertise for OTP patterns, supervision trees, Phoenix LiveView, Ecto, and concurrent/distributed systems with BEAM best practices.
Enforces Elixir best practices like pattern matching over if/else, pipe operator for chaining, with for sequential fallible ops, @impl true, and let-it-crash when editing .ex/.exs files.