P2P push-to-talk — no account, no server. Works in any browser.
Translation pending
SocialJavaScript · CSSGitHub @ErwannRobinOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Serverless P2P push-to-talk voice chat — no accounts, no server. Works on desktop (macOS), iOS, Android, and web.
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Instant push-to-talk voice rooms.
No accounts. No installation. No server required.
• Pure P2P voice (WebRTC full-mesh audio) — never routed through a media server, under any setting
• Push-to-talk first UX on every platform
• Host migration keeps rooms alive when the host leaves
• No account required to create or join rooms
• No mandatory backend (optional presence only)
• Desktop + iOS + Android + Web from one shared frontend
• Open source and self-hostable signaling for production controlRead the full README ↗Instant push-to-talk voice rooms. No accounts. No installation. No server required.
| Home | Audio call | |
|---|---|---|
| Dark | ||
| Light |
Video call with an animated virtual background (the Lagoon deck, lit by night or by day):
| Dark | Light |
|---|---|
postMessage bridge (details)Voxal combines push-to-talk simplicity with peer-to-peer resilience across desktop, mobile and web.
Most peer-to-peer voice applications stop working when the host disconnects. Voxal automatically elects a successor and keeps the room alive without reconnecting participants (deep dive).
And voice stays peer-to-peer permanently. A TURN relay only ever forwards opaque encrypted DTLS-SRTP; an SFU has to decrypt media to forward it selectively, which is why camera and screen-share may use one in larger rooms but audio never does, under any setting (the distinction, in full).
Signaling topology : star (host ↔ peers via PeerJS DataConnection)
Audio topology : mesh (peer ↔ peer via WebRTC MediaConnection) — always, never server-routed
Video/screen : mesh by default; optionally through Cloudflare's Realtime SFU
Codec : Opus (16 kHz mono)
Room flow (high level):
selectVideoTopology() may route through the SFU instead.See it drawn: topology diagrams — the join sequence, star vs. mesh at four people, what each server sees, host migration, and how video changes above two participants. Room Lab lets you build a room yourself and watch the links form, and the flow explorer walks the same system component by component.
docs/promo.html)docs/topology.html)docs/architecture.html)docs/topology-lab.html)Contributions are welcome. For local development:
git clone https://github.com/ErwannRobin/Voxal.git
make install
make dev
make test
If you modify files under src/, sync assets for mobile builds with make cap-sync.
| Command | What it does |
|---|---|
make install | Installs Node deps and fetches Rust crates (with setup preflight checks) |
make dev | Starts the Tauri desktop app with hot reload |
make run-web | Serves the web app at http://localhost:8080 |
make test | Full suite: Rust type-check + Rust tests + API tests + Playwright E2E |
make test-e2e | Fast Playwright E2E only (pure-logic and UI flows) |
make test-mesh | Multi-peer WebRTC E2E against a real local PeerServer |
make lint | ESLint over all JavaScript + cargo fmt --check |
make coverage | Rust + E2E + API coverage reports, summarised in one table |
make coverage-badge | Re-measure main.js and rewrite the coverage badge above |
make bench | Performance benchmark: voice and camera, real WebRTC, no thresholds |
make bench-publish | Put the newest benchmark run into the published results |
make test is what CI gates on: main takes no merge whose tests are not green
(how that is enforced). The multi-peer make test-mesh
suite is kept out of it so the fast path stays deterministic — run it when you
touch signaling, the audio mesh, or host migration.
npm install (and so make install) points git at the repository's own hooks
in .githooks/ by setting core.hooksPath. Nothing to do by hand;
make hooks re-enables them if you ever need to. They catch what CI would
reject before it costs a CI run. CI still runs everything and stays the real
safety net.
| Hook | Runs | Time |
|---|---|---|
pre-commit | On staged files only: ESLint for JS, JSON validity, rustfmt --check for Rust, conflict markers/whitespace | ~2 s |
pre-push | Only what your pushed commits touch: API tests (api/), Rust tests (src-tauri/), a Swift syntax check (ios/**/*.swift, macOS only). Pushes that only change src/ or docs run nothing. No E2E: a push that edits tests/e2e/*.spec.js just prints a reminder to run make test-e2e-changed (CI runs the suite; PREPUSH_E2E=all runs it in the hook anyway) | seconds |
The mesh suite is never run by a hook (slow, timing-sensitive; CI runs it).
pre-push tests the working tree, so stash unrelated edits if you want the
result to describe exactly what you push.
Emergency bypass: git commit --no-verify / git push --no-verify skips
the hook for that one command. CI will still check the change.
MIT - see LICENSE.