Menu ▾ ▴

#14 Block typing indicator (privacy)

closed
nobody
2026-11-07
2026-06-28
Anonymous
No

Originally created by: kristofferR

Block typing indicator

Add a privacy setting that stops Carrier from broadcasting the "…is typing" indicator to the other person while you type. This is one of Caprine's flagship privacy features and the kind of thing people switch clients for.

Behaviour

  • New setting (default off, i.e. normal Messenger behaviour) — e.g. block_typing_indicator.
  • When enabled, the typing signal is never sent; you can still see others' typing indicators.
  • Toggle live without reload (re-applies via the carrier:settings event, like the other inject settings).

Implementation notes

  • Pure injected-JS change in src-tauri/inject/messenger.js. Messenger sends the typing state over its realtime channel; intercept it at the network layer rather than poking the React internals:
  • Wrap WebSocket.prototype.send and/or fetch/XMLHttpRequest and drop the outbound payloads that set the typing/is_typing state (Messenger's MQTT-over-WebSocket typ/typing messages, or the GraphQL typing mutation — confirm the exact shape against the live DOM/network).
  • Keep the interception narrow so only the typing signal is dropped — never touch message-send traffic.
  • Add the setting to the Settings struct (src-tauri/src/lib.rs), the Settings window (dist/settings.html), and read it in the inject script via window.__CARRIER_SETTINGS__.

Caveats

  • Needs verification against the current messenger.com realtime protocol; if the signal isn't interceptable cleanly at the network layer, fall back to suppressing the local input events that trigger it.

Part of the Caprine privacy-parity set (see also typing/read-receipt/notification/blur issues).

Reference implementation (November 2026 competitor review)

fMess ships a working typing-indicator block (04-privacy.js:127-224, MIT):

  • It rewrites outgoing /ws/lightspeed frames: for request type 4 with label "3", it sets is_typing to 0. Requests are edited, not dropped, so Messenger does not retry them.
  • For end-to-end encrypted chats, it rewrites the worker's sendChatStateFromComposer messages to idle via MessagePort.postMessage.
  • It only re-encodes JSON that parses and re-serializes unchanged, which protects 64-bit IDs from float rounding.

Adopting this means adapting their code, so include fMess's MIT notice. No competitor has a working read-receipt block (#15).

Part of [#349].

Related

Tickets: #349
Tickets: #374

Discussion

  • Anonymous

    Anonymous - 2026-11-07

    Originally posted by: kristofferR

    [!NOTE]
    🤖 Claude Opus 5.5 responding on behalf of Kristoffer

    Landed in [#374]: Settings → Privacy → Block typing indicator, off by default. It stops Carrier from sending your typing state, and you still see other people's.

    It is on main and ships in the next release.

     

    Related

    Tickets: #374

  • Anonymous

    Anonymous - 2026-11-07

    Ticket changed by: kristofferR

    • status: open --> closed
     

Log in to post a comment.