AI-built · a family of self-hosted apps, designed & coded with AI Self-hosted voice & text

Your community.
Your server.
Your rules.

AuraLeaf is a family of self-hosted applications that let you run a full voice and text community on your own infrastructure — and, through AuraCanopy, let multiple communities join and talk to each other. No third-party servers. No telemetry. No subscriptions.

Runs onDocker / Portainer stack
Voice engineLiveKit (WebRTC)
ClientWindows · Ubuntu · Android
LicensePolyForm Noncommercial
The client

See AuraLeaf in action.

Channels, encrypted DMs, live voice with AI noise suppression, and cross-server federation — all from one client.

AuraLeaf connected
AuraLeaf client showing the #general channel, connected voice, and member list
AuraLeaf connected to a voice channel, with the channel list and voice control bar
AuraLeaf member list showing admins, online and offline members
One ecosystem

A family of four, working as one.

Each piece does one job well. Together they form a complete, self-hosted community platform you control end to end — and can federate across communities.

Security first

Encryption and security are not an afterthought — they're the foundation.

Because you're hosting your own community, protecting its data is on us. AuraLeaf is built encryption-first: payloads are encrypted in transit, credentials are hashed the strong way, and there's no telemetry leaving your stack.

  • Encrypted payloadsECDH key exchange + AES-256-GCM
  • E2E-encrypted DMsSignal-style key ratcheting — the server can't read them
  • Argon2 passwordsStrong, memory-hard hashing
  • Secure pairingRelays pair via ECDH + one-time tokens
  • Encrypted sessionshttpOnly refresh cookies + JWT, token rotation
  • Rate limitingPer-endpoint abuse protection
  • No telemetryYour stack, your data, nothing phoned home
Why self-host

Big platforms own your community. You can own your own.

Most chat platforms hold your data, lock you into their ecosystem, and gate features behind subscriptions. AuraLeaf flips that: the same feature set, running on your hardware, with nothing phoned home.

Your data, your machines

Messages, media, and voice all live on infrastructure you control. Export, back up, or delete — it's your data, not a vendor's asset.

No subscription, no tiers

Every feature is free for non-commercial use. No Nitro, no boosted roles, no paywalled voice quality or file limits.

Encryption-first

Encrypted payloads, E2E-encrypted DMs with key ratcheting, Argon2 passwords. Security is the foundation, not an upsell.

Source-available

Read every line, fork it, contribute back. The code is public and auditable — you don't have to take our word for anything.

Federate when you outgrow one tree

AuraCanopy lets multiple independent servers share channels and DMs — scale a community without surrendering independence.

Runs on a single Docker stack

One docker-compose up brings up the whole platform. Deploy it on a home server or a VPS, manage it from Portainer.

How it compares

The honest version — features, control, and cost at a glance.

AuraLeaf
Discord
Revolt
Hosting
Self-hosted, your infra
Cloud (vendor)
Self-hosted
Voice & video
Full, with regional relays
Full
Voice only
E2E-encrypted DMs
Key ratcheting
No
Partial
Federation
Across independent servers
No
Yes (Matrix)
AI noise suppression
RNNoise / NSNet2 / DeepFilterNet
No
No
Push notifications
Self-hosted ntfy
Vendor
App store only
Telemetry
None
Extensive
None
Cost
Free (non-commercial)
Subscriptions & tiers
Free (open source)

Comparison is a rough guide — details differ per release. The source is public; verify it yourself.

Under the hood

How it all fits together.

A single AuraTree stack powers your community. AuraBranches extend voice to new regions, and AuraCanopy weaves multiple trees into one federated whole.

AuraLeaf client · Win/Ubu/And AuraTree · master api · socket · livekit postgres · redis · minio AuraBranch 1 AuraBranch 2 AuraCanopy — federation separate trees · shared resources · federated channels AuraTree B AuraTree C
AuraLeaf — client AuraTree — server (master) AuraBranch — relay nodes AuraCanopy — federation
Where it's going

The roadmap.

No promises on timelines — we ship when it's ready. What's below is the current shape of things, from both repos.

  • 1 Now · alpha

    Windows client, full server

    • AuraTree: complete messaging, voice/video, management, events, storage
    • AuraBranch relays for distributed voice (regional routing, failover)
    • Windows alpha client — per-app audio capture, push-to-talk, E2E-encrypted DMs
  • 2 Next

    More platforms, client polish

    • Public alpha releases — Windows installer, then Ubuntu (LTS) .AppImage and Android APK
    • Auto-update feed for the desktop client (electron-updater is wired, just needs a feed)
    • Mobile push notifications
  • 3 After that

    AuraCanopy & security hardening

    • Federation: cross-server visibility, federated channels, cross-server DMs
    • Two-factor authentication (2FA / TOTP)
    • End-to-end encryption for voice & video calls
  • 4 Later

    Language support

    • Internationalization (i18n)
    • Federated relays — dedicated AuraBranch capacity for the canopy
Questions

FAQ.

What's the difference between the web client and the desktop client?
Both talk to the same AuraTree. The web client (React, served by the API container) is what you get on day one. The AuraLeaf desktop client (Electron + Mantine) adds per-app audio capture on Windows, system tray, global shortcuts (push-to-talk, mute, deafen), auto-launch, and better screen-share audio. In alpha they're developed separately and may temporarily differ screen by screen.
Is AuraCanopy a separate service I deploy?
No. AuraCanopy is the connective layer between AuraTrees, not a service you host. When trees join a federation, they exchange federated channels and cross-server DMs through each other. Dedicated federated relays (a Branch reserved just for the canopy) are planned so federation voice doesn't tax an already-loaded server.
Is my data really private?
Your messages sit on your own server. Payloads are encrypted in transit (ECDH + AES-256-GCM), and DMs are end-to-end encrypted with Signal-style key ratcheting — the server can't read them. There's no telemetry anywhere in the stack. The source is public, so you can audit exactly what runs.
What hardware do I need to host it?
The whole stack is six small containers (API, Postgres, Redis, MinIO, LiveKit, ntfy). A modest VPS or home server with Docker handles a small community comfortably — the main scaling lever is adding AuraBranch relay nodes for voice as your community grows. The client itself is light: ~485 MB RAM idle on the Windows alpha.
Is it free? What's the licensing?
Free for personal, hobby, educational, and research use under PolyForm Noncommercial. A commercial license is needed if you sell it, offer it as a paid service, or bundle it into a product — open a GitHub issue tagged commercial-license to discuss. Earlier MIT-licensed releases stay MIT.
Can I migrate a community from another platform?
AuraTree includes message export (JSON/CSV with date-range filtering), which pairs well with community migration scripts. There's no official importer yet — check the issue tracker for the latest, or open a feature request.
Ready when you are

Put your community on your own ground.

Spin up AuraTree from a single Docker stack, point AuraLeaf at it, and grow from there. Everything runs on your hardware, under your control.

AI-built Server

AuraTree

The self-hosted voice & text community core. One Docker container runs your whole community — messaging, voice and video, management, events, storage, and distributed voice. Built on Fastify, Socket.IO, PostgreSQL, Redis, MinIO, and LiveKit.

Fastify 4 + Socket.IO 4PostgreSQL 16 Redis 7MinIO (S3) LiveKit SFUntfy push React 19 web client

Messaging

Real-time text, rich and searchable

  • Real-time messaging over Socket.IO, with edit, delete & threaded replies
  • Emoji reactions, pinned messages & a pinned panel
  • Full-text message search (PostgreSQL FTS) with filters & highlighted results
  • File attachments with type/size validation, typing indicators & read receipts
  • Mention autocomplete, unread counts & Giphy integration

Voice & Video Live

LiveKit WebRTC, with regional relays

  • Voice channels, video & screen share (permission-based)
  • Full-screen stream viewer overlay with host preview & picture-in-picture
  • Live viewer count, minimize to audio-only, quality selection (720p / 1080p / Native)
  • DM voice calls & temporary voice channels (auto-cleanup when empty)
  • AFK channel auto-move, participant management, limits & bitrate config
  • Soundboard & custom per-user/per-server join & leave sounds

Server Management Live

Full control, granular permissions

  • Bitflag permissions (server/text/voice) + role & user overrides
  • Role templates, kick/ban/timeout, invites with expiry & max uses, ownership transfer
  • Role reactions (self-service roles via emoji), welcome & announcement channels, server popups
  • Custom emoji packs (up to 500) & stickers (up to 50) per server, drag-and-drop channel layout
  • Audit logging with filtering by action, user & date range

Events & Storage

Calendar + a real storage dashboard

  • Events with RSVP, role-based visibility & announcements
  • Per-category storage stats, limits & threshold alerts
  • Retention policies, dry-run purge & scheduled cleanup

Direct messages

Private, encrypted, with calls

  • Friend system: send/accept/reject requests, blocking, DM channels auto-created on friendship
  • End-to-end encrypted DMs — Signal-style key ratcheting; the server can't read them
  • DM voice calls & message status tracking (sent / received / read)

Experience

The day-to-day details

  • 5 themes (Dark, Light, OLED, Nord, Midnight) with system-preference detection
  • Command palette (Ctrl+K), message search (Ctrl+F), presence & custom status
  • Message export (JSON/CSV) with date-range filtering

Infrastructure

Built to run, scale & self-heal

  • Auto-migrations, gateway with resume & gap detection
  • Message archiving to MinIO cold storage (gzip)
  • Push via ntfy, health & version endpoints, idempotency keys

Run AuraTree in minutes.

One docker-compose stack brings up the whole platform.

AI-built Client

AuraLeaf

The client your community opens to join your AuraTree. Text, voice, video, and screen share in one app — on your own ground. Currently in alpha.

ElectronReactMantine E2E-encrypted DMsAI noise suppression Windows (alpha)Ubuntu & Android (soon)

Connecting to your server

Point AuraLeaf at any AuraTree you host or join

  • Connect to your own AuraTree — or join someone else's, in your own community
  • Full access to text, voice, video & screen share on the connected server
  • Multi-server support — connect to several trees and switch between them instantly
  • No account on a third party's platform — you're on your own infrastructure

Desktop experience

A real app, not a browser tab

  • System tray, global shortcuts (push-to-talk, mute, deafen) & auto-launch with Windows
  • Per-app audio capture (Windows) — stream one app's audio, not your whole system
  • Native desktop notifications: unread indicators, mention badges, system alerts
  • Custom color themes; built on Electron + React + Mantine

Privacy in the client

Your device stays yours too

  • End-to-end encrypted DMs — Signal-style key ratcheting; the server can't read them
  • AI noise suppression in the client: RNNoise, NSNet2 or DeepFilterNet modes
  • Encrypted credential storage & a sandboxed app — no filesystem access, zero telemetry

Cross-server (via AuraCanopy)

Where the federation shows up

  • See & talk to users on other federated servers
  • Join federated channels broadcast from other trees
  • Cross-server DMs when you add users from another tree

Status & requirements

Where the client is today

  • Windows alpha — expect rough edges & missing features; public alpha releases coming
  • Ubuntu (LTS) & Android builds on the roadmap; auto-update feed being wired
  • Feedback via the client's GitHub issues
Windows (alpha)MinimumRecommended
OSWindows 10 (1809+)Windows 11
CPUDual-core x64Quad-core x64
RAM4 GB system / 750 MB free8 GB system / 1 GB free
Disk700 MB install1 GB install
Network256 kbps voice / 1 Mbps share1 Mbps voice / 4 Mbps share

Typical RAM in testing: ~485 MB idle, ~600 MB in a voice call. Linux/Android requirements ship with those builds.

Getting started

Five steps, once a public build is out

  • 1. Download and install AuraLeaf for your platform
  • 2. Launch the app — you'll see the server connection screen
  • 3. Enter your server's URL (e.g. https://chat.example.com)
  • 4. Create an account or log in
  • 5. You're in. Don't have a server yet? Host one in minutes.

Get the AuraLeaf client.

Windows alpha is live; more platforms are coming.

AI-built Relay

AuraBranch

The extension layer. Stand up extra voice regions and backup nodes wherever your community needs them. Each branch auto-pairs to the master and handles its own voice auth, heartbeats, and event relay.

Standalone relay CLIAuto-pairing ECDH + one-time tokensLatency-aware routing

Distributed voice

Lower latency, more capacity, real redundancy

  • Standalone relay server that runs on its own box, anywhere
  • Per-region voice routing so members connect to the nearest node
  • Backup capacity — keep voice up when a node drops
  • Channel relay policies: master, auto (best by latency/load), or specific (pinned)

Pairing & health

Secure, self-monitoring

  • Secure pairing via ECDH key exchange + one-time tokens
  • Heartbeat health monitoring with auto-failover
  • Admin lifecycle: create, suspend, drain, delete

Federated Relays Future

A branch reserved just for the federation

  • Stand up a relay specifically for AuraCanopy to use
  • Offload federation voice so one already-taxed server isn't carrying it
  • Planned — not yet available

Extend voice beyond one machine.

AuraBranch ships with the server's relay package.

AI-built Federation

AuraCanopy

The layer that connects AuraTrees. Many trees, acting as separate servers that still share resources — so users across communities can join and see each other, talk in shared federated channels, and DM across servers. It's not a separate service you deploy; it's the connective tissue between your trees.

Cross-server visibilityFederated channels Cross-server DMsFederation permissions Encryption-first
AuraCanopy — shared federated channels each tree can broadcast a channel into the shared section Tree A broadcasts #announce Tree B broadcasts #music Tree C joins federation ⇣ federated channels federated channels ⇣ cross-server DMs when users add each other

What federation does

Separate servers, one shared community feel

  • Users on different trees can join and see each other
  • Each tree keeps its own identity, data & ownership — nothing is merged into a single monolith
  • Scale a community across multiple servers without sacrificing independence

Federated channels

Broadcast a channel to the whole federation

  • Any tree can choose to broadcast a channel into every server's federated section
  • Enables native cross-server communication
  • Users from other trees appear in the shared channels

Cross-server DMs

Private, across the canopy

  • When users on different trees add each other, they get a DM
  • Friend requests & DMs work across the federation

Federation permissions

Because it connects trees, it's a critical control surface

  • Permissions govern who can join a federation and what they can broadcast
  • Each tree controls what it shares with the canopy
  • Federation is a connective layer, not a separate service — but it carries its own permission model because it bridges independent servers

Security & privacy

Federation stays encryption-first

  • Cross-server data exchange is encrypted, consistent with the platform's ECDH + AES-256-GCM model
  • No tree hands over ownership of its data to the federation

Federated Relays Future

Dedicated AuraBranch capacity for the canopy

  • Stand up a relay specifically for the federation to use
  • Keep federation voice off an already-taxed server
  • Planned — not yet available

Many trees. One canopy.

Federation is coming to AuraTree. Watch the repo for the AuraCanopy release.

Security first

Encryption and security are a top priority.

You're hosting your own community, so protecting its data is on us. AuraLeaf is built encryption-first: payloads are encrypted in transit, credentials are hashed the strong way, relays pair securely, and nothing is phoned home.

In transit & at rest

How your data is protected

  • Full payload encryption with ECDH key exchange + AES-256-GCM
  • End-to-end encrypted DMs — Signal-style key ratcheting; even the server can't read direct messages
  • Argon2 password hashing (memory-hard, resistant to GPU/ASIC attacks)
  • Credential encryption (AES-GCM) for "remember me"; client app runs in a locked-down sandbox
  • JWT access tokens + httpOnly refresh cookies with rotation

Relay security

AuraBranch pairs securely

  • Relay pairing via secure ECDH + one-time pairing tokens
  • WebSocket signaling proxied through the master's SSL (no mixed content)

Abuse & access

Defense in depth

  • Per-endpoint rate limiting
  • Admin claim-code system & session management
  • No telemetry — your stack, your data

On the roadmap

Planned, not yet shipped

  • Two-factor authentication (2FA / TOTP)
  • End-to-end encryption for voice/video calls

Your data stays yours.

Documentation

Get AuraTree running.

Everything is in the README on GitHub — this is the formatted, quick-reference version. The canonical source is always the repo.

Prerequisites

  • Docker & Docker Compose
  • Node.js 20+ (for development)
  • pnpm 8+ (for development)

Production deploy

The whole platform runs from a single docker-compose stack. Copy the env file, edit it, then bring the services up.

# 1. Configure environment
cp docker/.env.example docker/.env
# edit docker/.env with your settings

# 2. Start all services
cd docker
docker-compose up -d
What to set: your public URL, the Postgres/Redis credentials, MinIO keys, the LiveKit API key & secret, and the JWT signing secret. The .env.example file in the repo documents every variable.

Portainer

Deploying through Portainer instead of the CLI? Add a new stack, paste the contents of docker/docker-compose.yml, and fill in the env file values on the stack form. The livekit service uses network_mode: host — on Portainer this works as-is on Docker Desktop and Linux, but if you're deploying to a remote endpoint make sure the UDP ports (50000–60000 by default) are open on that machine for WebRTC.

Backups

Two volumes hold your community's actual data:

  • postgres — all messages, users, roles & server config
  • minio — attachments, emoji packs, stickers, profile media, archived messages

A nightly docker exec pg_dump plus a sync of the MinIO data volume covers both. Message export (JSON/CSV) in the app is a good second net for individual servers.

Docker services

The stack brings up these containers. This is what you'll see in Portainer once deployed.

ServiceImagePortPurpose
apisosiagaming/sgchat-api3040API + web client
postgressosiagaming/sgchat-postgres3041Database
redisredis:7-alpine3042Cache, sessions
miniominio/minio3043File storage
livekitlivekit/livekit-serverhostVoice/video SFU (UDP 50000–60000 for WebRTC)
ntfybinwiederhier/ntfy3048Push notifications

Only the api port (3040) needs to be exposed to your users — put a reverse proxy (Caddy/Nginx/Traefik) with TLS in front of it. Everything else stays on the internal Docker network.

Relay networking (AuraBranch)

When deploying relay servers on the same LAN as the master, the relay must report a reachable IP address — not localhost. The master's API container proxies LiveKit WebSocket signaling through its own SSL, so the relay's livekit_url must be reachable from inside the Docker container.

Common gotcha: With Docker bridge networking (the default), localhost resolves to the container itself, not the host. Set PUBLIC_IP or LIVEKIT_PUBLIC_URL to the relay machine's LAN IP.
# Example: relay on the same LAN as the master
LIVEKIT_PUBLIC_URL=ws://192.168.1.50:7880

Development

# Install dependencies
pnpm install

pnpm dev        # API dev server (port 3000)
pnpm dev:web    # web client dev server (port 5174)
pnpm dev:all    # both at once

pnpm build      # build all packages (shared -> web -> api)
pnpm typecheck  # type check
pnpm lint       # lint

Project structure

sgChat-Server/
├── packages/
│   ├── shared/   # types, validators, permissions, constants
│   ├── api/      # Fastify backend + Socket.IO
│   │   └── src/  # routes, socket, services, lib, middleware,
│   │             # migrations, plugins
│   ├── web/      # React 19 frontend (served by API container)
│   └── relay/    # standalone relay server CLI (AuraBranch)
│       └── src/  # auto-pairing, crypto, ws proxy, heartbeat,# voice auth, event relay
└── docker/
    ├── docker-compose.yml
    ├── Dockerfile.api
    ├── Dockerfile.postgres
    ├── init.sql
    └── livekit.yaml

AuraLeaf client

The desktop client lives in its own repo: DemonFiend/sgChat-Client. It's a separate codebase (Electron + React + Mantine + Vite) that talks to any AuraTree.

What the client adds over the web client

  • Per-app audio capture on Windows (stream one app's audio, not the whole system)
  • System tray, global shortcuts (push-to-talk, mute, deafen), auto-launch with Windows
  • Multi-server switching, native notifications with mention badges
  • AI noise suppression in the client: RNNoise, NSNet2, DeepFilterNet

Current status

  • Windows alpha — public alpha releases coming
  • Ubuntu (LTS) .AppImage and Android APK — not yet published
  • Auto-update is wired (electron-updater) but not connected to a release feed yet
  • Per-app audio capture is Windows-only; other platforms fall back to system audio

Bug reports and feature requests go to the client's issue tracker.

Licensing

AuraLeaf uses a dual-license model:

  • PolyForm Noncommercial 1.0.0 — free for personal, hobby, educational, research, and other non-commercial use. Read the source, fork it, modify it, contribute back.
  • Commercial license — required to sell it, offer it as a paid service/hosting, bundle it into a product you sell, or otherwise use it in a for-profit business. Open a GitHub issue tagged commercial-license to discuss.
Historical note: earlier versions were MIT-licensed. Those remain MIT; the PolyForm Noncommercial license applies to current and future versions.

Known limitations

Screen-share audio capture (browser)

The getDisplayMedia() API has inherent limits on audio capture:

Share typeAudio behavior
Browser tabCaptures tab audio only
WindowNo isolated app audio (system audio or nothing)
Entire screenCaptures all system audio

Browsers don't expose per-application audio routing for privacy/security. The Electron desktop client (AuraLeaf) provides better audio capture.