Skip to content

Thaw and Ice fixes and features - #40

Merged
holzcloud merged 31 commits into
mainfrom
claude/ice-fork-development-hzdl1d
Oct 3, 2026
Merged

holzcloud merged 31 commits into
mainfrom
claude/ice-fork-development-hzdl1d

Conversation

@holzcloud

@holzcloud holzcloud commented Oct 3, 2026 •

Copy link
Copy Markdown
Owner

Fixes and features from the other Ice fork, Thaw (GPL-3.0), and from the open pull requests and issues of the original Ice by Jordan Baird. Two phases share this pull request: 05.1.1 Thaw fixes and speed and 05.1.1.1 Thaw features. Code adapted from Thaw is credited in NOTICE (one line per file).

Done — Phase 05.1.1

Plan 05.1.1-01: input, robustness, hardening

  • THAW-07 No input path waits on another app: the application menu frame and the menu bar's validity are read off the main thread with a 0.25 s per-element timeout (ApplicationMenuFrames); hit tests, hiding app menus, temporary showing and the overlay read the cache; macOS 27 item bounds asked on the main thread come from the last read.
  • THAW-05 A click on empty bar space reveals from cached state; the debug log says how many ms after the click. The double-click part does not apply (holzBar has no double-click option; Option-click picks Always Hidden).
  • THAW-03 Event taps rebuild an invalid port and enable after adding their run loop source; a health check runs after wake/unlock/display changes and when Accessibility is granted. Automatic moves back off (60 s doubling to 10 min, adapted from Thaw's MoveCircuitBreaker); Layout pane and Shelf moves always go through. holzBar rests while locked, asleep or switched away and settles 2 s after. The tint and shape stand on every desktop, follow the item list, reveals and macOS 27 concealment, step aside in fullscreen, and come back after sleep and login.
  • ICE-01 (Fix macOS 26 (Tahoe) support and harden XPC, config parsing, and logging jordanbaird/Ice#985) Stored hotkeys with an out-of-range key code or unknown modifier bits are ignored instead of trapping; stored colours with the wrong component count are rejected; the logs check fails on a public window title.

Plan 05.1.1-02: identity, menus, Dock icon, URL audit

  • THAW-01 Items keep their identity when their titles change (numbers canonicalised, title-changing apps learned and keyed by position, several items of one app kept apart; old stored keys still match). Before macOS 27, sections are saved after the user arranges items and restored through one path on launch, app launch (+ one 2 s re-check) and display settle; profiles, groups, known items and temporary shows match by identity.
  • THAW-02 Only real menus delay rehiding (before and on macOS 27). On macOS 27 a click is bridged to the clock only inside the visible bar's rectangle. Settings and the search open without a Dock icon; new setting "Keep the Dock icon hidden" (on by default). Notification Center already followed the click (no fixed timer).
  • THAW-08 holzbar://profile/<name> asks before it rearranges the bar (Cancel is the default); every URL command's effect is documented in Integrations/Raycast/README.md.
  • ICE-02 #900 was already done (no mouse-down monitor without a click feature). #933: clicks on another app's window above the bar (notch apps) no longer toggle hidden items. #911: failed source-PID lookups are remembered for 30 s and the application menu is found at several points (control items were already recognised directly). #923: a respawned app is not launched twice (the other causes were fixed earlier).

Plan 05.1.1-03: macOS 27 displays and notch, no screenshots, docs

  • THAW-04 macOS 27 hover, click and right-click on the display whose bar is not active use the frames MenuBarAgent draws there; holzBar's icon is kept out from under the notch by a transient concealment; folded items come back on a roomier display; the overflow button is bridged like the clock. The spacing parts do not apply to holzBar: one global spacing, applied only by the Apply button, no per-display spacing, no prompt after sleep.
  • THAW-06 Nothing drawn over the bar takes a screenshot on macOS 27: the wallpaper beside a shape comes from the desktop picture file (a file watcher instead of a 30 s timer), the search uses the flat colour, and a cover hides the concealed items while a clock click lifts concealment.
  • ICE-03 ([macOS 27 / PR #995] An app launched while concealed gets a squashed (3 pt) menu bar item that never recovers jordanbaird/Ice#1007) An app launching into a concealed section is shown until its item exists, so it is not squashed to 3 points.
  • ICE-04 (rest of macOS 27 support: remaining gaps on top of #995 jordanbaird/Ice#1001) Hidden items open from the search through ItemClicker27; bundleless items are disabled in the Layout pane with a tooltip; settings without effect are hidden on 27; the wallpaper window is found under WindowManager; a dropped holzBar icon is put back.
  • ICE-06 docs/upstream-bugs.md is up to date (#1005, #1007, #974, #968, #988, #959, #979, #961, #976).

README (05.1.1): new rows in "holzBar vs. Ice and Thaw", the feature list, the macOS 27 section and the Screen Recording row.

Done — Phase 05.1.1.1

Plan 05.1.1.1-01: Zen mode, Shortcuts, hotkeys per profile and item, profiles per display or Space

  • THAW-10 Zen mode keeps hidden items hidden: hover, empty-bar clicks, scrolling, reveal rules, URL commands and change reveal show nothing; holzBar's icon and the section hotkeys still do. On from a hotkey, holzBar's menu, holzbar://zen/toggle or Shortcuts, and optionally on its own while a display is mirrored or the screen is shared (screen sharing agent and mirror state from notifications; no permission, no polling).
  • THAW-15 Shortcuts actions (App Intents): Toggle Zen Mode, Change Section, Apply Layout Profile, Open Menu Bar Item (by name, fuzzy), Search Menu Bar Items, with App Shortcuts. Every layout profile and every menu bar item can have its own hotkey (Hotkeys pane, item context menu); the old hotkey storage is unchanged.
  • THAW-11 Profiles can be bound to a display or a Space and apply when the display connects or the Space becomes active (the Space wins); rename and delete keep bindings and hotkeys in step.

Plan 05.1.1.1-02: item hints, keyboard and VoiceOver, rehide, change reveal

  • THAW-14 "Open an item by letter": a hotkey shows every item with a letter under the menu bar; typing it opens the item, hidden ones included. Every way of opening an item (Shelf, search, groups, hints, hotkeys, Shortcuts) goes through one path.
  • THAW-13 The Layout pane works from the keyboard (focus, arrows, Option-arrows, Command-1/2/3), with undo and redo of moves and of deleting a profile, and VoiceOver actions; the holzBar Shelf opened by its hotkey works with the arrows, Return and Escape.
  • THAW-12 Opened items stay up to 30 s after their menu closes (the delay starts when the menu closes, on macOS 27 too); "Open hidden items in the menu bar" off opens them in place without showing them. "Show When It Changes" shows a marked item for 5 s when its title or value changes (at most every 30 s, never in Zen mode; Accessibility notifications, no polling).

Plan 05.1.1.1-03: images and folders, appearance, sync, languages

  • THAW-16 Any item can have an image of your choice or its app's icon (Layout pane context menu); without Screen Recording the Shelf and the search show app icons. Groups get a colour and a symbol or image.
  • THAW-17 Dashed and dotted borders; tints that follow the wallpaper or the accent colour; the system's glass (macOS 26 and later). Older appearances import unchanged.
  • SYNC-01 Settings sync through iCloud Drive or any folder the Macs sync (Nextcloud, Dropbox, OneDrive, Syncthing, a network share), chosen with an open panel and kept as a bookmark; existing iCloud Drive users keep syncing without a question.
  • ICE-05 holzBar in English, German (Swiss spelling), French, Italian and Romansh: three String Catalogs (359 strings), AppKit texts through String(localized:), a strings CI job that proves every text has its four translations. macOS's per-app language chooses it. The translations are machine-written and wait for a reader.

README: new comparison rows, selling point "Five languages", feature list, permissions ("A folder you choose"), 338 unit tests, app size 16.5 MB. CI also checks that every language and the App Intents metadata are in the built app.

Before merging (macOS 26 and 27)

05.1.1-01

  • Stop a menu bar app (kill -STOP <pid>), then hover, click the menu bar and type for 30 s: the pointer, clicks and keys never stall (kill -CONT afterwards).
  • log stream --predicate 'subsystem == "com.holzcloud.holzBar"' --level debug | grep 'after the click' shows about 70 ms or less.
  • Lock for a minute and unlock, sleep and wake, unplug and replug a display: no move or capture while locked, items keep their sections, the look is back within about 2 s.
  • Launch at login keeps the tint and shape.
  • Tint and shape on every desktop, follow an app adding an item, show with the icons, step aside in fullscreen.
  • Layout pane drags always move, also right after a "paused" log line.
  • defaults write com.holzcloud.holzBar Hotkeys -dict-add ToggleHiddenSection -data 5b39393939392c3235365d, relaunch: ignored without a crash.

05.1.1-02

  • macOS 26: an app with a changing title (mail counter, date item, iStat Menus) in Hidden stays there after its title changes, a relaunch, a holzBar restart and a display unplug/replug, and is never moved into the new-items section. Two items of one app keep their sections after a relaunch. A profile applied from the Layout pane moves every item. A Command-drag on the bar is kept after the next app launch.
  • With a Dock-preview or floating-window app running, an item opened from the Shelf hides again after its menu closes.
  • macOS 27: a click just below the clock over a maximised window, and near the clock in a fullscreen video with the bar hidden, reaches the app; a click on the clock still opens Notification Center at once.
  • Settings, the search and revealing items over a crowded bar show no Dock icon; with "Keep the Dock icon hidden" off the application menus hide again (with the icon).
  • With boring.notch or another notch app, clicking its controls with show on click on does not toggle hidden items.
  • macOS 26 on a notched Mac: a Shelf click on a hidden item opens it on the first try.
  • Apply spacing relaunches every app (Spotlight, a respawning helper) once.
  • open "holzbar://profile/Work" asks; Cancel (Return or Escape) leaves the bar unchanged.

05.1.1-03

  • macOS 27 with two displays: on the display whose bar is not active, hovering and clicking an item does not reveal hidden items, right-clicking holzBar's icon keeps its menu open, another app's item opens its menu there.
  • Notched MacBook with a crowded bar: holzBar's icon is visible after launch and after unplugging an external display; moving the bar to a wide external display brings folded items back; » opens while items are concealed.
  • macOS 27 with a split or rounded shape and a picture wallpaper: the wallpaper shows beside the shape and nothing lights the recording indicator; a new wallpaper shows within a second.
  • Clicking the clock while items are concealed opens Notification Center with no hidden item flashing.
  • Launching an app whose section is Hidden: its item is full width when revealed.
  • macOS 26: a shape shows the wallpaper beside it without Screen Recording.
  • macOS 27: a hidden item opened from the search opens its menu; an item without a bundle identifier is disabled with the tooltip; the five Advanced settings are hidden; the icon stays reachable after ten minutes of concealing.

05.1.1.1-01

  • Zen mode from holzBar's menu: hidden items hide; hovering, clicking empty bar space and scrolling reveal nothing, a low-battery or offline rule does not reveal, open holzbar://show/hidden is ignored; holzBar's icon and the section hotkey still show them. The Zen mode hotkey and open holzbar://zen/toggle toggle it; Shortcuts lists "Toggle Zen Mode" and it works.
  • "Turn on Zen mode while the screen is mirrored or shared": mirroring a display (or AirPlay) and another Mac sharing this screen turn Zen mode on, ending them turns it off; lsappinfo list | grep -i screensharing during a session lists the sharing agent.
  • A profile and an item with a hotkey: the profile applies and the item's menu opens from the keyboard; both survive a relaunch and an export/import.
  • Shortcuts lists holzBar's actions; "Apply Layout Profile" lists the profiles; "Change Section", "Open Menu Bar Item" (by name) and "Search Menu Bar Items" work.
  • Bind a profile to an external display, unplug and replug it: it applies once; bind one to a Space and switch Spaces: it applies; after a restart the bindings still work.

05.1.1.1-02

  • "Open an item by letter": every item shows a letter; typing one opens its menu (hidden ones included), Escape closes; VoiceOver reads "A, Wi-Fi". The Shelf, the search and a group still open items as before.
  • macOS 26 Layout pane: Tab to an item (focus ring), arrows, Option-Right moves it one place, Command-2 moves it to Hidden, Command-Z puts it back, Shift-Command-Z redoes; a mouse drop is undone the same way. macOS 27: Option-Right beeps and says why; Command-1/2/3 change its section and undo.
  • Delete a profile and press Command-Z: it returns with its binding and hotkey; the bar does not move.
  • VoiceOver: layout items read name and section and offer the move actions; Shelf items offer Open and Open Menu. The Shelf opened by its hotkey works with arrows, Return and Escape.
  • With the delay at 10 s an item opened from the Shelf stays 10 s after its menu closes; with "Open hidden items in the menu bar" off its menu opens without the item appearing.
  • A counter or timer app marked "Show When It Changes" shows for 5 s when its title changes, at most every 30 s, never in Zen mode; note which apps post no change.

05.1.1.1-03

  • Choose an image for an item: it shows in the Layout pane, the Shelf, the search and the hints and survives a relaunch; "Use App Icon" and "Reset Image" work. Without Screen Recording (tccutil reset ScreenCapture com.holzcloud.holzBar) the Shelf and the search show app icons. A group with a colour and an image shows them in its icon and panel.
  • Border styles Dashed and Dotted at widths 1 and 3; "Follow Wallpaper" follows the wallpaper without the recording indicator; "Use Accent Color" follows a change in System Settings at once; "System Glass" looks like the system's glass; an appearance exported before this PR imports unchanged.
  • Settings sync: an existing iCloud Drive sync keeps working after the update without a question; "Change…" to a Nextcloud, Dropbox, OneDrive or Syncthing folder on two Macs: a change on one arrives on the other; "Turn Off" stops it.
  • holzBar's language set to Deutsch, Français, Italiano and Rumantsch (System Settings → General → Language & Region → Applications), relaunched: menus, Settings, alerts, the permissions window and Shortcuts actions are translated, nothing is cut off, holzBar and holzBar Shelf stay as they are. A native speaker (or you) reads the machine-written translations, Romansh above all.
  • With macOS in English and German as a second language, holzBar stays in English (the app has no en.lproj; English comes from the development region).

Website

Rows for the comparison table on https://holzcloud.ch/holzbar (Ice 0.11.12 / Thaw 3.0 beta / holzBar), all added in this pull request:

Row Ice 0.11.12 Thaw 3.0 beta holzBar
Zen mode (also while presenting) ❌ ✅ ✅
Hotkeys per profile and per item ❌ ✅ ✅
Shortcuts actions (App Intents) ❌ ✅ ✅
Profiles bound to a display or a Space ❌ ✅ ✅
Folders with their own icon and colour; item images of your choice ❌ ✅ ✅
Dashed and dotted borders, wallpaper, accent and glass tints ❌ ✅ ✅
Open an item by letter ❌ ✅ ✅
Layout editor and Shelf from the keyboard, undo, VoiceOver actions ❌ ✅ ✅
Opened items stay up to 30 s, or open without showing the item ❌ ✅ ✅
Show an item briefly when it changes ❌ ✅ ✅ (opt-in per item)
Export and import settings (replaces "Export, import and sync settings") ❌ ✅ ✅
Settings sync: iCloud Drive or any synced folder ❌ ❌ ✅
Languages English many, through Crowdin English, German, French, Italian, Romansh
Input never stalls when an app hangs ❌ ✅ ✅
Items keep their section when an app changes its title ❌ ✅ ✅
Pauses while the screen is locked, settles after wake ❌ ✅ ✅
Look on every desktop, follows the icons, steps aside in fullscreen ❌ ✅ ✅
No screen-recording indicator when showing or hiding (macOS 27) — ✅ ✅
Hover and click on a second display (macOS 27) — ✅ ✅
URL commands that rearrange items ask first — — ✅
Validated hotkeys and colours (no crash loop from bad settings) ❌ — ✅

Changed rows: "Settings sync checks for changes" → when the synced folder delivers them, no polling (Thaw: — no sync); "Unit tests run on every change" → 338; "App size" → 16.5 MB. Selling points: "Five languages" (English, German, French, Italian and Romansh); "More features" now names folders, Zen mode, Shortcuts actions and settings sync through any folder. Permissions: "A folder you choose" replaces "iCloud Drive file"; without Screen Recording the Shelf and the search show app icons.

🤖 Generated with Claude Code

https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu


Generated by Claude Code


Generated by Claude Code

claude added 30 commits October 3, 2026 06:08
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
…eals from cached state

- ApplicationMenuFrames reads the application menu frame and the menu bar's
  validity off the main thread (0.25 s messaging timeout) on frontmost, owner,
  space and screen changes, with two bounded settle reads
- Hit testing, hiding application menus, temporary showing and the overlay read
  the cache; the overlay's millisecond read loop is gone
- macOS 27 item bounds asked on the main thread come from the last read
- Show on click logs how many milliseconds after the click it revealed

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
… while locked or asleep

- SystemActivity (Core, tested) and SystemActivityMonitor pause item reads,
  moves, captures and concealment changes while the screen is locked, the Mac
  sleeps or the session is away, and settle once 2 s after wake, unlock or a
  display change (one-shot wait, no timer loop)
- On settle: health check of taps and monitors, item cache, images where a
  view shows them, macOS 27 concealment and the menu bar appearance
- EventTap recreates a missing or invalid port and adds its run loop source
  before enabling; the health check also runs when Accessibility is granted
- MoveBackoff (Core, tested; adapted from Thaw's MoveCircuitBreaker, credited
  in NOTICE) pauses automatic moves for 60 s doubling to 10 min; user moves
  in the Layout pane and from the Shelf always go through and end a pause
- Rehiding temporarily shown items waits during a pause instead of retrying
  every 3 s without end

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
…urs are validated

- The overlay panel joins every desktop (canJoinAllSpaces, stationary) instead
  of following the active space, steps aside on a fullscreen space and redraws
  with reveals, the item list and the macOS 27 concealment
- The appearance manager restores the panels on settle and retries panels
  that found no menu bar at launch (three times, 3 s apart)
- Stored hotkeys with a key code outside 0...127 or unknown modifier bits are
  ignored; conversions for the system use UInt16/UInt32(exactly:)
  (jordanbaird/Ice#985)
- ColorComponents (Core, tested) rejects stored colours with the wrong number
  of components or values that are not numbers; the gradient average skips
  colours without four RGB components
- The logs privacy check fails on a public window title

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
…the class body

- OSLog interpolations of a property need an explicit self in a method
- ApplicationMenuFrames.ReadResult moves into the class, next to its only user

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
…ne restore path

- ItemIdentity (Core, tested; canonical titles adapted from Thaw's
  canonicalMetricTitle, credited in NOTICE): numbers in titles do not change
  an identity, apps whose titles change beyond that are learned and keyed by
  position, several items of one app stay apart, keys of earlier versions match
- Before macOS 27 the section of every item is saved (ItemSections) after a
  Layout pane drop, a Command-drag on the bar, a profile and on the first run;
  reconcileSections in SectionRestore.swift is the one path that restores them
  on launch, app launch (with one re-check 2 s later) and settle, places new
  items and keeps Live Activities visible; placeNewItems and move(itemsTo:) are
  gone
- Profiles, groups, known items and temporarily shown items match by identity
- The mouse-up monitor notices the end of a Command-drag before macOS 27

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
…ar, no Dock icon, notch apps left alone

- InterfaceWindowRule (Core, tested): only a new menu-level window of the
  item's app (levels 24, 25, 100, 101) keeps a temporarily shown item out,
  before and on macOS 27 (ItemClicker27 lists only menus) (Thaw #1158)
- ClockBridgeZone27 bridges a click only inside the visible menu bar's
  rectangle; frames grow by a point horizontally only; on a fullscreen space
  only while the bar's window is on screen (Thaw #1171, #1191)
- DockIconPolicy (Core, tested): Settings and the search open without a Dock
  icon; the new setting "Keep the Dock icon hidden" (on by default) keeps it
  hidden when items reach the application menus; the toggle hotkey still
  hides them (jordanbaird/Ice#906, Thaw #1197)
- MenuBarOcclusion (Core, tested): show on click and hover ignore another
  app's window above the bar, such as a notch app (jordanbaird/Ice#933)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
…URL commands ask before rearranging

- SourcePIDCache remembers a failed lookup for 30 s instead of scanning every
  app again on each miss (jordanbaird/Ice#911)
- Before macOS 27 the application menu bar is found at the display's corner
  and then 8, 20 and 40 points in, halfway down the bar, following a menu to
  its bar, so notched Macs and Liquid Glass find it (jordanbaird/Ice#911)
- SpacingRelaunch.isRelaunched (tested): a respawned app is not launched a
  second time, a quitting old process does not stop the launch
  (jordanbaird/Ice#923)
- holzbar://profile/<name> asks before it rearranges the bar (Cancel is the
  default, Escape cancels); every URL command's effect is documented

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
…t from under the notch

- MenuBarItemProvider27 keeps every frame MenuBarAgent draws on displays whose
  bar is not active; ItemHitTest27 counts them (tested), so hover, click and
  the context menu leave items on the second display alone (Thaw #1159,
  #1138, #1137; jordanbaird/Ice#1001)
- NotchCover27 (tested): while holzBar's icon lies under the notch, the
  nearest visible app right of it is concealed for the moment, one per read,
  never in the saved layout; cleared on display changes and app launches
- When the bar moves to a roomier display with items folded, concealment is
  released and applied again once (Thaw #1106)
- A click on the overflow button is bridged like the clock (Thaw #1195)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
…ock click, unsquashed launching apps

- DesktopPicture reads the desktop picture from its file (ImageIO thumbnail
  off the main thread, laid out like the desktop) for the wallpaper beside a
  menu bar shape; no capture and no Screen Recording. Only a moving wallpaper
  before macOS 27 falls back to the capture (and its 30 s refresh); on
  macOS 27 the shape stands on the flat colour
- WallpaperChangeMonitor (adapted from Thaw, credited in NOTICE) notices a new
  wallpaper from the wallpaper store's index instead of a timer
- The search uses the flat colour on macOS 27; the wallpaper window is found
  under WindowManager too (jordanbaird/Ice#1001)
- ClockCover27 covers the concealed part of the bar while a clock click lifts
  concealment, so hidden items no longer flash (Thaw #1181)
- LaunchGrace27 (tested): an app launching into a concealed section is shown
  until its item exists (at most 10 s), then concealed, so its item is not
  squashed to 3 points (jordanbaird/Ice#1007)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
- A hidden item opened from the search goes through ItemClicker27, as in the
  Shelf
- Items without a bundle identifier are disabled in the Layout pane with a
  tooltip; system items that cannot be hidden say so
- Settings that do nothing on macOS 27 are not shown there; their values stay
- holzBar's icon is put back when MenuBarAgent dropped it while concealing
  (two reads in a row, once per concealment change)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
- docs/upstream-bugs.md: #1005 and #1007 fixed on macOS 27; items losing
  their section, several items of one app, auto-rehide behind other windows,
  the Dock icon and styling lost after sleep or login move to Fixed; #988,
  #959 join the drawing group; #976 is not a bug
- README: new rows in "holzBar vs. Ice and Thaw", the feature list, the
  macOS 27 section and the Screen Recording row

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
The weak capture inside the setup task's closure differed from that closure's
strong capture of self (compiler warning); configureObservers registers it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
- ZenMode (Core, tested): manual and automatic parts; while active, hover,
  click on empty bar space, scroll, reveal rules, URL commands and change
  reveal are refused; holzBar's icon and the section hotkeys still work
- MenuBarManager.toggleZenMode() and setAutomaticZenMode(_:); turning it on
  hides every section (macOS 27 concealment follows the sections)
- Gates in HIDEventManager, RevealRules and URLCommands (logs "Ignored: Zen
  mode")
- HotkeyAction.toggleZenMode = "ToggleZenMode" appended last; recorder
  "Zen mode"; "Zen Mode" item with a checkmark in holzBar's menu;
  holzbar://zen/toggle (no confirmation: it only hides)
- HolzBarIntents.swift: ToggleZenModeIntent and the App Shortcuts provider;
  AppState.current reaches the app state, because NSApp.delegate is SwiftUI's
  adaptor object, not AppDelegate

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
… item, Shortcuts actions

- PresentationSignals (Core, tested) and PresentationMonitor: with "Turn on
  Zen mode while the screen is mirrored or shared" on, Zen mode follows
  CGDisplayIsInMirrorSet on screen changes (adapted from Thaw, NOTICE) and
  macOS's screen sharing agent on app launch and quit notifications; no
  polling, no process-table walk, no permission; turning the setting off
  withdraws only the automatic part
- HotkeyTarget (Core, tested): actions keep Ice's stored names, profiles and
  items are stored as "ApplyProfile:<name>" and "OpenItem:<identity key>" in
  the same Hotkeys dictionary; Hotkey holds a target; HotkeysSettings loads,
  saves and removes the dynamic hotkeys; deleting a profile removes its hotkey
- Hotkeys pane: a "Layout Profiles" section with a recorder per profile and
  the items that have a hotkey, each with a remove button; "Set Hotkey…" in
  the context menu of an item in the Menu Bar Layout pane
- ItemOpener.swift: openItem(_:mouseButton:shelfDisplayID:) and the item
  lookup by identity key, used by item hotkeys and the Shortcuts action
- Shortcuts: Change Section, Apply Layout Profile (profile entity and query),
  Open Menu Bar Item (fuzzy match by name) and Search Menu Bar Items, all in
  the App Shortcuts provider
- Raycast README: the zen/toggle row and the Shortcuts actions

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
- LayoutProfile gains optional displayUUID and spaceUUID (older profiles
  decode unchanged; saving a profile again keeps its bindings);
  bind(_:toDisplay:), bind(_:toSpace:), unbind(_:) and rename(_:to:), which
  moves the profile's hotkey
- ProfileBinding (Core, tested): only newly connected displays count, a
  bound Space wins over a bound display, the current profile is never
  applied again
- Event-driven: displays are compared after SystemActivityMonitor's settle,
  the Space on activeSpaceDidChangeNotification; nothing applies while Zen
  mode is on or an item is dragged in the Layout pane
- Bridging.getDisplayUUIDString(for:) and getActiveSpaceUUID() through
  CGSCopyManagedDisplaySpaces (every value type-checked, nil otherwise)
- Layout pane: a row per profile with Apply, Bind (To This Display, To This
  Space, Remove Binding), Rename… and Delete, and a line saying what it is
  bound to
- README: Zen mode, hotkeys per profile and item, Shortcuts actions and
  profile bindings in the comparison table and the feature list

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
…y of opening items

- ItemHints (Core, tested): home-row letters first, two-letter hints only
  once the single letters run out, never a hint that starts another;
  typed letters pick, wait or miss
- ItemHintsPanel: a key panel under the menu bar with every item in bar
  order (visible, hidden, always hidden, separated), its picture or name and
  its letter; letters pick, Delete takes one back, Escape or a click
  elsewhere closes; each hint is a button VoiceOver reads as "A, Wi-Fi";
  needs no Screen Recording
- HotkeyAction.showItemHints = "ShowItemHints" appended last; recorder
  "Open an item by letter" in Menu Bar Items
- The Shelf (left and right click), the search and groups now open items
  through MenuBarItemManager.openItem (ItemOpener.swift), like item hotkeys
  and the Shortcuts action; their three copies and MenuBarItemActions are
  removed

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
…ceOver actions

- LayoutKeys (Core, tested): arrows move the focus within a section and
  between sections, Option-arrows and Command-1/2/3 move the item, Return or
  Space opens its menu; moving within a section is refused on macOS 27
- Layout pane: items take the keyboard focus with the system focus ring and
  handle the keys; LayoutBarRouter moves the focus between the section rows;
  macOS 27 beeps and says "macOS orders the items within each section."
- Undo and redo: every Layout pane move (keyboard or drop) registers its
  inverse on the Settings window's undo manager (before 27 back next to the
  former neighbour, on 27 the former section); undoing registers the redo at
  once; profile save, delete, rename and bind restore the profile list and
  its hotkeys without touching the bar; deleting asks first and says it can
  be undone; the hidden Edit menu keeps its key equivalents, so Command-Z,
  Copy and Paste work in holzBar's windows
- VoiceOver: layout items are buttons read as "<name>, <section>" with Move
  to Visible/Hidden/Always Hidden, Move Left/Right (before 27) and Set
  Hotkey…; every move is announced; Shelf items are buttons with Open and
  Open Menu
- Shelf: opened with a section hotkey it takes keys: Left/Right highlight,
  Return or Space opens through openItem, Escape closes
- Scripts/macos27/layout-ax.swift accepts the button role

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
…ng items show briefly

- THAW-13: "Temporarily shown item delay" becomes "Hide opened items again
  after" (0 to 30 s, stored under TempShowInterval; a stored value above 30
  reads as 30), counted from when the item's menu closes: before macOS 27
  the rehide waits the delay once the menu is seen closed, on macOS 27
  ItemClicker27 waits it before ending the temporary show
- "Open hidden items in the menu bar" (OpenHiddenItemsInMenuBar, on by
  default): off, openItem presses a hidden item through Accessibility off
  the main thread with a 0.25 s messaging timeout, and shows it as before
  when the app does not take the press
- THAW-12: ChangeReveal (Core, tested): 1 s debounce, one reveal per item
  every 30 s, nothing in Zen mode or for a visible item; ItemChangeWatcher
  observes kAXTitleChangedNotification and kAXValueChangedNotification on
  the items marked "Show When It Changes" (RevealOnChangeItems) only, set up
  again when the item list changes; MenuBarManager.revealBriefly shows the
  item for 5 s; one bounded wait per batch, no timer, no polling
- The Open Menu Bar Item shortcut no longer waits until the item hides again
- README: rows and features for item hints, keyboard and VoiceOver, opened
  items and Show When It Changes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
… coloured folders

- ItemIconChoice (Core, tested): chosen image, then the capture, then the
  app icon, then the name; "Use App Icon" wins over a capture; stored values
  "app" and "file:<name>.png" only, never a path; HexColor for group colors
- ItemIconStore: Choose Image… reads the file once from the open panel,
  scales it off the main thread with ImageIO to at most 64 points high at 2x
  and stores a PNG in Application Support/holzBar/ItemIcons; Use App Icon,
  Reset Image; choices in the ItemIcons setting (synced, images stay local)
- The Shelf, the search, the Layout pane, the item hints and the group panel
  show the same image; without Screen Recording the Shelf shows the items
  with their apps' icons next to the hint instead of the hint alone
- Groups as folders: a color (color well, tinted symbol in the menu bar,
  colored name in the panel) and an image of the user's choice instead of
  the symbol; older groups decode unchanged

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
…nts, system glass

- BorderStyle and BorderPattern (Core, tested): solid, dashed (6 and 3
  widths) and dotted (round dots every two widths); the border of the bar and
  of the shapes is stroked with the pattern
- WallpaperPalette (Core, tested), adapted from Thaw (NOTICE): the dominant
  colors of the desktop picture strip, read from its file by
  DesktopPicture.palette(for:height:) with no capture and no permission
- Tints: "Follow Wallpaper" (a gradient of the two dominant colors, renewed
  on wallpaper, Space and screen changes), "System Glass" (an
  NSGlassEffectView masked to the shape, macOS 26 and later; hidden in the
  picker before) and "Use Accent Color" for the solid tint, updated on
  systemColorsDidChangeNotification
- Tolerant decoding: an unknown tint kind reads as no tint and an unknown
  border style as solid, so older and newer appearances import unchanged
- Editor: Border Style picker, the new tint kinds and Use Accent Color

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
SYNC-01 (user decision): settings sync is no longer limited to iCloud Drive.

- SettingsSyncLocation (Core, tested): the chosen folder from its bookmark,
  iCloud Drive without a choice (stored as the choice, so existing iCloud
  users keep syncing without a question), never a silent switch to iCloud
  Drive when the chosen folder cannot be found; the file is
  holzBar/Settings.plist in the folder; folder names for people
- SettingsSync: the folder is chosen with an NSOpenPanel and kept as a
  bookmark (SettingsSyncFolderBookmark, stays on this Mac, stale bookmarks
  are stored again); reads and writes keep file coordination; a file system
  event source on the folder notices files that Nextcloud, Dropbox, OneDrive
  or Syncthing replace without coordination; no polling, no network code
- Advanced pane: "Sync settings between your Macs" with the folder's name,
  Change… and Turn Off (Turn On… while off)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
…mansh

- Localizable, InfoPlist and AppShortcuts String Catalogs with German
  (Swiss spelling), French, Italian and Romansh translations of every
  user-visible text; holzBar and holzBar Shelf stay untranslated
- AppKit alerts, menus, tooltips, panels and errors go through
  String(localized:); interpolated SwiftUI keys instead of concatenation
- knownRegions en, Base, de, fr, it, rm; macOS's per-app language picks it
- strings job in CI: strings-check.py proves every text has its four
  translations with the same format specifiers
- README: languages, folders and item images, borders and tints, settings
  sync through any synced folder, permissions table

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
…mpling

- Actions with @parameter properties and the App Shortcuts provider are
  main-actor isolated: nonisolated cannot apply to the mutable parameter
  properties
- The wallpaper palette samples its pixels in a loop the type checker
  handles in time
- README: 338 unit tests

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
…ts metadata ship

- README: the app size of this build (16912 KB)
- build job: every language's compiled catalog and Metadata.appintents
  must be in the built app
- 05.1.1.1-03 summary: CI results and fixes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
…con claim

- build job: listing a language folder that does not exist no longer ends
  the step; the step lists the app's resources
- README: without Screen Recording, the holzBar Shelf and the search show
  app icons (the Layout pane still asks for the permission)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BSzFQk1ZzGXFVBDZMYq8eu
@holzcloud
holzcloud marked this pull request as ready for review October 3, 2026 08:39
@holzcloud
holzcloud merged commit fdf65a1 into main Oct 3, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants