Reference
Production Checklist
Prepare Rivet Actors for production by reviewing authentication, persistence, scaling, observability, deployment, and recovery.
We recommend passing this page to your coding agent to verify your configuration before deploying.
Deploy-time configuration (environment variables, runtime mode, platform timeouts, concurrency, graceful shutdown) lives in the worker production checklist. This page covers application design: what to get right before writing the actor, not before shipping it.
Actors
Design Patterns
- Do not use god actors. Avoid putting all logic into a single actor type. See Design Patterns.
- Do not use actor-per-request patterns. Avoid creating a new actor for each request. See Design Patterns.
Lifecycle
- Do not rely on
onSleepfor critical cleanup.onSleepis not called during crashes or forced terminations. See Lifecycle.
State
- Verify
c.statedoes not grow unbounded. Avoid using arrays or objects that grow over time in state. Use SQLite for unbounded or append-heavy data instead. - Verify actor data does not exceed 10 GB. Contact enterprise support if you need more storage.
- Use input parameters and
createStatefor actor initialization. See Input Parameters.
Events
- Use
conn.send()instead ofc.broadcast()for private events.c.broadcast()sends to all connected clients. Useconn.send()to send events to a specific connection. See Realtime.
Actions
- Review action timeout configuration. The default
actionTimeoutis 60 seconds. Increase it if you have long-running actions like API calls or file processing. See Actor Configuration. - Review message size limits. The default
maxIncomingMessageSizeis 64 KiB andmaxOutgoingMessageSizeis 1 MiB. Increase if your actors send or receive large JSON payloads. See Registry Configuration.
Queues
- Review queue limits. The default
maxQueueSizeis 1,000 messages andmaxQueueMessageSizeis 64 KiB. Increase if you expect burst traffic or large queue payloads. See Actor Configuration. - Ensure queue handlers are idempotent. If processing fails before
message.complete(), the message will be retried. See Queues.
Workflows
- Verify workflows do not generate infinite steps. Use
ctx.loopto avoid creating unbounded step histories. See Workflows.
Security
Authentication
- Validate connections in
createConnStateoronBeforeConnect. Do not trust client input without validation. See Authentication.
CORS
- Configure CORS for production. Restrict allowed origins instead of allowing all. See CORS.
Tokens (Rivet Cloud)
- Use
pk_*tokens forRIVET_PUBLIC_ENDPOINT. Public tokens are safe to expose to clients. - Use
sk_*tokens forRIVET_ENDPOINT. Secret tokens should only be used server-side. - Do not leak your secret token. Never expose
sk_*tokens in client-side code, public repositories, or browser environments. See Endpoints. - Verify you’re connecting to the correct region. Use the nearest datacenter endpoint (e.g.
api-us-west-1.rivet.dev) for lowest latency.
Access Control
Access control is only needed if you want granular permissions for different clients. For most use cases, basic authentication in onBeforeConnect or createConnState is sufficient.
- Use deny-by-default rules. Reject unknown roles in
onBeforeConnect, action handlers,canPublish, andcanSubscribe. See Access Control. - Authorize actions explicitly. Check the caller’s role in each action handler and throw
forbiddenfor unauthorized access. - Gate event subscriptions and queue publishes. Use
canSubscribeandcanPublishhooks to restrict which clients can subscribe to events or publish to queues.
Clients
- Dispose connections and/or client when not in use (JavaScript client). Call
conn.dispose()orclient.dispose()when no longer needed to free resources. React and SwiftUI clients handle this automatically. See Connection Lifecycle.