Signal Land Line

January 20, 2021

Goal: set up a Signal instance with no smartphone.

Both times I’ve set up a Signal instance tied to a land-line I’ve had to look things up. This post is aimed at future-me for the third time I do it.

Signal uses phone-numbers to identify users. This can seem to go against the notion of a “private communication system” (since often people conflate “privacy” and “anonymity”) however it does come with an advantage: you already have a contact-list consisting of phone numbers (more about this on Signal’s blog). Luckily, Signal supports sending one-time codes via voice calls so we can use any phone number (not only SMS-capable ones). For more, see “Technical Background” below.


We want a Signal install that uses a land-line phone number. We will use Signal Desktop for messaging.


  1. A phone number. This can be any phone number (within the bounds of whatever Signal will make calls to) and it doesn’t have to support SMS texts.
  2. An installed signal-cli which will serve as our “main” instance. (In a “normal” Signal install, the “main” instance is on your smartphone).
  3. An installed Signal Desktop on your preferred computer (this could be the same computer as signal-cli is on, or a different one).

Follow the install steps for both above. This should leave you with signal-cli and signal-desktop in your $PATH.

Registering and Setup

We will now register our telephone number with Signal (using signal-cli). This will cause Signal to phone us on the number and read a temporary code. We then use signal-cli to confirm that number (thus showing Signal we do indeed control that phone number). We have now made an account using signal-cli. Next we pair this to our Desktop install.

I will assume that signal-cli is in your $PATH and that all the defaults are fine (this stores data in ~/.local/share/signal-cli on my Debian system).

Signal uses international formats for all phone numbers. For North Americans, that means a number normally written like (587) 555-1234 looks like +15875551234. Anywhere a “username” is mentioned by signal-cli, that is your own phone number (in international format).

Register the Phone Number

$ signal-cli -u +15875551234 register --voice

This will cause Signal to phone you (on (587) 555-1234) in this example) and read a short code. Lets say the code was 888777. Next step is to confirm that:

$ signal-cli -u +15875551234 verify 888777

If you want to set a “registration PIN”, add --pin 1234 (for example). This would prevent anyone who doesn’t know the PIN from registering this number in the future. (For more information, consult Signal PIN information on Signal’s support site).

If you get a message about needing a CAPTCHA, you need to visit and use dev-tools to dig out the signalcaptcha://<token> token to pass to --captcha in the register step. See signal-cli docs for more.

Test It

$ signal-cli -u +15875551234 send -m "testing my signal install" -r +15875551111

This will send a message to (587) 555 1111 (assuming they are on Signal as well). It should print out some ID number of the message. To receive any read-receipt or reply, run:

$ signal-cli -u +15875551234 receive -t -1

(The -1 means “forever” so ctrl-c to stop it). For bonus points, you can set your name and avatar so contacts can recognize you more easily:

$ signal-cli -u +15875551234 updateProfile --name "meejah" --avatar ~/avatar.png

Pair with Signal Desktop

When you start a freshly-installed Signal Desktop, it should be showing a QR code and offering to pair. It will look something like this:

screenshot for Signal Desktop from their documentation

Normally, you’d take a picture of that QR code with your phone’s Signal app. In this case, signal-cli is our “app”. The QR code decodes to a URI. So, we need to take a screenshot of the QR code and decode it. The GIMP is an easy way to take a screenshot (File > Create > Screenshot…). Export it as a png.

On Debian, apt instal zbar-tools provides the zbarimg binary, which can decode the QR code:

$ zbarimg ~/screenshot.png
scanned 1 barcode symbols from 1 images in 0.06 seconds

Now we cut out the URI, starting at tsdevice:/ and run signal-cli addDevice:

$ signal-cli -u +15875551234 addDevice --uri 'tsdevice:/?uuid=f8xFyUdXap4mSrTwuuSMaA&pub_key=BbRMJm%2FCTr5HrhRb9dJeVUD2EjrmZU3usYJ7x%2BBcPvpX'

Remember to quote the URI part, because there are &’s in it. Now that we have things paired, Signal Desktop can be used as normal. It may be important to run signal-cli -u ... receive -t 1 occasionally (I don’t know that though, as I do routinely use the CLI).

We’re done!

Technical Background (optional)

The guts of the Signal encryption system is a private key-pair. Technically, this means that any Signal install can be tied to any username. Since a Signal “username” is actually just a phone number (that you control) this makes it possible to register a land-line, as in this post. Thanks to the ability to add a “registration PIN” now, you don’t even have to maintain control of the number indefinitely.

In Canada, a good way to acquire a phone number cheaply is 7/11’s “SpeakOut” product. When I last looked, you could buy a $10 SIM card and $20 worth of “minutes” that take 365 days to expire. Thus for $30CAD you have a phone number you control for 1 year. If you add a “regisration PIN” then whomever gets it after you cannot register a new Signal account with it unless they know the PIN you set.

Update: a colleague points out the Tossable Digits service, which can probably be used as a source of number.

Although Signal themselves do not provide a command-line client, a developer has released one on GitHub which uses the libraries that Signal does release as open-source. This does not yet support so-called “new groups” so the latest features in “new groups” are not availble to any group you join (the invite link being one I know). It does, however, support most other things (including attachments, read-recepits, emoji reactions, …) and I use it as my main client on some computers.