- Rust 98.8%
- PowerShell 0.7%
- Shell 0.5%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .forgejo/workflows | ||
| .github/workflows | ||
| .grit | ||
| src | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| install.ps1 | ||
| install.sh | ||
| LICENSE | ||
| README.md | ||
Starling
A federated, peer-to-peer communications platform — birds talking across the murmuration, with no company in the middle.
Starling is Discord's shape (servers, channels, voice, video, DMs) without the company that owns every server. Direct messages and small calls go straight between friends, peer-to-peer. Communities live on a server that belongs to whoever runs it — not to a corporation. Every message is end-to-end encrypted.
⚠️ Early access — under active development. Starling is young and moving fast. Expect rough edges, breaking changes, and missing features. It's built in the open by Saltfault, a two-person team; bug reports and feedback are welcome.
This is the main repo — you install it, and it installs the rest.
Install
Install the starling launcher — then it installs everything else. No Rust or compiler needed.
Windows (PowerShell):
irm https://forgejo.hearthhome.lol/Saltfault/Starling/raw/branch/main/install.ps1 | iex
Linux / macOS:
curl -sSfL https://forgejo.hearthhome.lol/Saltfault/Starling/raw/branch/main/install.sh | bash
Then use it to install the components you want:
starling install tui # terminal client (chat, voice, video)
Roosts are built into the launcher — no separate install needed. Create one with starling roost create <name> and it runs in the background. See Roosts below.
The launcher downloads prebuilt binaries — no compilation.
Run starling-tui to launch the client.
Upgrade everything: starling update. Uninstall: starling tui uninstall.
Building from source? You need Rust and a C compiler. See the per-platform setup in Starling-TUI.
Where do I go?
| I want to… | Go here |
|---|---|
| Use Starling right now (chat, voice, video) | Install above, then see Starling-TUI for usage |
| Run my own community server | starling roost create <name> — roosts are built-in, no separate server needed |
| Build a client on the protocol | Starling (this repo) is the shared library |
| Follow the future GUI / mobile / web apps | Desktop · Android · Web (all planned) |
The repositories
| Repo | What it is | Status |
|---|---|---|
| Starling (this) | Project hub + shared library — protocol, crypto, networking, roost server | 🚧 Active |
| Starling-TUI | Terminal client | 🚧 Active — text, voice, video |
| Starling-Server | ⚠️ Deprecated — roost server moved to core (v0.6.0+). This crate is backward-compat only. | 📦 Deprecated |
| Starling-Desktop | Native GUI client | 📋 Planned |
| Starling-Android | Android client | 📋 Planned |
| Starling-Web | Browser (WASM) client | 📋 Planned |
The vocabulary
Starling uses a handful of bird terms, and only where they carry weight. Everything else keeps its ordinary networking name.
| Word | Meaning |
|---|---|
| Starling | The whole platform |
| The murmuration | The peer-to-peer network itself — thousands of leaderless birds, each reacting only to its neighbors, exactly like the gossip mesh underneath |
| Bird | A single node / user |
| Flock | A room — one gossip topic, one shared encryption key. Hatched by one bird, joined by its invite code |
| Roost | A bird that stays online to keep a community's history and channels |
| Chirp | A private message sealed to a single bird |
How it works, briefly
- Hatching a flock — a bird runs the client; its persistent node ID becomes the room code (e.g.
BIRD-00CCFF-…). The gossip topic and the E2E key both derive from that code, so sharing the code is sharing membership. - Joining — another bird enters the same code, subscribes to the same topic, derives the same key. iroh's relay + hole-punching connects them across the internet with no addresses exchanged.
- Text rides gossip; voice rides QUIC datagrams (drop-if-late); video rides QUIC uni-streams (JPEG frames). History for latecomers rides QUIC bi-streams.
- Encryption — gossip text is end-to-end encrypted with ChaCha20-Poly1305; voice and video are E2E via QUIC TLS 1.3. Relays forward ciphertext they can't read.
- Flocks vs roosts — a flock is joinable by anyone holding its code; a roost is a persistent, self-hosted community whose access becomes identity-gated (invited birds only) as roles land.
Protocol at a glance
| Layer | Protocol | Purpose |
|---|---|---|
| Transport | QUIC (via iroh) | Peer connections, NAT traversal, relay fallback |
| Chat | Gossip (iroh-gossip) | Broadcast text to the flock |
| Voice | QUIC datagrams | Low-latency Opus audio |
| Video | QUIC uni-streams | JPEG frames from the webcam |
| Sync | QUIC bi-streams | History backfill for late joiners |
| Encryption | ChaCha20-Poly1305 | E2E for gossip text |
| Identity | Ed25519 (iroh) | Persistent node identity |
| Serialization | postcard | Compact binary encoding |
Audio: 48 kHz stereo Opus, 20 ms frames, with a 2-second jitter buffer. Video: webcam via nokhwa (Media Foundation / AVFoundation / V4L2), JPEG frames rendered as terminal half-blocks.
Roadmap
| Phase | Feature | Status |
|---|---|---|
| 0 | Foundations — module layout, channels, logging | ✅ Shipped |
| 1 | Text chat in a flock | ✅ Shipped |
| 2 | Voice calls (Opus + QUIC datagrams) | ✅ Shipped |
| 3 | E2E encryption & profiles | ✅ Shipped |
| 4 | Video in the terminal | ✅ Shipped |
| 5 | Presence & history sync | 🚧 In progress |
| 6 | Many flocks at once | 🚧 In progress |
| 7 | Roosts: persistent servers & channels | 🚧 In progress |
| 8 | Roles & permissions (invite-only roosts) | 📋 Planned |
| 9 | Cryptographic identity — signing, chirps | 🚧 In progress |
| 10 | Own the murmuration — self-hosted relays | 📋 Planned |
License
Apache 2.0