Window overview: a drawer page listing what's open on the desktop #3
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Triage: enhancement, needs-triage (the repo has no labels yet). Not ready to start: the scope and the privacy trade-offs need deciding first.
Want
An overview of what's open on the desktop: every niri window, grouped by workspace in strip order. As far as possible it should also show what's in each window: every browser tab, and a synopsis of what a terminal is showing.
What we know (verified on the running system, niri unstable 2026-08-02)
niri gives us, per window:
id,title,app_id,pid,workspace_id,is_focused,is_floating,is_urgent,focus_timestamp, andlayout(pos_in_scrolling_layout= [column, row], tile and window sizes). The data comes fromniri msg --json windowsor the event streamNiri.qmlalready reads.WindowsChangedarrives on connect. Updates should come fromWindowOpenedOrChanged,WindowClosedandWindowLayoutsChanged, but none of those were observed yet. Check them on the wire before relying on them, given theWindowFocusChangedhistory in NOTES.md.pidis shared: every Firefox window has the same pid, and so does every Ghostty window./procdata is per app, not per window, for both.Browser tabs:
~/.mozilla/firefox/default/sessionstore-backups/recovery.jsonlz4(mozlz4:mozLz40\0+ 4-byte size + an LZ4 block). It's refreshed about every 15 seconds. Decoding needs an LZ4 decoder, which isn't on the wrapper's PATH today.<selected tab title> — Mozilla Firefox. Not yet confirmed.Sessions/Session_*files are an undocumented binary format.Terminal contents:
herdr pane read <id> --source visible, andherdr agent listgives agent state. So realistically, only terminals running inside herdr can get a synopsis.herdr api snapshot.niri msg action screenshot-windowwould also write every capture to the clipboard, and from there into clipboard history.Open questions (why this needs more thought)
home? Its own key? Should it act on windows (focus, close) or only show them?claude -p --model haiku, or the API) costs money and time.envoutput and private data. Should it be opt-in per pane? Redacted? A local model? Tab URLs and titles are sensitive too, even if they never leave the machine.fjordxy-windows, likefjordxy-settings.py) that joins niri, tabs, herdr and cached summaries into one JSON document, drawn by a thin QML page? Or aNiri.qmlwindow mirror plus per-app providers in QML?Spikes before deciding (all read-only)
recovery.jsonlz4and confirm the selected-tab title ↔ niri title match.herdr api snapshotand see whether its panes can be tied to Ghostty windows.Direction change: terminal content comes from Rex
Superlogical's Rex will replace herdr (see #4), so the terminal half of this issue is designed against Rex, not herdr. That changes several things above:
idle/working/done/blocked(with akind:permission,questionorauth) /error, plus a one-linemsgand optionalprogress. Rex delivers these asprogram_status_changedevents. This mostly settles open questions 3 and 4: the program chooses what to disclose, and nothing leaves the machine. An LLM synopsis would only fill in for programs that don't report status. Theherdr pane readroute is dropped.name,cwd,pid) throughterminal.process_changed, and directory changes throughpwd_changed.rex events --all --jsonprints one JSON object per line, like niri's stream.donestays until the user has seen it, which fits howNotify.qmlmarks messages read.Rendering risk (applies whatever the source)
Window titles, tab titles and any
msgare untrusted text. QML'sTextdefaults toAutoText, which renders anything that looks like HTML as rich text, so these fields needtextFormat: Text.PlainText. OSC 7501 also asks that displayed status name the terminal it came from, so one program can't pose as another.Spike list, updated
herdr api snapshot.