AsamK/signal-cli
Productivity & UtilitiesCommand-line, JSON-RPC and D-Bus client for registering and messaging on Signal, aimed at servers and automation.
Overview
signal-cli is an unofficial command-line client for the Signal messenger that can register a number, verify it, link an existing account, send and receive messages, and run as a daemon exposing JSON-RPC and D-Bus interfaces. It is built on a patched libsignal-service-java client library extracted from the Signal-Android source. The documented primary use case is notifying server admins about events, though the client also serves users who want Signal without a smartphone.
Besides one-shot commands, the daemon exposes JSON-RPC with a small Rust example client and a D-Bus interface. The protocol expects incoming messages to be received regularly; the documentation says that keeps encryption efficient and delivers group, expiration-timer and other updates.
Install and first run
You need at least JRE 25 and the bundled native libsignal-client libraries; prebuilt binaries are bundled for x86_64 Linux (with recent enough glibc), Windows and macOS. Download the latest bundled archive (JVM or GraalVM native Linux build), or build it yourself with Gradle. Steps for other architectures are covered in the native-library wiki page. The README offers a system-wide Linux install recipe that resolves the latest release tag and extracts into /opt; run it only if that layout suits your machine.
With the binary on PATH, the minimal flow is:
- Link an existing account:
signal-cli link, or register a new number:signal-cli -a ACCOUNT register, whereACCOUNTis the international phone number starting with+. Registering unregisters any existing client on that number. - Verify with the code received by SMS or voice:
signal-cli -a ACCOUNT verify CODE(add--pin PIN_CODEif the account has a PIN). - Send:
signal-cli -a ACCOUNT send -m "This is a message" RECIPIENT. Usernames are prefixed withu:. Message content can also come from stdin with--message-from-stdin. - Receive:
signal-cli -a ACCOUNT receive, or run the daemon to keep receiving continuously.
Landline numbers cannot receive SMS; the README describes a voice-call fallback using --voice after an initial SMS attempt fails, and points to a captcha registration page when challenged.
Constraints and caveats
This is an unofficial client; the project says it must be kept up to date because official clients expire after three months and the server may then make incompatible changes, so releases older than three months may work incorrectly. Registration is tied to a phone number able to receive SMS or calls, and registering from signal-cli displaces existing clients on that number. Credentials, including the password and cryptographic keys, are stored under the user's home directory in $XDG_DATA_HOME/signal-cli/data/ (or $HOME/.local/share/signal-cli/data/). The project is licensed GPL-3.0 and bundles code derived from Open Whisper Systems' libsignal-service-java.
HN discussion has raised whether non-official clients are permitted to connect to Signal servers. One commenter characterizes it as a terms-of-use restriction on the network service rather than a license restriction, and notes that signal-cli uses a fork of the Android client library. Treat this as a discussion point to verify against Signal's current terms, not as a statement from the project.
HotRepo's take
On the 2026-11-09 Java daily list, signal-cli recorded a No. 7 best position with 3 stars gained, showing that a longstanding utility still surfaces in the language ranking. The older HN threads (2017 and 2021) focused on the unusual role of a CLI client for a phone-centric messenger, with a 2021 commenter describing five years of use to keep Signal without a smartphone. These records indicate sustained niche interest rather than a recent surge; the single snapshot is not enough to call a trend.
HotRepo's take
language list, not the all-language daily ranking.
Written by AI from the project's README, updated . The project's own docs are the source of truth.