Flatter message rows and a first Linux desktop client
Messages sit in flat rows beside an organisation rail, Command-K searches conversations, messages and commands on the device, and Linux gets its first desktop version, on Wayland and Vulkan.
A consistent desktop appearance
The new visual foundation adopted one spacing density, system fonts, themed controls and stable avatar colours. On the Mac, appearance could follow the system and use its selected accent colour.
An organisation rail and focused sidebar
An organisation rail switched between workplaces while the sidebar showed the selected organisation’s channels, groups and direct conversations. Unread indicators, people counts, connection status and a sidebar visibility command were integrated into the new shell.
A flatter conversation transcript
Messages moved from bubbles to aligned rows with names, avatars, times and hover actions. Replies, formatted text, mentions, reactions, attachments, unread markers and call records were carried into the new layout.
Also new
- A redesigned composer. The message box grew to ten lines before scrolling and included attachment, emoji and mention controls. Reply and edit modes stayed inside the box, with explicit Cancel and Save controls while editing.
- Conversation details in a side panel. A Details panel brought together the topic, membership, roles, join requests and management actions for the conversation. When the window was too narrow, it overlaid the conversation instead of squeezing the message column.
- People by name. People lists and new-conversation searches showed colleagues by display name. Opening a person from the organisation’s searchable People list opened or started the direct conversation.
- One place to jump and search. Command-K opened a palette for conversations, locally indexed messages and commands. Results could reveal the matching message in its conversation; the search stayed on the device.
- A correction proposal while typing. A short pause could show a proposed correction or text replacement below the word. People could dismiss it, accept it at the next word boundary or undo it back to exactly what they typed.
- Select text in dialogs and notices. Informational text in generated dialogs, link confirmations, alerts and toasts became selectable and copyable. Selections behind a modal dialog turned inactive, and copying while the dialog was open followed its own text.
- Move text with a visible drop caret. Dragging text into a field showed the insertion position before dropping. Text could be moved within a field or copied with Option, with the drop treated as one undo step.
- Closer integration with Mac text input. Input-method clauses, candidate placement, Look Up and keyboard context menus were integrated with the focused text field. Mac Services could act on selected editable text; dictation alternatives were supported if the operating system supplied them.
- Protected copying of recovery secrets. On the Mac, copying from a secret field kept the clipboard item on that Mac and marked it concealed for clipboard managers. The visible recovery-kit text could still be copied and pasted deliberately.
- Joining with a private invite card. Invite links carried what the client needed to open an encrypted organisation-name card before joining. Setup accepted the link and then the person’s name, and the installation guide was updated for that route.
- The first Linux desktop bridge. Linux gained a Wayland and Vulkan desktop bridge, on-demand PipeWire audio, clipboard and drag services, file portals, keyring support and accessibility connections. Optional tray support, application-link routing and Linux release archives were included.
- Tools can page through older history. Tools and plugins gained bounded pages beyond the latest-message limit, without changing the selected conversation or its unread state. The local page position was scoped to its account and conversation and expired on restart.
Fixed
- Notices and call controls fit the new layout. Update offers and toasts were placed above the composer without covering it, and join-request banners and call controls adopted the new visual language. An update check no longer announced availability twice while its offer was already visible.
- Fast typing and composed input keep the right text. Typing immediately after Return no longer mixed the next character into the message being sent or left sent text in the next draft. Korean input-method Return and dictated “new line” were also corrected, while input updates preserved changes made by the owning field.
- Private text stays out of lookup services. Recovery-kit fields were marked private so Look Up and Services could not receive their contents. Lookup commands were also restricted to text actually selected or under the caret.
- A fresh start for a new invite. Opening a new invite reset the previous setup attempt cleanly. Toast placement and alignment were also corrected so the invite card stayed readable.
- Retry recovery-kit confirmation after a refusal. A server refusal appeared once beside the recovery kit, kept it on screen and re-enabled Confirm. If the device was offline or disconnected during confirmation, the prompt explained that it was waiting and continued automatically when connectivity returned.
- Independent wakeups on Linux. Linux preserved separate scheduled wakeups so an earlier background event could not discard a later device-join event. The real-server test tools also gained isolated Linux keyring, session-bus and virtual-audio environments.
- Large files prepare in the background. Preparing a large attachment moved off the interactive thread. This kept file staging from holding up the window while the file was processed.
- Dragged files keep their actual contents. Imported demo attachments kept their original bytes and metadata for sending, saving, copying and dragging, even if the source later changed or disappeared. On Linux, exported files remained available long enough for the receiving file manager to read them.
- Window controls and longer names. The window buttons were aligned on one header surface. Organisation titles gained priority over member counts, and truncated text dropped trailing spaces before its ellipsis.
- New conversations use the organisation being viewed. Starting a new conversation selected the organisation currently on screen. It no longer placed the conversation under a different organisation left over from earlier activity.
- Membership and people lists scale more steadily. Repeated member searches were replaced with more efficient lookups, and people-list work stopped multiplying rapidly with organisation size.
- Newcomer joins take turns. Existing members took turns adding a newcomer to a directory or open channel instead of all trying at once. This reduced competing membership changes, with a deliberate wait when members earlier in the turn order were offline.
- Retrying delivery after a failed inbox write. A failed server inbox write no longer discarded the pending delivery signal. The delivery path kept enough state to try that notification again. Confirmation of a stored message no longer waited for a slow recipient inbox notification to finish.
- Membership changes survive interrupted delivery. New-device welcome data was stored with the membership change that created it. Related join, welcome and leave notifications gained retry handling, and an uncertain change was settled by catching up with the conversation.
- An uncertain send is checked before retrying. If the server reported an internal error after possibly accepting a message, the client kept the send unresolved and checked the conversation first. It no longer treated the error alone as proof of failure and risked sending the same message again.
- Smaller graphics allocations when idle. The Mac renderer stopped reserving large upload buffers at launch and instead grew them when needed. Smaller initial allocations and safe shrinking reduced retained graphics capacity without changing the visible interface.
- Less allocation churn while editing. Growing text reused layout and accessibility buffers, and ordinary Mac text insertion avoided a temporary heap allocation. Reapplying an unchanged appearance also stopped triggering redundant native updates during typing and hovering.
- Reclaim pictures and graphics caches safely. Memory-pressure events could release disposable interface and graphics caches while preserving drafts, composition, selection, undo and staged attachments. Offscreen decoded attachment reuse was also bounded during normal frames.
- Staged files release idle copies. After an attachment was safely sealed in the local store, unnecessary in-memory copies could be released. Preview and send read one staged item at a time while retaining captions, fallback data and completion handling.
- Diagnostic logs avoid private contents. Unexpected server failures stopped including exception details that could contain content. Interface diagnostics likewise reported structure and text sizes rather than the text itself.
- Automation cancels and shuts down cleanly. Shared runtime and automation work repaired cancellation, late completion and shutdown handling. A stopped plugin no longer received callbacks intended for an active owner, and queued work retained the right caller through cleanup.
- Preferences follow the selected profile. Appearance and notification preferences could be stored independently of a graphical window and remained tied to the selected profile. This supported consistent settings for the shared runtime’s different interfaces.
In the works 2 changes · designs and groundwork
- Several servers in one client. A design for using several servers in one client was chosen, and the core gained separate account state and concurrent server sessions.
- One core for graphical and terminal clients. A shared-runtime design was accepted for graphical, headless and future terminal clients. Lifecycle, plugin preferences and automation scheduling began moving into reusable services.
Under the hood 9 changes · tests, tools and the server
- Documented dictation limits. Input tracing was added without recording the text itself. A hand check established that macOS 27 did not supply dictation alternatives, including in TextEdit, and the documentation was corrected to reflect that limit.
- A more compact encryption-state format. Stored group-encryption state switched from a verbose text format to a more compact representation.
- Portable services and private diagnostics. Launch options and file services were moved behind shared platform interfaces, and diagnostic output was limited to structure and byte counts instead of interface text. Encryption checks and provider boundaries were strengthened during the same portability repair.
- Release builds exclude demo data. Sample conversations and other demo content were removed from release builds. Demonstration support remained a development and test facility.
- Graphics and image verification. Generated files were checked against source content, visual-test crops were corrected for display scale and frame pacing gained stronger checks. Menu snapshots and application-exit reporting also became more dependable.
- Memory and safety checks. Memory-safety runs were added for the application and chat interface, with coverage for longer lists and a release-size limit. Separate memory tooling observed real desktop footprint and activity workloads; a Linux graphics-driver exit allocation was attributed without relaxing owned-memory leak checks.
- Keeping real-client tests aligned. Real-client chat and interface tests were repaired to follow the evolving conversation and membership flows.
- A durable coordination record. Coordinating the work moved from a running handover document to issues and a generated live status view. Lasting facts were transferred into the roadmap and product documentation before the handover document was removed.
- Checking encrypted call-record transfer. Tests checked that existing call records travelled through encrypted device linking and backups and returned intact on import. They also checked that those records were absent from the plaintext seen by the relay or backup server.