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 — millions of jobs an hour, 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. Every release benchmarked against stock Sidekiq — published numbers, not claims.
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 + ProBatches 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.
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.
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.
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.
A dashboard you'll keep open
A precompiled SolidJS SPA ships inside the gem — consumers never touch Node. Live queues, retries, busy workers, batches, limiters, cron, and metrics, with click-through job detail.
Sidekiq OSS + Pro/EntWurk 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 the dashboard.
HTTP producer + observe API
A bearer-token-scoped /v1 JSON API to enqueue, bulk-enqueue, and inspect queues, jobs, and the swarm — standalone, engine-nested, or via the wurk api CLI.
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.
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.
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.
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.
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.
Kubernetes probes
config.health_check opens a thin /live//ready HTTP listener that self-elects across a swarm's children.
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-onlyA dashboard you'll actually want open
Dark, fast, and mobile-first — a precompiled SolidJS SPA that ships inside the gem (consumers never run Node). Live queues, retries, scheduled, dead, busy workers, batches, limiters, cron, and throughput/failure metrics. Click any job for its full args, error, and backtrace.
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 a rolling deploy can run Sidekiq and Wurk against the same Redis during cutover. 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 maintained AI-first: implementation, parity suite, docs, and benchmarks written and kept current by AI agents under human review. 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 (Sidekiq's own tests as an oracle, third-party gems' upstream suites run against Wurk), and to keep adding surface Sidekiq doesn't have. It also means the claims stay measured: published numbers against stock Sidekiq every release, including the unflattering ones.
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.