Note: For new registrations (both primary and secondary), beta.20+ is required.
Note: Groups properly work only in beta.19+
Note: Only beta.12+ works. Any older version can’t connect to the Signal servers at all!
Whisperfish is an advanced but unofficial Signal client. Whisperfish should be in a usable state for many users, but is still considered beta quality software ; make sure to always have the latest version! Also, check our Wiki and feel free to contribute to it! Currently, mimimum supported SailfishOS version is 3.4. We intend to keep compatibility with 3.3 for as long as humanly possible. The build for SailfishOS 3.x is located in a separate OpenRepos application.
Do not ever contact the Signal developers about a Whisperfish issue. You will annoy them and make them dislike us. Contact us instead (see below).
Why Signal, what’s so interesting about it? Watch me explain what I like and love about Signal, explained in Lausanne, October 2022, FIXME hackerspace.
Whisperfish is a project by volunteers. Lots of stuff works, lots of other stuff does not work. If you find something that does not work, file an issue or reply to this thread.
The list corresponds to the latest release (see release notes below).
- Sending a message to a user no longer using Signal doesn’t trigger the user-is-deleted detection
- Workaround: Manually refresh the users profile → user now shows up as unregistered
- Sending/receiving reactions don’t update the message bubble
- Workaround: Navigate to main menu and back to update reactions
- Previously installed emojis are not shown anymore
- This occurs when updating from beta.9 (or older) to beta.10 (or newer)
- Caused by version bump to Emoji 14
- Fix: Remove the old emojis and re-install the new set(s)
Sending the first message to a contact gives a 404 Not Found error:
- Use Signal Desktop to send the first message.
- Ask your contact via another way to send you the first message.
Creating groups, inviting new members, deleting members (planned for later)
Workaround: use Signal Desktop.
- Getting invited to a group. Ask to be added to the group instead.
Workaround: use Signal Desktop.
- Many other UI features are just stubs at this point.
- Typing notifications have been temporary removed
- Cover page unread count is not updated
- Registration if registration lock is enabled.
- Wait 7 days, or;
- Disable the registration lock on the old device in the Settings menu of the Signal app:
- For Android, this seems to be: Settings → Privacy → Registration lock,
- and for iOS this is seemingly: Account → Signal PIN → Registration lock.
The intention is to keep as many versions of SailfishOS supported for as long as possible. Some versions show bugs specific to that SailfishOS version. If it is not possible to upgrade to the version mentioned below, you can use the workarounds mentioned here.
Current highest tested SailfishOS version: SailfishOS 22.214.171.124
In principle, Whisperfish works on SailfishOS 3.3, except for registration. @direc85 keeps testing Whisperfish on Jolla Phone, which runs SailfishOS 3.4.
- Registration on SailfishOS 3.3. As a workaround, register on another device, and move over your data.
Since the release of SailfishOS 4.3, there has been an ABI-incompatible change between 3.x and 4.x. Whisperfish is now built separately for 3.x and 4.x, and both packages are available on OpenRepos. If Storeman cannot figure out the correct version for your 3.x installation, you can install Whisperfish via the commandline (after adding the repository):
zypper install harbour-whisperfish-0.6.0.beta.10-0.sf3.armv7hl
The Sailfish 4.x series introduced a few issues, and possibly new features; notably.
If the app behaves strangely or slow (I have a strong dislike for slow software) to you, please get in touch on Matrix #whisperfish:rubdos.be or on Libera.Chat #whisperfish, file an issue, or email whisperfish [at] rubdos [dot] be, or post on this forum thread. If it works well already, also let me know! That’s good for morale.
Follow the progress of the rework in the 0.6 milestone on Gitlab. If you are interested in contributing, contact me on Gitlab. If you want to discuss development, join the discussion on Matrix #whisperfish:rubdos.be.
There are nightly builds (in form of RPM) available on Gitlab. Nighlies eat batteries for breakfast, break up with your girlfriend, and use magic to turn phones into bricks. If you want to use them, please come and chat on Matrix or IRC. Whenever there is a version that makes sense, and has a low probability of tearing apart the very fabric of the universe, it’ll be here on Open Repos!
Thanks for the support, feel free to buy us a coffee! Liberapay allows for donations via PayPal or credit card. While we do appreciate the donations, please do match your donation towards Signal themselves. Also consider donating to Weblate, because they provide their translation hosting service to us and many other SailfishOS applications at no cost!
The original Whisperfish 0.5.0, by Andrew, was released under GPLv3+. Since we are using the upstream code of Signal themselves, partly licensed under AGPLv3+, the whole of Whisperfish 0.6.0 falls under AGPLv3+.
Post-quantum end-to-end encryption, registration fix, and much more.
69 files changed, 2465 insertions(+), 1179 deletions(-)
- Post-quantum (Kyber) key-exchange
- Fix build version number in CI/About page (maybe, I hope)
- Fix the info row lock size in developer mode
- Fix muting conversations
- Fix disappearing messages timer resets
- Store attachment pointers in database, preparation work for attachment download retries.
- New, more fine grained notification privacy options
- Show blur hash while attachments are downloaded
- Emoji-react to messages (hold message, swipe away, then tap the emoji)
- Fix logs on panic
- Implement a captcha test page
- Handle remote message deletions, implement remote message deletion
- Show original attachment file name, if available
- Implement attachment exporting
- Fix unidentified sending mode resets on profile key reception
- Fix registration and linking for new registration protocol
Signal overhauled their registration procedure. In my eyes, the new API flow has been redesigned to allow for registrations without phone number in the future. Signal has, meanwhile, introduced usernames , which will allow you to hide your phone number from contacts and groups. I hope to get this into Whisperfish soon™ too.
Signal recently introduced post-quantum key exchanges for their end-to-end encryption protocol. This is, as far as I know, the first broad and permanent real-world deployment of post-quantum cryptography, and follows the very recent NIST standardization of Kyber. Signal is yet to announce this change officially, but it has been in production for two weeks. I expect Signal to roll out a rekey event for all sessions, and at that time announce the roll-out.
The deployment is a hybrid of X25519 and Kyber. This means that if the new Kyber system is horribly broken next week, your sessions will still be secure in the classical sense.
Practically speaking, the current change means that every new session with a contact will be protected against capture-now-decrypt-later attacks by (currently non-existing) cryptographically-relevant quantum computers, under the condition that Kyber remains as secure as it is thought to be.
I expect Signal to trigger session renewals or rekeying events to additionally protect existing sessions from the “quantum threat”.
This release fixes group updating (adding members, changing admins etc.) since Signal changed their API calls. First steps toward PNI support.
119 files changed, 3487 insertions(+), 1918 deletions(-)
- Database refactoring, phone numbers and UUID are now strong types
- beta.19 is a hotfix release to fix a refactoring bug
- Fixes a hang on unregistered startup
- Fix group update API calls
- Show roles of group members
- Graceful handling of ^C
- Show translation contributors in About.qml, automatically update the About.qml page
- Fix self-recipient bugs
- Reset page stack when closing in daemon mode
- Add PNI column to recipient (currently unused), fetch self-PNI
- Fix archive/pinned UI bugs
- Fix profile image display when clicking notifications for groups
- Fixes related to message notification counter
- Split storage module into separate crate, preparation for more refactoring
- Show the profile picture in the sharing dialog
- Fix RTL support in cover
- Fix detail attachment display for non-image/video attachments
- Fix the “show more” tag placement for long text messages
- Many small fixes
With this release, sealed/unidentified sending is now implemented and in active use. This increases privacy, and should render “Signal needs you to complete a captcha so you can continue sending messages” a thing of the past.
63 files changed, 3373 insertions(+), 1411 deletions(-)
- Fixes the profile page not loading
- Fix multiple settings page and profile page issues
- Implement automatic identity key reset
- Implement draft messages
- Fix captcha display and submission
- Ignore NullMessages and implement PlaintexContent
- Implement sealed sending
- Cleaner logging thanks to minimized Display implementations for database types
- Log Qt and QML via simplelog
- Keep identity key in memory, instead of reading from storage
- Stop trying to send messages to unregistered users, store registration state in db
- Consider empty sessions as read, fixes incorrect unread message count
- Expose logging settings in Settings page
- Bump emoji.js
- Utilize Diesel 2 CLI
Fix an issue during registration, and some QoL improvements. If you want to register after a failed attempt, don’t forget to reset your installation
26 files changed, 821 insertions(+), 270 deletions(-)
Overhauls the QML binding system. This should fix all UI inconsistencies, except for a few that are now introduced.
108 files changed, 5191 insertions(+), 4061 deletions(-)
- Capture panics to log
- Log Qt errors to Rust
- Allow capturing logs to a file via a configuration option
- Cleaner display of reactions
- Show message action buttons on one row in landscape mode
- Add a placeholder for sticker messages, instead of showing “This message is empty”
- Use upsert clauses thanks to SQLite and Diesel update (slight performance win and code cleanup)
- Remove defunct incognito mode
- Fix displaying version in About menu
- Allow opening direct message from group member list
- Refactor QML session/message singletons (performance win, future proofing, and UI consistency)
- Allow registration with reCAPTCHA and hCAPTCHA
Bugfix release for most of the bugs we introduced in beta.13, and some fixes for changes upstream.
15 files changed, 577 insertions(+), 127 deletions(-)
- Attempt to handle HTTP 428 by responding with a reCAPTCHA challenge
- Handle device mismatches (fixes sending to contacts that change their linking setup)
- Attempt at fixing a crash at startup related to profile uploading
- Fix a crash when opening an empty session
- emoji.js now supports out-of-date emoji packages as fallback
- Fix typing notification display of names in certain conditions
- Marking as read fix for mismatched sessions
- Cleaner formatting for linked device display
Profile fetching and updating, avatar displaying, sender key and unidentified sender support at receiver side, and much more.
153 files changed, 4549 insertions(+), 2363 deletions(-)
- Disable defunct “send new message” functionality
- Don’t crash when Signal desktop sends a SyncMessage about a story.
- Use move_rows instead of reinserting upon new message reception
- Big refactoring work by Lucien XU
- Send messages via the Websocket instead of the PushService
- Display avatars
- Display Signal profile names, with preference for local contact names in settings
- Implement regular profile updating
- Implement displaying and sending quotes
- Use Emoji font for displaying reactions when configured as such
- Move (signed) prekeys, identities, sessions into database
- Implement sender keys and unidentified sending at the receiver side for much improved privacy
- Many, many, other tiny and big things.
Hotfix release for the new Signal root certificate
72 files changed, 439 insertions(+), 361 deletions(-)
- Update root CA certificate for Signal production server (4096 bits RSA instead of 2048!)
- Multiple fixes for SailfishOS 3.4
- Fix storage migration corner case
- Fix some registration issues
- Fix cover scrolling behaviour
- Big update of libsignal-protocol version
- Misc layout and input field improvements
- Refactored some storage and Sailfish platform code
Mostly bugfixes for bugs that we introduced in beta.10, but also implements Whisperfish as secondary device. This release is basically completely due to direc85 and Gabriel Margiani; thank you both!
37 files changed, 1212 insertions(+), 292 deletions(-)
sailfish-qmlto dependencies for registration to work on new installs (thanks to direc85!)
- Fix config.yml migration code (thanks to direc85!)
- Improve handling SMS verification field input (#444 and #443, thanks to direc85!)
- Implement secondary device mode (thanks to Gabriel Margiani and ntninja!)
- Fix background mode (thanks to Gabriel Margiani and direc85!)
- Start a Catalan translation (thanks to Jaume Singlavalls!)
- Play a quiet message when a message arrives when the application is active (thanks to direc85)
- Fix sending to UUID-only contacts (thanks to Gabriel Margiani, fixed in an unrelated MR)
- Keep up with technical debt (several merge requests and pushes)
This is a huge release, thanks to the hackathon we did a month ago with @direc85 (see picture at Whisperfish - The unofficial SailfishOS Signal client - #595 by rubdos).
There’s a ton of useful changes for the users, and there’s also a lot of technical debt fixed that will make the next releases even more awesome. Diffstat since beta.9:
127 files changed, 11795 insertions(+), 5464 deletions(-) (and that’s huge)
- Update to Emoji 14 (thanks to @direc85)
- Correct attachment showing for out-of-order downloads
- Allow resetting identity key through developer options
- Cover page design showing messages showing typing indicators (in cooperation with direc85)
- Implement typing indicators for groups and direct messages (turn on in settings)
- Implement captcha rendering through external application, and hence fix registration (thanks to @direc85 and Gabriel Margiani)
- Spit share plugin and compile them separately for Sailfish 3 or 4 (thanks to @direc85)
- Fix message queuing and resending
- Migrate session records and identity storage to database
- Update libsignal-client (long overdue, only possible since the session record/identity record storage refactoring, cooperation with Gabriel Féron)
- Redesign registration page to combat phone number entry confusion (thanks to @direc85)
- Work around Signal-Desktop issue with JPEG’s sent as PNG’s (thanks to @direc85)
- Optimize Emoji rendering (thanks to @direc85 and @ichthyosaurus )
- Add RemovableMedia to privileges for sending Pictures from the SD card
- Implement archiving and pinning of sessions (thanks to @direc85)
- Multiple UI fixes (thanks to @direc85)
- Allow sending pictures directly from within Whisperfish (thanks to @direc85)
- Give a warning for old Whisperfish versions (thanks to @direc85)
- Show multiple attachments up to five
- Registration should work again! Thanks @direc85 and Gabriel Margiani !
- Cover page is awesome!
- Typing notifications are cute!
- Display multiple attachments!
- Resending failed messages!
This is quite a milestone. The next big milestone will be porting Rust 1.61 to SailfishOS, because that will allow us to further push the dependencies and implement all the new GroupV2 and sealed sending features more easily.
Today I’m feeling healthy and confident enough to start a thread about Whisperfish, the Signal client originally built by Andrew E. Bruno in 2016 (thank you so much, Andrew). In February 2019, aebruno announced the EOL of his Whisperfish. I have then, four months later, volunteered to take the lead and rewrite the whole thing against
libsignal-protocol-c, the official and upstream ratchet/axolotl/e2ee library.
It’s taken me a long time, and during the time I switched to Rust, which turned out to be a radical choice back then, but has since paid of: Signal themselves started switching the protocol library to Rust, and SailfishOS introduced preliminary Rust support in 3.4. I had to DIY my Rust SDK (and haven’t migrated yet).
What followed was a painful rewrite of many things, but it is now starting to pay off. I’d like to thank Markus Törnqvist and Gabriel Féron for their efforts in respectively the Sailfish part and the back end part. I have (re)written the bulk of the application, including a very experimental (but very much working)
await-enabled Qt interface, which I want to get cleaned up by Whisperfish 1.0.0.
The result of our efforts is, currently, Whisperfish 0.6-alpha.3. While I am confident many more people can use the “new” Whisperfish, be aware that this is an alpha release. This means that things will fail and you might lose data. That being said: I have many reports of people losing data with Whisperfish 0.5, data that is not lost on my rewrite. This is due to the new cryptographic library, and many updated API calls. If you install this software (thanks!) please leave feedback, both positive and negative in this thread.
- Sending and receiving messages
- Receiving attachments
- Sending attachments
- Starting conversations with new people
- Altering groups
The above means, that if you can wait with sending pictures (my priority number one) and if you have a working Whisperfish 0.5 installation, you can probably start using the Whisperfish 0.6-alpha’s. Be prepared to send me feedback, either through the forum, Matrix or IRC (freenode#whisperfish). Bug reports and feature requests are more than welcome on the Gitlab issue tracker
Before downloading any of this, please read the above paragraph.
All RPMs are published on the Gitlab package archive.
Published versions can be found on my OpenRepos account.