Visitar URL original
Wurk — a free, 100% drop-in replacement for Sidekiq + Pro + Enterprise

Wurk

Wurk, wurk. 🪓 Ready to work. Zug zug.

A 100% drop-in replacement for Sidekiq + Sidekiq Pro + Sidekiq Enterprise. Free forever. In production at developerz.ai and partner deployments, across many servers.

# Gemfile
gem "wurk"

Why Wurk

100% drop-in

Same Redis schema, job JSON, and DSL. Third-party Sidekiq gems work unchanged.

Free

Pro + Enterprise parity in the same gem. No tiers, no license check, no flag gates.

Parallel

Enterprise's forking swarm, in the free gem. The latest published comparison against stock Sidekiq is dated 2026-08-07 — numbers and reproduction commands, not a current-release guarantee.

Everything, in one free gem

The runtime, the Pro batches, the Enterprise limiters, periodic jobs, and encryption — the features Sidekiq offers across its three tiers all ship in a single MIT-licensed gem. No license keys, no feature flags. Just bundle install.

Real parallelism, not just threads

Fork-based workers use every core — no GIL bottleneck. Reliable BLMOVE fetch, PID supervision, zero-downtime rolling restarts, and graceful drain are built in.

Sidekiq OSS + Pro

Batches that fan out & call back

Track thousands of jobs as one unit. Fire success / complete / death callbacks, nest batches arbitrarily deep, and watch live progress roll in.

Sidekiq Pro · free

Rate limiting that holds the line

Concurrent, bucket, window, leaky, and points limiters protect fragile downstreams — throttle a third-party API or a hot database without ever dropping work.

Sidekiq Enterprise · free

Cron that fires exactly once

Leader-elected periodic jobs mean every schedule tick runs once across your whole fleet — no duplicate sends, no missed ticks, no extra moving parts.

Sidekiq Enterprise · free

Encrypted arguments, rotated keys

AES-256-GCM encryption for sensitive job arguments with zero-downtime key rotation. PII and secrets never sit in Redis as plaintext.

Sidekiq Enterprise · free

A dashboard you'll keep open

A precompiled SolidJS SPA ships inside the gem — consumers never touch Node. Built-in panes: Dashboard, Queues, Retries, Scheduled, Dead, Busy, Batches, Flows, Limiters, Cron, Metrics, Profiles, Search, with click-through job detail.

Sidekiq OSS + Pro/Ent

That's the full Sidekiq + Pro + Enterprise surface — $0, one gem, MIT licensed.

Wurk extras — not Sidekiq parity

Sidekiq has no equivalent for any of these, and each is Wurk-only: using it ties that code to Wurk. Everything that touches the job path is opt-in and free when unused — no extra Redis round trip on the hot path until you turn it on. The dashboard's theme, locale and timezone are the exception: they're on whenever the dashboard is, and cost the job path nothing either way.

Job status, progress & results

Opt-in track: true persists state, coalesced progress writes, and the return value — read back from Ruby or over the bearer-scoped /v1 HTTP API (GET /jobs/:jid).

Wurk-only

HTTP producer + observe API

A bearer-token-scoped JSON API to enqueue, bulk-enqueue, and inspect queues, jobs, and the swarm. Enabled when an API token is configured: engine-nested at <mount>/api/v1 (inheriting the engine's middleware), standalone at /v1 via run Wurk::API, or separately mounted, e.g. /wurk-api/v1 via mount Wurk::API => '/wurk-api'. Separate mounts do not inherit the engine's middleware. The wurk api CLI is a client of this API.

Wurk-only

OpenTelemetry tracing

W3C traceparent/tracestate propagated client to server, one span per attempt, linked across long retry delays instead of stretching one trace across hours.

Wurk-only

Flows — DAGs on batches

Wurk::Flow chains and fans batches out and in with dependency edges, piped results between nodes, and cycle/depth/width limits.

Wurk-only

Debounce, throttle-to-slot & collapse

collapse: { policy: :debounce } coalesces a burst into one job (last payload wins); collapse: { policy: :throttle } admits one job per fixed time slot.

Wurk-only

Per-job timeouts & deadlines

timeout: bounds one attempt; deadline: bounds the whole job from enqueue — enforced by a lightweight per-capsule watchdog, no thread-per-job.

Wurk-only

Global per-queue concurrency caps

config.global_concurrency = { critical: 20 } caps in-flight jobs for a queue across the whole cluster, folded into the fetch pipeline.

Wurk-only

Kubernetes probes

Optional, off by default: config.health_check(port: 7433) opens a dedicated-port HTTP listener for /live and /ready probes that self-elects across a swarm's children. These are not engine or /v1 API routes.

Wurk-only

Dashboard theme, locale & timezone

Light/dark/system theme, per-visitor locale override, and a 400-zone timezone picker applied to every timestamp in the SPA. (AI panes — anomaly detection, NL queries, capacity forecasting — are planned for M5, not shipped.)

Wurk-only

A dashboard you'll actually want open

Dark, fast, and mobile-first — a precompiled SolidJS SPA that ships inside the gem (consumers never run Node). Built-in panes: Dashboard, Queues, Retries, Scheduled, Dead, Busy, Batches, Flows, Limiters, Cron, Metrics, Profiles, Search. Click any job for its full args, error, and backtrace.

Open the live demo

Install

Add the gem

# Gemfile
gem "wurk"

# then
bundle install

Mount the dashboard

# config/routes.rb
mount Wurk::Engine => "/wurk"

Migrating from Sidekiq

Wurk reads and writes the same Redis schema, so there is no data migration: drain Sidekiq's workers, then start Wurk's. Swap the gems, add one line:

- gem "sidekiq"
- gem "sidekiq-pro", source: "https://gems.contribsys.com/"
- gem "sidekiq-ent", source: "https://enterprise.contribsys.com/"
+ gem "wurk"

bundle install && restart. One thing to size first: Wurk forks one worker process per CPU core, so total in-flight jobs = WURK_COUNT × concurrency — check your DB pool before the first deploy. The migration guide walks through parallelism, clustered Puma, and the gem mappings (cron, unique-jobs).

Why Wurk exists

Infrastructure this basic should be free software. A Rails app shouldn't need a licence key for reliable fetch, batches, rate limiting, or cron — those are table stakes, not a premium tier.

What makes that hard is maintenance: someone has to be paid to do it. Sidekiq funds a decade of human maintenance through its paid tiers, which is an honest trade. Wurk makes a different one — it is 100% AI-managed: issues, pull requests and dependency updates are handled end to end by a maintainer agent, which asks a human only for security reports, license questions and breaking changes, and new features and releases are shipped by humans and AI together. A fix, a doc update, or a version bump no longer costs somebody a week, which is what makes it practical to ship the whole Pro + Enterprise surface for free, to verify parity mechanically on every push (independently written oracles for documented Sidekiq behavior, third-party gems' upstream suites run against Wurk), and to keep adding surface Sidekiq doesn't have. It also means the claims stay measured: the latest published paired comparison against stock Sidekiq is dated 2026-08-07, including the unflattering results. It is a historical measurement, not a comparison run for each release.

Wurk is MIT and stays that way. If what you need is a commercial support contract and a human on the other end of an email, buying that is a perfectly good answer. Wurk is independent and not affiliated with or endorsed by Sidekiq or its maintainers.