mcpField
O
oban

oban

github.com/oliver-kriskaDevelopment57181 installsUpdated 1w ago
Repository

About oban

oban is a reference skill for developers building and maintaining background jobs with Elixir Oban. It covers worker, queue, and testing patterns, including guidance for detecting Oban Pro and using its corresponding conventions.

Key features

  1. 01Oban Pro detection and pattern selection
  2. 02Worker templates and queue design guidance
  3. 03Job idempotency and argument conventions
  4. 04Return-value handling guidance
  5. 05Testing assertion examples

Use cases

  1. 01Implement background workers in Elixir projects
  2. 02Review job retry and idempotency design
  3. 03Plan queue concurrency for different workloads
  4. 04Write tests for Oban jobs

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/oliver-kriska/claude-elixir-phoenix --skill oban

After installing, type/obanin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

references/
oban-pro-basics.md
queue-config.md
testing-patterns.md
worker-patterns.md

Details

From the project README

Oban Background Jobs Reference

Quick reference for Elixir Oban patterns.

Oban Pro Detection

Before applying patterns, check for Oban Pro:

grep -E "oban_pro|oban_web" mix.exs
grep -r "use Oban.Pro.Worker" lib/
grep -r "Oban.Pro.Engines.Smart" config/

If Oban Pro detected, use Pro patterns for ALL new workers:

Standard ObanOban Pro
use Oban.Workeruse Oban.Pro.Worker
def perform(%Job{})def process(%Job{})
Oban.TestingOban.Pro.Testing
Advisory lock engineOban.Pro.Engines.Smart

Pro features (all optional): args_schema (typed args), Workflows, Batches, Chunks, Relay, hooks, encryption, deadlines, chaining, Smart Engine (global concurrency + rate limiting). Pro plugins (DynamicCron, DynamicLifeline, DynamicPruner) enhance OSS equivalents — swap module, don't run both. See ${CLAUDE_SKILL_DIR}/references/oban-pro-basics.md for all patterns and migration guide.


Iron Laws — Never Violate These

  1. JOBS MUST BE IDEMPOTENT — Safe to retry. Use idempotency keys for payments
  2. JOBS MUST STORE IDs, NOT STRUCTS — JSON serialization. %{user_id: 1} not %{user: %User{}}
  3. JOBS MUST HANDLE ALL RETURN VALUES — :ok, {:error, _}, {:cancel, _}, {:snooze, _}
  4. ARGS USE STRING KEYS — Pattern match %{"user_id" => id} not %{user_id: id}
  5. UNIQUE CONSTRAINTS FOR USER ACTIONS — Prevent double-click duplicates
  6. NEVER STORE LARGE DATA IN ARGS — Store references (IDs, paths), not content
  7. SMART ENGINE: NEVER USE attempt TO LIMIT SNOOZES — Snooze rolls back attempt counter. Use meta["snoozed"] instead. Causes infinite loops

Quick Worker Template

defmodule MyApp.Workers.ExampleWorker do
  use Oban.Worker,
    queue: :default,
    max_attempts: 5,
    unique: [period: {5, :minutes}, keys: [:entity_id]]

  @impl Oban.Worker
  def perform(%Oban.Job{args: %{"entity_id" => id}}) do
    case process(id) do
      {:ok, _} -> :ok
      {:error, :not_found} -> {:cancel, "Entity not found"}
      {:error, :rate_limited} -> {:snooze, {5, :minutes}}
      {:error, reason} -> {:error, reason}
    end
  end
end

Return Value Meanings

ReturnStateBehavior
:okcompletedSuccess
{:ok, value}completedSuccess with value
{:error, reason}retryableRetry with backoff
{:cancel, reason}cancelledStop permanently
{:snooze, seconds}scheduledDelay and retry

Quick Decisions

Which Queue?
  • Critical operations → High concurrency (20+)
  • Mailers/Webhooks (I/O) → Medium concurrency (30-50)
  • CPU-intensive → Low concurrency (3-5)
  • External APIs → Use dispatch_cooldown for rate limiting
Testing Pattern
use Oban.Testing, repo: MyApp.Repo

# Assert enqueued
assert_enqueued worker: MyApp.Worker, args: %{id: 1}

# Execute and verify
assert :ok = perform_job(MyApp.Worker, %{id: 1})

Common Anti-patterns

WrongRight
%{user_id: id} pattern match%{"user_id" => id} (string keys)
%{user: %User{}} in args%{user_id: 1} (IDs only)
No idempotency for paymentsUse idempotency keys
Ignoring return valuesHandle all outcomes explicitly

References

For detailed patterns, see:

  • ${CLAUDE_SKILL_DIR}/references/worker-patterns.md - Worker options, backoff, timeout
  • ${CLAUDE_SKILL_DIR}/references/queue-config.md - Queue design, pool sizing, cron, Smart Engine
  • ${CLAUDE_SKILL_DIR}/references/testing-patterns.md - Testing, assertions, drain (OSS + Pro)
  • ${CLAUDE_SKILL_DIR}/references/oban-pro-basics.md - Pro.Worker, Workflow, Batch, Chunk, Relay, plugins

Comments

Markdown supported