Group applications under their organization, with its money on the heading #5

Merged
geusebio merged 2 commits from feature/org-tree-and-credit into main 2026-08-15 13:04:46 +00:00
Owner

Needs scclient #5 and the platform's #649.

The menu listed applications flat, which left the balance nowhere to live. Organizations are now headings with their applications indented beneath, and the heading carries what the organization has — balance, a braille sparkline of the last day's hourly spend, and how long that lasts at the current burn.

The menu

Order, as asked: who you are → what is unread → the tree → the controls. systray appends, so that is the order rows are added in — which is why the first fetch happens in the middle of onReady rather than after it. The sync/outcome row sits under the tree rather than over it: it answers "did that work?", which only somebody who has just clicked is asking. Say the word and it goes entirely.

A heading, not a submenu — and the capture suite is why

Nesting organizations put every toggle four levels deep, and the fourth level drew as an empty sliver. Not a canvas problem: libdbusmenu asks for grandchildren before their parents on its first layout request, and systray's Linux backend works around that exactly one level down — its own comment says so. A heading keeps the grouping, keeps the money where it belongs, and keeps a deployment two clicks from the icon.

This is the third defect the captures have caught, after the applications-below-Quit ordering and two silently-empty walks.

The gestures

Details worth knowing

  • The bell only appears when something is unread. A row that permanently reads zero is one people stop seeing. It carries the newest title, because a bare count makes you open a browser to find out whether it was worth opening a browser for.
  • Balances read on their own five-minute timer. Money moves in hours; a request per organization every ten seconds would be six a minute to watch a number that has not changed.
  • The sparkline is braille, for the same reason the CLI's spinner is: a menu item is plain text on every platform, and braille is the only alphabet that draws a chart in one. A day of hourly readings fits in twelve characters.
  • No projection is not a runway of infinity. Nothing metered, or nothing left, and the row simply omits the estimate.
  • The capture image gained an emoji font — the bell was drawing as tofu, which is a fault in the photograph rather than in the menu.

go build, go vet, go test ./... clean; captures regenerated for all three themes and read before committing.

Needs [scclient #5](https://git.grey.ooo/Grey.ooo/someones.computer_scclient/pulls/5) and the platform's [#649](https://git.grey.ooo/Grey.ooo/Someones.Computer/pulls/649). The menu listed applications flat, which left the balance nowhere to live. Organizations are now headings with their applications indented beneath, and the heading carries what the organization has — balance, a braille sparkline of the last day's hourly spend, and how long that lasts at the current burn. ![The menu](https://git.grey.ooo/Grey.ooo/someones.computer_tray/raw/commit/0fe5cf8b3f6d4890a54bc35ac43e86109b3a019e/docs/images/macos/tray-menu.png) Order, as asked: **who you are → what is unread → the tree → the controls.** systray appends, so that is the order rows are added in — which is why the first fetch happens in the middle of `onReady` rather than after it. The sync/outcome row sits *under* the tree rather than over it: it answers "did that work?", which only somebody who has just clicked is asking. Say the word and it goes entirely. ## A heading, not a submenu — and the capture suite is why Nesting organizations put every toggle **four** levels deep, and the fourth level drew as an empty sliver. Not a canvas problem: libdbusmenu asks for grandchildren before their parents on its first layout request, and systray's Linux backend works around that exactly one level down — [its own comment says so](vendor/fyne.io/systray/systray_menu_unix.go). A heading keeps the grouping, keeps the money where it belongs, and keeps a deployment two clicks from the icon. This is the third defect the captures have caught, after the applications-below-Quit ordering and two silently-empty walks. ![The gestures](https://git.grey.ooo/Grey.ooo/someones.computer_tray/raw/commit/0fe5cf8b3f6d4890a54bc35ac43e86109b3a019e/docs/images/macos/tray-gestures.png) ## Details worth knowing - **The bell only appears when something is unread.** A row that permanently reads zero is one people stop seeing. It carries the newest title, because a bare count makes you open a browser to find out whether it was worth opening a browser for. - **Balances read on their own five-minute timer.** Money moves in hours; a request per organization every ten seconds would be six a minute to watch a number that has not changed. - **The sparkline is braille**, for the same reason the CLI's spinner is: a menu item is plain text on every platform, and braille is the only alphabet that draws a chart in one. A day of hourly readings fits in twelve characters. - **No projection is not a runway of infinity.** Nothing metered, or nothing left, and the row simply omits the estimate. - The capture image gained an emoji font — the bell was drawing as tofu, which is a fault in the photograph rather than in the menu. `go build`, `go vet`, `go test ./...` clean; captures regenerated for all three themes and read before committing.
Group applications under their organization, with its money on the heading
Some checks failed
CI / build (pull_request) Has been cancelled
0fe5cf8b3f
The menu listed applications flat, which left the balance nowhere to live and
made "whose is this?" a question the tray could not answer. Organizations are
now headings, their applications indented beneath, and the heading carries
what the organization has: the balance, a braille sparkline of the last
day's hourly spend, and how long that lasts at the current burn.

The order is the one asked for: who you are, what is unread, the tree, then
the controls. systray appends, so that order is the order rows are added in —
which is why the first fetch happens in the middle of onReady rather than
after it. The sync/outcome row sits under the tree instead of over it: it
answers "did that work?", a question only somebody who has just clicked is
asking.

**A heading rather than a submenu, and the capture suite is why.** Nesting
organizations put every toggle four levels deep, and the fourth level drew as
an empty sliver: libdbusmenu asks for grandchildren before their parents on
its first layout request, and systray's Linux backend works around that
exactly one level down (its own comment says so). A heading keeps the
grouping, keeps the money where it belongs, and keeps a deployment two clicks
from the icon.

The bell only appears when something is unread — a row that permanently reads
zero is one people stop seeing — and carries the newest title, because a bare
count makes you open a browser to find out whether it was worth opening a
browser for.

Balances are read on their own five-minute timer. Money moves in hours, and a
request per organization every ten seconds would be six a minute to watch a
number that has not changed.
Note that coverage floors are Linux figures, since CI is what they gate
Some checks failed
CI / build (pull_request) Has been cancelled
d92b98de85
geusebio force-pushed feature/org-tree-and-credit from d92b98de85
Some checks failed
CI / build (pull_request) Has been cancelled
to 0fe5cf8b3f
Some checks failed
CI / build (pull_request) Has been cancelled
2026-08-14 20:46:35 +00:00
Compare
Pin scclient to the merged credit and notification reads
All checks were successful
CI / build (pull_request) Successful in 4m24s
b86948656f
geusebio changed title from WIP: Group applications under their organization, with its money on the heading to Group applications under their organization, with its money on the heading 2026-08-15 13:04:41 +00:00
Sign in to join this conversation.
No reviewers
No labels
in-progress
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Grey.ooo/someones.computer_tray!5
No description provided.