Menu ▾ ▴

#374 feat(privacy): block the typing indicator, and add a Privacy settings tab

closed
nobody
None
2026-11-07
2026-11-07
Anonymous
No

Originally created by: kristofferR

Messenger always tells the other person when you are typing, and there was no way to turn it off. It is one of the most requested privacy features in desktop Messenger clients.

Block Typing Indicator (new setting, off by default) rewrites outgoing typing updates to "not typing":

  • Regular chats send them over the Lightspeed WebSocket. WebSocket.prototype.send edits those frames' typing requests (is_typing to 0).
  • Encrypted chats hand them to Messenger's worker over a MessagePort; those sendChatStateFromComposer requests are set to idle.

Requests are edited rather than dropped, so Messenger never waits on or retries them. Only JSON that parses and re-serializes byte-for-byte is re-encoded, so 64-bit IDs are never rounded. Seeing other people type is unaffected. A diagnostics line notes each kind of rewrite, so a Messenger protocol change shows up in Carrier.log.

The frame code is adapted from fMess (MIT). Its full notice is in the source and, via /*! legal comments, in the shipped bundle.

Settings also gains a Privacy tab holding the new setting, Hide Names & Avatars, Block Facebook telemetry and Remove Facebook link tracking (moved from Appearance and Advanced).

Manual check still needed: with the setting on, type in a regular and an encrypted chat while watching from another account; Carrier.log should show privacy.typing-blocked.

Ref [#14]

Summary by CodeRabbit

  • New Features
  • Added an option to hide typing indicators in regular and encrypted chats.
  • Added a Privacy tab for privacy-related settings.
  • Updates
  • Moved settings for hiding names and avatars, blocking telemetry, and removing link tracking from other settings sections to Privacy.
  • Documentation
  • Updated the settings guide to describe the typing-indicator option and show telemetry blocking under Privacy.

CodeRabbit reviews this change in the combined PR [#394].

Related

Tickets: #14
Tickets: #389
Tickets: #394

Discussion

  • Anonymous

    Anonymous - 2026-11-07

    Originally posted by: coderabbitai[bot]

    Action performed

    Review finished. > Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.
     
  • Anonymous

    Anonymous - 2026-11-07

    Originally posted by: chatgpt-codex-connector[bot]

    Codex Review Summary: ✅ Completed This comment shows the latest Codex review activity on this pull request. | Review | Status | Commit | Review trigger | | --- | --- | --- | --- | | 📝 **Code Review** | ✅ **Completed** <relative-time datetime="2026-11-07T16:40:28.595631Z">2026-11-07T16:40:28.595631Z</relative-time> | `7389e2d` | Manual request |
    ℹ️ About Codex in GitHub
    [Your team has set up Codex to review pull requests in this repo](https://chatgpt.com/codex/cloud/settings/general). Reviews are triggered when you - Open a pull request for review - Mark a draft as ready - Comment "@codex review" or "@codex security review". Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.
     
  • Anonymous

    Anonymous - 2026-11-07

    Originally posted by: chatgpt-codex-connector[bot]

    Codex Review: Didn't find any major issues. Keep them coming!

    Reviewed commit: 875d084db6

    ℹ️ About Codex in GitHub
    [Your team has set up Codex to review pull requests in this repo](https://chatgpt.com/codex/cloud/settings/general). Reviews are triggered when you - Open a pull request for review - Mark a draft as ready - Comment "@codex review". If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
     
  • Anonymous

    Anonymous - 2026-11-07

    Originally posted by: coderabbitai[bot]

    <picture>Explain Change →</picture>

    Walkthrough

    This change adds an optional setting to suppress outgoing typing indicators in regular and encrypted chats. It rewrites matching Lightspeed WebSocket frames and composer-state messages sent through MessagePort. It also groups privacy settings in a dedicated tab and updates related documentation. **Changes: Typing Indicator Blocking** |Layer / File(s)|Summary| |:---|:---| |**Preference and settings UI**
    `src-tauri/src/settings.rs`, `inject/src/types.d.ts`, `dist/settings.html`, `inject/src/messenger/lib/injected-assets.test.ts`, `README.md`|Adds `block_typing_indicator` with a default of `false`. Moves privacy controls into a Privacy tab and updates the README. The settings asset test checks the tab’s fields.| |**Typing-state rewrite helpers**
    `inject/src/messenger/lib/typing-block.ts`, `inject/src/messenger/lib/typing-block.test.ts`|Adds helpers to edit JSON, clear matching typing updates in Lightspeed frames, and set non-idle composer states to `idle`. Tests cover edited data, unchanged inputs, malformed frames, and JSON precision loss.| |**Transport interception and initialization**
    `inject/src/messenger/features/typing-block.ts`, `inject/src/messenger/index.ts`, `src-tauri/inject/messenger.js`, `inject/build.ts`|Wraps WebSocket and MessagePort sends when the setting is enabled. Initializes the wrappers before Messenger opens its socket. The shared inject build preserves inline license comments; the generated injector also renames several local settings accessors.| **Estimated code review effort:** 3 (Moderate) | ~25 minutes **Change:** Feature ### Sequence Diagram(s) :::mermaid sequenceDiagram participant Messenger participant Injector participant clearTypingInFrame participant WebSocket participant idleChatStates participant MessagePort Messenger->>Injector: send through wrapped transport alt Lightspeed WebSocket send with setting enabled Injector->>clearTypingInFrame: edit binary frame clearTypingInFrame-->>Injector: edited frame or no edit Injector->>WebSocket: forward edited or original payload else MessagePort send with setting enabled Injector->>idleChatStates: edit chat-state message idleChatStates-->>Injector: edited message or no edit Injector->>MessagePort: forward edited or original message end **Possibly related issues** - Carrier issue 14 requests blocking outgoing typing indicators, including Lightspeed and encrypted-chat rewrite paths. This change adds those rewrite paths. - Carrier issue 349 tracks issue 14. This change implements the typing-indicator blocking behavior tracked there. - Carrier issue 364 requests moving the Hide Names & Avatars control to Privacy, along with other control and value changes. This change moves that control to Privacy; the summaries do not describe separate controls or value migration.
    Merge Risk: <picture></picture> Low · up to 875d0

    The new Block Typing Indicator setting may silently fail to hide typing in some chats, such as those with very large thread IDs. The setting is opt-in and the failure is bounded. Consider adding a diagnostics line for skipped rewrites, or a safer rewrite, and validate against live Messenger sessions.
    Pre-merge checks: <picture>Passed</picture> 4 · <picture>Failed</picture> 1

    <picture>Failed</picture> Failed checks: 1 warning | Check name | Status | Explanation | Resolution | | :---------------- | :----------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------- | | Docstring Coverage | ![Warning](https://storage.googleapis.com/coderabbit_public_assets/pre-merge-checks-warning.svg) | Docstring coverage is 29.17% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documenta… | Write docstrings for the functions missing them to satisfy the coverage threshold. |
    <picture>Passed</picture> Passed checks: 4 passed

    | Check name | Status | Explanation | | :------------------------ | :--------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Title check | ![Passed](https://storage.googleapis.com/coderabbit_public_assets/pre-merge-checks-passed.svg) | The title identifies the typing indicator setting and the new Privacy tab. | | Linked Issues check | ![Passed](https://storage.googleapis.com/coderabbit_public_assets/pre-merge-checks-passed.svg) | Check skipped because no linked issues were found for this pull request. | | Out of Scope Changes check | ![Passed](https://storage.googleapis.com/coderabbit_public_assets/pre-merge-checks-passed.svg) | Check skipped because no linked issues were found for this pull request. | | Description check | ![Passed](https://storage.googleapis.com/coderabbit_public_assets/pre-merge-checks-passed.svg) | The description is mostly complete. It explains the problem, changes, and remaining validation. Add the Summary heading and, if the author is not the repository owner, the required AI models disclosur… |
    Full details: Description check

    **Explanation** The description is mostly complete. It explains the problem, changes, and remaining validation. Add the Summary heading and, if the author is not the repository owner, the required AI models disclosure.
    Full details: Docstring Coverage

    **Explanation** Docstring coverage is 29.17% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documentation-only edits and deletions within surviving functions are included; unchanged diff context and fully deleted functions are excluded. Analyzed 24 functions across 9 files. (2 skipped: 2 unsupported.) **Resolution** Write docstrings for the functions missing them to satisfy the coverage threshold.
    Finishing Touches

    Generate docstrings

    - [ ] Commit to this branch - [ ] Create a new PR
    Generate unit tests (beta)

    - [ ] Commit to this branch - [ ] Create a new PR
    • [ ] Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

    Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

    Share

    - [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai) - [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai) - [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai) - [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)
     
  • Anonymous

    Anonymous - 2026-11-07

    Originally posted by: chatgpt-codex-connector[bot]

    Codex Review: Didn't find any major issues. More of your lovely PRs please.

    Reviewed commit: 7389e2d037

    ℹ️ About Codex in GitHub
    [Your team has set up Codex to review pull requests in this repo](https://chatgpt.com/codex/cloud/settings/general). Reviews are triggered when you - Open a pull request for review - Mark a draft as ready - Comment "@codex review". If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
     
  • Anonymous

    Anonymous - 2026-11-07

    Originally posted by: kristofferR

    ⏸️ crq will not request further automated reviews for this pull request.

    Reason: CodeRabbit reviews these changes once, in combined PR [#394]

    Resume with crq unhold kristofferr/carrier 374.

     

    Related

    Tickets: #394

  • Anonymous

    Anonymous - 2026-11-07

    Ticket changed by: kristofferR

    • status: open --> closed
     
  • Anonymous

    Anonymous - 2026-11-07

    Originally posted by: kristofferR

    ✅ The administrative hold has been retired because this pull request merged. crq will not request further automated reviews.

     

Log in to post a comment.