Whisperfish - The unofficial SailfishOS Signal client

If this is what I think it is, every Whisperfish user will hit this issue within the next few days. I’m working on something that should resolve some 428 errors, that should also alleviate what you describe. Beta 13 might have to hit sooner than we anticipated :slight_smile:

3 Likes

I’m having trouble sending messages, although I can still receive. The log shows the following. Is it a related issue or is it different?

[2022-11-27T16:10:14Z TRACE harbour_whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "<guid>", device_id: DeviceId(1)
}
[2022-11-27T16:10:14Z TRACE harbour_whisperfish::store::protocol_store] Storing session for ProtocolAddress { name: "<guid>", device_id: DeviceId(1)
}
[2022-11-27T16:10:14Z DEBUG libsignal_service_actix::push_service] HTTP request PUT https://chat.signal.org/v1/messages/<guid>
[2022-11-27T16:10:15Z DEBUG libsignal_service_actix::push_service] AwcPushService::put response:
ClientResponse HTTP/1.1 500 Internal Server Error
headers:
"x-signal-timestamp": "1669565414980"
"content-type": "application/json"
"date": "Sun, 27 Nov 2022 16:10:14 GMT"
"content-length": "110"
"connection": "keep-alive"

[2022-11-27T16:10:15Z TRACE libsignal_service_actix::push_service] Unhandled response with body: Ok(b"{\"code\":500,\"message\":\"There was an error processing your request. It ha
s been logged (ID <random hex>).\"}")
[2022-11-27T16:10:15Z TRACE harbour_whisperfish::store] Setting message 687 to failed
[2022-11-27T16:10:15Z ERROR harbour_whisperfish::worker::client] Sending message: Error sending message: Unexpected response: HTTP 500
[2022-11-27T16:10:15Z TRACE harbour_whisperfish::model::message] Mark message 687 failed'
[W] unknown:93 - file:///usr/share/harbour-whisperfish/qml/delegates/SessionDelegate.qml:93:5: QML Connections: Cannot assign to non-existent property "onTypingChanged"
[D] sendTypingToHeader:70 - onTypingChanged for 7 : []
[W] unknown:93 - file:///usr/share/harbour-whisperfish/qml/delegates/SessionDelegate.qml:93:5: QML Connections: Cannot assign to non-existent property "onTypingChanged"
[D] sendTypingToHeader:70 - onTypingChanged for 3 : []
[W] unknown:93 - file:///usr/share/harbour-whisperfish/qml/delegates/SessionDelegate.qml:93:5: QML Connections: Cannot assign to non-existent property "onTypingChanged"
[D] sendTypingToHeader:70 - onTypingChanged for 1 : []
[W] unknown:93 - file:///usr/share/harbour-whisperfish/qml/delegates/SessionDelegate.qml:93:5: QML Connections: Cannot assign to non-existent property "onTypingChanged"
[D] sendTypingToHeader:70 - onTypingChanged for 4 : []
[W] unknown:93 - file:///usr/share/harbour-whisperfish/qml/delegates/SessionDelegate.qml:93:5: QML Connections: Cannot assign to non-existent property "onTypingChanged"
[D] sendTypingToHeader:70 - onTypingChanged for 6 : []
[W] unknown:93 - file:///usr/share/harbour-whisperfish/qml/delegates/SessionDelegate.qml:93:5: QML Connections: Cannot assign to non-existent property "onTypingChanged"
[D] sendTypingToHeader:70 - onTypingChanged for 9 : []
[W] unknown:93 - file:///usr/share/harbour-whisperfish/qml/delegates/SessionDelegate.qml:93:5: QML Connections: Cannot assign to non-existent property "onTypingChanged"
[D] sendTypingToHeader:70 - onTypingChanged for 8 : []
[W] unknown:93 - file:///usr/share/harbour-whisperfish/qml/delegates/SessionDelegate.qml:93:5: QML Connections: Cannot assign to non-existent property "onTypingChanged"
[D] sendTypingToHeader:70 - onTypingChanged for 5 : []
[W] unknown:93 - file:///usr/share/harbour-whisperfish/qml/delegates/SessionDelegate.qml:93:5: QML Connections: Cannot assign to non-existent property "onTypingChanged"
[D] sendTypingToHeader:70 - onTypingChanged for 2 : []
1 Like

Exactly the same, indeed. I have implemented the alleged fix, and I have it working for me. I did not get 500 errors, however, but 428 (like @Schniki12 had before, Whisperfish - The unofficial SailfishOS Signal client - #573 by Schniki12). I have reason to believe that these are related, and that the same fix could apply for both issues at the same time.

There’s some polishing to be done before I push out beta 13, but most of it could be split to a beta 14… I hoped to have 13 as the last thing that required a beta label :frowning: .

5 Likes

Heads-up: if you use Signal Desktop to create a Signal story, it will crash your Whisperfish’s worker actor. Restarting the app a few times should clear the messages that crash the client. A fix will be in beta 13.

3 Likes

A bit later than I hoped, here we are! No new icon yet, because I want to poll a few variants first. This thing is pretty huge, and paves the path for many great new features after some more refactoring.

The fact that we now fetch Signal Profiles means that your UUID-only sessions will now get a name and picture.

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

  • 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.
10 Likes

Gonna try asap (now :–) )
This is great!
Many thanks!

Works great.
Didn’t think it’d make a big difference to see names instead of UUIDs.
But it does. Much more cosy!

Question:
In settings, it says it can use Signal contacts or, instead, SFOS contacts.
Where does WF takes Signal contacts? (In what file, I mean)

I ask, because I don’t share SF contacts, but would like to share some of them however.
So, I could maybe imitate a signal contacts file with the ones I’d like to share only.

2 Likes

Indeed beta.13 is out and has many requested (and necessary) features! Profile names and avatars are probably the most obvious improvements, along with colored reaction emojis and message reply support, but there are huge improvements under the hood, and there’s certainly more to come!

Just a quick note: Whisperfish beta.13 unfortunately doesn’t shut down cleanily, but crashes just before exiting. As far as I can tell, this is benign and shouldn’t affect day to day use. Tip: as background mode works again, it doesn’t hurt to have it turned on :slight_smile:

Names are indeed great to have! It’s “only one thing”, and strictly speaking not even mandatory, but it is both convenient and useful to have!

Currently Whisperfish isn’t able to send any contacts information to Signal (the option has no functionality to back it up). Whisperfish can retrieve profiles of “Signal-known” contacts, basically those you already talk with.

(Edit: Other users’ Signal profile data is stored in the Whisperdish database, except for avatar pictures, which are files in .local/share/be.rubdos/harbour-whisperfish/storage/avatars/.)

The contact info shown is combination of Signal profiles and your device address book. You can choose in the settings which one you prefer, but if you e.g. select address book as preferred option, and you don’t have every Signal contact in your address book, Signal profile name and avatar is used as a back-up (and the other way around, too). That way every contact should always have a name.

3 Likes

Lovely! Thank you all!

Thanks for the new release!

Unfortunately it seems I’m still running into the 500 error:

Log
[2022-12-10T23:15:57Z INFO  whisperfish::worker::client::profile_upload] Our own profile is up-to-date, not fetching.
[2022-12-10T23:15:57Z TRACE libsignal_service_actix::websocket] Will start websocket at Url { scheme: "wss", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("chat.signal.org")), port: None, path: "/v1/websocket/", query: Some("login=<guid>&password=<password>"), fragment: None }
[2022-12-10T23:15:57Z DEBUG libsignal_service_actix::push_service] HTTP request GET https://chat.signal.org/v2/keys/
[D] onCompleted:34 - Age 0
[D] unknown:0 - All queried in 637 ms
[W] unknown:88 - file:///usr/share/harbour-whisperfish/qml/pages/MainPage.qml:88:26: Unable to assign [undefined] to bool
[2022-12-10T23:15:58Z DEBUG libsignal_service_actix::websocket] WebSocket connected:
    ClientResponse HTTP/1.1 101 Switching Protocols
      headers:
        "connection": "upgrade"
        "date": "Sat, 10 Dec 2022 23:15:58 GMT"
        "sec-websocket-accept": "<password>"
        "upgrade": "WebSocket"

[2022-12-10T23:15:58Z DEBUG libsignal_service_actix::push_service] AwcPushService::get response:
    ClientResponse HTTP/1.1 200 OK
      headers:
        "connection": "keep-alive"
        "date": "Sat, 10 Dec 2022 23:15:58 GMT"
        "content-length": "12"
        "x-signal-timestamp": "1670714158130"
        "vary": "Accept-Encoding"
        "content-type": "application/json"

[2022-12-10T23:15:58Z DEBUG libsignal_service_actix::push_service] GET response: "{\"count\":93}"
[2022-12-10T23:15:58Z TRACE libsignal_service::account_manager] Remaining pre-keys on server: 93
[2022-12-10T23:15:58Z INFO  libsignal_service::account_manager] Available keys sufficient
[2022-12-10T23:15:58Z TRACE whisperfish::worker::client] Successfully refreshed prekeys
[2022-12-10T23:15:58Z TRACE libsignal_service::websocket] Decoded WebSocketMessage { r#type: Some(Request), request: Some(WebSocketRequestMessage { verb: Some("PUT"), path: Some("/api/v1/queue/empty"), body: None, headers: ["X-Signal-Timestamp:1670714158122"], id: Some(1970823675513354541) }), response: None }
[2022-12-10T23:15:58Z TRACE libsignal_service::websocket] Sending response WebSocketResponseMessage { id: Some(1970823675513354541), status: Some(200), message: Some("OK"), headers: [], body: None }
[2022-12-10T23:15:58Z TRACE libsignal_service_actix::websocket] Triggering keep-alive
[2022-12-10T23:15:58Z DEBUG libsignal_service::websocket] Sending keep alive upon request
[2022-12-10T23:15:58Z TRACE libsignal_service::websocket] Decoded WebSocketMessage { r#type: Some(Response), request: None, response: Some(WebSocketResponseMessage { id: Some(11549073119057556520), status: Some(200), message: Some("OK"), headers: ["Content-Length:0"], body: None }) }
[D] onCompleted:91 - [Emojify] global implementation could not be loaded
[D] onCompleted:92 - [Emojify] trace: [
  {
    "lineNumber": 1,
    "columnNumber": 38,
    "fileName": "file:///usr/share/harbour-whisperfish/qml/components/EmojiImplementationProxy",
    "message": "Script file:///usr/share/maliit/plugins/com/jolla/ichthyo_color_emojis/patch_ichthyo_emoji.js unavailable"
  },
  {
    "lineNumber": -1,
    "columnNumber": -1,
    "fileName": "file:///usr/share/maliit/plugins/com/jolla/ichthyo_color_emojis/patch_ichthyo_emoji.js",
    "message": "File not found"
  }
]
[D] onCompleted:103 - [Emojify] internal implementation loaded
[2022-12-10T23:16:00Z TRACE whisperfish::model::message] Dispatched actor::FetchSession(1)
[D] onClicked:207 - Activating session: 1
[W] unknown:6 - file:///usr/share/harbour-whisperfish/qml/pages/ConversationPage.qml:6:1: QML ConversationPage: <Unknown File>:10: Cannot assign to non-existent property "peerName"

[2022-12-10T23:16:01Z INFO  whisperfish::actor::messageactor] requested peer identity for Recipient { id: 2, e164: Some("<phonenumber>"), uuid: Some("<guid>"), username: None, email: None, blocked: false, profile_key: Some([...]), profile_key_credential: None, profile_given_name: Some("<name>"), profile_family_name: None, profile_joined_name: Some("<name>"), signal_profile_avatar: None, profile_sharing: false, last_profile_fetch: Some(2022-12-10T21:14:37.428770206), unidentified_access_mode: false, storage_service_id: None, storage_proto: None, capabilities: 0, last_gv1_migrate_reminder: None, last_session_reset: None, about: Some(""), about_emoji: Some("") }; #303
[2022-12-10T23:16:01Z TRACE whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "<guid>", device_id: DeviceId(1) }
[2022-12-10T23:16:01Z TRACE whisperfish::store::protocol_store] Reading own identity key pair
[2022-12-10T23:16:01Z TRACE whisperfish::store::utils] Opening file (async) /home/defaultuser/.local/share/be.rubdos/harbour-whisperfish/storage/identity/identity_key
[2022-12-10T23:16:01Z TRACE whisperfish::store::utils] Read file /home/defaultuser/.local/share/be.rubdos/harbour-whisperfish/storage/identity/identity_key with 64 bytes
[2022-12-10T23:16:01Z INFO  whisperfish::actor::messageactor] Computed fingerprint <numbers>
[2022-12-10T23:16:01Z TRACE whisperfish::model::message] handle_fetch_session(1)
[2022-12-10T23:16:01Z TRACE whisperfish::model::message] Dispatched actor::FetchAllMessages(1)
[2022-12-10T23:16:01Z TRACE whisperfish::store] Called fetch_all_messages_augmented(1)
[2022-12-10T23:16:01Z TRACE whisperfish::store] Called fetch_all_messages(1)
[2022-12-10T23:16:01Z TRACE whisperfish::model::message] handle_fetch_all_messages(1) count 176
[D] sendTypingToHeader:74 - onTypingChanged for 1 : []
[2022-12-10T23:16:01Z TRACE whisperfish::store] Called mark_session_read(1)
[D] sendTypingToHeader:74 - onTypingChanged for 1 : []
[2022-12-10T23:16:07Z TRACE whisperfish::actor::messageactor] MessageActor::handle(QueueMessage { session_id: 1, message: "Test", attachment: "", quote: -1 })
[2022-12-10T23:16:07Z TRACE whisperfish::store] Called create_message(..) for session 1
[2022-12-10T23:16:07Z TRACE whisperfish::store] Creating message for timestamp 2022-12-10 23:16:07.665
[2022-12-10T23:16:07Z TRACE whisperfish::store] Called mark_session_archived(1, false)
[2022-12-10T23:16:07Z TRACE whisperfish::store] Inserted message id 697
[2022-12-10T23:16:07Z TRACE whisperfish::store] Called fetch_message_by_id(697)
[2022-12-10T23:16:07Z TRACE whisperfish::store] Called fetch_recipient_by_id(1)
[2022-12-10T23:16:07Z INFO  whisperfish::worker::client] ClientActor::SendMessage(697)
[2022-12-10T23:16:07Z TRACE whisperfish::store] Called fetch_message_by_id(697)
[2022-12-10T23:16:07Z TRACE whisperfish::store] Called fetch_recipient_by_id(1)
[2022-12-10T23:16:07Z TRACE whisperfish::worker::client] Sending for session: Session { id: 1, is_archived: false, is_pinned: false, is_silent: false, is_muted: false, expiring_message_timeout: None, draft: None, type: DirectMessage(Recipient { id: 2, e164: Some("<phonenumber>"), uuid: Some("<guid>"), username: None, email: None, blocked: false, profile_key: Some([...]), profile_key_credential: None, profile_given_name: Some("<name>"), profile_family_name: None, profile_joined_name: Some("<name>"), signal_profile_avatar: None, profile_sharing: false, last_profile_fetch: Some(2022-12-10T21:14:37.428770206), unidentified_access_mode: false, storage_service_id: None, storage_proto: None, capabilities: 0, last_gv1_migrate_reminder: None, last_session_reset: None, about: Some(""), about_emoji: Some("") }) }
[2022-12-10T23:16:07Z TRACE whisperfish::worker::client] Sending message: Message { id: 697, session_id: 1, text: Some("Test"), sender_recipient_id: Some(1), received_timestamp: None, sent_timestamp: None, server_timestamp: 2022-12-10T23:16:07.665, is_read: true, is_outbound: true, flags: 0, expires_in: None, expiry_started: None, schedule_send_time: None, is_bookmarked: false, use_unidentified: false, is_remote_deleted: false, sending_has_failed: false, quote_id: None }
[2022-12-10T23:16:07Z TRACE whisperfish::worker::client] Transmitting DataMessage { body: Some("Test"), attachments: [], group: None, group_v2: None, flags: None, expire_timer: None, profile_key: Some([...]), timestamp: Some(1670714167665), quote: None, contact: [], preview: [], sticker: None, required_protocol_version: Some(0), is_view_once: None, reaction: None, delete: None, body_ranges: [], group_call_update: None, payment: None } with timestamp 1670714167665
[2022-12-10T23:16:07Z TRACE libsignal_service::sender] sending message to default device
[2022-12-10T23:16:07Z TRACE whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "<guid>", device_id: DeviceId(1) }
[2022-12-10T23:16:07Z TRACE libsignal_service::sender] encrypting message for ProtocolAddress { name: "<guid>", device_id: DeviceId(1) }
[2022-12-10T23:16:07Z TRACE whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "<guid>", device_id: DeviceId(1) }
[2022-12-10T23:16:07Z TRACE whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "<guid>", device_id: DeviceId(1) }
[2022-12-10T23:16:07Z TRACE whisperfish::store::protocol_store] Loading session for ProtocolAddress { name: "<guid>", device_id: DeviceId(1) }
[2022-12-10T23:16:07Z TRACE whisperfish::store::protocol_store] Storing session for ProtocolAddress { name: "<guid>", device_id: DeviceId(1) }
[2022-12-10T23:16:07Z TRACE whisperfish::store::protocol_store] Looking for sub_device sessions for <guid>
[2022-12-10T23:16:07Z TRACE whisperfish::store::protocol_store] Looking for sub_device sessions for <phonenumber>
[2022-12-10T23:16:07Z TRACE libsignal_service::websocket] Sending request WebSocketRequestMessage { verb: Some("PUT"), path: Some("/v1/messages/<guid>"), body: Some([123, 34, 100, 101, 115, 116, 105, 110, 97, 116, 105, 111, 110, 34, 58, 34, 60, 103, 117, 105, 100, 62, 34, 44, 34, 116, 105, 109, 101, 115, 116, 97, 109, 112, 34, 58, 49, 54, 55, 48, 55, 49, 52, 49, 54, 55, 54, 54, 53, 44, 34, 109, 101, 115, 115, 97, 103, 101, 115, 34, 58, 91, 123, 34, 116, 121, 112, 101, 34, 58, 49, 44, 34, 100, 101, 115, 116, 105, 110, 97, 116, 105, 111, 110, 68, 101, 118, 105, 99, 101, 73, 100, 34, 58, 49, 44, 34, 100, 101, 115, 116, 105, 110, 97, 116, 105, 111, 110, 82, 101, 103, 105, 115, 116, 114, 97, 116, 105, 111, 110, 73, 100, 34, 58, 60, 110, 117, 109, 98, 101, 114, 62, 44, 34, 99, 111, 110, 116, 101, 110, 116, 34, 58, 34, 77, 119, 111, 104, 66, 84, 99, 67, 78, 111, 114, 114, 104, 104, 107, 111, 90, 108, 71, 97, 49, 83, 55, 56, 54, 104, 121, 116, 57, 100, 77, 71, 120, 102, 81, 121, 99, 66, 99, 102, 101, 48, 48, 47, 78, 83, 116, 115, 69, 66, 65, 89, 65, 83, 75, 119, 65, 84, 71, 99, 86, 104, 74, 89, 71, 57, 81, 107, 122, 112, 113, 117, 108, 105, 109, 57, 72, 77, 43, 51, 90, 108, 55, 104, 111, 53, 74, 102, 48, 97, 67, 49, 50, 65, 119, 69, 70, 101, 76, 77, 86, 105, 79, 55, 112, 49, 122, 69, 65, 70, 72, 98, 79, 71, 74, 81, 80, 56, 79, 116, 110, 80, 73, 103, 49, 114, 112, 72, 99, 73, 121, 50, 57, 57, 80, 53, 47, 54, 76, 103, 82, 90, 110, 86, 99, 75, 87, 76, 90, 118, 49, 112, 113, 112, 80, 49, 48, 122, 109, 79, 81, 65, 89, 121, 115, 90, 110, 99, 69, 108, 86, 75, 76, 87, 115, 71, 117, 54, 53, 117, 102, 108, 83, 68, 115, 105, 117, 87, 65, 110, 57, 68, 72, 112, 105, 90, 82, 56, 98, 86, 100, 49, 53, 49, 89, 101, 50, 83, 74, 101, 117, 89, 75, 54, 113, 47, 113, 72, 48, 99, 79, 90, 115, 76, 47, 53, 112, 65, 87, 90, 66, 84, 87, 109, 86, 122, 49, 109, 90, 75, 47, 49, 89, 84, 107, 82, 98, 88, 99, 47, 87, 116, 43, 82, 111, 69, 83, 86, 119, 79, 108, 43, 103, 119, 49, 109, 71, 84, 80, 86, 74, 84, 76, 66, 49, 82, 118, 90, 79, 110, 118, 54, 77, 49, 51, 78, 101, 84, 68, 51, 54, 89, 57, 118, 108, 80, 79, 109, 71, 56, 113, 71, 56, 61, 34, 125, 93, 44, 34, 111, 110, 108, 105, 110, 101, 34, 58, 102, 97, 108, 115, 101, 125]), headers: ["content-type:application/json"], id: Some(13334859925653459204) }
[2022-12-10T23:16:07Z TRACE libsignal_service::websocket] Decoded WebSocketMessage { r#type: Some(Response), request: None, response: Some(WebSocketResponseMessage { id: Some(13334859925653459204), status: Some(500), message: Some("Internal Server Error"), headers: ["Content-Type:application/json", "Content-Length:110"], body: Some([123, 34, 99, 111, 100, 101, 34, 58, 53, 48, 48, 44, 34, 109, 101, 115, 115, 97, 103, 101, 34, 58, 34, 84, 104, 101, 114, 101, 32, 119, 97, 115, 32, 97, 110, 32, 101, 114, 114, 111, 114, 32, 112, 114, 111, 99, 101, 115, 115, 105, 110, 103, 32, 121, 111, 117, 114, 32, 114, 101, 113, 117, 101, 115, 116, 46, 32, 73, 116, 32, 104, 97, 115, 32, 98, 101, 101, 110, 32, 108, 111, 103, 103, 101, 100, 32, 40, 73, 68, 32, 60, 104, 101, 120, 62, 41, 46, 34, 125]) }) }
[2022-12-10T23:16:07Z ERROR libsignal_service::websocket] request_json with non-200 status code. message: Internal Server Error
[2022-12-10T23:16:07Z TRACE whisperfish::store] Setting message 697 to failed
[2022-12-10T23:16:07Z ERROR whisperfish::worker::client] Sending message: Error sending message: Unexpected response: HTTP 500
[2022-12-10T23:16:07Z TRACE whisperfish::model::message] Mark message 697 failed'
[D] sendTypingToHeader:74 - onTypingChanged for 1 : []

Is there anything I can try or additional information I can provide?

This is a bit late, but pease run beta.13 with verbose output enabled, especially the first time; there’s a one-time crash we’re trying to pinpoint still. Thanks!

Thanks, I’ll check if there’s anything suspicious about the log later today. Is that for all contacts or just one/select ones? There is an issue about that, I assume? :slight_smile:

That’s very interesting, I hoped that sending via the Websocket would have solved that. Indeed, does that trigger with one specific contact, or with everyone? Can you send to that contact via a linked Signal Desktop?

@direc85 I don’t think I made a separate issue about it.

This should be with --verbose logging enabled, but I posted only the partial log so the crash when exiting was not included. Would you like to also have a log of the crash?

I think it happens with all contacts, so far I tried talking to two contacts and one group chat and they all failed.

I don’t have a signal-desktop setup, only whisperfish. Can I do that without messing up whisperfish? If I would set it up, what information would you like me to collect from the desktop?

The exit crash log is already reported, if it is wildly different you could add your stack trace there.

You can (and it’s higly recommened) to link a Signal Desktop to Whisperwish install, it doesn’t break Whisperfish in any way. I have two SD’s linked, no issues regarding those! Just go to settings in Whisperfish and check the pull down menu to add a device. You’ll need a QR code reader or new enough SFOS so that Camera app supports reading them.

It would be interesting to see what happens when you try to send a message using Signal Desktop to an affected contact. Never collected its logs, however.

Thank you for the recommendation. I installed Signal Desktop and linked it as a new device. It got stuck importing my contacts, even after 15min waiting nothing happened. After a restart it appears to be mostly working, I imported contacts again from settings and this time it worked.

It seems I can send messages from the desktop client, and even see them appear on my phone, but sending from my phone still doesn’t work. I.e. sending/receiving a desktop message did not change anything on the phone.

Hi, I just installed and registered beta 13, thank you for your great work!.

But I’ve noticed something: the option to create a new message from the pull-down-menu isn’t there anymore:

The only options you can see here (UI language is German) are: “About Whisperfish”, “Settings” and “Show archived conversations” (translated).

Same here, also no option to start any new chat. In my case, it would be the very first chat.

Creating new conversations is currently broken, and thus disabled in the menu. You can install and link Signal Desktop and start the conversation over there, it will then appear in Whisperfish. Or, if the other party initiates the conversation, that works too.

1 Like