Encrypted terminal conversations through a small Rust relay.
Ghostline pairs two terminal clients with a temporary invite key, exchanges encrypted profiles, and relays encrypted chat frames without giving the server message plaintext.
| Crate | Role |
|---|---|
ghostline-client |
Ratatui interface for creating and joining invites, choosing contacts, and chatting. |
ghostline-server |
Tokio TCP relay that pairs users by room key and forwards encrypted message frames. |
ghostline-core |
Shared operation codes, identifiers, room keys, frame sizes, and protocol helpers. |
| 🔐 Messages | Encrypted client-side with ChaChaBox; every message uses a fresh ephemeral key pair and nonce. |
| 🗄️ Local data | Friend information, room keys, chat keys, and history are protected with XChaCha20-Poly1305 using an Argon2-derived key. |
| 🌐 Relay | Routes room and message frames but does not decrypt chat contents. |
| 🧹 Secrets | Private and derived key material uses zeroization where implemented. |
Experimental: Ghostline has not been independently audited. The current handshake does not provide an out-of-band identity verification step, so do not treat this prototype as production-secure messaging.
Ghostline currently uses 127.0.0.1:1278, so start the relay and clients on the same machine.
cargo run -p ghostline-servercargo run -p ghostline-client -- --invitecargo run -p ghostline-client -- --join <invite-key>cargo run -p ghostline-client -- --talkRunning the client without arguments opens the interactive menu:
cargo run -p ghostline-client| Path | Contents |
|---|---|
~/.ghostline/user_id |
Persistent random user identifier. |
~/.ghostline/friend_ids.toml |
Encrypted friend store, room keys, chat keys, and message history. |
The client prompts for a storage password. For non-interactive local runs, it can be supplied through GHOSTLINE_STORAGE_PASSWORD; remember that environment variables may be exposed to other processes or tooling on the machine.
- The relay address is the compile-time
SERVE_IPconstant; there is no runtime config or deployment profile yet. - Rooms exist only in server memory and disappear when the relay restarts.
- Invite keys are temporary connection secrets and must be shared through a trusted channel.
- The protocol and stored-data format may change while the project is a prototype.
cargo fmt --all --check
cargo test --workspace
cargo clippy --workspace --all-targets