signal-cli was primarily developed to be used on servers to notify admins of important events.
For this use-case, it has a dbus interface, that can be used to send messages from any programming language that has dbus bindings.
+For some functionality the Signal protocol requires that all messages have been received from the server.
+The `receive` command should be regularly executed. In daemon mode messages are continuously received.
+
== Options
*-h*, *--help*::
*-v*, *--version*::
Print the version and quit.
+*--verbose*::
+Raise log level and include lib signal logs.
+
*--config* CONFIG::
Set the path, where to store the config.
Make sure you have full read/write access to the given directory.
Specify your phone number, that will be your identifier.
The phone number must include the country calling code, i.e. the number must start with a "+" sign.
+This flag must not be given for the `link` command.
+It is optional for the `daemon` command.
+For all other commands it is only optional if there is exactly one local user in the
+config directory.
+
*--dbus*::
Make request via user dbus.
*--dbus-system*::
Make request via system dbus.
+*-o* OUTPUT-MODE, *--output* OUTPUT-MODE::
+Specify if you want commands to output in either "plain-text" mode or in "json". Defaults to "plain-text"
+
+*--trust-new-identities* TRUST-MODE::
+Choose when to trust new identities:
+- `on-first-use` (default): Trust the first seen identity key from new users,
+ changed keys must be verified manually
+- `always`: Trust any new identity key without verification
+- `never`: Don't trust any unknown identity key, every key must be verified manually
+
== Commands
=== register
Use "updateAccount" to undo this.
To remove a linked device, use "removeDevice" from the master device.
+*--delete-account*::
+Delete account completely from server. Cannot be undone without loss. You will
+have to be readded to each group.
+
+CAUTION: Only delete your account if you won't use this number again!
+
=== updateAccount
Update the account attributes on the signal server.
=== link
Link to an existing device, instead of registering a new number.
-This shows a "tsdevice:/…" URI. If you want to connect to another signal-cli instance, you can just use this URI. If you want to link to an Android/iOS device, create a QR code with the URI (e.g. with qrencode) and scan that in the Signal app.
+This shows a "tsdevice:/…" URI. If you want to connect to another signal-cli instance, you can just use this URI.
+If you want to link to an Android/iOS device, create a QR code with the URI (e.g. with qrencode) and scan that in the Signal app.
*-n* NAME, *--name* NAME::
Optionally specify a name to describe this new device.
Only works, if this is the master device.
*--uri* URI::
-Specify the uri contained in the QR code shown by the new device. You will need the full uri enclosed in quotation marks, such as "tsdevice:/?uuid=....."
+Specify the uri contained in the QR code shown by the new device.
+You will need the full uri enclosed in quotation marks, such as "tsdevice:/?uuid=....."
=== listDevices
-Show a list of connected devices.
+Show a list of linked devices.
=== removeDevice
-Remove a connected device.
+Remove a linked device.
Only works, if this is the master device.
-*-d* DEVICEID, *--deviceId* DEVICEID::
+*-d* DEVICE_ID, *--device-id* DEVICE_ID::
Specify the device you want to remove.
Use listDevices to see the deviceIds.
+=== getUserStatus
+
+Uses a list of phone numbers to determine the statuses of those users.
+Shows if they are registered on the Signal Servers or not.
+In json mode this is outputted as a list of objects.
+
+[NUMBER [NUMBER ...]]::
+One or more numbers to check.
+
=== send
Send a message to another user or group.
RECIPIENT::
Specify the recipients’ phone number.
-*-g* GROUP, *--group* GROUP::
+*-g* GROUP, *--group-id* GROUP::
Specify the recipient group ID in base64 encoding.
*-m* MESSAGE, *--message* MESSAGE::
*-a* [ATTACHMENT [ATTACHMENT ...]], *--attachment* [ATTACHMENT [ATTACHMENT ...]]::
Add one or more files as attachment.
-*-e*, *--endsession*::
+*--note-to-self*::
+Send the message to self without notification.
+
+*-e*, *--end-session*::
Clear session state and send end session message.
=== sendReaction
RECIPIENT::
Specify the recipients’ phone number.
-*-g* GROUP, *--group* GROUP::
+*-g* GROUP, *--group-id* GROUP::
Specify the recipient group ID in base64 encoding.
*-e* EMOJI, *--emoji* EMOJI::
*-r*, *--remove*::
Remove a reaction.
+=== sendReceipt
+
+Send a read or viewed receipt to a previously received message.
+
+RECIPIENT::
+Specify the sender’s phone number.
+
+*-t* TIMESTAMP, *--target-timestamp* TIMESTAMP::
+Specify the timestamp of the message to which to react.
+
+*--type* TYPE::
+Specify the receipt type, either `read` (the default) or `viewed`.
+
+=== sendTyping
+
+Send typing message to trigger a typing indicator for the recipient.
+Indicator will be shown for 15seconds unless a typing STOP message is sent first.
+
+RECIPIENT::
+Specify the recipients’ phone number.
+
+*-g* GROUP, *--group-id* GROUP::
+Specify the recipient group ID in base64 encoding.
+
+*-s*, *--stop*::
+Send a typing STOP message.
+
+=== remoteDelete
+
+Remotely delete a previously sent message.
+
+RECIPIENT::
+Specify the recipients’ phone number.
+
+*-g* GROUP, *--group-id* GROUP::
+Specify the recipient group ID in base64 encoding.
+
+*-t* TIMESTAMP, *--target-timestamp* TIMESTAMP::
+Specify the timestamp of the message to delete.
+
=== receive
Query the server for new messages.
-New messages are printed on standardoutput and attachments are downloaded to the config directory.
+New messages are printed on standard output and attachments are downloaded to the config directory.
+In json mode this is outputted as one json object per line.
*-t* TIMEOUT, *--timeout* TIMEOUT::
Number of seconds to wait for new messages (negative values disable timeout).
Default is 5 seconds.
*--ignore-attachments*::
Don’t download attachments of received messages.
-*--json*::
-Output received messages in json format, one object per line.
+
+=== joinGroup
+
+Join a group via an invitation link.
+
+*--uri*::
+The invitation link URI (starts with `https://signal.group/#`)
=== updateGroup
Create or update a group.
+If the user is a pending member, this command will accept the group invitation.
-*-g* GROUP, *--group* GROUP::
+*-g* GROUP, *--group-id* GROUP::
Specify the recipient group ID in base64 encoding.
If not specified, a new group with a new random ID is generated.
*-n* NAME, *--name* NAME::
Specify the new group name.
+*-d* DESCRIPTION, *--description* DESCRIPTION::
+Specify the new group description.
+
*-a* AVATAR, *--avatar* AVATAR::
Specify a new group avatar image file.
*-m* [MEMBER [MEMBER ...]], *--member* [MEMBER [MEMBER ...]]::
Specify one or more members to add to the group.
+*-r* [MEMBER [MEMBER ...]], *--remove-member* [MEMBER [MEMBER ...]]::
+Specify one or more members to remove from the group
+
+*--admin* [MEMBER [MEMBER ...]]::
+Specify one or more members to make a group admin
+
+*--remove-admin* [MEMBER [MEMBER ...]]::
+Specify one or more members to remove group admin privileges
+
+*--reset-link*::
+Reset group link and create new link password
+
+*--link* LINK_STATE::
+Set group link state: `enabled`, `enabled-with-approval`, `disabled`
+
+*--set-permission-add-member* PERMISSION::
+Set permission to add new group members: `every-member`, `only-admins`
+
+*--set-permission-edit-details* PERMISSION::
+Set permission to edit group details: `every-member`, `only-admins`
+
+*--set-permission-send-messages* PERMISSION::
+Set permission to send messages in group: `every-member`, `only-admins`
+Groups where only admins can send messages are also called announcement groups
+
+*-e* EXPIRATION_SECONDS, *--expiration* EXPIRATION_SECONDS::
+Set expiration time of messages (seconds).
+To disable expiration set expiration time to 0.
+
=== quitGroup
Send a quit group message to all group members and remove self from member list.
+If the user is a pending member, this command will decline the group invitation.
-*-g* GROUP, *--group* GROUP::
+*-g* GROUP, *--group-id* GROUP::
Specify the recipient group ID in base64 encoding.
+*--delete*::
+Delete local group data completely after quitting group.
+
=== listGroups
-Show a list of known groups.
+Show a list of known groups and related information.
+In json mode this is outputted as an list of objects and is always in detailed mode.
*-d*, *--detailed*::
-Include the list of members of each group.
+Include the list of members of each group and the group invite link.
+
+=== listContacts
+
+Show a list of known contacts with names.
=== listIdentities
=== updateProfile
-Update the name and avatar image visible by message recipients for the current users.
+Update the profile information shown to message recipients.
The profile is stored encrypted on the Signal servers.
-The decryption key is sent with every outgoing messages (excluding group messages).
+The decryption key is sent with every outgoing messages to contacts and included
+in every group.
+
+*--given-name* NAME, *--name* NAME::
+New (given) name.
+
+*--family-name* FAMILY_NAME::
+New family name.
+
+*--about* ABOUT_TEXT::
+New profile status text.
-*--name*::
-New name visible by message recipients.
+*--about-emoji* EMOJI::
+New profile status emoji.
-*--avatar*::
-Path to the new avatar visible by message recipients.
+*--avatar* AVATAR_FILE::
+Path to the new avatar image file.
*--remove-avatar*::
-Remove the avatar visible by message recipients.
+Remove the avatar
=== updateContact
*-n*, *--name*::
Specify the new name for this contact.
-*-e*, *--expiration*::
+*-e*, *--expiration* EXPIRATION_SECONDS::
Set expiration time of messages (seconds).
To disable expiration set expiration time to 0.
[CONTACT [CONTACT ...]]::
Specify the phone numbers of contacts that should be blocked.
-*-g* [GROUP [GROUP ...]], *--group* [GROUP [GROUP ...]]::
+*-g* [GROUP [GROUP ...]], *--group-id* [GROUP [GROUP ...]]::
Specify the group IDs that should be blocked in base64 encoding.
=== unblock
[CONTACT [CONTACT ...]]::
Specify the phone numbers of contacts that should be unblocked.
-*-g* [GROUP [GROUP ...]], *--group* [GROUP [GROUP ...]]::
+*-g* [GROUP [GROUP ...]], *--group-id* [GROUP [GROUP ...]]::
Specify the group IDs that should be unblocked in base64 encoding.
=== sendContacts
Send a synchronization message with the local contacts list to all linked devices.
This command should only be used if this is the master device.
+=== sendSyncRequest
+
+Send a synchronization request message to the master device (for group, contacts, ...).
+The master device will respond with synchronization messages with full contact and
+group lists.
+
=== uploadStickerPack
-Upload a new sticker pack, consisting of a manifest file and the stickers in WebP format (maximum size for a sticker file is 100KiB).
+Upload a new sticker pack, consisting of a manifest file and the sticker images.
+Images must conform to the following specification: (see https://support.signal.org/hc/en-us/articles/360031836512-Stickers#sticker_reqs )
+- Static stickers in PNG or WebP format
+- Animated stickers in APNG format,
+- Maximum file size for a sticker file is 300KiB
+- Image resolution of 512 x 512 px
+
The required manifest.json has the following format:
[source,json]
"title": "<STICKER_PACK_TITLE>",
"author": "<STICKER_PACK_AUTHOR>",
"cover": { // Optional cover, by default the first sticker is used as cover
- "file": "<name of webp file, mandatory>",
+ "file": "<name of image file, mandatory>",
+ "contentType": "<optional>",
"emoji": "<optional>"
},
"stickers": [
{
- "file": "<name of webp file, mandatory>",
+ "file": "<name of image file, mandatory>",
+ "contentType": "<optional>",
"emoji": "<optional>"
}
...
=== daemon
signal-cli can run in daemon mode and provides an experimental dbus interface.
+If no `-u` username is given, all local users will be exported as separate dbus
+objects under the same bus name.
*--system*::
Use DBus system bus instead of user bus.
Add member to a group::
signal-cli -u USERNAME updateGroup -g GROUP_ID -m "NEW_MEMBER"
+Accept a group invitation::
+signal-cli -u USERNAME updateGroup -g GROUP_ID
+
Leave a group::
signal-cli -u USERNAME quitGroup -g GROUP_ID
Trust new key, without having verified it. Only use this if you don't care about security::
signal-cli -u USERNAME trust -a NUMBER
+== Exit codes
+* *1*: Error is probably caused and fixable by the user
+* *2*: Some unexpected error
+* *3*: Server or IO error
+* *4*: Sending failed due to untrusted key
+
== Files
The password and cryptographic keys are created when registering and stored in the current users home directory, the directory can be changed with *--config*:
`$XDG_DATA_HOME/signal-cli/` (`$HOME/.local/share/signal-cli/`)
-For legacy users, the old config directories are used as a fallback:
-
- $HOME/.config/signal/
-
- $HOME/.config/textsecure/
-
== Authors
Maintained by AsamK <asamk@gmx.de>, who is assisted by other open source contributors.