Requirements
The server, database, domain and provider accounts Reception AI needs, why serverless hosting will not work, and a sizing starting point.
4 min readUpdated Oct 17, 2026Applies to Reception AI 1.0.0
On this page
At a glance
| You need | Required for | Notes |
|---|---|---|
| Node.js 22 | Everything | Use a current 22.x release. The Docker image is built on node:22-slim. |
| A long-running process | Everything | A VPS, a container host or a platform that keeps one process alive. Not serverless functions. |
| Postgres | Production | Any Postgres you can reach over TCP. Without one, an in-memory database is used and wiped on restart. |
| A domain with HTTPS | Production | Sign-in cookies require HTTPS on any host other than localhost, and carriers need public HTTPS and secure WebSocket URLs. |
| OpenAI API key | Live voice | Live phone calls and the homepage voice demo. |
| xAI API key | Chat and AI features | Workspace chat, the website widget, voice previews, rehearsals, the AI builder and Twilio outbound calls. |
| Twilio or Plivo account | Real phone calls | Twilio answers and places calls; Plivo answers only. See Phone numbers and carriers. |
| Stripe account | Optional | Self-serve paid plans. |
| SMTP server | Optional | Only used to email the first admin's confirmation link. |
| Google, Microsoft or Salesforce app registrations | Optional | Google sign-in and the OAuth connectors. |
Why it needs an always-on process
A live phone call is a relay: Reception AI holds one WebSocket open to the carrier and another to OpenAI for the whole length of the call, copying audio between them. Serverless functions are cut off after a short time and cannot hold those connections, so calls would drop.
Two more things live inside the process:
- The job queue. Campaign dialling, call reconciliation and similar work is queued in Postgres and drained by a scheduled task every minute inside the running server.
- Short-lived caches. Settings and plans are cached for about a minute per process.
Container platforms (Docker on a VPS, Railway, Fly.io, Render, a Kubernetes deployment with one replica) and a plain VM with systemd all work.
Warning
Turn off any "scale to zero" or auto-stop feature on your host. A cold start on a voice platform is silence on a live call.
Database
- Postgres 12 or newer. The schema uses stored generated columns, which arrived in Postgres 12. No extensions are needed: knowledge search uses Postgres' built-in full-text search.
- Any provider. Self-hosted, Neon, Supabase, Railway, RDS and similar all work. The app connects with the standard
pgdriver over TCP. - Migrations are a deploy step. The app never migrates a real database on its own. You run
npm run db:migratewhen you install and on every update; see Installation.
For a first look you can skip Postgres entirely. Without DATABASE_URL the app starts an embedded Postgres (PGLite) in memory. Everything works, and everything is wiped when the process restarts.
Domain and HTTPS
Reception AI does not terminate TLS or redirect HTTP to HTTPS itself. Put it behind something that does: Caddy, nginx with Let's Encrypt, a load balancer, or your platform's built-in HTTPS.
HTTPS is not optional in production, for three reasons:
- Session cookies are named
__Host-…and markedSecure. Browsers only accept them over HTTPS (with an exception forhttp://localhost), so sign-in will not stick on plain HTTP. - Carriers deliver webhooks to
https://<your-domain>/api/voice/…. - Live audio streams to
wss://<your-domain>/api/voice/stream, so your proxy must also pass WebSocket upgrades.
Provider accounts
| Provider | What it powers | Required? |
|---|---|---|
| OpenAI | Live phone calls and the homepage voice demo (Realtime API), OpenAI-voice speech | Yes, for any live voice |
| xAI | Workspace and widget chat, transcription, the Reception AI voices, rehearsals, the AI builder, Twilio outbound and the turn-based phone path | Yes, for chat and most AI features |
| Twilio | Inbound and outbound calls, SMS | For real calls |
| Plivo | Inbound calls | Alternative for inbound |
| Stripe | Plan checkout and the customer portal | Only for self-serve billing |
Note
In version 1.0.0 the xAI key is required for chat even if you connect another chat provider. See AI models and providers for the details.
Server size
These numbers are a starting point, not a measured benchmark. The relay copies audio without transcoding, so a call costs network and memory far more than CPU.
| Workload | Suggested starting size |
|---|---|
| Evaluation, a single business | 1 vCPU, 1 to 2 GB RAM |
| A small SaaS with a handful of concurrent calls | 2 vCPU, 2 to 4 GB RAM |
| Growing beyond that | Watch memory and open connections, and scale up before scaling out |
Two placement tips from the project's own deployment notes:
- Run the app close to its database. Distant Postgres adds latency to every turn of a live call.
- Run it close to OpenAI. The relay sits on the long leg of the audio path, so a US East region is a good default even if your callers are elsewhere.
Start with one instance. A call's two sockets live inside one process, and the bundled Railway configuration runs a single replica for that reason.
Local development
For a laptop install you only need Node.js 22 and npm. Postgres, keys and a domain can all come later. Quick start walks through it.