Threads, pinned messages and group mentions
Reply chains open in their own thread, with a Threads list for new replies. Messages can be pinned, @channel and @here alert a group, and each conversation can notify for mentions only.
Replies in threads
Open a reply chain in its own thread view with a separate composer, synced drafts and file replies. Followed threads have their own unread state and a Threads list for finding new replies.
Richer message formatting
Messages support bold, italic, strikethrough, code, code blocks, lists and quotes, with a Format menu and keyboard shortcuts. Copy and paste preserve supported rich text, while formatting markers and mentions inside code are handled correctly.
Mention the group
Group mentions such as @channel, @here and @everyone are interpreted by receiving clients under the conversation’s rules, bringing shared alerts into group messages.
Also new
- Choose which messages notify you. Each conversation can notify for Every Message, Mentions Only or Mute. The choice follows the account’s encrypted device sync and applies consistently to unread and notification behavior.
- Keep important messages pinned. Messages can be pinned and unpinned, with a count in the header and a list in conversation details. Pinning permissions and encrypted history preserve who may pin and what was pinned.
- Private link previews, starting with words. The sending device can fetch a link’s title, description and site and carry those words inside the encrypted message. Recipients do not fetch the page to display the preview, and the sender can remove a preview or turn the feature off; preview pictures follow later.
- Commands from the composer. Type slash commands in the composer with completion and forms when arguments are needed. Pasted text does not become a command, and the same command definitions are prepared for the terminal client.
- Find emoji by their names. The emoji picker searches Unicode names after checking shortcodes, making more emoji discoverable by ordinary words.
- Use arrow keys to choose people. Both people-selection sheets support arrow-key selection of matching people.
- More proxy networks supported. Connections support proxies that request a password and SOCKS5 proxies, including chat and call relay traffic. Mac proxy passwords available only through a system Keychain prompt are not supported yet.
- A client without a graphics window. A GPU-free client is built from the same shared runtime as the desktop app.
Fixed
- Lists and quotes follow right-to-left text. List markers and quote layout mirror for right-to-left text instead of staying on the wrong side.
- Conversation changes wait their turn. Changes to a conversation run in order, and cancelling one prevents it from running later. This avoids overlapping changes acting on stale conversation state.
- Protect drafts after a failed read. A failed local draft read cannot let an older synced draft replace the current draft. Restoring a retained draft retries when temporary operation capacity becomes available.
- Wait for confirmation after rejoining. After an external rejoin, outgoing messages wait until another member confirms the joined state through a message. Rejoining also checks the organisation membership rules already applied to ordinary invitations.
- Publish backup keys only after saving. Backup keys received through device sync, linking or restore become active only with the durable transaction that saves them, keeping memory and saved recovery state consistent.
- Group calls share one uplink fairly. Connections in a group call coordinate their use of a shared outgoing connection rather than repeatedly making each other back off.
- Better estimates as a call fills the connection. Call bandwidth estimates account for bytes on the actual link and reduce more gently as a queue starts forming, improving adaptation on limited connections.
- Keep floating call status and lock visible. Long status text is constrained in the floating call card so it fits while preserving the encryption lock indicator.
- Release memory after changing conversations. The app retains less memory after switching between conversations. A broader workload checks repeated switching through many conversations rather than only a single change.
- Leave less memory behind after scrolling. Pictures held during a long scroll are kept only for a limited time, and further cleanup reduces what remains after scrolling back and forward.
- Release search memory after Jump to. A Jump to search leaves a smaller idle memory footprint after the search closes.
- Unread totals without rescanning every message. Unread summaries use maintained counts instead of repeatedly counting the unread history, keeping the work bounded as unread messages accumulate.
- Less repeated work for conversation lists. The conversation list, organisation rail and badge avoid repeated passes that multiplied their work as the number of conversations grew.
- Reclaim space after deleting history. The encrypted main database can reclaim unused space after substantial deletions. Quiet-time checkpoints also let deleted pages leave the temporary write log.
- Private permissions for new Mac profiles. New profile folders on the Mac are created with access limited to their owner.
- Handle Linux directory errors safely. Linux directory creation rejects empty paths and existing files that are not directories instead of treating them as usable folders.
- Keep semicolons in saved filenames. The Linux save chooser preserves filenames containing semicolons instead of misreading them as separators.
- Safe clipboard answers after cancellation. Delayed clipboard answers remain owned until completion or cancellation, avoiding stale attachment-staging work using an answer after its requester has gone.
- Explain the expected key prompt before updating. Before installation, the update card identifies the running app and the expected local-store-key prompt. It explains that declining keeps the store closed and preserves messages and settings, and advises rejecting unexpected prompts.
- Consistent backup sizes in Settings. Settings uses the same decimal size units as the rest of the app for backups.
In the works 4 changes · designs and groundwork
- Terminal client foundations. A terminal-client contract, cell layout research, input decoding and capability detection establish the first building blocks. Bounded cell storage, safe text output, frame writing and terminal-mode ownership are implemented.
- Desktop automation attachment design. A contract defines authorization and lifecycle rules for attaching automation to the desktop app.
- Encrypted lists proposal. A proposal defines encrypted current-state lists.
- Prepare encrypted temporary transfers. A shared component can hold encrypted temporary transfers within explicit limits and has been checked on Mac and Linux.
Under the hood 13 changes · tests, tools and the server
- Stronger protection for Linux key memory. The Linux client disables process dumps and keeps the store key in locked memory, reducing accidental exposure through normal process memory dumping.
- Correct accounting around refused server requests. The server accounts for joins racing revocation and charges refused-version connection attempts consistently, preserving its request limits under those races.
- Stable shared-runtime ownership. Client identities are reserved before a runtime opens, transport lifecycles use copied descriptions, and standard-input automation has one private lifetime owner. These are internal ownership changes that support consistent clients.
- Lean graphics and text rendering work. The Mac graphics backend avoids unnecessary copies on normal whole-texture writes. Shared checks for image formats, texture bounds and live resources reduce duplicated graphics logic, and text layout uses one exact cache key.
- One consistent snapshot of launch options. Profile, theme, language and demo choices are captured once for the launch rather than read in separate places with potentially different results.
- Remove unused platform interfaces. Unused Linux synchronization cleanup, desktop-window and synchronous standard-input interfaces are removed. Network validation and connection acceptance reuse existing shared implementations.
- Known limits in screen quality and memory. A shared-screen quality regression, the bounded graphics-driver memory retained by a live call, and the actual work in history preview queries and send settlement are documented. Scale tests gain clearer paging and setup contracts.
- Keep native test hosts in sync with the app. Native Linux and Mac test hosts reuse complete application link information and discard unused sections. This covers presence, clipboard, frame, accessibility, tray, text, promise and keystore fixtures.
- More reliable deterministic checks. Server fixtures, device removal and rejoin tests wait on their own clocks and release held responses on failure. Shared message and markup assertions, isolated audio metadata waits and common server cleanup reduce test races and duplicated checks.
- Accurate dependency, size and performance checks. Build checks reject dependency-lock-only changes, refresh Rust copies safely and declare module boundaries. Release dependencies use size-focused compilation; each architecture is judged against its own size limit, while test-only encryption helpers stay outside the shipping library.
- Keep demo commands consistent. Demo retry and permission-setting commands match the real commands’ descriptions and metadata, improving the reliability of interface tests that use them.
- Failed presence checks keep their scheduling state. Presence tests preserve scheduling state when a quiet-report check fails, making failures diagnosable without changing the notification rule.