This design spec outlines the enhancements to Mattermost's desktop and web application to allow users to open popout windows for channels, threads, and other functions, facilitating improved multitasking and monitoring capabilities.
This enables users to engage in multiple conversations simultaneously without losing context, thereby enhancing operational efficiency and collaboration.
Server: A configured Mattermost server identified by a name and URL. Is housed in a tab.
Primary View: The parent tab for a server. Handles login, logout.
View: A self-contained part of the Mattermost Web App, like a Thread, or a Channel. A View can appear as a Tab or as a Pop-out Window.
Tab: A view attached to the Main Desktop App window similar to a Chrome tab. This can be an isolated view or an entire server view attached to it.
Pop-out Window: A separate standalone window in the Desktop App that houses a single View. It has been ‘popped out’ from the Main Desktop App window.
Server Menu: A dropdown list showing all configured servers in the Desktop App. Clicking a server opens a new tab for that server.
Users can open any channel in a separate window via an "Open in New Window" option accessible from the channel menu and the left sidebar. When a channel is opened in its own window, it opens in an isolated view without all the other navigation surrounding it.
There are a few ways to do this:
From the left sidebar | From the channel menu | From the channel header |
---|---|---|
![]() | ![]() | ![]() |
From the LHS channel list, users can also use Command/CTRL click to open a new window
Question: what about opening in a new tab? What shortcut for that?
Default size: 920px x 640px
Title that displays in title bar: {Channel name} - {Team name}
To start, we will use the native window bar
Within a channel window, users can:
Threads → open the RHS in the active channel window
Once a thread is open in the RHS, it can also be popped out in to its own window
Channel or thread links external to the active channel → open in the main window (bringing focus to that window)
RHS panels for pinned messages, files, members, info, etc → all open in the RHS in the active channel window
Users can also open any thread in a separate window via an "Open in New Window" option accessible from the RHS header button or Thread inbox view. When a thread is opened in its own window, it opens in an isolated view without all the other navigation surrounding it.
There are a few ways to do this:
Thread RHS header button | Threads header context menu | Threads header button | Threads list context menu |
---|---|---|---|
![]() | ![]() | ![]() | ![]() |
The new window button replaces the expand button in the RHS.
The new window button is hidden when the thread is viewed in the popout window
The close button is also hidden in the header when viewed in the popout window
In the Threads view a new window button is added next to the ••• button
Default size: 840px x 720px
Title that displays in title bar: Thread: {Channel name} - {Team name}
To start, we will use the native window bar
Within a thread window, users can:
No navigation within the thread window. Links external to the active thread → open in the main window (bringing focus to that window)
To start, we’re thinking of allow Playbook Runs and Copilot to be opened up in new windows.
Default size: 920px x 640px
To start, we will use the native window bar
In addition to multiple windows for the above views, we will also support multiple tabs.
We will be changing the behavior for the ‘Channels, Playbooks, and Boards’ tabs. Those will no longer be default tabs.
The ‘Main Window’ for a server must always be open to maintain the state and notifications for that server. Additional views from a server can be opened through the methods identified above. When switching servers, all tabs within that server are remembered from the last state.
If the title of a tab grows beyond the available (or max width), we will show a tooltip on hover with the full title for the tab. (will need to be a native tooltip)
Max-width for a tab should be 240px
Any tab in the desktop app bar can be closed and the re-opened through again through the server menu.
The main tab for a server cannot be closed
Opening a new tab must be done through the ‘open in new tab’ option for a channel, thread or RHS.
When a product (e.g. Boards) is clicked from the product switcher menu, by default the current window context will be replaced with that product.
An ‘open in new tab’ icon will be available on hover to open the product as a separate tab. Command/Ctrl-clicking the menu item will also open in a new tab.
For any window view, right-clicking on the top bar opens a context menu (native OS context menu) with the option to move to the main window. This will then add it as a tab back in the main window for it’s server.
For any channel, thread or view that is in it’s own tab (aside from the main server tab), users can right-click to open a context menu (native OS context menu) with the option to “Move to new window”.
NOTE: these options would not be available on the main tab for a server.
If a view is focused, suppress notifications for its content.
If a view is open but not focused, show a notification and shift focus to the view.
Prevent duplicates across multiple open views of the same thread/channel.
Synchronize read/unread states across all open views.
If a window or tab has been inactive for more than 1 hour, it can be suspended to reduce memory/CPU usage. When refocused, there will need to be a loading spinner.
If a notification or unread comes in on an inactive view, it can be considered active again and woken up.
Tabs: If a user opens more than 15 combined views (tabs + windows), we can warn them of performance degredation:
“Opening many windows or tabs may reduce performance. Consider closing unused views.”
The following UX navigation patterns are enforced by the underlying architecture:
Intra-server navigation always stays within the current tab or window.
Cross-server links will:
Open a new tab for the destination server (if not already open), or
Focus an existing tab for that server.
Pop-out window navigation (e.g., thread or plugin views):
Cannot navigate freely—external links or disallowed paths are passed back to the parent window and either opened in a browser window or in a server tab if it’s a link to another server that is configured in the app.
Specialized windows (like the Calls widget) may have custom logic.
PRD (Coming soon)