Rivet Actors are the primitive for stateful workloads. Built for AI agents, collaborative apps, and durable execution.
See the code
Rivet Actors are durable processes for agents, workflows, and sandboxes.
12 ms cold starts, 72 KB per Actor, billions on one control plane.
Open source and self-hostable.
Quickstart • Documentation • Changelog • Discord • X
Use with Your Coding AgentGive your coding agent the Rivet skills to create examples or integrate into existing projects:
Works with Claude Code, Cursor, Windsurf, and other AI coding tools. |
Start From Scratch |
Rivet is an orchestrator for agentic workloads. Where Kubernetes schedules pods, Rivet schedules Actors: long-lived processes with durable state, a SQLite database, a queue, realtime connections, and scheduling, each addressed by key.
Create one Actor per agent, per session, per user, or per tenant. Run it on plain Node.js, Bun, or Rust. Open source and self-hostable.
Backend
import { actor } from "rivetkit";
import { db } from "rivetkit/db";
const agent = actor({
// Per-Actor SQLite database, persisted across restarts and hibernation
db: db({
onMigrate: async (db) => {
// Apply the SQLite schema
await db.execute(`CREATE TABLE IF NOT EXISTS messages (role TEXT, content TEXT)`);
},
}),
actions: {
chat: async (c, text: string) => {
// Durably save the message
await c.db.execute("INSERT INTO messages VALUES (?, ?)", "user", text);
const messages = await c.db.execute("SELECT role, content FROM messages");
const response = streamText({ model: openai("gpt-5"), messages });
// Stream tokens to every connected client for multiplayer
for await (const delta of response.textStream) {
c.broadcast("token", delta);
}
// Durably save the response
await c.db.execute("INSERT INTO messages VALUES (?, ?)", "assistant", await response.text);
},
},
});
Client (frontend or backend)
// Connect to an Actor
const agent = client.agent.getOrCreate("agent-123").connect();
// Listen for realtime events
agent.on("token", delta => process.stdout.write(delta));
// Call an action on the Actor
await agent.chat("how many r's in strawberry?");
Every product Rivet ships is an Actor, scheduled by the same control plane.
| Rivet Actor | Kubernetes pod | |
|---|---|---|
| Cold start | 12.3 ms | ~6 s |
| Memory per instance | 72.4 KB | ~200 MB |
| Memory while idle | 0 MB (hibernates) | Always resident |
| Scale | Billions of Actors on one control plane | ~5k nodes per cluster |
Routing, scheduling, types, and telemetry, built in.
Local & Self-HostInstall Actors and run it locally while you build. When you ship, run the same open-source control plane as a Rust binary or container on your own infrastructure.
|
Rivet CloudDeploy Actors on Rivet Cloud with managed infrastructure and persisted Actor data. Or bring your own worker and run Actors on your compute while Rivet Cloud provides the control plane and routing layer. |
BYOCRun the control plane inside your own VPC, fully managed by Rivet. Your data never leaves your cloud and there is no inbound management connection. |
Run your agent infrastructure where your data already lives. The control plane is a single Rust binary: one process to install, monitor, and upgrade, on Kubernetes with the Enterprise Helm chart or as a systemd unit. Use Postgres or FoundationDB for persistence and tiered storage to S3. Local dev matches production: the same binary, APIs, and control-plane behavior from laptop to production.
Open source, permissively licensed: Apache 2.0 means you own your infrastructure. The managed service runs the same control plane you can run yourself. Talk to an engineer →
Typed SDKs for your backend and React hooks for your frontend. Rivet runs on native Node.js and Bun with no custom runtime, so your existing packages, tooling, and tests work unchanged.
Deploy workers on: Vercel • Railway • AWS ECS • AWS Lambda • GCP Cloud Run • Cloudflare • Kubernetes • Docker
Frameworks: React • Next.js • Hono • Elysia • tRPC • Effect
Runtimes: Node.js • Bun • Rust
Tools: Vitest • OpenTelemetry • Pino • AI SDK • OpenAPI • AsyncAPI
Yes. Rivet deploys into your own cloud account, including air-gapped environments: the control plane and storage run inside your VPC while Rivet operates them. See the BYOC docs.
Yes. Rivet Cloud is fully managed. It can run your Actors for you on Rivet Compute, with preview deployments and auto-scaling in edge regions, or you can bring your own worker and run Actors on your compute while Rivet Cloud provides the control plane and routing layer.
Yes. Rivet is fully self-hostable; see the self-hosting docs. For enterprise support with a self-hosted deployment, contact us.
Yes. Rivet is open source under the permissive Apache 2.0 license. You're looking at it.
Rivet is an orchestrator for stateful Actors. Think of an Actor like a pod, but much smaller, more lightweight, and faster to start. Each Actor also comes with SQLite for structured persistence, instead of or in addition to a filesystem, which gives it more flexibility than a Kubernetes pod.
Rivet is often used as an open-source alternative to Cloudflare Durable Objects that is easy to self-host and scales. It also fixes many of the constraints of Durable Objects: no 128 MB memory cap, no 10 GB SQLite limit, Actors are not randomly evicted, and you control the runtime because Actors run on vanilla Node.js or Bun instead of a custom runtime. Rivet also adds built-in connection handling, event broadcasting, durable scheduling and cron, full Vitest support, lifecycle hooks for draining, and control over Actor upgrades. See the Cloudflare Durable Objects comparison.
No. Rivet runs on native Node.js and Bun, so your existing packages, tooling, and tests work unchanged.
Yes. Rivet supports Bun in addition to Node.js.
Yes. Rivet Actors work with Effect; see the Effect agent example.
Rivet implements the virtual actor pattern, which is closest to Orleans, but focuses on what modern workloads need: SQLite persistence instead of simple JSON stores, multi-region routing, and support for modern runtimes. Erlang and Akka do not provide virtual actors out of the box, though ecosystem packages exist that offer functionality comparable to Rivet Actors.
No. Rivet only needs a standard process that connects to the control plane over WebSocket. That process can be Node.js, Bun, Rust, or anything else.
| Project | Description |
|---|---|
| RivetKit TypeScript | Client & server library for building Actors |
| RivetKit Rust | Rust SDK |
| RivetKit Python | Python client (experimental) |
| RivetKit Swift | Swift client (experimental) |
| Control Plane | Rust control plane that schedules, routes, and persists Actors |
| ↳ Pegboard | Actor scheduling & networking |
| ↳ Gasoline | Durable execution engine |
| ↳ Guard | Traffic routing proxy |
| ↳ Epoxy | Multi-region KV store (EPaxos) |
| Dashboard | Inspector for debugging Actors |
| Documentation | Source for rivet.dev/actors/docs |
| Examples | Runnable examples |
(top 24 of 29)
3,743 followers · starred Mar 2026
2,201 followers · starred Dec 2024
678 followers · starred Aug 2023
959 followers · starred Oct 2025
Rivet Actors are the primitive for stateful workloads. Built for AI agents, collaborative apps, and durable execution.
See the code
Rivet Actors are durable processes for agents, workflows, and sandboxes.
12 ms cold starts, 72 KB per Actor, billions on one control plane.
Open source and self-hostable.
Quickstart • Documentation • Changelog • Discord • X
Use with Your Coding AgentGive your coding agent the Rivet skills to create examples or integrate into existing projects:
Works with Claude Code, Cursor, Windsurf, and other AI coding tools. |
Start From Scratch |
Rivet is an orchestrator for agentic workloads. Where Kubernetes schedules pods, Rivet schedules Actors: long-lived processes with durable state, a SQLite database, a queue, realtime connections, and scheduling, each addressed by key.
Create one Actor per agent, per session, per user, or per tenant. Run it on plain Node.js, Bun, or Rust. Open source and self-hostable.
Backend
import { actor } from "rivetkit";
import { db } from "rivetkit/db";
const agent = actor({
// Per-Actor SQLite database, persisted across restarts and hibernation
db: db({
onMigrate: async (db) => {
// Apply the SQLite schema
await db.execute(`CREATE TABLE IF NOT EXISTS messages (role TEXT, content TEXT)`);
},
}),
actions: {
chat: async (c, text: string) => {
// Durably save the message
await c.db.execute("INSERT INTO messages VALUES (?, ?)", "user", text);
const messages = await c.db.execute("SELECT role, content FROM messages");
const response = streamText({ model: openai("gpt-5"), messages });
// Stream tokens to every connected client for multiplayer
for await (const delta of response.textStream) {
c.broadcast("token", delta);
}
// Durably save the response
await c.db.execute("INSERT INTO messages VALUES (?, ?)", "assistant", await response.text);
},
},
});
Client (frontend or backend)
// Connect to an Actor
const agent = client.agent.getOrCreate("agent-123").connect();
// Listen for realtime events
agent.on("token", delta => process.stdout.write(delta));
// Call an action on the Actor
await agent.chat("how many r's in strawberry?");
Every product Rivet ships is an Actor, scheduled by the same control plane.
| Rivet Actor | Kubernetes pod | |
|---|---|---|
| Cold start | 12.3 ms | ~6 s |
| Memory per instance | 72.4 KB | ~200 MB |
| Memory while idle | 0 MB (hibernates) | Always resident |
| Scale | Billions of Actors on one control plane | ~5k nodes per cluster |
Routing, scheduling, types, and telemetry, built in.
Local & Self-HostInstall Actors and run it locally while you build. When you ship, run the same open-source control plane as a Rust binary or container on your own infrastructure.
|
Rivet CloudDeploy Actors on Rivet Cloud with managed infrastructure and persisted Actor data. Or bring your own worker and run Actors on your compute while Rivet Cloud provides the control plane and routing layer. |
BYOCRun the control plane inside your own VPC, fully managed by Rivet. Your data never leaves your cloud and there is no inbound management connection. |
Run your agent infrastructure where your data already lives. The control plane is a single Rust binary: one process to install, monitor, and upgrade, on Kubernetes with the Enterprise Helm chart or as a systemd unit. Use Postgres or FoundationDB for persistence and tiered storage to S3. Local dev matches production: the same binary, APIs, and control-plane behavior from laptop to production.
Open source, permissively licensed: Apache 2.0 means you own your infrastructure. The managed service runs the same control plane you can run yourself. Talk to an engineer →
Typed SDKs for your backend and React hooks for your frontend. Rivet runs on native Node.js and Bun with no custom runtime, so your existing packages, tooling, and tests work unchanged.
Deploy workers on: Vercel • Railway • AWS ECS • AWS Lambda • GCP Cloud Run • Cloudflare • Kubernetes • Docker
Frameworks: React • Next.js • Hono • Elysia • tRPC • Effect
Runtimes: Node.js • Bun • Rust
Tools: Vitest • OpenTelemetry • Pino • AI SDK • OpenAPI • AsyncAPI
Yes. Rivet deploys into your own cloud account, including air-gapped environments: the control plane and storage run inside your VPC while Rivet operates them. See the BYOC docs.
Yes. Rivet Cloud is fully managed. It can run your Actors for you on Rivet Compute, with preview deployments and auto-scaling in edge regions, or you can bring your own worker and run Actors on your compute while Rivet Cloud provides the control plane and routing layer.
Yes. Rivet is fully self-hostable; see the self-hosting docs. For enterprise support with a self-hosted deployment, contact us.
Yes. Rivet is open source under the permissive Apache 2.0 license. You're looking at it.
Rivet is an orchestrator for stateful Actors. Think of an Actor like a pod, but much smaller, more lightweight, and faster to start. Each Actor also comes with SQLite for structured persistence, instead of or in addition to a filesystem, which gives it more flexibility than a Kubernetes pod.
Rivet is often used as an open-source alternative to Cloudflare Durable Objects that is easy to self-host and scales. It also fixes many of the constraints of Durable Objects: no 128 MB memory cap, no 10 GB SQLite limit, Actors are not randomly evicted, and you control the runtime because Actors run on vanilla Node.js or Bun instead of a custom runtime. Rivet also adds built-in connection handling, event broadcasting, durable scheduling and cron, full Vitest support, lifecycle hooks for draining, and control over Actor upgrades. See the Cloudflare Durable Objects comparison.
No. Rivet runs on native Node.js and Bun, so your existing packages, tooling, and tests work unchanged.
Yes. Rivet supports Bun in addition to Node.js.
Yes. Rivet Actors work with Effect; see the Effect agent example.
Rivet implements the virtual actor pattern, which is closest to Orleans, but focuses on what modern workloads need: SQLite persistence instead of simple JSON stores, multi-region routing, and support for modern runtimes. Erlang and Akka do not provide virtual actors out of the box, though ecosystem packages exist that offer functionality comparable to Rivet Actors.
No. Rivet only needs a standard process that connects to the control plane over WebSocket. That process can be Node.js, Bun, Rust, or anything else.
| Project | Description |
|---|---|
| RivetKit TypeScript | Client & server library for building Actors |
| RivetKit Rust | Rust SDK |
| RivetKit Python | Python client (experimental) |
| RivetKit Swift | Swift client (experimental) |
| Control Plane | Rust control plane that schedules, routes, and persists Actors |
| ↳ Pegboard | Actor scheduling & networking |
| ↳ Gasoline | Durable execution engine |
| ↳ Guard | Traffic routing proxy |
| ↳ Epoxy | Multi-region KV store (EPaxos) |
| Dashboard | Inspector for debugging Actors |
| Documentation | Source for rivet.dev/actors/docs |
| Examples | Runnable examples |
(top 24 of 29)
3,743 followers · starred Mar 2026
2,201 followers · starred Dec 2024
678 followers · starred Aug 2023
959 followers · starred Oct 2025