cron-jobs
Langlebige Cron-Jobs mit Rivet Actors: schedule.after- und schedule.at-Timer überleben Neustarts und Abstürze, plus erneutes Aktivieren wiederkehrender Jobs und idempotente Handler.
npx skills add https://github.com/rivet-dev/skills --skill cron-jobsCron Jobs and Scheduled Tasks
IMPORTANT: Before doing anything, you MUST read BASE_SKILL.md in this skill's directory. It contains essential guidance on debugging, error handling, state management, deployment, and project setup. Those rules and patterns apply to all RivetKit work. Everything below assumes you have already read and understood it.
Working Examples
If you need a reference implementation, read the raw working example code in these templates:
Rivet Actor schedules are durable actor-local timers. They survive actor sleep, restarts, upgrades, deploys, and crashes without a separate cron service.
Choose a schedule type
| API | Use it for |
|---|---|
c.schedule.after(delayMs, action, ...args) | One-time work after a relative delay. |
c.schedule.at(timestamp, action, ...args) | One-time work at an exact Unix timestamp in milliseconds. |
c.cron.set({ ... }) | Named calendar recurrence in an IANA timezone. |
c.cron.every({ ... }) | Named fixed intervals of at least 5 seconds. |
All callbacks are ordinary actions on the same actor. Keep the action name fixed in your code rather than accepting an arbitrary action name from a client.
See Schedule & Cron for the full API, history, cancellation, failure behavior, and limits.
Calendar job
Use cron.set instead of manually re-arming a one-shot action:
Install fixed background jobs in onCreate so setup runs once per actor. The job name remains an upsert key, so a later cron.set call updates the existing job rather than creating a duplicate. cron.set also handles timezone and daylight-saving transitions.
Fixed-interval job
Use cron.every for frequent work such as presence sweeps or cache refreshes:
await c.cron.every({
name: "presence-sweep",
interval: 15_000, // Minimum 5 seconds.
action: "sweepPresence",
maxHistory: 25,
});
Intervals remain anchored to scheduled deadlines rather than drifting by the action's runtime. If a previous run is still active, the overlapping occurrence is skipped.
Cancellation and updates
Keep the ID returned by a one-shot schedule when it may need cancellation:
const id = await c.schedule.after(60_000, "expireSession", sessionId);
await c.schedule.cancel(id);
Recurring jobs are managed by name:
await c.cron.delete("presence-sweep");
Calling cron.set or cron.every again with the same name replaces its configuration.
Failure and idempotency
Keep scheduled actions idempotent when duplicate work would be harmful. See Execution behavior for retry behavior and workflow guidance.
Topology
Use a singleton actor key for one global job, such as jobs["daily-report"]. Use an actor per user or resource for isolated reminders, trials, billing periods, or other per-entity schedules.
Reference Map
Actors
- Access Control
- Actions
- Actor Keys
- Actor Runtime Socket
- Actor Statuses
- Authentication
- Cloudflare Workers Quickstart
- Communicating Between Actors
- Connections
- Custom Inspector Tabs
- Debugging
- Design Patterns
- Destroying Actors
- Effect.ts Quickstart (Beta)
- Errors
- Fetch and WebSocket Handler
- Helper Types
- Icons & Names
- In-Memory State
- Input Parameters
- Lifecycle
- Limits
- Low-Level HTTP Request Handler
- Low-Level KV Storage
- Low-Level WebSocket Handler
- Metadata
- Next.js Quickstart
- Node.js & Bun Quickstart
- Queues & Run Loops
- React Quickstart
- Realtime
- Rust Quickstart (Beta)
- Scaling & Concurrency
- Schedule & Cron
- Sharing and Joining State
- SQLite
- SQLite + Drizzle
- Supabase Functions Quickstart
- Testing
- Troubleshooting
- Types
- Vanilla HTTP API
- Versions & Upgrades
- Workflows
Cli
Clients
Cookbook
- AI Agent
- Chat Room
- Collaborative Text Editor
- Cron Jobs and Scheduled Tasks
- Database per Tenant
- Deploying Rivet in a VPC or Air-Gapped Network
- Live Cursors and Presence
- Multiplayer Game
Deploy
- Container Runner
- Deploy To Amazon Web Services Lambda
- Deploying to AWS ECS
- Deploying to Cloudflare Workers
- Deploying to Freestyle
- Deploying to Google Cloud Run
- Deploying to Hetzner
- Deploying to Kubernetes
- Deploying to Railway
- Deploying to Rivet Compute
- Deploying to Supabase Functions
- Deploying to Vercel
- Deploying to VMs & Bare Metal
General
- Actor Configuration
- Architecture
- Cross-Origin Resource Sharing
- Documentation for LLMs & AI
- Edge Networking
- Endpoints
- Environment Variables
- HTTP Server
- Logging
- Pool Configuration
- Production Checklist
- Registry Configuration
- Runtime Modes
- WASM vs Native SDK