OpenMeet is a browser-based P2P video meeting app. It runs as one Cloudflare Worker and uses HeteroNet Flow for room lifecycle, WebSocket signaling, STUN, and automatic TURN fallback.
Production: https://open-meet.mizuame.app
- The Cloudflare Worker serves the Vite SPA and the same-origin
/api/*routes. - The Worker stores the HeteroCloud developer credential as a Cloudflare secret.
- The Worker creates or reads Flow rooms, validates optional room passwords, and mints five-minute participant contexts.
- Browsers connect directly to Flow signaling and pass Flow's ICE server list to
RTCPeerConnectionunchanged. - Media is browser-to-browser whenever ICE can establish a direct route. Flow TURN is used automatically when it cannot.
- Chat, participant state, moderation messages, and file transfer use authenticated WebRTC data channels.
There is no Express, Socket.IO, self-hosted TURN, Docker, VM, or long-running application server.
Requirements: Node.js, npm, a HeteroCloud Flow service, and its hcf_... developer credential.
cd web
npm install
cp .dev.vars.example .dev.vars
# Set HETEROCLOUD_FLOW_CREDENTIAL in .dev.vars
npm run devnpm run dev:web starts only Vite and therefore does not provide the room API. Use npm run dev for an end-to-end local Worker.
cd web
npm run checkAuthenticate Wrangler, register the secret once, and deploy:
cd web
wrangler login
wrangler secret put HETEROCLOUD_FLOW_CREDENTIAL
npm run deployThe non-secret Flow endpoint configuration and static asset routing are declared in web/wrangler.jsonc.