Demo deploy (Render)
Bring up an instance to try out, with no card and no domain of your own.
Free path for trying OpenCall out. Not the path for a real community β see Real limits at the end.
| Piece | Service | Cost |
|---|---|---|
| Next.js hosting | Render, Free instance | US$ 0 |
| Postgres | Neon, Free plan | US$ 0 |
| LiveKit | LiveKit Cloud, Build plan | US$ 0 |
| Domain | none | *.onrender.com and *.livekit.cloud come with TLS |
| Attachment storage (optional) | Neon Object Storage | US$ 0 β can be skipped, see step 5 |
Read the limits before investing time
The ceiling that bites first is LiveKit Cloud Build: 5 simultaneous WebRTC connections across the whole project. Six people in a call will not fit.
Terminal commands
Some steps here are typed into a terminal and need Node.js installed. If you have never opened one, see "Before you start" in Requirements.
1. App: Render
Render is where the app itself runs, and it comes first on purpose. It is what
generates the https://YOUR-SERVICE.onrender.com address that three variables
depend on, and it is where every other variable gets pasted. Creating the
service now means you fill each variable in the moment it appears, instead of
hoarding everything in a notepad until the end.
You need a fork of the OpenCall repo in your account first β see GitHub repository.
2. Discord
Discord is how people log in β OpenCall has no email/password sign-up.
Follow Set up Discord. Since the service from step 1 already has an address, you can register the final Redirect URI on the first try:
https://YOUR-SERVICE.onrender.com/api/auth/callback/discordNEXTAUTH_SECRET comes from Generate the session
secret β one command, no account to create.
Paste into Render: DISCORD_CLIENT_ID, DISCORD_CLIENT_SECRET,
NEXTAUTH_SECRET.
3. Voice: LiveKit Cloud
LiveKit is the server that actually carries the audio and video.
Follow LiveKit: Cloud on the Build plan (no card).
There is no command that creates a LiveKit Cloud project β this step happens in the browser, even when an AI is doing the rest.
Paste into Render: LIVEKIT_URL, LIVEKIT_API_KEY, LIVEKIT_API_SECRET.
4. Database: Neon
Neon is where the app stores users, messages and settings.
Follow the Option B: Neon (free) section of Database.
Free plan, no card, and the whole project can be created from the command line
with neonctl.
Use the pooled connection string β its host carries the -pooler suffix.
Paste into Render: DATABASE_URL.
5. Attachment storage (optional)
You can bring the demo up without it: voice, video, screen sharing and text chat all work. The only thing missing is attaching images in chat β the attachment button does not appear.
To have it, follow Neon Object Storage β the same account and the same API key from step 4, so there is no new provider and no card.
Cloudflare R2 also works and is what the production path uses, but it asks for a payment method to enable, even inside the free tier β which is the friction this page exists to avoid.
Images share the database's transfer allowance
Neon's 5 GB/month of network transfer covers the whole project, images and database alike, and running out suspends the compute until the next cycle. For a demo it is plenty.
Paste into Render: R2_BUCKET, R2_ACCESS_KEY_ID,
R2_SECRET_ACCESS_KEY, NEXT_PUBLIC_R2_PUBLIC_BASE_URL, R2_ENDPOINT,
R2_REGION.
6. Create the tables
The database exists but is still empty. This command creates the tables the app expects.
Render's Free instance has no terminal access, so run it from your own machine, in the folder where you cloned the OpenCall repo.
DATABASE_URL="PASTE_THE_POOLED_STRING" pnpm prisma db pushWhen it finishes it prints something like Your database is now in sync with your Prisma schema. Then follow the Final
check.
Real limits
| Limit | Value | Consequence |
|---|---|---|
| Simultaneous WebRTC connections (LiveKit Build) | 5 | ceiling on call participants, across all channels |
| WebRTC minutes/month (LiveKit Build) | 5,000 | 5 people Γ 3h is already 900 min |
| Egress bandwidth (LiveKit Build) | 50 GB/month | |
| Idleness (Render Free) | sleeps after 15 min | the first request after that takes ~1 min |
| Instance (Render Free) | 512 MB RAM, 0.1 CPU | the Next.js build is the most likely thing to blow past it |
| Hours/month (Render Free) | 750 h per workspace | |
| Database (Neon Free) | 0.5 GB, 100 CU-h/month | once the quota runs out, compute stays suspended until the next cycle |
| Attachment storage (Neon Free) | 5 GB per project | during the beta |
| Network transfer (Neon Free) | 5 GB/month per project | shared by database and images; running out suspends the compute |
| Idleness (Neon Free) | suspends after 5 min | adds ~1s to the first query |
Presence, live chat and the call notice live in the process's memory: when Render tears the instance down for idleness, anyone in a call is disconnected and that state resets.
Moving off this
Once 5 simultaneous people is too few: Production deploy (Railway) plus paid LiveKit Cloud or LiveKit self-host. Same variables, pointing somewhere else.