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":
WebSocket.prototype.send edits those frames' typing requests (is_typing to 0).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]
CodeRabbit reviews this change in the combined PR [#394].
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.
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.
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".
Originally posted by: coderabbitai[bot]
<picture>
</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
875d0The 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>
</picture> 4 · <picture>
</picture> 1
<picture>
<picture>
</picture> Passed checks: 4 passed
| Check name | Status | Explanation | | :------------------------ | :--------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Title check |  | The title identifies the typing indicator setting and the new Privacy tab. | | Linked Issues check |  | Check skipped because no linked issues were found for this pull request. | | Out of Scope Changes check |  | Check skipped because no linked issues were found for this pull request. | | Description check |  | 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
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)
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".
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:
#394Ticket changed by: kristofferR
Originally posted by: kristofferR
✅ The administrative hold has been retired because this pull request merged. crq will not request further automated reviews.