Oban Releases

Web v2.8.0

📋 New Queues Table, Details, and Runtime Configuration

Oban Web has a new queues page that shows details about every active queue, including previously invisible configuration like global concurrency limits, uptime, and rate limit activity. You can also expand queues to view specifics about instances across each node, along with the ability to pause or resume instances.

For more queue information and runtime configuration there is a details page for every queue. Within it you can scale the local limit across all nodes, change the global limit, edit the rate limit, and even scale individual instances.

🌗 Dark Mode and Visual Updates

The dashboard is completely overhauled with a visual refresh and a new dark mode! The visual changes were driven by accessibility improvements such as:

  • Increased contrast
  • Consistent hover/focus for actionable elements
  • Informative tooltips
  • Semantic forms

🔏 Custom Args/Meta Formatting Callbacks

By default, the job views pretty print args and meta in full. For more control, i.e. for privacy or brevity, there are now format_job_args/1 and format_job_meta/1 callbacks.

For example, to redact the "email" for only the SecretJob worker:

@impl true
def format_job_args(%Oban.Job{worker: "MyApp.SecretJob", args: args}) do
  |> Map.replace("email", "REDACTED")
  |> inspect(pretty: true)

def format_job_args(job), do: Oban.Web.Resolver.format_job_args(job)

See the Customizing the Dashboard guide for more.


  • Upgrade the minimum Phoenix Live View dependency to 0.17.4 in order to get components working properly.

  • Upgrade the minimum Elixir version to 1.12 due to the required use of HEEX templates in the latest Live View.

Jobs Page

  • Sort jobs by worker, queue, attempt, or time in either ascending or descending order. The default is by time ascending.

  • Filter jobs by multiple nodes or queues at once. Within nodes or queues filtering acts like an “OR”, while between them it is an “AND”.


  • Pause refreshing when Web loses window visiblity and restore it when the window becomes visible again. This prevents runaway database queries when the tab is left open unattended. Additionally, there is a new 1 minute refresh option for even less frequent polling.

  • Perform stats counts less frequently for large states to minimize database load. This trades realtime fidelity for performance by backing off of counts that can’t be accelerated by an index. State counts are displayed as suffixed estimates, e.g. 41k or 43.1k to compensate.

  • Fetch only fields that may change when refreshing the jobs table or details view.

  • Use the built-in cancel_all/retry_all from Oban to accelerate bulk operations.


  • Export locals_without_parens for oban_dashboard/1,2 in .formatter.exs

Web v2.8.1

Bug Fixes

  • Ensure all required params are available when navigating job pages.

    When a job was deleted, either manually or automatically, the params weren’t initialized properly. By consistently routing back to the base jobs page we ensure that all keys are available.

  • Clean up tooltip warnings caused by missing ids.

    Some elements declared a phx-hook without providing an id. That caused console errors and prevented unmounting in-use tooltips.

Web v2.8.2

Bug Fixes

  • Restore previous “Run Now” functionality for scheduled jobs. Oban’s built-in function ignores the scheduled state, which prevented the intended functionality.

  • Use whitespace and wrapping when displaying args and meta on the job details page. Overflowing was restrictive, and often broken. The new styling matches that of error reporting services.

  • Indicate that jobs are complete, rather than just attempted in the details timeline.

Web v2.8.3

Bug Fixes

  • Restore custom route naming, e.g. mounting with as: :my_oban_dashboard or mounting multiple dashboards in the same router.

  • Wrap lengthy error messages rather than attempting to scroll. This preserves the detail view’s layout and matches the display for args and meta.

  • Redirect back to the queues page when details for a particular queue aren’t available. This could happen when a tab was left open and a dynamic queue stopped running.