Signal-cli service not working propably

I am having some problems setting up a working signal-cli service.

According to this guide Signal | Hermes Agent

curl http://127.0.0.1:9090/api/v1/check
# Should return: {"versions":{"signal-cli":...}}

BUT it return only an empty string !

I have chosen to run the server on port 9090 and with the user aia, but that is the only difference from the guide.

Here is my service config,I have hidden my phone number and name with *'s.

# cat /etc/nixos/signal-cli-service.nix 
{ config, pkgs, lib, modulesPath,... }:                                                                                                                                                                                                                         
   {                                                                                                                     
     environment.systemPackages = with pkgs; [                                                                           
       signal-cli                                                                                                 
     ];                                                                                                                  

  systemd.services.signal-cli-daemon = {
  wantedBy = [ "multi-user.target" ];
  after = [ "network.target" ];
  serviceConfig = {
    ExecStart = "${pkgs.signal-cli}/bin/signal-cli -a +45******** daemon --http 127.0.0.1:9090";
    User = "aia";
    #Restart = "always";
  };
};
networking.firewall.allowedTCPPorts = [ 9090 ];
}

Seem to start up fine.

[aia@cyberty:~]$ signal-cli  --config ~/.local/share/signal-cli -a +45******** daemon --http 127.0.0.1:9090
INFO  AccountHelper - The Signal protocol expects that incoming messages are regularly received.
INFO  DaemonCommand - Starting daemon in single-account mode for +45********
INFO  HttpServerHandler - Started HTTP server on /127.0.0.1:9090
Envelope from: “S****************” +45******** (device: 1) to +45********
Timestamp: 1776439481059 (2026-04-17T15:24:41.059Z)
Server timestamps: received: 1776439480732 (2026-04-17T15:24:40.732Z) delivered: 1776439599096 (2026-04-17T15:26:39.096Z)
Received a sync message
Received sync message with block list
Blocked:

Envelope from: “S****************” +45******** (device: 1) to +45********
Timestamp: 1776439481275 (2026-04-17T15:24:41.275Z)
Server timestamps: received: 1776439480963 (2026-04-17T15:24:40.963Z) delivered: 1776439599096 (2026-04-17T15:26:39.096Z)
Received a sync message

Envelope from: “S****************” +45******** (device: 1) to +45********
Timestamp: 1776439481293 (2026-04-17T15:24:41.293Z)
Server timestamps: received: 1776439480975 (2026-04-17T15:24:40.975Z) delivered: 1776439599096 (2026-04-17T15:26:39.096Z)
Received a sync message

Envelope from: “S****************” +45******** (device: 1) to +45********
Timestamp: 1776439481457 (2026-04-17T15:24:41.457Z)
Server timestamps: received: 1776439481101 (2026-04-17T15:24:41.101Z) delivered: 1776439599096 (2026-04-17T15:26:39.096Z)
Received a sync message

Envelope from: “S****************” +45******** (device: 1) to +45********
Timestamp: 1776439484379 (2026-04-17T15:24:44.379Z)
Server timestamps: received: 1776439484731 (2026-04-17T15:24:44.731Z) delivered: 1776439599096 (2026-04-17T15:26:39.096Z)
Received a sync message
Received complete sync contacts:

Envelope from: “S****************” +45******** (device: 1) to +45********
Timestamp: 1776439485709 (2026-04-17T15:24:45.709Z)
Server timestamps: received: 1776439485376 (2026-04-17T15:24:45.376Z) delivered: 1776439599096 (2026-04-17T15:26:39.096Z)
Received a sync message

Envelope from: “S****************” +45******** (device: 1) to +45********
Timestamp: 1776439621391 (2026-04-17T15:27:01.391Z)
Server timestamps: received: 1776439621096 (2026-04-17T15:27:01.096Z) delivered: 1776439621097 (2026-04-17T15:27:01.097Z)
Received a sync message

But

[aia@cyberty:/root]$ curl http://127.0.0.1:9090/api/v1/check

[aia@cyberty:/root]$

Can anyone help?

1 Like

Hi @Isomorph70, haven’t used signal-cli recently myself, but will try to help.

Have you looked at the service’s log? $ journalctl -u signal-cli-daemon

Also try to run it as user service, not system-wide. Just change it to systemd.user.service and remove the User = ….

Be aware that opening the port in the firewall would make the signal-cli daemon accessible for all other devices in your network. I guess that’s not needed?

If you’re looking at the second listing. It is a direct run of signal-cli as user aia, and even that, don’t work. The problem is there even without setting up the service. Meaning the curl command return the empty string. But there is not any error from the daemon.

Reminder for Signal that the mobile (Android/iOS) device is the primary device and must be updated and connected to the network approximately at least once per month, as it is the only device that can finalize version upgrade migrations.

1 Like

Some other checks, to run. Most of the app seems to run, but the http server still seems broken.

[aia@cyberty:~]$ signal-cli listAccounts
Number: +45*****4**

[aia@cyberty:~]$ signal-cli version
signal-cli 0.13.22

[aia@cyberty:~]$ source .hermes/.env

[aia@cyberty:~]$ signal-cli -a $SIGNAL_ACCOUNT version
User +45*****5** is not registered.  << found a bug in my setup here, but that did not fix the main problem

[aia@cyberty:~]$ signal-cli send --note-to-self -m 'Ping from Cyberty'
1776547118029

[aia@cyberty:~]$ (echo 'Test from';hostname ;date) | signal-cli send --note-to-self --message-from-stdin
1776599982039

Very strange. Nixos 25.11 should install signal-cli 0.14.2, according to Nixos.org
But install 0.13.22

[aia@cyberty:~]$ nixos-version 
25.11.8023.4590696c8693 (Xantusia)

[aia@cyberty:~]$ signal-cli version
signal-cli 0.13.22

4590696c8693 is the commit hash. nixpkgs/pkgs/by-name/si/signal-cli/package.nix at 4590696c8693fea477850fe379a01544293ca4e2 · NixOS/nixpkgs · GitHub shows 0.13.22. Update your flake/channels and rebuild.

After update the signal-version is now 0.14.2, but the main problem, still remain.

[aia@cyberty:~]$ signal-cli version
WARNING: A restricted method in java.lang.System has been called
WARNING: java.lang.System::loadLibrary has been called by org.signal.libsignal.internal.Native in an unnamed module (file:/nix/store/6vdlgfdv500jnlifcn7z9a7j854q938c-signal-cli-0.14.2/lib/libsignal-client-0.90.0.jar)
WARNING: Use --enable-native-access=ALL-UNNAMED to avoid a warning for callers in this module
WARNING: Restricted methods will be blocked in a future release unless native access is enabled

signal-cli 0.14.2

[aia@cyberty:~]$ 
[aia@cyberty:~]$ signal-cli daemon --http 127.0.0.1:9090
WARNING: A restricted method in java.lang.System has been called
WARNING: java.lang.System::loadLibrary has been called by org.signal.libsignal.internal.Native in an unnamed module (file:/nix/store/6vdlgfdv500jnlifcn7z9a7j854q938c-signal-cli-0.14.2/lib/libsignal-client-0.90.0.jar)
WARNING: Use --enable-native-access=ALL-UNNAMED to avoid a warning for callers in this module
WARNING: Restricted methods will be blocked in a future release unless native access is enabled

INFO  DaemonCommand - Starting daemon in multi-account mode
INFO  HttpServerHandler - Started HTTP server on /127.0.0.1:9090
Envelope from: “Svend H. Sørensen” +4571830478 (device: 1) to +4571830478
Timestamp: 1776766819742 (2026-04-21T10:20:19.742Z)
Server timestamps: received: 1776766818535 (2026-04-21T10:20:18.535Z) delivered: 1776772746111 (2026-04-21T11:59:06.111Z)
Received a sync message
[root@cyberty:/home/aia/.hermes/skills]# curl http://127.0.0.1:9090/api/v1/check

[root@cyberty:/home/aia/.hermes/skills]# curl http://127.0.0.1:9090/api/v1
<h1>404 Not Found</h1>No context found for request
[root@cyberty:/home/aia/.hermes/skills]# curl http://127.0.0.1:9090/api
<h1>404 Not Found</h1>No context found for request
[root@cyberty:/home/aia/.hermes/skills]# curl http://127.0.0.1:9090/
<h1>404 Not Found</h1>No context found for request
[root@cyberty:/home/aia/.hermes/skills]# 

Judging from the documentation you shouldn’t expect any output. It just returns 200 OK and an empty body.

GET /api/v1/check : Responds with 200 OK if daemon is running

See: signal-cli/man/signal-cli-jsonrpc.5.adoc at 417d2ce971c85f708fb255bd2773aba12afd19f5 · AsamK/signal-cli · GitHub

So I suspect that the demon is working as expected.

Yes the guide is wrong or old.

Run this test instead, and send a test message from you phone in note_to_self group.

[aia@cyberty:~]$ curl http://127.0.0.1:9090/api/v1/events
:
:
:
:
:
event:receive
data:{"envelope":{"source":"+45********","sourceNumber":"+45********","sourceUuid":"05f156d2-ae08-406c-aabe-0182b560730f","sourceName":"S*****************","sourceDevice":1,"timestamp":1776785715343,"serverReceivedTimestamp":1776785716812,"serverDeliveredTimestamp":1776785716813,"syncMessage":{"sentMessage":{"destination":"+45********","destinationNumber":"+45********","destinationUuid":"05f156d2-ae08-406c-aabe-0182b560730f","timestamp":1776785715343,"message":"Test 2 from sm","expiresInSeconds":604800,"isExpirationUpdate":false,"viewOnce":false}}},"account":"+45********"}

: