Beep¶
A video-conferencing component you can drop into a larger product. A Python backend, a Svelte frontend, and a narrow documented contract between them — running on unmodified upstream Galene as the SFU.
Running on stock Galene
The whole stack works against an unpatched upstream build: both
end-to-end suites pass, real bidirectional media flows, and presence
is persisted to Postgres. Proof and reproduction recipe in
notes/v3/evidence/full-stack/.
What Beep is, and isn't¶
Beep does not fork Galene. make galene-bin builds a pinned upstream
checkout into vendor/galene/, and the entire SFU-side configuration is
a single group file (see SFU). Everything the integration
needs turned out to be reachable without patching the SFU.
That wasn't the original plan. An earlier iteration forked Galene and
added four "primitives" to it; all four turned out to be unnecessary.
notes/v3/upstream-gap-check.md records how that was established and
notes/v3/retrospective.md covers the experiment.
The parts¶
| Part | Language | Role | Swappable? |
|---|---|---|---|
| SFU | Go (upstream) | Media forwarding and /ws signalling |
It's a pinned dependency — see SFU |
| backend | Python (Litestar) | Reference implementation of /api/v1/ |
Yes — see alt-backend |
| front | Svelte 5 SPA | Meeting UI | Yes — /api/v1/ is the contract |
The frontend is the product surface. The backend is a reference
implementation, not the only one: a host platform writes its own
/api/v1/ and keeps the frontend and SFU unchanged.
alt-backend/ makes that concrete — roughly 220 lines
of aiohttp with no database, passing the same Playwright specs as the
9,000-line Litestar backend. It is the contract's conformance test: if a
change breaks it, the change is wrong.
How the backend talks to the SFU¶
Two mechanisms, neither of which requires a modified Galene:
- Rooms are implicit. The parent group carries
auto-subgroups, someetings/<slug>exists as soon as somebody joins. Nothing is provisioned and nothing is deleted. - Join tokens are signed by the backend against the key in that
group's
authKeys. Username and permissions travel in the token, so no user directory is needed anywhere. - Presence and moderation ride an operator connection. The backend
joins each active room as a client holding the
oppermission. That connection sees Galene'suseradd/change/delete stream and can issuekick,lockandrecord.
Quick links¶
- Quickstart — first meeting in about five minutes
- Architecture — how the pieces fit
- API contracts —
/api/v1/, the boundary that matters - SFU — configuring and running upstream Galene
- Deployment — dev and production
- Roadmap — what's next