signal-cli is a comprehensive command-line interface for the Signal messaging protocol, implemented primarily in Java (with a supplementary Rust JSON-RPC client). It operates as both an interactive CLI and a persistent daemon, exposing three API surfaces: standard CLI (argparse4j), JSON-RPC over Unix/TCP/HTTP sockets, and D-Bus. The core is a reusable library (`libsignal-cli`) that encapsulates Signal's cryptographic protocols (pre-keys, sender keys, end-to-end encryption, storage sync) against the Signal network. The daemon supports multi-account management, numberless (ACI-based) accounts, and device linking. Features include sending/receiving messages with attachments, stickers, polls, stories, reactions, voice/video calls (via an external tunnel binary), and full group management (v1/v2, invite links, permissions, bans). Persistence uses SQLite with a versioned migration scheme and HikariCP pooling. The architecture follows a layered pattern: entry commands → helper classes (business logic) → storage stores → network dependencies. The codebase is well-structured with clear separation of concerns, extensive unit tests, and reproducible build support (Docker, GraalVM native-image, Gradle).