Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
de6e3af
macOS 26: Fix menu bar item retrieval
jordanbaird Jun 11, 2025
6295f73
macOS 26: Fix menu bar color averaging
jordanbaird Jun 11, 2025
f17729e
macOS 26: Rework EventManager
jordanbaird Jun 14, 2025
075581c
macOS 26: Fix mouse state check
jordanbaird Jun 16, 2025
fabe66c
macOS 26: UI updates
jordanbaird Jun 16, 2025
8530421
macOS 26: Work around ControlItem initialization
jordanbaird Jun 18, 2025
ad86802
macOS 26: Reworks all the way down
jordanbaird Jun 20, 2025
fda726e
macOS 26: Fix warnings from the new SDK
jordanbaird Jun 20, 2025
5470334
Update build settings to Xcode 26
jordanbaird Jun 20, 2025
b7b7442
Bump version and build numbers
jordanbaird Jun 20, 2025
ac313f2
Disable sandbox
jordanbaird Jun 20, 2025
7771686
Bump version and build numbers
jordanbaird Jun 20, 2025
f58956b
Misc reworks
jordanbaird Jun 26, 2025
b6eff36
macOS 26: `ControlItem` changes
jordanbaird Jun 26, 2025
7edd1c6
Settings and state reworks
jordanbaird Jun 27, 2025
653404f
Don't hide app menus when using Ice Bar
jordanbaird Jun 27, 2025
a7ae7a1
macOS 26: Search panel redesign
jordanbaird Jun 27, 2025
292556f
Replace `mouseMoved` event monitor with an event tap
jordanbaird Jun 27, 2025
08e883e
Lots of refactoring
jordanbaird Jun 30, 2025
239f47c
Settings reworks
jordanbaird Jul 1, 2025
75cfc1c
Don't create control items until app setup
jordanbaird Jul 1, 2025
30a072e
Permissions interface changes
jordanbaird Jul 3, 2025
407e894
Change `IceWindow` presentation behavior
jordanbaird Jul 3, 2025
e36a6a9
Refactoring
jordanbaird Jul 3, 2025
cf15b07
Explicitly handle reopen
jordanbaird Jul 3, 2025
09b4888
Update `Hotkey` implementation
jordanbaird Jul 4, 2025
4c9ecb6
UI changes
jordanbaird Jul 4, 2025
4b57b4a
Fix `MenuBarItem` image caching issues
jordanbaird Jul 5, 2025
b77730e
Refactor settings models
jordanbaird Jul 8, 2025
78b8c79
Rework `IceBarColorManager`
jordanbaird Jul 8, 2025
bd49603
Introduce `MenuBarItemSourceCache`
jordanbaird Jul 9, 2025
a2b8e53
Fix menu bar item click/temp show
jordanbaird Jul 14, 2025
4594280
Update `MenuBarItemSourceCache`
jordanbaird Jul 14, 2025
1e2e0dd
Update screen capture implementation
jordanbaird Jul 14, 2025
90a0650
Update cache operations when showing Ice Bar
jordanbaird Jul 14, 2025
9c6740c
Change how menu bar items are displayed
jordanbaird Jul 15, 2025
8adf5a4
Create MenuBarItemService XPC
jordanbaird Jul 16, 2025
9ce3ed3
Minor UI adjustments
jordanbaird Jul 18, 2025
8eaec4b
Make search interface respect menu bar average color
jordanbaird Jul 19, 2025
eaa5d93
Better fuzzy search
jordanbaird Jul 19, 2025
eb5d14a
Lots of refactoring
jordanbaird Jul 21, 2025
389588e
Refactor UI
jordanbaird Aug 6, 2025
8d4b6a5
Improve menu bar item movement
jordanbaird Aug 7, 2025
2053b41
UI changes and cleanup
jordanbaird Aug 14, 2025
998474c
Changes to MenuBarItemService
jordanbaird Aug 16, 2025
927cbe0
Update project files
jordanbaird Aug 16, 2025
2f02231
Event, caching, and concurrency reworks
jordanbaird Aug 17, 2025
e3c63f2
Improve menu bar item event handling
jordanbaird Aug 18, 2025
5dff4d4
Misc refactoring
jordanbaird Aug 22, 2025
b0a1942
Improve menu bar item handling
jordanbaird Aug 22, 2025
9a58021
Misc refactoring
jordanbaird Aug 24, 2025
4b7d748
Improve menu bar item handling
jordanbaird Aug 31, 2025
37722ee
Misc refactoring
jordanbaird Sep 2, 2025
c474aec
Improve menu bar item handling
jordanbaird Sep 3, 2025
39db268
Misc refactoring
jordanbaird Sep 3, 2025
2f66c01
Add Semaphore package to acknowledgements
jordanbaird Sep 3, 2025
423272a
Reformat acknowledgements
jordanbaird Sep 3, 2025
c1312eb
Update .swiftlint.yml
jordanbaird Sep 3, 2025
f233bf3
Update Menu Bar Appearance interface
jordanbaird Sep 5, 2025
f18f7f6
Adjust AppState setup order
jordanbaird Sep 5, 2025
9c5fd18
Update Menu Bar Layout settings pane
jordanbaird Sep 5, 2025
a89b65a
UI tweaks
jordanbaird Sep 6, 2025
1245612
Tweak menu bar appearance interface
jordanbaird Sep 6, 2025
88a14fb
Simplify `ControlItem` state observation
jordanbaird Sep 9, 2025
4b61aad
Update Menu Bar Layout settings pane
jordanbaird Sep 9, 2025
c7a7d7c
Add workspace setting to disable auto-creating schemes
jordanbaird Sep 15, 2025
5a015de
Item management reworks
jordanbaird Sep 16, 2025
9978e49
Update packages
jordanbaird Sep 16, 2025
405c440
Update menu bar item display name
jordanbaird Sep 16, 2025
28712ea
Use different `menuBarInsetAmount` depending on macOS version
jordanbaird Sep 16, 2025
da2dd23
Bump version and build numbers
jordanbaird Sep 16, 2025
ea4df54
Don't update menu bar item cache if items haven't changed
jordanbaird Sep 18, 2025
38d344f
Update screen capture
jordanbaird Sep 18, 2025
2295985
Switch the MenuBarItemService connection to use a higher priority con…
jordanbaird Sep 18, 2025
8c0b9bb
Rework menu bar item event handling to for better reliability across …
jordanbaird Sep 18, 2025
f8828cd
Rename `EventManager` to `HIDEventManager` and rework enabling/disabl…
jordanbaird Sep 20, 2025
6d74d25
Bump version and build numbers
jordanbaird Sep 20, 2025
7621f86
feat: merge macOS 26 compatibility fixes
May 4, 2026
07a4630
fix: disable code signing for local development
May 4, 2026
0780b47
fix: macOS 26.4 compatibility and permission handling
May 4, 2026
200a9b6
fix: prevent crash in ControlItem setup on macOS 26
May 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .swiftlint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ custom_rules:
regex: ^\t

file_header:
required_pattern: |
required_pattern: |-
//
// SWIFTLINT_CURRENT_FILENAME
// Ice
Expand Down
58 changes: 58 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# AGENTS.md

## Project Overview

Ice is a macOS menu bar management tool built with Swift/SwiftUI. Requires macOS 14+. Single Xcode project (no SPM, no multi-target). Not sandboxed.

## Developer Commands

- **Build**: Open `Ice.xcodeproj` in Xcode and run (⌘R)
- **Lint**: `swiftlint --strict` (CI runs this on ubuntu via `norio-nomura/action-swiftlint`)
- **No test suite**: No test targets exist in the project
- **No pre-commit hooks**

## Architecture

- **Entry point**: `Ice/Main/IceApp.swift` (`@main` SwiftUI App)
- **Central state**: `Ice/Main/AppState.swift` — single source of truth, passed to all views/managers
- **Lifecycle**: `Ice/Main/AppDelegate.swift` (NSApplicationDelegate, assigned via `@NSApplicationAdaptor`)
- **Startup flow**: `IceApp.init()` → `MigrationManager.migrateAll()` → `AppDelegate.performSetup()` (after permission check)

### Key Directories

| Directory | Purpose |
|---|---|
| `MenuBar/` | Core hiding/showing logic, layout, search, appearance, spacing |
| `Settings/` | Settings panes and settings manager hierarchy |
| `Bridging/` | Private CGS* API wrappers (window server connection, spaces, process responsivity) |
| `Bridging/Shims/` | `Private.swift` (private C function declarations), `Deprecated.swift` |
| `Hotkeys/` | Keyboard shortcut management |
| `Permissions/` | Permission checking (accessibility, screen recording, etc.) |
| `Swizzling/` | Runtime method swizzling (NSSplitViewItem) |
| `Updates/` | Sparkle framework auto-updates |
| `Utilities/` | Shared types: Logger, Defaults, Extensions, MigrationManager |

## Important Context

- **Private APIs**: `Bridging/` uses private CGS* functions (CGSSetConnectionProperty, CGSGetWindowList, etc.). These are declared in `Bridging/Shims/Private.swift`. Changes to window/menu bar manipulation likely touch this layer.
- **Not sandboxed**: `Ice.entitlements` has `com.apple.security.app-sandbox = false`. This is required for private API access.
- **Logger**: Custom `Logger` wrapper around `os.Logger` with subsystem `com.jordanbaird.Ice`. Use `Logger(category:)` with a static per-file extension (see any file for pattern).
- **Defaults**: UserDefaults-based persistence via `Defaults.swift`. New settings need a `DefaultsKey` entry.
- **Migration**: `MigrationManager` handles version-to-version data migrations. New breaking changes need a migration step.

## SwiftLint Config

- Many strictness rules disabled (complexity, file/function length, naming, tuple size)
- Opt-in rules enabled: multiline argument/parameter formatting, modifier order (acl first), trailing commas, indentation width, closure spacing
- Custom rule: `@objc dynamic` ordering, no tabs (4-space indent required)
- File header required: `// Ice //` comment block

## CI

Single workflow (`.github/workflows/lint.yml`): SwiftLint `--strict` on push/PR to `main` for `*.swift` changes.

## Notes

- Active development — many roadmap features not yet implemented (see README)
- Homebrew cask: `brew install --cask jordanbaird-ice`
- Uses Sparkle for updates (feed: `jordanbaird.github.io/ice-releases/appcast.xml`)
Loading