Serein
Rust로 만든 가볍고 성능 좋은 Discord 전용 네이티브 클라이언트
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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 controlREADME 전문 보기 ↗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.