HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
oban-bg
oban
Elixir2019–2026
oban-bg / oban

oban

💎 Robust job processing in Elixir, backed by modern PostgreSQL, SQLite3, and MySQL

28Distinct people
36Mentions
1Explicit recommenders
4KGitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

💎 Robust job processing in Elixir, backed by modern PostgreSQL, SQLite3, and MySQL

GitHub

Where it is used

No documented product use was verified in the last source check.

What people are saying

Just curious, if you’re already in Elixir and using Postgres, why not use Oban[1]? It’s my absolute favorite background job library, and the thing I often miss most when…

mmcclure used a recommendation phrase. One indexed comment matches. This is a phrase match, not a verdict.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

Mentioned in the same Hacker News threads. That is not proof they are substitutes.

This week on Hacker News

Nov 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 5:04:57 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by year36 dated mentions

Observed mentions: 2019-12-20 16:11:41 UTC to 2026-04-30 17:12:06 UTC.

02468102019-01-01 00:00:00 UTC to 2020-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments20192020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 7 mentions; 0 submissions, 7 comments2021-01-01 00:00:00 UTC to 2022-01-01 00:00:00 UTC (exclusive): 9 mentions; 0 submissions, 9 comments2022-01-01 00:00:00 UTC to 2023-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments20222023-01-01 00:00:00 UTC to 2024-01-01 00:00:00 UTC (exclusive): 10 mentions; 1 submissions, 9 comments2024-01-01 00:00:00 UTC to 2025-01-01 00:00:00 UTC (exclusive): 3 mentions; 0 submissions, 3 comments2025-01-01 00:00:00 UTC to 2026-01-01 00:00:00 UTC (exclusive): 4 mentions; 1 submissions, 3 comments2026-01-01 00:00:00 UTC to 2027-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments. Incomplete calendar period.2026*

* An incomplete calendar period is marked with an outlined bar. Its count is not directly comparable with a full period.

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
20192019-01-01 00:00:00 UTC2020-01-01 00:00:00 UTC101
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC707
20212021-01-01 00:00:00 UTC2022-01-01 00:00:00 UTC909
20222022-01-01 00:00:00 UTC2023-01-01 00:00:00 UTC101
20232023-01-01 00:00:00 UTC2024-01-01 00:00:00 UTC1019
20242024-01-01 00:00:00 UTC2025-01-01 00:00:00 UTC303
20252025-01-01 00:00:00 UTC2026-01-01 00:00:00 UTC413
2026 (partial)2026-01-01 00:00:00 UTC2027-01-01 00:00:00 UTC101

From the project README

An excerpt from the repository, fetched Nov 13, 2026.

Read the project’s introduction
Robust job processing in Elixir, backed by modern PostgreSQL, MySQL, and SQLite3. Reliable, observable, and loaded with enterprise grade features. Table of Contents Features Oban Pro Engines Requirements Installation Quick Getting Started Learning Community Contributing Note This README is for the unreleased main branch, please reference the official documentation on hexdocs for the latest stable release. Features Oban's primary goals are reliability, consistency and observability. Oban is a powerful and flexible library that can handle a wide range of background job use cases, and it is well-suited for systems of any size. It provides a simple and consistent API for scheduling and performing jobs, and it is built to be fault-tolerant and easy to monitor. Oban is fundamentally different from other background job processing tools because it retains job data for historic metrics and inspection. You can leave your application running indefinitely without worrying about jobs being lost or orphaned due to crashes. Advantages Over Other Tools Fewer Dependencies — If you are running a web app there is a very good chance that you're running on top of a SQL database. Running your job queue within a SQL database minimizes system dependencies and simplifies data backups. Transactional Control — Enqueue a job along with other database changes, ensuring that everything is committed or rolled back atomically. Database Backups — Jobs are stored inside of your primary database, which means they are backed up together with the data that they relate to. Advanced Features Isolated Queues — Jobs are stored in a single table but are executed in distinct queues. Each queue runs in isolation, with its own concurrency limits, ensuring that a job in a single slow queue can't back up other faster queues. Isolated Jobs — Every job runs in a dedicated process to provide fully concurrent execution, a clean environment between jobs, and efficient cleanup after the job runs. Queue Control — Queues can be started, stopped, paused, resumed and scaled independently at runtime locally or across all running nodes (even in environments like Heroku, without distributed Erlang). Resilient Queues — Failing queries won't crash the entire supervision tree, instead a backoff mechanism will safely retry them again in the future. Job Canceling — Jobs can be canceled in the middle of execution regardless of which node they are running on. This stops the job at once and flags it as cancelled. Triggered Execution — Insert triggers ensure that jobs are dispatched on all connected nodes as soon as they are inserted into the database. Unique Jobs — Duplicate work can be avoided through unique job controls. Uniqueness can be enforced at the argument, queue, worker and even sub-argument level for any period of time. Scheduled Jobs — Jobs can be scheduled at any time in the future, down to the second. Periodic (CRON) Jobs — Automatically enqueue jobs on a cron-like schedule. Duplicate jobs are never enqueued, no matter how many nodes you're running. Job Priority — Prioritize jobs within a queue to run ahead of others with ten levels of granularity. Historic Metrics — After a job is processed the row isn't deleted. Instead, the job is retained in the database to provide metrics. This allows users to inspect historic jobs and to see aggregate data at the job, queue or argument level. Node Metrics — Every queue records metrics to the database during runtime. These are used to monitor queue health across nodes and may be used for analytics. Graceful Shutdown — Queue shutdown is delayed so that slow jobs can finish executing before shutdown. When shutdown starts queues are paused and stop executing new jobs. Any jobs left running after the shutdown grace period may be rescued later. Telemetry Integration — Job life-cycle events are emitted via Telemetry integration. This enables simple logging, error reporting and health checkups without plug-ins. 🌟 Oban Pro An official set of extensions, plugins, and workers that expand what Oban is capable of is available as a licensed package. It includes features like: Smart Engine — Enables global concurrency, global rate limiting, queue partitioning, and auto insert batching for truly distributed job processing. Pro Worker — Extends workers with execution hooks, structured args, output recording, encrypted args at rest, and chained execution. Workflows — Compose jobs with arbitrary dependencies for sequential, fan-out, and fan-in execution patterns. Batches — Process related jobs while tracking overall progress across all nodes and executing optional callbacks. Dynamic Plugins — Runtime configuration of cron schedules, queues, job priorities, and automatic scaling—ideal for applications that manage jobs dynamically. Decorator — Build and insert jobs directly from regular functions without defining worker modules. Learn more about Oban Pro → Engines Oban ships with engines for PostgreSQL, MySQL, and SQLite3. Each engine supports the same core functionality, though they have differing levels of maturity and suitability for production. Requirements Oban requires: Elixir 1.15+ Erlang 24+ PostgreSQL 14.0+, MySQL 8.4+, or SQLite3 3.37.0+ Installation See the installation guide for details on installing and configuring Oban in your application. Quick Getting Started Configure queues and an Ecto repo for Oban to use: # In config/config.exs config :my_app, Oban, repo: MyApp.Repo, queues: [mailers: 20] Define a worker to process jobs in the mailers queue (see Oban.Worker): defmodule MyApp.MailerWorker do use Oban.Worker, queue: :mailers @impl Oban.Worker def perform(%Oban.Job{args: %{"email" => email} = _args}) do _ = Email.deliver(email) :ok end end Enqueue a job (see the documentation): %{email: %{to: "foo@example.com", body: "Hello from Oban!"}} |> MyApp.MailerWorker.new() |> O
Read the full README on GitHub

What Hacker News says

36 sources
That's the issue with goroutines, threads, or any long running chain of processes. The tasks must be broken up into atomic chunks, and the state has to be serialized in some way. That allows failures to be retried, errors to be examined, results to be referenced later, and the whole thing to be distributed between multiple nodes. It must in my view at least, as that's how Oban (https://github.com/oban-bg/oban) in Elixir models this kind of problem. Full disclosure, I'm an author and maintainer of the project. It's Elixir specific, but this article emphasizes the importance of async task persistence: https://oban.pro/articles/oban-starts-where-tasks-end
In Go is a good fit for agents
I have nothing against pg_boss[0] from the articel (I don't know anything about it), but there are plenty of queues and crons and schedulers for PG Some others: * https://github.com/LaunchPlatform/bq * https://github.com/cybertec-postgresql/pg_timetable * https://github.com/pgmq/pgmq * https://github.com/riverqueue/river * https://github.com/oban-bg/oban * https://github.com/pgadmin-org/pgagent * https://github.com/citusdata/pg_cron etc. There are plenty of options to choose from. 0: https://github.com/timgit/pg-boss
In How to run cron jobs in Postgres without extra infrastructure
This is a fairly old article, but this has become a very common pattern. For 90% of projects that just need a task queue for sending email or generating reports, you're not going to be doing millions of messages a second and anything that simplifies your stack is worth looking at. I've used these patterns so often to work around issues encountered with Celery that I've split them into their own framework, https://github.com/TkTech/chancy (feedback appreciated ;) There are lots of these, several of which are commercial ventures so there's definite interest behind it: https://worker.graphile.org/ (Node.js) https://riverqueue.com/ (Go) https://github.com/acaloiaro/neoq (Go) https://github.com/contribsys/faktory (Go) https://github.com/sorentwo/oban (Elixir) https://github.com/procrastinate-org/procrastinate (Python)
In Do you need Redis? PostgreSQL does queuing, locking, and pub/sub (2021)
I’ve been thinking about the potential for PostgreSQL-backed job queue libraries to share a common schema. For instance, I’m a big fan of Oban in Elixir: https://github.com/sorentwo/oban Given that there are many Sidekiq-compatible libraries across various languages, it might be beneficial to have a similar approach for PostgreSQL-based job queues. This could allow for job processing in different languages while maintaining compatibility. Alternatively, we could consider developing a core job queue library in Rust, with language-specific bindings. This would provide a robust, cross-language solution while leveraging the performance and safety benefits of Rust.
In Show HN: PgQueuer – Transform PostgreSQL into a Job Queue
The number of features lifted directly from Oban[1] is astounding, considering there isn't any attribution in the announcement post or the repo. Starting with the project's tagline, "Robust job processing in Elixir", let's see what else: - The same job states, including the British spelling for `cancelled` - Snoozing and cancelling jobs inline - The prioritization system - Tracking where jobs were attempted in an attempted_by column - Storing a list of errors inline on the job - The same check constraints and the same compound indexes - Almost the entire table schema, really - Unique jobs with the exact same option names - Table-backed leadership election Please give some credit where it's due. [1]: https://github.com/sorentwo/oban
In River: A fast, robust job queue for Go and Postgres
> Work in a transaction has other benefits too. Postgres’ NOTIFY respects transactions, so the moment a job is ready to work a job queue can wake a worker to work it, bringing the mean delay before work happens down to the sub-millisecond level. Oban just went the opposite way, removing the use of database triggers for insert notifications and moving them into the application layer instead[1]. The prevalence of poolers like pgbouncer, which prevent NOTIFY ever triggering, and the extra db load of trigger handling wasn't worth it. [1]: https://github.com/sorentwo/oban/commit/7688651446a76d766f39...
In River: A fast, robust job queue for Go and Postgres
You can actually have "background jobs" in very different ways in Elixir. > I want background work to live on different compute capacity than http requests, both because they have very different resources usage In Elixir, because of the way the BEAM works (the unit of parallelism is much cheaper and consume a low amount of memory), "incoming http requests" and related "workers" are not as expensive (a lot less actually) compared to other stacks (for instance Ruby and Python), where it is quite critical to release "http workers" and not hold the connection (which is what lead to the creation of background job tools like Resque, DelayedJob, Sidekiq, Celery...). This means that you can actually hold incoming HTTP connections a lot longer without troubles. A consequence of this is that implementing "reverse proxies", or anything calling third
Read the rest
party servers _right in the middle_ of your own HTTP call, is usually perfectly acceptable (something I've done more than a couple of times, the latest one powering the reverse proxy behind https://transport.data.gouv.fr - code available at https://github.com/etalab/transport-site/tree/master/apps/un...). As a consequence, what would be a bad pattern in Python or Ruby (holding the incoming HTTP connection) is not a problem with Elixir. > because I want to have state or queues in front of background work so there's a well-defined process for retry, error handling, and back-pressure. Unless you deal with immediate stuff like reverse proxying or cheap "one off async tasks" (like recording a metric), there also are solutions to have more "stateful" background works in Elixir, too. A popular background job queue is https://github.com/sorentwo/oban (roughly similar to Sidekiq at al), which uses Postgres. It handles retries, errors etc. But it's not the only solution, as you have other tools dedicated to processing, such as Broadway (https://github.com/dashbitco/broadway), which handles back-pressure, fault-tolerance, batching etc natively. You also have more simple options, such as flow (https://github.com/dashbitco/flow), gen_stage (https://github.com/elixir-lang/gen_stage), Task.async_stream (https://hexdocs.pm/elixir/1.12/Task.html#async_stream/5) etc. It allows to use the "right tool for the job" quite easily. It is also interesting to note there is no need to "go evented" if you need to fetch data from multiple HTTP servers: it can happen in the exact same process (even: in a background task attached to your HTTP server), as done here https://transport.data.gouv.fr/explore (if you zoom you will see vehicle moving in realtime, and ~80 data sources are being polled every 10 seconds & broadcasted to the visitors via pubsub & websockets).
In Switching to Elixir
areichert·Sep 27, 2023Submission

Show HN: A simple API/CLI for scheduling HTTP requests

Hi HN! This is something I've been tinkering on for the past couple months. It's basically just an API/CLI for scheduling delayed or recurring jobs as HTTP requests. I initially built it as a personal tool to save myself a bit of time on little side projects where I've needed scheduled/recurring alerts, but decided it could be a good opportunity to practice building out a nice landing page [0] and documentation [1]. And who knows, maybe someone else will find it useful ¯\_(ツ)_/¯ The tool relies heavily on Elixir's Oban [2] library for managing jobs, and Mintlify [3] for documentation. I also shamelessly stole most of the frontend design from Resend [4] because I'm a fan of the aesthetic and thought it would be good for my design chops to use their design as a guide. I also discovered Radix [5] UI while working on this, which ended up bein
Read the rest
g immensely helpful for moving quickly on the frontend. Anyways, I almost certainly spent a bit too much time on small UX details that are most likely utterly inconsequential, but it was a fun exercise in polish :) All feedback is welcome! [0] https://www.booper.dev/ [1] https://docs.booper.dev/ [2] https://github.com/sorentwo/oban [3] https://mintlify.com/ [4] https://resend.com/ [5] https://www.radix-ui.com/
12 points · Open discussion

Showing the 15 most recent of 36 sources. Enable JavaScript to search and browse every indexed mention.

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.