Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
WHY2 Chat
Privacy-focused encrypted chat application powered by WHY2 encryption.
WHY2 Chat is a reference implementation demonstrating the WHY2 encryption system in a real-world application. It provides encrypted text, voice, file transfer and screen sharing with no metadata collection, no backdoors, and complete transparency.
Features
Security
- REX Encryption: Everything on the wire is encrypted with WHY2 before transmission
- Hybrid Key Exchange: ephemeral ECC (NIST P-521) + ML-KEM-768 post-quantum encapsulation, combined through HKDF
- Signed Handshake: the ephemeral offer is signed by the server's static identity, so the pinned key authenticates every exchange
- Forward Secrecy: every handshake uses fresh ephemerals, and the session rekeys every 10 minutes
- Authenticated Encryption: HMAC-SHA256 encrypt-then-MAC on one-shot packets and on the streamed ones (file transfer, screen share), where the MAC covers the stream counter
- Sequence Numbers: prevent replay and reordering attacks
- TOFU (Trust On First Use): server public key is pinned on the first connection
- Encrypted Message History: the optional lobby history is stored authenticated-encrypted on disk, under a key of its own
Communication
- Text Messaging: real-time encrypted chat, channels, and per-channel scrollback
- Voice Channels: encrypted voice communication
- Opus codec compression (48 kHz, 20 ms frames)
- Noise reduction (nnnoiseless)
- Voice activity detection, jitter buffering, automatic gain control
- Per-user mute and a live voice roster of the channel
- Screen Sharing: H.264 screen share with audio, multiple viewers per sharer
- Monitor selection (
/screen <index|name>), swappable while the share runs - GPU colour conversion and GPU-side playback (
wgpu), with CPU fallbacks - Echo cancellation keeps your own voice output out of the shared audio
- Monitor selection (
- File Transfer: upload files to the server and download them by ID
- Private Messages: direct user-to-user encrypted messaging
- Multi-Channel Support: organize conversations into separate channels
Interface
- Full-screen TUI:
ratatuiover crossterm — message pane, user sidebar, voice panel, mouse-wheel scrolling - Slash-command palette: filtered command menu and a signature hint for the parameter you are typing
- In-app settings:
/settingswrites audio and interface options straight through to the config - Server settings: the same overlay edits
server.tomlremotely for owners, including a graceful server restart - Roles:
User/Moderator/Owner, with moderation (mute, kick, ban, IP ban, pardon, broadcast) gated by rank
Technical Highlights
- CTR Mode Encryption: parallel message processing
- TCP + UDP: reliable text (TCP), low-latency voice (UDP) — on the same port
- Async top to bottom: tokio on both binaries, no manually spawned OS threads
- Spam Protection: rate limiting, packet size limits and packet validation
- Session Management: automatic timeout and cleanup
- Cross-Platform: Linux, macOS, Windows support
Building from Source
Prerequisites
Linux
# Server, or a client without voice/screen share
# Full client (voice + screen share)
macOS
Windows
No additional dependencies required (uses Windows Audio APIs and DXGI Desktop Duplication).
Compilation
Client (Default)
# Build client binary
# Binary location: ./target/release/why2
Server
# Build server binary (no client features)
# Binary location: ./target/release/why2-server
Features
client(default): the whole client —client_base+client_voice+client_screenclient_base: TUI and core networking (text, channels, file transfer), no audio or videoclient_voice: voice chat (cpal, Opus, noise suppression)client_screen: screen sharing (impliesclient_voice)server: server functionality (multi-client handling, no UI)windows_resources(indefault): embeds the Windows icon, VERSIONINFO and manifest — for binary builds only. A crate depending onwhy2-chatas a library must build it withdefault-features = false, or those resources are force-linked into its own executable.
Client and server features are mutually exclusive; the build script says so rather than failing at link time.
Build-time environment variables
| Variable | Effect |
|---|---|
WHY2_CONFIG_DIR |
Baked-in config directory (default {HOME}/.config/WHY2) |
WHY2_SKIP_TOFU |
Disables server key pinning — local/dev testing only |
WHY2_DEV_BYPASS |
Skips the feature-combination check in build.rs |
Usage
Server Setup
-
Run the server:
-
Configuration (auto-generated on first run):
- Location:
~/.config/WHY2/server.toml - Important Settings:
server_ip: Bind address (default:0.0.0.0)server_port: Server port (default:1204)server_name/server_username: how the server presents itselfmax_clients,max_unauth_clients,max_ip_clients: connection limitsallow_register: enable/disable new user registrationenable_voice_chat,enable_screenshare: toggle the two side channelsmax_upload_size,max_client_parallel_uploads: file transfer limitspersistent_messages,max_persistent_messages: keep lobby messages on disk (off by default)
- Owners can edit all of it in-app with
/server settings;server_ip,server_port,enable_voice_chatandserver_usernameare only read at startup and are marked as needing a restart, which the same overlay can trigger.
- Location:
-
State on disk (all under
~/.config/WHY2/):server_users.toml— users and their rolesserver_bans.toml— user and IP bansserver_keys/— the server identity (private,public) andhistory_keyserver_messages.bin— the encrypted lobby history, if enabled
Uploaded files are kept outside of it, in
WHY2-Uploads/under the system temp directory.
Client Setup
-
Run the client:
-
First-time setup (all of it inside the TUI's connect box):
- Enter server address (optionally followed by
:PORT) - Server public key verification (TOFU)
- Create username and password
- Enter server address (optionally followed by
-
Configuration (auto-generated):
- Location:
~/.config/WHY2/client.toml - Important Settings:
default_port: default server portauto_connect/auto_connect_addr: dial a server without a keystrokesocks5_enabled/socks5_addr: route the connection through a SOCKS5 proxydownload_directory: where downloads land- Display options (
show_id,disable_colors,disable_logo,mouse_capture) - Audio (
input_device,output_device,input_volume,output_volume,screen_volume,noise_suppression,automatic_gain) — all editable in-app with/settings, and applied immediately, including to a voice call that is already running. The two device keys hold a cpal device ID, so pick them in/settingsrather than by hand
- Location:
Runtime environment variables (client)
| Variable | Effect |
|---|---|
WHY2_CAPTURE_BACKEND |
Pins the screen capture backend (recorder / legacy) |
WHY2_CAPTURE_PROBE_TIMEOUT |
Overrides the recorder probe deadline, in seconds |
WHY2_CAPTURE_CONVERTER |
Pins the RGBA → I420 path (gpu / cpu) |
Important Commands
Every command has aliases, and the ones with a shortcut can be typed with Ctrl+<key>.
| Command | Description |
|---|---|
/help |
Display available commands |
/info <command> |
Show a command's usage |
/list |
List connected users and their IDs |
/pm <id> <message> |
Send private message |
/channel [name] |
Switch to channel (back to the lobby if omitted) |
/voice |
Toggle voice chat |
/mute [id] |
Toggle-mute a user, or yourself |
/upload <path> |
Upload a file to the server |
/files |
Show available files and their IDs |
/download <user id> <file id> |
Download a file from the server |
/screen [monitor] |
Toggle screen sharing, or swap the shared monitor |
/screens |
Show everyone who is sharing |
/attach <id> |
Watch someone's screen share |
/deattach |
Stop watching |
/color <color> / /ucolor <color> |
Set message / username color |
/settings |
Open audio and interface settings |
/logout |
Disconnect and return to the login screen |
/exit |
Disconnect and quit |
Moderation lives under /server and is offered by rank:
| Command | Minimal role |
|---|---|
/server mute <id>, /server kick <id> |
Moderator |
/server ban <id>, /server banip <id>, /server bans |
Owner |
/server pardon <id>, /server pardonip <id> |
Owner |
/server say <message>, /server role <id> <role> |
Owner |
/server settings |
Owner |
Network Architecture
Protocols
-
Text Communication: TCP (port 1204 by default)
- Key exchange (ECC + ML-KEM)
- Encrypted messaging and server commands
- File transfer and screen share run as authenticated streams over their own TCP connections
-
Voice Communication: UDP (same port as TCP)
- Encrypted Opus packets
- Low latency streaming
- Voice activity detection
- Noise reduction
Security Flow
-
Connection:
- Server → Client: static identity + a fresh ephemeral ECC key and ML-KEM encapsulation key, signed by the identity over the handshake transcript
- Client → Server: its own ephemeral ECC key + the ML-KEM ciphertext
- Both derive the WHY2 grid key, nonce and HMAC key from the combined secret via HKDF
-
Authentication:
- Server → Client: its rules (name, username/password limits) and version
- Client → Server: username, then password
- Server verifies the Argon2 hash it stores, and answers with the client's role
-
Session:
- One-shot packets: WHY2 (CTR mode) with HMAC-SHA256 encrypt-then-MAC
- Streams: the same, with the stream counter inside the tag, verified before the cipher advances
- Sequence numbers prevent replay and reordering
- Periodic rekeying (every 10 minutes) with fresh ephemerals
Downloads
Prebuilt Binaries
Security Notice
WHY2 Chat is an experimental application built on the WHY2 encryption system, which has not undergone formal security audit.
Known Limitations:
- Trust On First Use: the first connection to a server is the one that matters — nothing authenticates the identity you pin there
- Rekeying window: a compromised session key exposes traffic until the next rekey (10 minutes)
- Message history is opt-in and server-side: with
persistent_messageson, the lobby's messages sit encrypted next to their key in the server's config directory, which protects a leaked copy of the file and nothing that already has that directory - The server sees the plaintext: this is transport encryption between client and server, not end-to-end encryption between users
- Experimental crypto: the WHY2 algorithm lacks peer review
Best Practices:
- Verify server keys: always validate TOFU prompts
- Use strong passwords: minimum 12 characters by default
- Secure server: run the server on trusted infrastructure — its config directory holds the identity, the user store and the history key
- Regular updates: keep software up-to-date
Technical Details
Dependencies
- Core Crypto:
why2(WHY2 encryption system) - Key Exchange:
p521(ECC),ml-kem(ML-KEM post-quantum),hkdf - Authentication:
hmac(HMAC-SHA256),argon2(password hashing) - Async Runtime:
tokio,dashmap - Voice:
audiopus(Opus codec),nnnoiseless(noise reduction),ringbuf - Audio I/O:
cpal(cross-platform audio) - Screen Share:
xcap/libwayshot(capture),openh264(codec),wgpu(colour conversion and playback),winit(viewer window) - Networking:
tokio-socks(SOCKS5 proxy support),socket2 - Serialization:
wincode(binary encoding),toml_edit(config) - UI:
ratatui+crossterm(terminal interface)
Performance
- Voice Latency: ~25ms (depends on network)
- Screen Share: 30 FPS target, 4 Mbps H.264, shed rather than buffered when the link is full
- Concurrent Users: tested up to 100 simultaneous connections
- Message Throughput: limited by spam protection by default
Platform Support
| Platform | Text Chat | Voice Chat | Screen Share | Notes |
|---|---|---|---|---|
| Linux | ✅ | ✅ | ✅ | ALSA, PulseAudio, PipeWire; X11 and Wayland (portal/wlr) |
| macOS | ✅ | ✅ | ✅ | CoreAudio, AVCaptureScreenInput |
| Windows | ✅ | ✅ | ✅ | WASAPI, DXGI Desktop Duplication |
Contributing
See CONTRIBUTING in the repository root for contribution guidelines.
Getting Help
- Issues: GitLab Issues
- Discord: DM engo150
- Email: engo@satan.red
License
WHY2 Chat is licensed under the GNU GPLv3.
You are free to use, modify, and redistribute it under the terms of the license. See https://www.gnu.org/licenses/ for details.
Philosophy
WHY2 Chat embodies the principle that privacy is a fundamental right:
- No telemetry: Zero data collection
- No backdoors: All code is auditable
- No subscriptions: Free as in freedom
- No censorship: You control your server
- No trust required: Verify the code yourself