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 data by default (SQLite), with optional Postgres mode for larger/community setups
- 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 | SQLite default, Postgres community mode |
| 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 forces local runtime defaults:
- Frontend:
http://localhost:5173 - Backend:
http://localhost:3000 - Health check:
http://localhost:3000/health - SQLite DB path:
backend/data/chat.db
Backend-only localhost cleanup mode (skips frontend and ignores STDB env leftovers):
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 supports a few deployment combinations:
normal + node(default): SQLite + Node containersnormal + bun: SQLite + Bun containerscommunity + node: Postgres + Node containerscommunity + bun: Postgres + Bun containers
Compose examples:
# normal + node
docker compose -f docker-compose.yml up -d --build
# community + node
docker compose -f docker-compose.yml -f docker-compose.community.yml up -d --build
# community + bun
docker compose -f docker-compose.yml -f docker-compose.community.yml -f docker-compose.bun.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,DB_MODEPLUGINS_ENABLED,PLUGINS_ALLOW_INSTALL(both default tofalse)WABI_VIDEO_COMPRESSION_CLIENT_METRICS_ENABLED/VITE_VIDEO_COMPRESSION_CLIENT_METRICS(both default tofalse)- Postgres settings if using community mode
- 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.