尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗A browser studio for up to six people: live video over WebRTC, a composited 16:9 stage, host-controlled layouts, banners, a scrolling ticker, branding, studio chat and one-click recording.
vercel.json serves public/ and the api/ function.KV_REST_API_URL + KV_REST_API_TOKEN, UPSTASH_REDIS_REST_URL + UPSTASH_REDIS_REST_TOKEN, or REDIS_URL.https://<your-app>.vercel.app/api/studio?action=config. You want "ok": true.
If not, problem says what's wrong and envDetected lists which variable names the function can see.Open the deployment URL, create a studio, and send the invite link to a second device. Any setup problem also appears in red in the "Step into the studio" dialog.
gather sends email through Resend and schedules reminders with Resend's scheduled_at, so no cron job is needed.
| Variable | Example | Notes |
|---|---|---|
RESEND_API_KEY | re_… | From resend.com → API Keys |
MAIL_FROM | gather <[email protected]> | Must use a domain verified in Resend |
APP_URL | https://gather-gold-nine.vercel.app | Used in email links; defaults to the request's host |
Without these, accounts, scheduling and everything else still work; the app says plainly that emails were not sent.
Optional environment variables, for guests on strict corporate or mobile networks:
| Variable | Example |
|---|---|
TURN_URL | turn:turn.example.com:3478 (comma-separate several) |
TURN_USER | short-lived username |
TURN_PASS | short-lived credential |
Guests can also enter their own TURN details under Settings (kept for that browser session only).
npm start # http://localhost:8080 — no install needed, no database needed
Open two tabs, create a studio in one, and join with the code or invite link in the other.
Locally the studio state lives in memory. Set KV_REST_API_URL and KV_REST_API_TOKEN to use Redis instead.
Camera and screen capture need HTTPS or localhost.
lib/studio.js is a
stateless handler over Redis. Each participant has a private inbox list. The browser polls it every
300 ms while connections are being set up and about once a second after that, and every 2.5 s when the tab is hidden.
Outgoing messages (ICE candidates, chat, stage changes) are batched into single requests.
server.js runs the same handler for local use.replaceTrack, so there is no renegotiation.
A failed connection triggers an ICE restart.<canvas> drawn every frame from everyone's video. That same canvas plus a Web Audio
mix of all participants feeds MediaRecorder, so a recording matches the stage exactly.An idle participant costs about one Redis command per second. A one-hour session with six people uses roughly 25–30k commands. Studios expire after six hours without activity.
Each host pastes their own provider key in the AI panel. It is kept in that browser's local storage and sent with each question through /api/ai to the provider; gather never stores or logs it. Claude requests use the official Anthropic SDK with web search and server-side refusal fallback.
pdf.js and qrcode-generator are served from public/vendor/ (licences in public/vendor/LICENSES.md).
Shortcuts: M mute · V camera · S share screen · ← → slides · 1–9 scenes · R record · F full screen · / chat.