stonerl/Thaw
Menu bar manager for macOS 26
Mixed signals — read the receipts
worst of 4 axescopyleft license (GPL-3.0) — review compatibility; no tests detected
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ✓Last commit today
- ✓5 active contributors
- ✓GPL-3.0 licensed
Show 4 more →Show less
- ✓CI configured
- ⚠Concentrated ownership — top contributor handles 53% of recent commits
- ⚠GPL-3.0 is copyleft — check downstream compatibility
- ⚠No test directory detected
What would change the summary?
- →Use as dependency Concerns → Mixed if: relicense under MIT/Apache-2.0 (rare for established libs)
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Forkable" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/stonerl/thaw)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/stonerl/thaw on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: stonerl/Thaw
Generated by RepoPilot · 2026-05-10 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/stonerl/Thaw shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
WAIT — Mixed signals — read the receipts
- Last commit today
- 5 active contributors
- GPL-3.0 licensed
- CI configured
- ⚠ Concentrated ownership — top contributor handles 53% of recent commits
- ⚠ GPL-3.0 is copyleft — check downstream compatibility
- ⚠ No test directory detected
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live stonerl/Thaw
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/stonerl/Thaw.
What it runs against: a local clone of stonerl/Thaw — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in stonerl/Thaw | Confirms the artifact applies here, not a fork |
| 2 | License is still GPL-3.0 | Catches relicense before you depend on it |
| 3 | Default branch development exists | Catches branch renames |
| 4 | Last commit ≤ 30 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of stonerl/Thaw. If you don't
# have one yet, run these first:
#
# git clone https://github.com/stonerl/Thaw.git
# cd Thaw
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of stonerl/Thaw and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "stonerl/Thaw(\\.git)?\\b" \\
&& ok "origin remote is stonerl/Thaw" \\
|| miss "origin remote is not stonerl/Thaw (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(GPL-3\\.0)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"GPL-3\\.0\"" package.json 2>/dev/null) \\
&& ok "license is GPL-3.0" \\
|| miss "license drift — was GPL-3.0 at generation time"
# 3. Default branch
git rev-parse --verify development >/dev/null 2>&1 \\
&& ok "default branch development exists" \\
|| miss "default branch development no longer exists"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 30 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~0d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/stonerl/Thaw"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
Thaw is a macOS menu bar management application written in Swift that allows users to hide, show, and organize menu bar items. It serves as an actively maintained fork of the Ice project, providing a solution to the cluttered menu bar problem on macOS by enabling granular control over which system and application menu bar icons are visible at any time. Two-target architecture: main Thaw app and MenuBarItemService XPC helper. Shared code in Shared/ contains bridging logic (Bridging.swift, Shims.swift), accessibility utilities (AXHelpers.swift), and services (MenuBarItemService.swift). MenuBarItemService runs as a privileged helper (main.swift, Listener.swift, SourcePIDCache.swift) to interact with system menu bar APIs. Resources/ holds application assets (Icon.svg, background@2x.png).
👥Who it's for
macOS power users and developers who want to declutter their menu bar by selectively hiding/showing menu bar icons without uninstalling applications. Also relevant for macOS app developers building system utilities that need menu bar integration.
🌱Maturity & risk
Actively maintained and production-ready. The project has comprehensive CI/CD workflows (build-dmg.yml, release.yml, ci.yml), organized GitHub issue templates, and is actively developed as a maintained fork of the inactive Ice project. Swift-only codebase (~1.68MB) suggests focused, well-curated code. Regular release cycles are evident from the Homebrew integration and DMG build automation.
Low-to-moderate risk. Single maintainer (stonerl) creates maintenance risk, though the active CI/CD pipeline and public GitHub setup mitigate this. The app requires macOS 26+ (latest compatibility constraint), which means it must track Apple's rapid macOS evolution. Accessibility framework usage (AXHelpers.swift) creates fragility risk across OS updates since menu bar access relies on undocumented macOS Accessibility APIs.
Active areas of work
Active maintenance focused on macOS 26+ compatibility. CI workflow (ci.yml) runs on PRs. Release pipeline (release.yml) automates DMG creation and notarization. Translation infrastructure (block-translation.yml, Crowdin integration visible in README) is being actively managed. Recent activity suggests bug fixes and feature parity with original Ice project roadmap.
🚀Get running
git clone https://github.com/stonerl/Thaw.git
cd Thaw
# Open in Xcode and build using the scheme 'Thaw'
open Thaw.xcodeproj
# Or build via CLI
xcodebuild -scheme Thaw build
Daily commands:
# Build the app
xcodebuild -scheme Thaw build
# Run from Xcode or launch the built app
open build/Release/Thaw.app
# For debugging, Xcode scheme will handle both app and XPC helper targets
🗺️Map of the codebase
- MenuBarItemService/main.swift: Entry point for the XPC helper service that runs with elevated privileges to manipulate menu bar items
- Shared/Utilities/AXHelpers.swift: Core accessibility API wrappers for querying and manipulating macOS menu bar items via the Accessibility framework
- Shared/Services/MenuBarItemService.swift: Bridge between main app and XPC helper, coordinating all menu bar item visibility and state management
- MenuBarItemService/Listener.swift: XPC listener that accepts requests from the main app to show/hide menu bar items and broadcasts state changes
- Shared/Bridging/Bridging.swift: Objective-C/Swift interop layer, essential for accessing low-level macOS APIs unavailable in pure Swift
- .github/workflows/ci.yml: CI pipeline defining build, test, and validation steps that must pass for all PRs
🛠️How to make changes
Menu bar logic: start in Shared/Utilities/AXHelpers.swift (accessibility queries) and Shared/Services/MenuBarItemService.swift (service coordination). UI changes: likely in a Views/ directory (not shown but standard for SwiftUI apps). Helper/daemon behavior: modify MenuBarItemService/Listener.swift and MenuBarItemService/main.swift. Constants/config: edit Shared/Utilities/SharedConstants.swift. Bridging: update Shared/Bridging/Bridging.swift for new Objective-C interop.
🪤Traps & gotchas
Code signing & notarization: app requires valid Apple Developer ID signing (see .github/actions/configure-signing and notarize-and-validate) — local builds may fail without proper provisioning profiles. XPC entitlements: MenuBarItemService requires specific entitlements in its Info.plist to communicate with main app and access Accessibility APIs — modifying this will break IPC. Accessibility prompt: app requires user to grant Accessibility permissions in System Preferences (macOS Accessibility framework quirk) — no graceful degradation if denied. Helper installation: XPC helper must be installed at runtime; missing helper bundle will cause silent failures. Breaking AX API changes: menu bar access relies on undocumented Accessibility APIs that Apple has broken between major macOS versions (see SourcePIDCache.swift suggests workarounds for PID tracking changes).
💡Concepts to learn
- Accessibility Framework (AX* APIs) — Thaw's core capability depends entirely on macOS's undocumented AX APIs for querying and hiding menu bar items; understanding AXUIElement, AXAttribute, and accessibility hierarchy is essential for any menu bar manipulation
- XPC (Inter-Process Communication) — Thaw uses XPC to communicate between unprivileged main app and privileged MenuBarItemService helper; critical for understanding the two-process architecture and permission model
- Code Signing & Notarization — The .github/workflows/ show extensive signing and notarization automation; required for distributing macOS apps on modern OS versions and understanding why local builds need provisioning profiles
- Menu Bar Architecture (NSStatusBar/NSStatusItem) — Understanding how macOS organizes menu bar items internally (via accessibility tree, not public API) is necessary for Thaw's item visibility toggling logic
- Source PID Caching & Process Tracking — SourcePIDCache.swift suggests Thaw must track which process owns which menu bar item across system events; this is non-trivial because menu bar item ownership can change and APIs vary by macOS version
- App Sandboxing & Entitlements — Thaw requires specific entitlements (Accessibility, XPC service) in its entitlements files to function; missing or incorrect entitlements will silently fail at runtime
- SwiftUI/AppKit Interoperability — Modern Thaw likely uses SwiftUI for UI while AppKit for system integration (menu bar access); bridging code handles the two frameworks talking to each other
🔗Related repos
jordanbaird/Ice— The original macOS menu bar manager that Thaw forks from; reference for original design patterns and roadmap featuresFelixKratz/SketchyBar— Alternative menu bar customization tool using different approach (event-driven bar redraw) vs. Thaw's item hiding; useful for comparing architectural trade-offssupercomputra/BitBar— Menu bar app executor that complements menu bar managers like Thaw by allowing custom scripts to populate menu bar; users often run bothHomebrew/homebrew-cask— Distribution channel for Thaw (visible in README asbrew install thaw); where to understand Thaw's packaging and release process
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add unit tests for EventMonitor.swift and EventTap.swift
The Thaw/Events directory contains critical event handling logic (EventMonitor.swift, EventTap.swift, HIDEventManager.swift) but there are no visible test files in the repo structure. These components are foundational to menu bar interaction detection and require robust testing to prevent regressions. Adding unit tests would improve reliability and make it easier for contributors to modify event handling without breaking core functionality.
- [ ] Create Tests directory in Thaw/ with EventMonitorTests.swift
- [ ] Add tests for EventMonitor initialization, event filtering, and callback handling
- [ ] Create EventTapTests.swift with tests for HID event capture and processing
- [ ] Add tests for edge cases like rapid event sequences and app switching
- [ ] Integrate tests into the CI workflow (reference .github/workflows/ci.yml)
Add integration tests for MenuBarItemService IPC communication
The MenuBarItemService directory contains a separate service (main.swift, Listener.swift, SourcePIDCache.swift) that communicates with the main app via inter-process communication. There's no visible test coverage for this critical bridge. Adding integration tests would ensure the service correctly handles menu bar item queries and caching, preventing silent failures in the IPC layer.
- [ ] Create MenuBarItemService/Tests directory with MenuBarItemServiceTests.swift
- [ ] Add tests for Listener.swift message handling and response formatting
- [ ] Add tests for SourcePIDCache.swift cache hit/miss scenarios and expiration
- [ ] Test IPC communication with the main app via XCTest framework
- [ ] Document expected XPC message formats in Shared/Services/MenuBarItemService.swift
Add comprehensive documentation for Accessibility Helpers and AX APIs
The Shared/Utilities/AXHelpers.swift file exposes macOS Accessibility API functionality, which is complex and requires specific entitlements. New contributors will struggle without documentation explaining which AX APIs are used, why they're needed, and how to debug AX permission issues. This PR would create onboarding documentation specific to this macOS-specific functionality.
- [ ] Create docs/ACCESSIBILITY_SETUP.md explaining AX API requirements and permissions
- [ ] Document all AX functions exported from AXHelpers.swift with usage examples
- [ ] Add troubleshooting section for common AX permission errors in docs/
- [ ] Link ACCESSIBILITY_SETUP.md from CONTRIBUTING.md for new contributors
- [ ] Update .github/CONTRIBUTING.md with Accessibility entitlements setup steps for local development
🌿Good first issues
- Add unit tests for AXHelpers.swift accessibility query functions — currently no test files visible; test the accessibility API wrappers with mock AXUIElement objects to prevent regressions across macOS versions
- Document the XPC communication protocol in code comments or a separate spec file — Listener.swift and MenuBarItemService.swift lack explanation of message format and expected responses, making it hard for new contributors to extend functionality
- Create a diagnostic tool that validates Accessibility permissions and XPC helper installation — DiagnosticLogger.swift exists but app lacks a self-check feature to help users debug why menu bar hiding fails (common support issue based on FREQUENT_ISSUES.md reference)
⭐Top contributors
Click to expand
Top contributors
- @stonerl — 53 commits
- @diazdesandi — 35 commits
- @nightah — 6 commits
- @Copilot — 5 commits
- @bytepl — 1 commits
📝Recent commits
Click to expand
Recent commits
0eb84ca— fix: enhance comments for clarity in MenuBar and Permissions views (diazdesandi)beb5c08— fix(workflows): add repos guard policy to issue-triage workflow (diazdesandi)a119b75— chore: fix issue triage workflow and lower min-integrity for resource reads (diazdesandi)ee8236d— chore: lowermin-integrityin issue triage workflow (diazdesandi)7c367c8— Remove automatic maintainer assignment (Copilot)2ceeff4— fix: clarify update_issue assignment payload (Copilot)5fa92ef— Initial plan (Copilot)bf76f35— Treat transient Control Center items (Live Activities) as non-hideable (stonerl)c968072— Add debug log to discover Live Activities source bundle ID (stonerl)3b94995— docs: consolidate community health files and update requirements (diazdesandi)
🔒Security observations
The Thaw macOS menu bar manager application demonstrates a moderate security posture. The primary concerns are centered around inter-process communication (XPC service), accessibility framework usage, and event monitoring capabilities. No obvious hardcoded credentials or SQL injection vectors were identified in the file structure. The application properly uses GitHub Actions for secure builds with signing and notarization workflows. Key recommendations include: (1) Regular dependency audits for Swift packages, (2) strict validation of all IPC messages and accessibility API responses, (3) enhanced input validation for event handling, and (4) comprehensive security testing of the MenuBarItemService. The codebase appears well-structured with security considerations for code signing and secure build processes already in place.
- Medium · Missing Package Dependency Analysis —
Thaw.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved. The Package.resolved file is present but its contents were not provided for analysis. This file contains locked versions of Swift Package Manager dependencies, which could contain known vulnerabilities if not regularly updated. Fix: Regularly audit Swift Package dependencies using tools likeswift package updateand verify that no known CVEs exist in locked dependency versions. Consider using dependency scanning tools in CI/CD pipeline. - Medium · Potential Insecure IPC Communication —
MenuBarItemService/main.swift, Shared/Services/MenuBarItemService.swift. The codebase contains a MenuBarItemService (XPC service) that communicates with the main application. XPC services handle inter-process communication which, if improperly validated, could allow privilege escalation or injection attacks. Fix: Ensure all XPC message handlers validate input strictly, use proper entitlements, implement code signing verification, and avoid passing raw pointers or unchecked data between processes. - Medium · Accessibility Framework Usage Without Explicit Validation —
Shared/Utilities/AXHelpers.swift. The codebase uses AXHelpers (Accessibility framework) to interact with system UI elements. Without proper validation, this could be susceptible to accessibility API abuse or injection of malicious UI automation. Fix: Implement strict validation of accessibility attributes before use, verify target application identities, validate all returned values from accessibility API calls, and implement proper error handling for malformed responses. - Medium · Event Monitoring and HID Event Handling —
Thaw/Events/EventTap.swift, Thaw/Events/HIDEventManager.swift, Thaw/Events/EventMonitor.swift. The application monitors system events and HID (Human Interface Device) events through EventTap, EventMonitor, and HIDEventManager. Improper handling could lead to input injection or privacy violations. Fix: Ensure proper permission checks before accessing input events, validate all event data before processing, implement rate limiting to prevent DoS attacks, and document privacy implications in user-facing documentation. - Low · Missing Code Signing Verification Details —
Shared/Bridging/Bridging.swift, MenuBarItemService/main.swift. While the repository includes code signing workflows and configuration, the actual verification mechanisms in source code files (particularly bridging and XPC service components) were not reviewed for completeness. Fix: Ensure all inter-process communication includes code signature verification, implement entitlements checks, and verify that only authorized processes can communicate with the XPC service. - Low · Diagnostic Logger Information Disclosure —
Shared/Utilities/DiagnosticLogger.swift. The DiagnosticLogger utility exists but its implementation details regarding what sensitive information might be logged are not visible. Diagnostic logs could potentially expose sensitive system information. Fix: Review logging statements to ensure sensitive data (window titles, process information, user preferences) is not leaked in debug/diagnostic logs. Implement log redaction for sensitive information.
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.