Tray, notifications and persistence
The tray menu and its attention mark, when desktop notifications fire and where they come from, and what survives a restart.
Tray roster
Sirio puts a native tray icon on each platform: NSStatusItem in the macOS menu bar, Shell_NotifyIcon in the Windows notification area, StatusNotifierItem on Linux. At rest the icon is a terminal on macOS and Linux and Sirio’s own icon on Windows. It switches to an attention mark when an agent needs your input: the questionmark.circle symbol on macOS, a dialog-question overlay on Linux and Sirio’s attention icon on Windows. An agent that runs, finishes or fails leaves the icon at rest.
The menu lists one row per worktree whose agents report a status, most urgent first: failed, needs input, running, then finished. Each row names the branch and the project, then the status and how long it has held it, such as running · 3m. When no worktree has an agent in one of those states, the menu reads No active agents. Click a row to bring the window forward on that worktree, at its most urgent tab. Open Sirio brings the window forward, and Quit Sirio quits.
On macOS the icon opens the menu. On Linux and Windows a left click on the icon brings the window forward, and a right click opens the menu. On macOS and Linux, closing the window only minimizes it, so the tray is a way back in; on Windows the close button quits Sirio.
Notifications
Sirio posts a desktop notification when an agent changes to needs input, done or error, the same states the sidebar shows; see Activity states. A change to running raises none. Nor does any change in the tab you are working in while Sirio’s window is active, since you can already see it. The notification’s title names the agent, then the project and branch of the worktree you have selected in Sirio.
Where a notification comes from depends on the platform:
- macOS: once you allow Notifications in Settings → Permissions, notifications come from Sirio itself, with its icon, and show as a banner even while Sirio is in front. Until then they go through Script Editor. If you deny them, Sirio shows none.
- Linux:
notify-send. - Windows: a notification-area balloon.
Agents can post their own with sirioctl notify --title … --body …, which takes the same route.
Persistence
Sirio keeps its state in a local SQLite database. It saves a moment after each change and once more when it quits, and a launch brings back:
- Your projects and worktrees, with the worktree you had selected. Each other worktree’s tabs come back when you switch to it.
- Every tab in both panes, and the tab each pane showed: terminals with their splits, chats with their conversation and any unsent draft, browser tabs at their address, editor tabs whose file still exists, the Changes tab on the file it showed, commit tabs, Project Settings tabs, pull request tabs on the inner tab you left, and read-only snapshots.
- The pane each moved terminal or chat sat in, and whether each worktree’s right pane was hidden.
- Closed chats, at most 50 and none older than 30 days.
- Whether the sidebar showed Projects or Sessions.
A terminal reattaches to the session that kept running, as the next section describes. A chat starts its agent again, and with Resume agent sessions on launch turned on in Settings → General, as it is by default, a restored Claude Code chat picks its own session up again; see Agent chats.
Terminals that outlive the app
Every terminal Sirio opens runs in sirio-host, a small background process detached from the app, and not inside the app. An agent in a terminal keeps running through a crash, a Force Quit, a Quit or an update, and Sirio picks it up again when it starts. A chat is not a terminal: it starts its agent again on launch, as Persistence above describes. Settings → General shows the host’s status.
- Quit does not stop your terminals. Quitting detaches from the host. The next launch reattaches every terminal it left, with its scrollback. The same holds when the app crashes or is force-quit.
- Nothing is lost on the way. Sirio adopts a terminal the host still runs but no tab shows into the worktree that holds its directory. After a reboot the host is gone too, and the tabs come back as a new shell with the old scrollback, with the agent resumed where it supports that.
- Closing still ends things. Closing a tab, a worktree or a project ends the terminals inside it.
- If the host goes away, the tab says Session lost and offers Restart, and the next terminal starts a new host. When no host can be used at all, terminals run inside the app and a banner says why.