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 + 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. Built-in panes: Dashboard, Queues, Retries, Scheduled, Dead, Busy, Batches, Flows, Limiters, Cron, Metrics, Profiles, Search, 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 over the bearer-scoped /v1 HTTP API (GET /jobs/:jid).
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.
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
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.
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). 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.
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.