liblogosdelivery is no longer consumed as a prebuilt Nix package; waku-bindings compiles it from the Nim sources in its vendor submodule. The devShell drops the prebuilt package and LOGOS_DELIVERY_LIB_DIR and instead supplies that build's toolchain. CI checks out submodules recursively and caches the (slow, cold) Nim build on the submodule commit; the toolchain-only jobs exclude every crate that reaches the native lib, and format is scoped to workspace members so it never rewrites the vendored generated sources. Docs corrected along the way: the default transport is `file`, not logos-delivery, and chat-cli no longer carries its own build.rs or a logos_delivery transport module. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ai43sF2rymPFMG9iki9fwL
4.8 KiB
chat-cli
A terminal chat application built on top of libchat. End-to-end encrypted messaging in your terminal.
Building
The native logos-delivery
node is built from source by the waku-bindings submodule, so fetch it
recursively and build inside the dev shell (which supplies the Nim/C toolchain):
git submodule update --init --recursive
nix develop -c cargo build --release -p chat-cli
The binary lands at target/release/chat-cli. The first build compiles the whole
Nim tree and takes tens of minutes; later ones are incremental.
Transports
Both transports are compiled into the binary and selected at runtime via --transport:
Value (--transport) |
Description |
|---|---|
file (default) |
Shared directory; no network needed — great for local testing |
logos-delivery |
Embedded Waku node on the logos.dev network, one reliable channel per conversation |
Quick start
Run two instances in separate terminals:
# Terminal 1
cargo run -p chat-cli -- --name alice --port 60001
# Terminal 2
cargo run -p chat-cli -- --name bob --port 60002
For local-only testing without any network dependency, use the file transport:
# Terminal 1
cargo run -p chat-cli -- --name alice --transport file
# Terminal 2
cargo run -p chat-cli -- --name bob --transport file
Establishing a connection
- In Alice's terminal, type
/intro— the bundle is copied to your clipboard automatically. - In Bob's terminal, type
/connect <paste bundle here>. - Bob's "Hello!" message appears in Alice's terminal. Both can now chat.
Optional: KeyPackage registry
When --registry-url <url> is set, the client publishes its MLS KeyPackage
to the keypackage-registry
service on startup so other clients can later fetch it by account_id. Without
the flag, an in-memory registry is used and is only visible inside the local
process.
# Terminal 1 — registry server (from a chat-store checkout)
cargo run -- --bind 127.0.0.1:18080
# Terminal 2 / 3 — chat clients pointing at it
cargo run -p chat-cli -- --name alice --transport file \
--registry-url http://127.0.0.1:18080
cargo run -p chat-cli -- --name bob --transport file \
--registry-url http://127.0.0.1:18080
The registry is a throwaway testnet helper; v0.3 replaces it with a λLEZ-based discovery service.
Options
| Flag | Default | Description |
|---|---|---|
--transport <kind> |
logos-delivery |
Transport to use (logos-delivery or file) |
--data <dir> |
tmp/chat-cli-data |
Data directory (UI state and default SQLite path) |
--db <path> |
<data>/<name>.db |
SQLite file for persistent identity |
--preset <name> |
logos.dev |
logos-delivery network preset |
--port <n> |
60000 |
TCP port for the embedded logos-delivery node |
--registry-url <url> |
(unset) | Use the HTTP-backed keypackage-registry at this URL instead of the in-memory registry |
--log-file <path> |
(stderr, off) | Write logs to a file instead of stderr |
Commands
| Command | Description |
|---|---|
/help |
Show available commands |
/intro |
Generate your introduction bundle (copies to clipboard) |
/connect <bundle> |
Connect to a user using their introduction bundle |
/chats |
List all established chats |
/switch <user> |
Switch active chat |
/delete <user> |
Delete a chat session |
/status |
Show identity and connection info |
/clear |
Clear current chat's message history |
/quit · Esc · Ctrl+C |
Exit |
Storage
All data lives under tmp/chat-cli-data/ by default (override with --data):
| Path | Contents |
|---|---|
<name>.db |
SQLite — identity keys, ratchet state, chat metadata (encrypted) |
<name>_state.json |
UI state — message history, active chat |
transport/<name>/ |
Inbox directory watched for incoming messages (file transport only) |
The SQLite database can be inspected with DB Browser for SQLite: password chat-cli, cipher SQLCipher 4 defaults.
Architecture
bin/chat-cli/
└── src/
├── main.rs entry point, CLI arg parsing, runtime transport dispatch
├── app.rs application state and command handling
├── ui.rs ratatui terminal UI
├── utils.rs shared helpers
├── transport.rs module declarations
└── transport/
└── file.rs file-based transport
The logos-delivery transport is not part of this crate: it lives in
extensions/embedded-logos-delivery,
which maps each conversation onto a reliable channel and links the native node
through waku-bindings.