个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Serverless P2P push-to-talk voice chat — no accounts, no server. Works on desktop (macOS), iOS, Android, and web.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
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 control查看完整 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.