mrkeyoor.com_
Tue 01 Sept 17:43 UTC
Self-Hostedevaluationupdated 23 Aug 2026

signal-cli-rest-api review

signal-cli-rest-api puts an HTTP API around signal-cli so software can register or link a Signal account, send and receive messages, manage groups, and handle attachments. It solves the awkward job of connecting ordinary web services and automation to Signal through a containerized service.

+10stars / 7d
Verdict

Use signal-cli-rest-api when you specifically need a self-hosted HTTP boundary around Signal and accept responsibility for the account, keys, receiving loop, and network security. The API breadth, clear execution modes, recent repository activity, and successful build make it a credible starting point. It is not a managed messaging product, and the small measured test count means production teams should add their own end-to-end checks before trusting important notifications to it.

We ran it

Install✓ · 35s111 packages
Build✓ · 92s
Tests✓ · 17s2 passed · 0 failed of 2 (go test)
Repo200 files~14,335 lines of source · 1725.9 MB · 5 CI workflows

Answers from our run

Does signal-cli-rest-api build from source?

Dependencies installed in 35 seconds (111 packages), and the build succeeded in 92 seconds. We cloned commit a08db23 into a clean Debian container with 3 CPUs and no project-specific setup.

Do signal-cli-rest-api's tests pass?

Yes: 2 of 2 passed when we ran the project's own test command (go test). Some failures need services or credentials a bare container does not have.

Who should not use signal-cli-rest-api?

People seeking an official Signal business API, because this is a community wrapper around signal-cli

What are the alternatives to signal-cli-rest-api?

signal-cli, signald, mautrix-signal. Use signal-cli-rest-api when you specifically need a self-hosted HTTP boundary around Signal and accept responsibility for the account, keys, receiving loop, and network security.

Setup4/5Quick Docker path, but account linking and persistent state add work
Docs4/5Good quick start, mode guidance, Swagger, and examples
Community4/52,785 stars and a push one week before review
Maturity4/5Broad feature set and active work, with integration risk remaining

Who it’s for

Self-hosters who need to connect an internal service to Signal
Developers building alerts, bots, or operational messaging around a dedicated Signal account
Teams comfortable securing a Docker service and preserving sensitive account state

Who it’s NOT for

People seeking an official Signal business API, because this is a community wrapper around signal-cli
Anyone unwilling to operate a stateful service containing account keys and registration data
Teams that expect authentication, public-internet hardening, and managed delivery guarantees out of the box
Simple personal automations where maintaining a messaging bridge costs more than it saves

Setup reality

In our fresh Debian sandbox, installation succeeded in 35 seconds with 111 packages installed, the build succeeded in 92 seconds, and the test run succeeded in 17 seconds with 2 tests passed and none failed. That is a clean result, but the checkout was 1725.9 MB and the repository had no Dockerfile in our measured snapshot, even though the README presents a single Docker command as the main path. Real deployment also means linking or registering a number, mounting persistent Signal configuration, choosing an execution mode, deciding how receiving works, and protecting the HTTP endpoint and cryptographic state.

Why this project exists

Signal is designed as a private messaging application, not as a conventional business messaging platform with a first-party REST API. signal-cli-rest-api fills that gap by putting an HTTP service around signal-cli. Instead of teaching every internal tool how to invoke a command-line client or speak its daemon protocol, you can call familiar endpoints to register or link an account, send and receive messages, work with groups, manage attachments, and update a profile.

That boundary is useful. A monitoring system, home server, or internal application can treat Signal as another delivery channel while the container owns the details of the underlying client. The project is MIT-licensed, written primarily in Go, and has 2,785 GitHub stars. It is still an unofficial route into Signal, however. You are operating a real Signal account through community software, not buying a supported messaging service with contractual guarantees.

What happened when we ran it

We cloned commit a08db23 into a fresh, unprivileged Debian container with three CPUs and 8 GB of RAM. Installation succeeded in 35 seconds and installed 111 packages. The build then succeeded in 92 seconds. Tests completed successfully in 17 seconds, with two tests passing and none failing.

Those are reassuring basics: the source installed, compiled, and passed the tests it exposed in our environment. They are not evidence of message delivery speed or production reliability, and we did not measure either. The repository contained 200 files and about 14,335 lines of source, while the checkout occupied 1725.9 MB. We found five CI workflow files, no Dockerfile, and no tests directory. The successful test command only exercised two tests, so the green result is a useful smoke signal rather than deep coverage of registration, linking, delivery, attachments, groups, and receiving behavior.

What it gets right

The README starts with a practical deployment story. You create a host directory for configuration, run the published container with port 8080 exposed, and mount the Signal configuration directory so upgrades do not force account registration again. It then walks through linking the service as a secondary device with a QR code and sending a test message through /v2/send. That sequence is much more useful than documentation that stops at compilation.

The execution modes are also explained with unusually clear tradeoffs. normal starts the Java client for each request and is described as the slowest. native invokes a precompiled GraalVM binary per call, with lower latency and memory use but an explicit stability warning and an ARMv7 fallback. json-rpc keeps a JVM process alive for speed at the cost of resident memory, while json-rpc-native combines a native binary with daemon operation. The table is qualitative, not a benchmark, but it gives operators a sensible starting point.

Feature coverage goes beyond sending text. The documented surface includes multiple recipients and groups, attachments, receiving, device linking, group creation and removal, attachment serving and deletion, and profile updates. Swagger documentation and a text examples file provide two ways to explore the API. The README also points to community libraries and a separate secured gateway, useful signs that people have built around the service rather than merely starred it.

Rough edges and operational risks

The easy Docker command hides a stateful and security-sensitive system. The mounted configuration contains the account password and cryptographic keys. Exposing port 8080 beyond a trusted network without authentication, authorization, TLS termination, rate limits, and careful logging would be reckless. The README excerpt does not present those controls as built-in guarantees, so plan to supply them through a reverse proxy, gateway, firewall, or private network.

Receiving needs deliberate design. In normal and native modes, the project recommends calling receive regularly and offers AUTO_RECEIVE_SCHEDULE. It also warns that scheduled receiving can fetch messages before your own receiver handles them, potentially making messages appear lost to that workflow. That is not a minor toggle. Decide whether polling, scheduled receipt, or daemon behavior owns consumption, then test restarts and duplicate handling.

The measured source snapshot also deserves caution. It built cleanly, but two passing tests are thin assurance for a bridge that holds identity keys and sits in a notification path. The missing Dockerfile in our checkout is notable because the public image is central to the documented experience. Users building or auditing images from source should verify how the published artifact is assembled and pinned.

Project health and release picture

The latest listed release is 0.100 from June 11, 2026, and the repository was pushed on August 16, only a week before this review. That combination looks active; the release tag is not the last sign of maintenance. There are 145 open issues, a meaningful backlog that could represent both adoption and support load. Check issues for your exact endpoint, platform, and execution mode before committing, especially around upstream signal-cli changes.

Where it fits

In a real stack, place this service behind a private API boundary. Let an application or job queue submit sends, persist its own delivery intent, and treat Signal responses as integration results rather than durable business records. Keep the Signal configuration on encrypted, backed-up storage with tight filesystem permissions, and test recovery before upgrades. Monitoring should cover container health, receive-loop health, failed API calls, and upstream compatibility.

Choose signal-cli directly when a local process can invoke commands or JSON-RPC without another network service. Choose mautrix-signal when the goal is specifically bridging Matrix and Signal. For a general self-hosted REST interface, this project remains the most direct shape: capable, understandable, and active, but only as dependable as the security and operational work you put around it.

Alternatives

ProjectWhat it isPick it when
signal-cliThe command-line Signal client that this REST wrapper uses underneath.pick this instead when a local command or native JSON-RPC integration is enough and you do not need an HTTP layer.
signaldA daemon-oriented unofficial Signal interface intended for other applications.pick this instead when you want to integrate with a daemon protocol directly and are prepared to evaluate its current maintenance status and API fit.
mautrix-signalA bridge focused on connecting Signal conversations with Matrix.pick this instead when your actual goal is a Signal-to-Matrix bridge rather than a general REST endpoint.

What people are saying

  1. [github-trending] bbernhard/signal-cli-rest-api

Sources

  1. signal-cli-rest-api GitHub repository
  2. signal-cli-rest-api documentation

More self-hosted reviews

v2 · OpenShell · wigolo · Mindwtr · club-3090 · reclip · the whole board →