Docs / Ref. 01 aleja.app ↗

Features and technology

What Aleja does, and what it is built with. The rest of these docs cover the developer platform (webhooks, bots, apps); this page is the wider picture.

What Aleja is

Aleja is a chat app for communities and friends. People gather in nests (what other apps call servers), talk in text and voice channels, message each other directly, and share files, screens and small games. It runs as a desktop app (Windows, macOS and Linux) and in a browser. Privacy is the organizing idea: messages, files and calls are end-to-end encrypted, and the server is built to hold as little readable data as it can.

Messaging

  • Direct messages and group chats, with friends, friend requests, blocking, and per-person controls for who may message or befriend you.
  • Nest channels: text and voice, grouped into sections, each with its own permissions and an optional banner.
  • Rich messages: formatted text, replies, forwarding, spoilers, links to a message or channel, emoji, stickers, and a slash-command menu (/me, /spoiler, /shrug, /nick, /msg, and moderation commands such as /kick and /ban).
  • Attachments, up to five per message, sealed on your device before they upload. The size limit depends on who sends and where: Goose subscribers can send up to 500 MB, and a nest's Golden Eggs tier raises the limit for everyone in it. A share link carries the file's key in the link itself.
  • Search across your messages. The index is built on your device from messages it has already decrypted, so searching never sends your words anywhere.
  • Notifications: desktop toasts, taskbar badges, per-event sounds, and quiet controls.

Voice, video and screens

  • Calls in voice channels and direct messages, with camera and screen sharing. Media passes through a pool of LiveKit servers that can only relay ciphertext (see Privacy below).
  • Audio tools: noise suppression that runs on your machine, a graphic equalizer, device pickers, input and output level meters, and a soundboard: a dozen built-in clips plus any a nest uploads, played for everyone in the call by members whose role allows it.
  • Streaming quality scales with the nest's Golden Eggs tier, from 720p at 30 FPS up to 1080p at 60 FPS and 1440p at 30 FPS. The call view adapts its layout to the number of people and shares.
  • Desktop extras: a picture-in-picture call window, an in-game overlay, and global keybinds that work while another app (a game, say) has focus.
  • AI in calls: Gemini can join a call as a voice participant, and answers text prompts. She is a Goose member perk, with 50 messages and 15 minutes of calls in any 24 hours.

Nests

  • Roles and permissions, with per-channel overrides, role colors and icons, and an audit log of moderation and settings changes.
  • Invites with expiry and use limits, personal one-use invites, and an invite page that shows the nest's emblem and background. Nests on the second Golden Eggs tier can claim a vanity invite URL.
  • Community tools: onboarding, safety settings, scheduled events (including voice events that start on cue), engagement settings, insights, and server templates.
  • Customization: server icon and banner, custom emoji and stickers, a soundboard, and feathers, a short A-Z tag and a plume members can display next to their name.
  • Apps, bots and webhooks: see the developer docs.

Golden Eggs

Members can gift golden eggs to a nest. More eggs unlock more for everyone in it.

FreeTier 1 (3 eggs)Tier 2 (12 eggs)
Voice bitrate96 kbps128 kbps192 kbps
Screen sharing720p at 30 FPSAdds 1080p at 30 FPSAdds 1080p at 60 FPS and 1440p at 30 FPS
Attachment limit25 MB50 MB100 MB
Custom emojiNo25 static and 25 animated50 static and 50 animated
StickersNo10 static30, animated too
Banner and invite backgroundNoNoCustom banner, invite and info background (still pictures)
ExtrasRole icons, Egg Provider role for giftersVanity invite URL, per-channel banners

Members with a Goose subscription get 192 kbps voice in any nest, whatever its tier, and can share their screen in up to 4K at 60 FPS in DMs and group chats.

You and your profile

  • Profiles with avatar, banner, background, status, bio, badges and a custom status line.
  • Themes: more than a dozen color themes, each with its own backdrop, titlebar and pattern in light and dark, from a koi pond to a neon outrun sunset, all under Settings > Appearance.
  • The shop: profile frames, banners, backdrops and avatar wrappers, with animated effects.
  • Connected accounts to show on your profile: Spotify, Steam, GitHub, Reddit, Twitch, YouTube, X, Facebook, Battle.net and Riot.
  • Rich presence: what you are playing or listening to, picked up from detected games, from Spotify, and from programs that speak Discord's local presence protocol.
  • The Garage: collect cars with rarities from common to mythic, buy scenes to stand them in front of at the dealership, show one off, and visit other people's.
  • Accessibility: text size and readability, visual density, color and contrast options, and reduced motion.

Privacy and security

  • End-to-end encrypted messages. Direct and group messages use a Signal-style design: pre-key bundles for starting a conversation, a double ratchet for each pair of people, and sender keys for groups. The server stores ciphertext. Safety numbers and QR codes let two people verify each other.
  • Encrypted files and calls. Attachments are sealed with AES-GCM under a fresh key that travels inside the encrypted message. In calls every participant encrypts media with their own key, hands it to the others over their pairwise encrypted sessions, and rotates it when someone joins or leaves.
  • A vault the server cannot open. Your password is stretched with Argon2id on your device. What the server stores is wrapped with keys derived there, which is how a new device picks up your identity, block list and settings. A recovery key covers a forgotten password.
  • Keys at rest. The desktop app keeps your session token, vault key and encryption state in the operating system's credential store. The local search index is an encrypted SQLCipher database.
  • Friends of friends without a social graph. Mutual-friend suggestions use a private set intersection over ristretto255, so two people learn about shared friends and nothing else.
  • Blocks the server can't list. Blocks and friendships are tracked by opaque keyed tokens rather than plain user pairs, and IP addresses are stored only as keyed hashes.
  • Abuse protection: rate limits throughout, Cloudflare Turnstile on sign-up and risky logins, sign-in throttling, optional two-factor codes, and name and bio filters that look past tricks like spacing and look-alike letters.
  • Moderation: reports, image scanning for avatars and server icons, and hash matching against known abuse imagery.

Technology

Client

PieceWhat it is
UIVue 3 (Composition API) built with Vite
StylingTailwind CSS 4, with Lucide icons and DM Sans and Urbanist fonts
Rich textTipTap
Callslivekit-client, with an end-to-end encryption worker
Cryptography@noble/curves and @noble/hashes (Ed25519, X25519, ristretto255, HKDF, Argon2id) and the browser's Web Crypto for AES-GCM
Animation and artlottie-web and DiceBear
Noise suppressionDeepFilterNet3 from the maintained DeepFilterNet Plus fork, compiled from Rust to WebAssembly and run in an audio worklet
TestsVitest

Desktop

The desktop app is a Tauri 2 shell around the same Vue client. The native side is Rust: system tray and launch-at-login, deep links (aleja://invite/...), global shortcuts, the notification and overlay windows, game detection, a local rich presence server, the operating system credential store (keyring) with ChaCha20-Poly1305 for sealed secrets, and the encrypted search index (SQLCipher through rusqlite). The app runs under a strict content security policy.

Server

PieceWhat it is
Language and frameworkRust, with axum 0.8 on Tokio, serving HTTP and WebSocket
DatabasePostgreSQL through sqlx, split into schemas for identity, spaces, channels, crypto and history
Cache and presenceRedis (cluster-aware) for sessions, presence and fan-out, with in-process moka caches in front
CallsA cluster of LiveKit SFU nodes sharing one Redis; each call's room is pinned to a healthy node, and the server watches bitrates and token metadata
StorageCloudflare R2 (S3 API) through rusty-s3, with signed, expiring attachment links
Cryptographyargon2, aes-gcm, p256, hkdf, hmac, sha2 and ring; TOTP through totp-rs
Safetyrustrict and Unicode normalization for name filters, pdqhash for image hash matching, Sightengine for image scanning, Cloudflare Turnstile, governor rate limiting
IntegrationsResend for email, Google Gemini for AI replies and live voice, Black Forest Labs FLUX for generated artwork, and account connections to the providers listed above
DocsThese pages, written in Markdown and rendered by pulldown-cmark into the server binary

Operations

  • Edge: nginx terminating TLS (Let's Encrypt) in front of the server, with WebSocket upgrade handling.
  • Deploy: a primary node for the API and Redis, and separate SFU nodes for calls, configured from the server/deploy templates. Local development uses Docker Compose for Postgres, Redis and an optional two-node LiveKit cluster.
  • Bots: the bot SDK is a Node.js package, and apps are sandboxed web pages that talk to the client over a small postMessage protocol.