render-background-workers — Claude Code skill: Render workers
A skill that sets up background workers on Render: wire a queue broker, catch SIGTERM, and keep in-flight jobs alive through a deploy.
npx skills add render-oss/skills --skill render-background-workers -a claude-codeWhat render-background-workers does
This skill covers worker services on Render — processes that pull jobs from a queue instead of serving HTTP. A worker gets no public URL and cannot receive private network traffic aimed at it. Outbound connections are a different story: it can reach PostgreSQL, Key Value, private services, internal web service URLs, and the public internet.
There is a framework table mapping each tool to its queue backend. Celery, Sidekiq, BullMQ and Asynq run against Key Value; Oban keeps its queue in Postgres. The skill also walks through picking between a worker, a Cron Job and a Workflow, and ships a minimal render.yaml with type: worker and REDIS_URL wired via fromService.
When Render Key Value acts as the job broker, set maxmemoryPolicy: noeviction. Policies such as allkeys-lru belong to caches — they evict queue keys and jobs disappear with them. Blueprints also require ipAllowList on Key Value, often an empty list for private-network-only access. For shutdown behavior the skill points to references/deployments.md and references/graceful-shutdown.md; networking questions go to references/private-networking.md.
What it helps with
- stand up a worker that consumes jobs from a queue
- decide between a worker, a Cron Job and a Workflow
- configure Key Value as a broker rather than a cache
- survive a deploy without losing in-flight jobs
- wire a worker to its queue in
render.yaml
Example prompts for the agent
- Set up a background worker on Render for Celery with Render Key Value as the broker
- Why does my worker drop jobs on deploy? Walk me through graceful shutdown with SIGTERM
- Should this periodic task be a worker or a Cron Job?
How to install render-background-workers
1Skills CLI (Vercel)
npx skills add render-oss/skills --skill render-background-workers -a claude-code2Manually: put the files in place
~/.claude/skills/render-background-workers/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/render-background-workers/
1Skills CLI (Vercel)
npx skills add render-oss/skills --skill render-background-workers -a codex2Manually: put the files in place
.agents/skills/render-background-workers/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add render-oss/skills --skill render-background-workers -a cursor2Manually: put the files in place
.cursor/skills/render-background-workers/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install render-oss/skills render-background-workers2Manually: put the files in place
.github/skills/render-background-workers/SKILL.md1Skills CLI (Vercel)
npx skills add render-oss/skills --skill render-background-workers -a gemini-cli2Platform CLI
gemini skills install https://github.com/render-oss/skills --path skills/render-background-workersManually: put the files in place
.devin/skills/render-background-workers/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add render-oss/skills --skill render-background-workers -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about render-background-workers
How do I install render-background-workers in Claude?
Run npx skills add render-oss/skills --skill render-background-workers -a claude-code. The skill lands at ~/.claude/skills/render-background-workers/SKILL.md.
What does render-background-workers do?
It helps you configure Render workers for queue-based job processing: broker wiring, service type selection, and clean shutdown on SIGTERM.
Which queue frameworks does it cover?
Celery, Sidekiq, BullMQ, Asynq and Oban. The first four use Key Value; Oban stores its queue in Postgres.
Source text
SKILL.md · MIT
---
name: render-background-workers
description: >-
Sets up and configures background workers on Render for queue-based job
processing. Use when the user needs to process async jobs, consume from a
queue, run Celery/Sidekiq/BullMQ/Asynq/Oban workers, handle graceful
shutdown with SIGTERM, wire a worker to Key Value, or choose between
workers and cron jobs for background work.
Trigger terms: background worker, async jobs, queue consumer, Celery,
Sidekiq, BullMQ, Asynq, Oban, job processing, SIGTERM, graceful shutdown.
license: MIT
compatibility: Render background worker services
metadata:
author: Render
version: "1.0.0"
category: compute
---
# Render Background Workers
This skill explains **worker** services on Render: processes that **consume jobs from a queue** instead of serving HTTP. Pair with **render-blueprints**, **render-env-vars**, and **render-networking** when wiring `render.yaml` and private connectivity.
## When to Use
- Designing or debugging **queue-backed workers** (Celery, Sidekiq, BullMQ, Asynq, etc.)
- Choosing between a **worker**, **Cron Job**, or **Workflow** for background work
- Configuring **Render Key Value** as a **broker** (not a cache) with correct **eviction policy**
- Implementing **graceful shutdown** so in-flight jobs are not lost on deploy
Per-framework setup and signal-handling detail: `references/queue-framework-setup.md`, `references/graceful-shutdown.md`.
Before deploying, restarting, or changing shutdown behavior, read `references/deployments.md`.
Before configuring or troubleshooting a worker's outbound private-network connection, read `references/private-networking.md`.
When choosing between a worker, cron job, and Workflow, read `references/service-types.md`.
## How Workers Work
- **Long-running services** with **no inbound (HTTP) traffic**. Render does not expose a public URL or internal hostname for workers the way it does for web or private services—**workers cannot receive private network traffic directed at them**.
- The typical pattern is a **poll loop**: the process connects to a **queue backend** (often **Render Key Value**, Redis-compatible **Valkey 8**) and **pulls jobs**.
- Workers **can initiate outbound connections** on the private network—to **PostgreSQL**, **Key Value**, **private services**, **web services** (internal URLs), and the public internet—subject to your plan and firewall rules.
## Queue Framework Overview
| Framework | Language | Queue backend | Notes |
|-----------|----------|---------------|--------|
| Celery | Python | Key Value | Most common Python task queue |
| Sidekiq | Ruby | Key Value | Standard for Rails |
| BullMQ | Node.js | Key Value | Modern Node queue |
| Asynq | Go | Key Value | Go async task processing |
| Oban | Elixir | **Postgres** (not a Key Value queue) | Queue stored in the database |
## Pairing with Key Value
- Use **Render Key Value** as the **job broker** when your framework expects Redis.
- Set **maxmemory policy** to **`noeviction`**. **`allkeys-lru`** and similar policies are for **caches**; evicting queue keys **drops jobs**.
- Wire **`REDIS_URL`** (or your framework’s equivalent) via **`fromService`** with `type: keyvalue` and `property: connectionString` in the Blueprint.
- **Blueprints require `ipAllowList`** on Key Value—include the CIDRs that should reach the instance (often `[]` for private-network-only access; see **render-blueprints** / Key Value field reference).
See `references/queue-framework-setup.md` for minimal app + YAML examples.
## Worker vs Cron vs Workflow
| Need | Use | Why |
|------|-----|-----|
| Always-on queue consumer | **Background Worker** | Polls continuously; long-lived process |
| Periodic scheduled task | **Cron Job** | Runs on a schedule, **exits**; **12h max** per run |
| Distributed parallel compute | **Workflow** | Each run gets its own instance; fan-out patterns |
| High-volume or bursty jobs | **Workflow** | Scales per run without a continuously running worker instance |
## Graceful Shutdown
- Workers should: **(1)** stop accepting new jobs, **(2)** finish the current job or **checkpoint** progress, **(3)** close connections, **(4)** exit **0**.
- Follow `references/deployments.md` for Render's current drain, signal, and shutdown-delay behavior.
Language- and framework-specific handlers: `references/graceful-shutdown.md`.
## Blueprint Configuration
Minimal pattern: **`type: worker`**, **`runtime`**, **`buildCommand`**, **`startCommand`**, and **`envVars`** wired from Key Value.
```yaml
services:
- type: keyvalue
name: jobs
plan: starter
region: oregon
maxmemoryPolicy: noeviction
ipAllowList: []
- type: worker
name: task-worker
runtime: python
region: oregon
plan: starter
buildCommand: pip install -r requirements.txt
startCommand: celery -A tasks worker --loglevel=info
envVars:
- key: REDIS_URL
fromService:
name: jobs
type: keyvalue
property: connectionString
```
Optional: **`maxShutdownDelaySeconds`** on the worker service for longer draining jobs.
## References
| Topic | File |
|--------|------|
| Celery, Sidekiq, BullMQ, Asynq, Oban setup + YAML | `references/queue-framework-setup.md` |
| SIGTERM, `maxShutdownDelaySeconds`, per-language patterns | `references/graceful-shutdown.md` |
| Deploy lifecycle, shutdown, restart, and verification | `references/deployments.md` |
| Private-network scope, internal addresses, and troubleshooting | `references/private-networking.md` |
| Service-type selection and execution models | `references/service-types.md` |
## Related Skills
- **render-deploy** — First deploy, CLI, service creation
- **render-blueprints** — Full `render.yaml` schema, `fromService`, projects
- **render-networking** — Private URLs, what can call what
- **render-scaling** — Worker plans, instance counts, limits
<!-- shared:documentation-retrieval -->
## Current documentation retrieval
Whenever this skill directs you to consult current Render documentation:
1. Retrieve the linked Markdown document directly with an available URL-fetching tool or HTTP client, such as `curl`. Do not substitute web-search summaries for the document.
2. Confirm that retrieval succeeded and returned the expected document, then read its contents. Saving a file or printing its path is not sufficient.
3. If the request fails or your tool cannot read the Markdown response, open and read the linked HTML version instead.
4. If neither version can be retrieved, disclose that the current reference is unavailable and follow any topic-specific fallback in the skill. Use bundled guidance only for stable constraints, and do not guess at changeable platform details.
When a task requires multiple references, apply this workflow to each one and distinguish the documents you verified from those that remain unavailable.
<!-- /shared:documentation-retrieval -->
© Render · MIT · render-oss/skills