Feature matrix
What each feature is, which edition it needs and where it is available. Core runs without a key; Pro needs a JoobQ Pro key (see Licensing). In the language columns, ✓ means the SDK (or the Crystal library) has it and it is tested against a real server in that language; ○ means it is there but not tested in that language yet; – means not available; n/a means the test does not apply to Crystal, which uses the JoobQ libraries directly.
| Feature | Edition | Status | Crystal | Python | TypeScript | Ruby | Go | Rust | Java | PHP | .NET | Page |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Enqueue a job (one at a time) | Core | shipped | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Batch enqueue (enqueue_many, POST /sdk/jobs/batch, up to 500 jobs) | Core | shipped | – | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | page |
| Enqueue without waiting (enqueue_async) | Core | shipped | – | ○ | ○ | ○ | ○ | ○ | ○ | – | ○ | page |
| Retries with backoff and the dead letter queue | Core | shipped | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Non-retryable errors (straight to the dead letter queue) | Core | shipped | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Delayed jobs (delay_ms) | Core | shipped | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Run at an absolute time (run_at_ms) | Core | shipped | – | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Per-job expires_ms and timeout_ms | Core | shipped | n/a | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Request context and the application container (ctx.app, ctx.context) | Core | shipped | – | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Unique jobs, while_locked (unique_key + unique_ttl_ms) | Core | shipped | n/a | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Unique jobs, until_executed (unique_mode) | Pro | shipped | n/a | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Unique jobs, until_executing (unique_mode) | Pro | shipped | – | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | page |
| Sealed job fields (encrypt_fields, encrypted_property) | Core | shipped | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Queue throttling (claim-time rate per queue) | Core | shipped | server | server | server | server | server | server | server | server | server | page |
| Rate limiting (rate_limit(key, limit, period_ms)) | Pro | shipped | n/a | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Batches with completion callbacks (JoobQPro::Batch) | Pro | shipped | ○ | – | – | – | – | – | – | – | – | page |
| Batches with completion callbacks from the SDKs | Pro | coming | – | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | page |
| Dead letters (browse, re-drive, purge, export) | Core | shipped | console | console | console | console | console | console | console | console | console | page |
| Worker middleware (worker.use(mw)) | Core | shipped | n/a | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Long-poll delivery, leases, ack batching and graceful shutdown | Core | shipped | n/a | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Pause, resume, clear and concurrency of a queue | Core | shipped | console | console | console | console | console | console | console | console | console | page |
| Job schedules registered from code (register_schedule, cron or every) | Core | shipped | n/a | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Job schedules in the console (pause, resume, run now) | Core | shipped | console | console | console | console | console | console | console | console | console | page |
| Workflow schedules | Pro | shipped | console | console | console | console | console | console | console | console | console | page |
| Alert rules and notification channels | Pro | shipped | console | console | console | console | console | console | console | console | console | page |
| Durable workflows conducted by the engine (steps, blueprints) | Pro | shipped | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Parallel, sequence and after: | Pro | shipped | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Step retries, timeout_ms, heartbeat_ms, schedule_to_start_ms, non_retryable | Pro | shipped | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Workflow timeout (blueprint timeout_ms) | Pro | shipped | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Sagas and compensation | Pro | shipped | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Signals, signal timeouts and durable timers | Pro | shipped | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Queries | Pro | shipped | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Workflow client reads (describe, result, history, query, search attributes) | Pro | shipped | n/a | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Search attributes (register, set, search) | Pro | shipped | console | console | console | console | console | console | console | console | console | page |
| Cancel, terminate, re-drive, retry a step, bulk actions | Pro | shipped | console | console | console | console | console | console | console | console | console | page |
| Event history, retention and the history archive | Pro | shipped | console | console | console | console | console | console | console | console | console | page |
| Worker build ids (promote, retire, re-pin; admin) | Pro | shipped | ○ | – | – | – | – | – | – | – | – | page |
| Continue-as-new, updates, cancellation scopes, replay and migrate (Crystal workflows, console and API) | Pro | shipped | ○ | – | – | – | – | – | – | – | – | page |
| Conditional steps (only_if) | Pro | shipped | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Child workflows | Pro | shipped | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Continue-as-new | Pro | shipped | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Compensation on waits, timers and children | Pro | shipped | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Cancellation scopes (scope, non_cancellable) | Pro | shipped | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Update handlers and update_workflow | Pro | shipped | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Change gates (versioning) | Pro | shipped | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | page |
| Roles, API tokens and the SDK token | Core | shipped | console | console | console | console | console | console | console | console | console | page |
| Two-factor authentication and OpenID Connect single sign-on | Core | shipped | console | console | console | console | console | console | console | console | console | page |
| Audit log | Core | shipped | console | console | console | console | console | console | console | console | console | page |
| Retention of audit events, dead letters and finished workflows | Core | shipped | server | server | server | server | server | server | server | server | server | page |
| Prometheus metrics (/metrics) | Core | shipped | server | server | server | server | server | server | server | server | server | page |
| Several instances and leader leases | Core | shipped | server | server | server | server | server | server | server | server | server | page |
| Command-line tasks of the self-hosted binary | Core | shipped | server | server | server | server | server | server | server | server | server | page |
| Deployment licence (402 paid_license_required) and the Pro key | Core | shipped | server | server | server | server | server | server | server | server | server | page |
"console" means the feature is used through the JoobQUI console and its API, "server" that it is configured on the server, whatever language the workers are written in.