Run your own Konvene
Konvene is a folder of static files plus one optional function. Put it on Netlify, Vercel or any web host, under your own name and with your own settings. The code is at https://github.com/rakeshmenon/konvene.
The site you're on is the public demo. Your own copy works exactly the same, and calls on it never touch the demo.
Deploy in one click
Both buttons copy the code into your own GitHub account, build it and give you a web address. Every change you push goes live on its own.
The build settings are already in the code (netlify.toml and vercel.json), so there is nothing to fill in. Add settings later under Environment variables in your host's dashboard, then redeploy.
Run it on your computer
You need Node.js 22 or newer and git.
git clone https://github.com/rakeshmenon/konvene
cd konvene
npm install
npm run dev
Open http://localhost:8790. To try a call on one computer, open http://localhost:8790/?local=1 in two tabs. Browsers only allow the camera on localhost and on HTTPS addresses, so a real call between two computers needs the site deployed.
Deploy to any web host
npm run build makes a dist/ folder. Upload that folder to any static host. The only rule: send unknown paths to /index.html, because call links look like /abc-def-ghj.
- Cloudflare Pages: import the repository, build command
npm run build, outputdist, variableNODE_VERSIONset to22. The relay function and security headers are included. - Nginx:
try_files $uri /index.html; - Apache:
FallbackResource /index.html - Caddy:
try_files {path} /index.html - Docker:
docker build -t konvene .thendocker run -p 8080:80 konvene - GitHub Pages and similar: a copy of the app is included as
404.html, so call links work on a site served from the root of its domain.
Static hosts can't run the relay function. Calls still work; see the relay section for what that means.
Settings
Everything is optional. Set these as environment variables in your host's dashboard, or copy .env.example to .env on your computer. KONVENE_ settings end up in the page, so anyone can read them. Secrets never start with KONVENE_ and stay on the server.
| Variable | What it does |
|---|---|
KONVENE_APP_ID | Calls only meet browsers with the same app ID. Set your own (for example acme-calls) to keep your calls apart from other copies. |
KONVENE_OPERATOR | Your name or organisation, shown on the privacy page. |
KONVENE_CONTACT_URL | A contact link for the privacy page (a web page or mailto: link). |
KONVENE_REPO_URL | Where your copy's code lives. The GitHub links on the site point here. |
KONVENE_RELAYS | Your own Nostr relays for the handshake, comma separated. Leave empty for the public defaults. |
CLOUDFLARE_TURN_KEY_IDCLOUDFLARE_TURN_API_TOKEN | Secret. Cloudflare relay for strict networks (see below). |
TURN_URLS, TURN_USERNAME, TURN_CREDENTIAL | Secret. Any other TURN server, such as your own coturn. |
A relay for strict networks
Most calls connect directly. Some networks (strict offices, hotels, some mobile carriers) won't allow that, and those calls need a TURN relay. The relay passes the call along still encrypted; it can't see or hear it.
- In the Cloudflare dashboard, open Realtime, then TURN Server, and create a TURN key. Cloudflare has a free allowance.
- Copy the key ID and the API token.
- In Netlify or Vercel, add them as
CLOUDFLARE_TURN_KEY_IDandCLOUDFLARE_TURN_API_TOKEN, marked secret, and redeploy.
The included function (/api/turn) swaps your secret for passwords that expire after a few hours, so the secret never reaches a browser. On a host without functions you can set KONVENE_TURN_URLS, KONVENE_TURN_USERNAME and KONVENE_TURN_CREDENTIAL instead, but those are visible to anyone, so only use credentials made for that.
Licence
Konvene is licensed under the GNU AGPL v3. You can use, change and share it for free, including commercially. If you run a changed version for other people, you must offer them its source code: put your copy on GitHub and set KONVENE_REPO_URL, and the links on your site do that for you. Keep the licence notices for the bundled libraries and models (they travel inside app.js).
Help and contributing
Questions, bugs and ideas go to GitHub issues. Want to help? Read CONTRIBUTING.md.