Wabi is a free, self-hosted communication app for people who want to leave Discord without needing a computer science degree.
Think: Discord-style servers and channels, reliable calls inspired by TeamSpeak, and easy social messaging in the spirit of LINE.
You run it yourself, so your community controls its own space and data.
Positioning references:
- Like LINE for social/group messaging UX
- Like Discord for server/channel community structure
- Built on standard communication tech: WebRTC, Socket.IO, TURN
- Real-time text chat, channels, DMs, presence, typing indicators
- Voice, video, and screen sharing via WebRTC
- Better call connectivity across networks using TURN (coturn)
- User accounts, JWT auth, guest access codes, and role-based permissions
- Saves shared server state in the embedded Wabidb engine; browser-local client caches belong in IndexedDB
- Theme customization and saved user preferences
- Plugin system with integrity/signature policy controls
- Optional
relay-node(file delivery network phase) andmedia-gateway(SRT gateway daemon + worker bridge)
| Area | Status | Notes |
|---|---|---|
| Real-time chat | Available | Channels, DMs, presence, typing indicators |
| Voice/video calls | Available | WebRTC with TURN REST credentials |
| Screen sharing | Available | Real-time share flows in client |
| Auth + roles | Available | JWT auth, guest codes, RBAC |
| Persistence | Available | Wabidb server state (embedded engine) + IndexedDB client-local cache |
| Theming | Available | Saved user theme/preferences |
| Relay network | Optional/Phase 1 | relay-node/ for file delivery relays |
| SRT media gateway | Optional | media-gateway/ daemon with control-plane sync + worker orchestration |
| Plugin system | In progress | Core framework is live (integrity/signing). Plugin mode completion is on roadmap. |
frontend/: SvelteKit client (web + Tauri support)backend/: Node.js + Socket.IO API/server, auth, policy, persistence, pluginsturn-server/: Dockerized coturn for TURN REST authrelay-node/: Volunteer-hosted relay node for file deliverymedia-gateway/: SRT gateway daemon (control-plane + worker orchestration)
See full architecture and deep technical docs in PROJECT_DOCS/ARCHITECTURE.md and PROJECT_DOCS/CODEBASE_OVERVIEW.md.
If you can run Docker or Podman, you can run Wabi. Works on Windows, Mac, and Linux with zero config.
git clone https://github.com/AzureFoxStudios/wabi.git
cd wabi
docker compose up -d --buildOpen http://localhost:3000, create the owner account, and you're in. No .env editing is required for local bring-up; localhost defaults are baked into Compose, and backend secrets are auto-generated on first boot.
If your host ships Podman instead of Docker, replace docker compose with podman compose. The setup and launch scripts auto-detect either runtime; set WABI_CONTAINER_RUNTIME=podman to force Podman when both are installed.
Optional: include TURN for production-quality calling:
docker compose --profile turn up -d --buildDefault local endpoints:
- Frontend:
http://localhost:3000 - Backend:
http://localhost:8080 - Health check:
http://localhost:8080/health
For public domains, TURN, reverse proxies, mesh config, or other non-local settings, use ./scripts/setup.sh on Linux or scripts/setup-forWindows.ps1 on Windows. Login-page branding is configured separately via data/launch-page.json.
If you prefer to set secrets manually:
cp .env.example .env
cp frontend/.env.example frontend/.env
# Edit .env with your JWT_SECRET, domain, etc.
docker compose up -d --buildWabi supports two tunnel paths out of the box:
- Domainless quick tunnel (free, temporary URL):
docker compose --profile tunnel --profile tunnel-quick up -d --build
docker logs -f wabi-cloudflared-quickUse the https://*.trycloudflare.com URL printed in logs.
- Named tunnel (your own domain, stable URL):
# Set in .env first:
# CLOUDFLARE_TUNNEL_TOKEN=<token from Cloudflare Zero Trust>
docker compose --profile tunnel --profile tunnel-named up -d --buildIn both modes, Wabi routes frontend + backend through Caddyfile.tunnel so /api and /socket.io stay on one origin.
For first-time server provisioning, use:
./scripts/setup.shThe setup wizard asks a few questions, generates your config files, helps with Caddy, and prints the exact deploy commands.
Windows guided setup without WSL:
powershell -ExecutionPolicy Bypass -File scripts/setup-forWindows.ps1Windows deploy helper (requires WSL):
powershell -ExecutionPolicy Bypass -File scripts/launch-forWindows.ps1Use setup-forWindows.ps1 for first-run config generation on Windows. launch-forWindows.ps1 is a WSL wrapper around the more advanced launch.sh deploy helper.
Optional operator config (used by scripts/launch.sh):
cp wabi.config.example wabi.configwabi.config is the operator-friendly control file (PROFILE, RUNTIME, CALLS, plugin/privacy toggles).
Edit wabi.config, then run ./scripts/launch.sh; it syncs supported keys into .env and frontend/.env.
Relay node deployment is intentionally separate from core server launch.
Linux/macOS:
./scripts/relay-launch.sh configure
./scripts/relay-launch.sh upWindows (WSL required):
powershell -ExecutionPolicy Bypass -File scripts/relay-launch-forWindows.ps1 configure
powershell -ExecutionPolicy Bypass -File scripts/relay-launch-forWindows.ps1 upRelay runbook: PROJECT_DOCS/RELAY_PHASE1_SERVER_RUNBOOK.md
Run frontend and backend together from repo root:
bun run devLocalhost-first dev mode (recommended when remote/prod server is down):
bun run dev:local:windowsbun run dev:localThis mode is the real local stack, not UI mock mode:
- Frontend:
http://localhost:5173 - Rust backend:
http://localhost:3001 - Wabidb data dir:
./data/wabi-server - (no proxy needed; Wabidb is in-process)
If spacetimedb/wabi_state_bridge is missing, bun run dev:local fails loudly instead of falling back to a fake persistence layer.
Backend-only localhost mode (skips frontend; still expects only the wabi-server binary to be valid):
bun run dev:backend:local:windowsbun run dev:backend:localService scripts:
- Root scripts:
package.json - Backend scripts:
backend/package.json - Frontend scripts:
frontend/package.json
The active Tauri desktop app lives in frontend/src-tauri.
From repo root on Windows:
bun run desktop:dev
bun run desktop:build
bun run desktop:checkUse desktop:check first if you only want to validate the Rust side quickly.
Windows desktop bundles are emitted to frontend/src-tauri/target/release/bundle/.
The Windows installer is configured to embed the WebView2 offline installer so it can install on machines that do not already have WebView2 or cannot download it during setup. This makes the installer much larger, but it avoids the common "works on my machine, fails on another PC" problem.
tauri-app/ is a legacy wrapper kept around for compatibility; it is not the primary desktop source of truth anymore.
Wabi's canonical deployment is Rust + Wabidb (engine embedded). Optional profiles add tunnels, TURN, SFU, and media helpers.
Compose example:
docker compose -f docker-compose.yml up -d --buildSee PROJECT_DOCS/DEPLOYMENT.md for full deployment guidance.
Primary env files:
.env(backend/runtime/deployment/turn/media flags)frontend/.env(socket URL, TURN client config, GIF key)
Start from:
.env.examplefrontend/.env.example
If you use scripts/launch.sh, treat wabi.config as your primary operator surface and avoid hand-editing env files unless you need an advanced variable not exposed there.
scripts/launch.sh does not configure relay-node deployment; relay setup uses scripts/relay-launch.sh.
Important settings to review before production:
FRONTEND_URL,PUBLIC_URL,ALLOWED_ORIGINSJWT_SECRETTURN_EXTERNAL_IP,TURN_REALM,TURN_SHARED_SECRETWABI_MODE,WABI_RUNTIME,JWT_SIGNING_KEY(see docker-compose.yml for required env)PLUGINS_ENABLED,PLUGINS_ALLOW_INSTALL(both default tofalse)WABI_VIDEO_COMPRESSION_CLIENT_METRICS_ENABLED/VITE_VIDEO_COMPRESSION_CLIENT_METRICS(both default tofalse) Server data dir and storage config (seedocker-compose.yml)- Optional launch page branding:
WABI_LAUNCH_PAGE_JSONorWABI_LAUNCH_PAGE_PATH
If you are new to this, start with ./scripts/setup.sh and only edit advanced variables later.
Wabi can serve a community-branded launch page on the login screen.
- Copy
data/launch-page.example.jsontodata/launch-page.json. - Edit the content, palette, hero links, and highlights.
- Restart backend.
Backend serves this config from GET /api/public/launch-page.
Wabi has a modular plugin system (runtime install dir: plugins/) with:
- manifest-based capabilities and permissions
- integrity checksum support
- optional signing + trusted signer policy
- audit/logging hooks
Plugin authoring guide: plugins/README.md
Bundled test add-ons (not installed by default): addons/README.md
If you just want to host Wabi, you can ignore plugins at first.
If you see logs like Safe mode: skipping third-party plugin ..., plugin crash-loop safe mode is active.
To clear previous crash history:
Set-Content -Path backend/data/.plugin-storage/plugin-crash-state.json -Value "{}"Then restart the backend server and run add-on detection again from Settings if needed.
- Overview:
PROJECT_DOCS/README.md - Architecture:
PROJECT_DOCS/ARCHITECTURE.md - Deployment:
PROJECT_DOCS/DEPLOYMENT.md - Translation guide:
TRANSLATION_GUIDE.md - TURN setup:
PROJECT_DOCS/TURN_SETUP.md - TURN REST auth:
PROJECT_DOCS/TURN_REST_AUTH.md - Calling transport:
PROJECT_DOCS/CALLING_TRANSPORT_ARCHITECTURE.md - Policy system:
PROJECT_DOCS/POLICY_SYSTEM.md - Tauri readiness:
PROJECT_DOCS/TAURI_BUILD_READINESS.md
MIT (LICENSE)
- Clean up open bugs.
- Polish and stabilize CSS and UI consistency.
- Finish plugin mode.