Whisperfish
Important: With beta.25, you may have to re-link your secondary Whisperfish devices. See release notes and linking and registration for more info.
Note: Registration and linking work only in beta.28+
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 Sailfish OS version is 3.4. We intend to keep compatibility with 3.3 for as long as humanly possible. The build for Sailfish OS 3.x is located in a separate OpenRepos application.
Do not ever contact Signal developers about a Whisperfish issue. You will annoy them and make them dislike us. Contact us instead (see below).
Collecting logs is something we often ask for, you can find the details in the wiki: Debugging and logging. Please note that the verbose log contains private and sensitive information, so make sure to get familiar with the Censor your logs chapter before sharing the logs with anyone!
Talk about Signal, Whisperfish and Sailfish OS
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.
Sailfish OS fan club group on Signal
Known issues
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).
- Recording voice notes on Xperia 10 IV and 10 V doesn’t work (not a WF bug)
- Secondary Whisperfish devices don’t handle PNI correctly (beta.25+)
-
Symptom: Certain conversations don’t pop up, crashes like
Error(Char { character: 'P', index: 1 })
- Cause: Missed PNI synchronisation messages earlier
- Workaround: Remove the linked Whisperfish and re-link it
- Caveat: This requires removing linked Whisperfish data (messages etc.)
-
Symptom: Certain conversations don’t pop up, crashes like
- Previously installed emojis are not shown any more
- This occurs when updating from beta.9 (or older) to beta.10 (or newer)
- Caused by version bump to Emoji 14/15
- 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:
Workaround:- 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.
- Cover page unread count is not updated
- Registration is blocked if registration lock is enabled.
Workaround:- 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.
Sailfish OS platform version notes and known issues
The intention is to keep as many versions of Sailfish OS supported for as long as possible. Some versions show bugs specific to that Sailfish OS version. If it is not possible to upgrade to the version mentioned below, you can use the workarounds mentioned here.
Current highest tested Sailfish OS version: Sailfish OS 4.6.0.13
Sailfish OS 3.x series
Bugs present in the Sailfish 3.x series
In principle, Whisperfish works on Sailfish OS 3.3, except for registration. @direc85 keeps testing Whisperfish on Jolla Phone, which runs Sailfish OS 3.4.
- Registration on Sailfish OS 3.x. As a workaround, register on another device, and move over your data.
Sailfish OS 4.x series
The Sailfish 4.x series introduced a few issues, and possibly new features; notably.
Contribute: get in touch, report issues and translate!
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.
Development and progress
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!
Donations
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 Sailfish OS applications at no cost!
Licence note
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+.
Release notes
Whisperfish 0.6.0-beta.28 “Quickfix release, again!”
@direc85 indentified why the UI has been slow for the past few months, and patched around it. Butter smooth again
Changes
4 files changed, 123 insertions(+), 77 deletions(-)
- Fix release automation
- Only calculate recipient fingerprint when needed
Previous releases
0.6.0-beta.27
Whisperfish 0.6.0-beta.27 “Quickfix release!”
Fixes for voice note transcription, blurhash performance improvement, registration fixes.
Changes
7 files changed, 35 insertions(+), 42 deletions(-)
- Fix voice message transcription in Sailjail
- Blurhash performance improvement
- Fix registration
0.6.0-beta.26
Whisperfish 0.6.0-beta.26 “Whisper”
Voice note updates, and some other cool things! Apparently, it has been more than 90 days since our last release. Sorry for the scary warning!
Changes
82 files changed, 2553 insertions(+), 1056 deletions(-)
- Contact linking to Sailfish contacts (useful for username/ACI contacts)
- Ignore playlists in audio player
- Correction in attachment deletion on deleted messages
- Graceful failure on body range errors
- Recording of voice notes
- Local transcription of (English) voice notes using Speech Note
Voice note transcription
To use the (currently very rough) local voice note transcription feature, see the instructions on the wiki. Currently, it’s only working for English speech.
- Install Speech Note
- Install a model for English (Whisper tiny for armv7 devices (Xperia 10 and below), Whisper base or medium for aarch64/newer devices)
- Press and hold a voice note, and select “Transcribe”.
- (Optional) Enable automatic transcription in your settings (battery drain warning!)
Thanks to @mkiol for writing Speech Note in a way that we can just hook into it!
Recording voice notes
Use the + button (as if adding an attachment) and select the microphone icon. Whisperfish starts recording immediately. Discard using the X, or send immediately with the send button.
0.6.0-beta.25
Whisperfish 0.6.0-beta.25 “PNI”
Sorry for the wait, but it’s finally here. There is one important caveat: if you currently have a working, linked (secondary) Whisperfish installation, it will currently not be able to correctly handle PNI, as we missed the migration messages. A work-around is to relink your Whisperfish by resetting it, removing the linked device in Signal Android (or Molly, or Signal-iOS; you primary device), and adding it again.
In principle, we should implement the relinking with retention of your messages, but that is still a lot of work.
There are some reports of Whisperfish not connecting the first time you start it after the upgrade. A restart of the app should fix it, but I’m interested in the logs of installations where this happens!
Whisperfish 0.6.0-beta.25
PNI support, fixes registration
Changes
52 files changed, 1662 insertions(+), 870 deletions(-)
- Support PNI (except for pre-beta-25 linked devices)
- Nicely display service messages (joined group, changed group, …)
- Fix an edge case crash in message mark up rendering
- Fix a crash on PNI-only contacts
- Fix audio message playback with a headset connected
- Generate blurhash when sending pictures
- Fix broken shareplugin
0.6.0-beta.24
Whisperfish 0.6.0-beta.24 “faster”
(registration is still broken)
Changes
59 files changed, 1457 insertions(+), 962 deletions(-)
- Fixes for expiring messages
- Fixes for rendering spoilers containing URLs
- Sending multiple attachments in a single message
- A lot of performance improvements
- Typing messages are back!
- Fix a bug with deleted formatted messages
With a big thank-you to @direc85 for basically doing everything in this version
0.6.0-beta.23
Whisperfish 0.6.0-beta.23 “FOSDEM release”
Sever cool new features! I tagged this during the Sailfish OS dinner on FOSDEM-Saturday
(registration is still broken, but we’re working on the root cause!)
Changes
76 files changed, 4234 insertions(+), 1502 deletions(-)
- Implement disappearing messages (a huge effort by @direc85 and myself)
- Implement message style rendering (mentions, bold/italics/…)
- Implement receiving message edits
- Preparatory work for phonenumber privacy (PNP/PNI)
- Delete message notifications on remote message deletion
- Some other small clean ups that were long overdue
0.6.0-beta.22
Whisperfish 0.6.0-beta.22
Several cool fixes and features
Changes
92 files changed, 4695 insertions(+), 2561 deletions(-)
- Fix a crash when downloading certain attachments
- Update from Rust 1.52 to Rust 1.75 to allow for many many many new cool things!
- Inline voice message player (highly overengineered!)
- Show identified delivery status in debug mode for group messages on per-recipient basis
- Fix a crash when messages are received on deleted group sessions
- Performance improvements on loading sessions and receiving read receipts
- Fix RUSTSEC-2020-0071 RUSTSEC-2021-0139 RUSTSEC-2021-0146 RUSTSEC-2021-0145 RUSTSEC-2021-0127 CVE-2023-42444 and CVE-2023-42447 (although unaffected by any of these)
- Update Emoji s to version 15
- Some initial work for receiving stories and distribution lists
- Fix deleting messages with attachments
- Decrypt attachments on a threadpool instead of on the executor (fixes lag/unresponsiveness on receiving attachments)
- Update libsqlite/sqlcipher to 3.41/4.5.0
- Rework logging subsystem for more concise and more useful logs
Currently, linking and registration is broken because Signal now mandates PNI/ACI support on clients. I will implement that next. There are several other cool new features upcoming too, stay tuned for a very soon update!
0.6.0-beta.21
Whisperfish 0.6.0-beta.21
Several small fixes
Changes
50 files changed, 1443 insertions(+), 611 deletions(-)
- Embedded QR code scanner for device linking on Sailfish 4 and higher.
- More relaxed parsing of SMS-based confirmation codes
- Don’t close keyboard when using send or enter
- Detect and handled deleted contacts in groups
- Some fixes relating to attachment fetching, including a crash
- Update blurhash decoding, should be a lot faster
- More correct message for empty session view
- Disable sending messages in UI for unregistered contacts
- Fix marking of unregistered contacts
- Hide archived conversations in cover page
- Add cargo-deny to catch CVE’s in the future
- Add setting to hide recipient phone number in conversation page
- Fix relating to profile fetching
- Correctly handle nullable E164’s and other nullable fields
- Update libsqlite/sqlcipher to 3.41/4.5.0
- Rework logging subsystem for more concise and more useful logs
Currently, linking and registration is broken because Signal now mandates PNI/ACI support on clients. I will implement that next. There are several other cool new features upcoming too, stay tuned for a very soon update!
Important note to Sailfish 3 users
The builds for Sailfish 3 and Sailfish 4 are now the same package again. This was required because the pending update to Rust 1.61 (maybe even 1.64 and 1.72 ).
You may need to tinker with the OpenRepos app in order to update. Worst case, you can uninstall the sf3 build manually, and install the unified application. You can check whether the update worked by opening Whisperfish and opening the about menu: it should show beta 21 or newer.
0.6.0-beta.20
Whisperfish 0.6.0-beta.20
Post-quantum end-to-end encryption, registration fix, and much more.
Changes
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
Registration
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.
Post-quantum key exchange
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”.
0.6.0-beta.18/19
Whisperfish 0.6.0-beta.18/19
This release fixes group updating (adding members, changing admins etc.) since Signal changed their API calls. First steps toward PNI support.
Changes
119 files changed, 3454 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
0.6.0-beta.17
Whisperfish 0.6.0-beta.17
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.
Changes
62 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
0.6.0-beta.16
Whisperfish 0.6.0-beta.16
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
Changes
26 files changed, 821 insertions(+), 270 deletions(-)
- Fix an issue during registration, introduced after the refactoring
- Close Whisperfish when updating
- Implement auto-login for password-protected setups
- Cleanup profile view page, allow viewing fingerprint and changing profile
- Allow starting a new conversation from group view
0.6.0-beta.15
Whisperfish 0.6.0-beta.15
Overhauls the QML binding system. This should fix all UI inconsistencies, except for a few that are now introduced.
Changes
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
0.6.0-beta.14
Whisperfish 0.6.0-beta.14
Bugfix release for most of the bugs we introduced in beta.13, and some fixes for changes upstream.
Changes
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
0.6.0-beta.13
Whisperfish 0.6.0-beta.13
Profile fetching and updating, avatar displaying, sender key and unidentified sender support at receiver side, and much more.
Changes
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.
0.6.0-beta.12
Whisperfish 0.6.0-beta.12
Hotfix release for the new Signal root certificate
Changes
72 files changed, 439 insertions(+), 361 deletions(-)
- Update root CA certificate for Signal production server (4096 bits RSA instead of 2048!)
- Multiple fixes for Sailfish OS 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
0.6.0-beta.11
Whisperfish 0.6.0-beta.11
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!
Changes
37 files changed, 1212 insertions(+), 292 deletions(-)
- Add
sailfish-qml
to 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)
0.6.0-beta.10
Whisperfish beta.10
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) (translations included)
Changes
106 files changed, 4759 insertions(+), 2962 deletions(-)
- 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
Highlights:
- 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 Sailfish OS, because that will allow us to further push the dependencies and implement all the new GroupV2 and sealed sending features more easily.
0.6.0-beta.1 ... beta.9
beta.9: 44 files changed, 986 insertions(+), 544 deletions(-)
beta.8: 49 files changed, 1582 insertions(+), 878 deletions(-)
beta.7: 43 files changed, 2640 insertions(+), 2331 deletions(-)
beta.6: 38 files changed, 877 insertions(+), 839 deletions(-)
beta.5: 3 files changed, 25 insertions(+), 8 deletions(-)
beta.4: 12 files changed, 1063 insertions(+), 529 deletions(-)
beta.3: 3 files changed, 79 insertions(+), 84 deletions(-)
beta.2: 59 files changed, 2038 insertions(+), 583 deletions(-)
beta.1: 192 files changed, 18088 insertions(+), 10474 deletions(-)
(since alpha.3)
Whisperfish 0.6-alpha.3
Hello, world!
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 Sailfish OS 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) async
/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.
Implemented features (in alpha.3):
- Sending and receiving messages
- Receiving attachments
Notably not implemented (in alpha.3):
- Registration
- 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
Downloads
Before downloading any of this, please read the above paragraph.
Master branch builds (“nightlies”)
All RPMs are published on the Gitlab package archive.
Version history
Published versions can be found on my OpenRepos account.