Five Years Later: Signal Land Line
April 01, 2026
In our previous episode we had set up a Signal instance tied to a land-line by using the signal-cli software. How’s that going?
What is signal-cli
Signal publishes open-source libraries that implement their protocols. These libraries are mostly in Java.
The author of signal-cli has taken these libraries and written command-line code on top so that one can directly use Signal from a normal computer, using the CLI.
This is not problem-free: I’ve usually had to hand-install a newer version of OpenJDK than Debian ships with (even Trixie, currently).
Another issue can be that the way Signal works changes, necessitating a change in workflow.
How is Phone-Free Signal?
Since the 2021 post was written, I’ve used several different Signal instances. One of these was tied to a land-line; another was tied to a more ephemeral / throw-away number I rented for a while.
For the most part, this has functioned well.
My normal work-flow is to almost exclusively use Signal Desktop and periodically run signal-cli to appease the Signal servers. Signal needs the “primary” account / instance (that’s usually your phone, but in this case is the signal-cli instance) to connect “often”.
This is not a bad thing, but it can be inconvenient.
Signal has been issuing warnings that show up in Signal Desktop as a yellow box saying “connect your main instance more often”. It is not made clear what the definition of “often” is (and I believe it has been changing / shortening).
Oh No
Yes that was foreshadowing; I did indeed fail to run signal-cli “often enough”. I don’t of course know precisely what criteria Signal uses to de-register accounts, but I did end up losing mine.
One piece of data is that I failed to run my “main instance” between March 23 and April 1. A notification showed up in Signal Desktop saying I had to re-pair Signap desktop.
This failed, with an error to “re-register”. Since I’ve since lost control of the phone number used to register that particular instance, that account is lost.
More Refined Approach
I’ve since set up another instance, on a phone number I intend to control indefinitely. The workflow as of today is fairly well documented in signal-cli’s README. Here are my notes of the exact procedure I followed.
Setup Softaware
- archived previous Signal Desktop install (moved data out of
~/.config/Signal) - choose a place for everything (
~/signalsay) - install OpenJDK 26 in
~/signal/jdk-26 - install
signal-cliin~/.config/signal-cli-0.14.1 - create
~/signal/READMEdocumenting this setup - create
~/signal/configfor signal-cli’s config - create a
~/signal/signal.shshell-script to run things
#!/usr/bin/bash
export PATH=~/signal/jdk-26/bin:$PATH
export JAVA_HOME=~/signal/jdk-26
~/signal/signal-cli-0.14.1/bin/signal-cli -a '+1234567890' --config ~/signal/config "$@"
- (from now on we assume
signal.shrefers to the above) - note that
+1234567890is your account identifier, the full international version of your phone number - for Canada (and America) that’s+18005551234for example for “1 (800) 555-1234”
Also assume you have Signal Desktop installed.
Register With Signal
To actually register and start using this setup via a voice-only telephone line:
signal.sh register- this likely needs a captcha, so visit signalcaptchas.org as per signal-cli instructions
- note: it seems you DO need to get this error first, don’t try with a CAPTCHA immediately
signal.sh register --captcha 'signalcaptcha://....'- (wait a bit)
- likely get an error “StatusCode: 400 (InvalidTransportModeException)” if your phone doesn’t support SMS
- wait 60s
- try again with “voice” registration (again, don’t go straight to this you need the above error first)
signal.sh register --voice- (may or may not need a new CAPTCHA here too)
- you should receive a voice call, which will read you a 6-digit number in English
signal.sh verify 123456
This should complete the registration process. You can confirm by sending a message with signal.sh send -m "hello from signal-cli" +18005551234
Make Sure We Update
One very important thing to get right now is to set up Cron (or whatever you prefer) to receive messages at least once per day. For example, a crontab entry like:
@daily ~/signal/signal.sh receive -t 1
This will wait up to 1 second to find new message to fetch.
Signal Desktop
Actually reading and using Signal via signal-cli is not great – and of course it’s not meant for this necessarily. There are other tools which work with signal-cli if you don’t want to use Signal’s official desktop client; see that project for more.
Once you start Signal Desktop for the first time, it’ll have a screen showing nothing but a QR code and instructions to scan this with your phone app to pair it.
Instead, we do this:
- take a screenshot of the QR code
- use
zbarimg ~/Screenshots/Screenshot\ From\ 2026*.pngto extract the"sgnl://"link - copy the part starting with
sgnl:// signal.sh addDevice --uri 'sgnl://linkdevice?uuid=...'- Signal Desktop should now say something about sync’ing contacts
~/signal/signal.sh sendContacts- We set up some other nice-to-haves:
~/signal/signal.sh updateProfile --avatar ~/me.png~/signal/signal.sh updateProfile --given-name meejah- Rename our newly paired Signal Desktop to
"desktop" ~/signal/signal.sh listDevices~/signal/signal.sh updateDevice -d 2 -n desktop
Operational Take-a-Ways
While it was fun operating for several years on a phone number that “wasn’t mine” this obviously has sustainability limits. Namely: yes, you can lose your account.
It is also important to have more than one “Admin” in group chats; if the one admin user is no longer available / viable, it’s harder to do things in those groups. (I do not yet know what happens longer term to the few groups I have with the lost account as sole admin).
Comparing Safety Numbers
There is no UX I can find in Signal Desktop that will show you a safety number.
The only good way to show safety numbers in signal-cli seems to be with ~/signal/signal.sh listIdentities
Make sure you’re reading the “Safety Number” listed under your contact’s number / username and not your own! Half of the digits will be the same, but the other half won’t match (which should be cause for concern).
When reading someone else’s “Safety Number” it’s actually partially yours, and partially theirs – so in the listing signal-cli shows you (under your own number) is just your numbers repeated twice.
Any feedback? You can reply on this Mastodon toot if you like.
txtorcon
carml
cuv’ner