Deployment overview
Where a pipedog voice agent can run in production, and which transport each host allows.
A voice agent is a long-lived session: it holds a pipeline, a conversation and a connection for the whole call. That shapes where it can run. The transport decides most of it:
- SmallWebRTC sends media over UDP. It needs a long-lived server process with UDP reachable: Bun, Node or Deno on a VM, a container or a bare-metal host.
- WebSocket sends audio frames over TCP. It runs on the same servers, and also on Cloudflare Workers and Durable Objects, and on Vercel's Bun runtime.
- Cloudflare Realtime lets users connect over WebRTC to Cloudflare's SFU, which streams their audio to the bot as PCM over WebSockets. The bot can then run in a Worker or Durable Object (see Cloudflare Realtime).
| Host | Runtime | SmallWebRTC | WebSocket | Page |
|---|---|---|---|---|
| VM, container, bare metal | Bun, Node, Deno | Yes | Yes | Servers, Bundling |
| Cloudflare Workers + Durable Objects | workerd | No (no UDP); WebRTC users through Cloudflare Realtime | Yes | Cloudflare Workers |
| Vercel Functions | Bun runtime | No (no UDP) | Yes | Vercel |
| Serverless functions without WebSockets | any | No | No | Signalling only |
On a server, @pipedog/runner gives you Pipecat's runner routes (the prebuilt
client, WebRTC signalling, telephony webhooks and WebSockets) as one fetch handler:
createRunnerApp() builds it and serve() listens on Bun, Node or Deno. See
Servers.
Pipecat's own deployment guides (Fly.io, Cerebrium, Modal, Pipecat Cloud) assume a Python process per session. The same patterns apply to a pipedog server: one process (or one Durable Object) per session, and a cap on concurrent sessions.
Before you deploy
- Authenticate the endpoints. pipedog's endpoints don't authenticate. Put a check in front of them, as in Frameworks: Authentication.
- Provider keys stay on the server. Services read their keys from options you pass; read them from the environment or the host's secret store, never from the client.
- Turn detection and size. Local Silero VAD and Smart Turn load ONNX models (about 100 MB of runtime and models). On Workers, use provider-side turn detection instead. See Turn detection.
- Tracing. Set
OTEL_EXPORTER_OTLP_ENDPOINTto export spans. See Metrics & tracing. - Runtimes. The compatibility table lists where each package is verified.
Servers
Bun, Node or Deno, with SmallWebRTC and WebSocket.
Cloudflare Workers
One Durable Object per session, over WebSocket.
Fully on Cloudflare
Flux, a Workers AI LLM and Aura, with the agent in a Durable Object.
Vercel
WebSocket sessions on Vercel Functions with the Bun runtime.
pipedog is an unofficial community TypeScript port of Pipecat. It is not affiliated with or endorsed by Daily or the Pipecat project.
Portions adapted from the Pipecat documentation, Copyright (c) 2024–2025 Daily, BSD-2-Clause (see apps/docs/LICENSE-pipecat-docs).