RepoPilotOpen in app →

macmade/Hot

Hot is macOS menu bar application that displays the CPU speed limit due to thermal issues.

Mixed

Stale — last commit 2y ago

worst of 4 axes
Use as dependencyMixed

last commit was 2y ago; top contributor handles 98% of recent commits…

Fork & modifyHealthy

Has a license, tests, and CI — clean foundation to fork and modify.

Learn fromHealthy

Documented and popular — useful reference codebase to read through.

Deploy as-isHealthy

No critical CVEs, sane security posture — runnable as-is.

  • 3 active contributors
  • MIT licensed
  • CI configured
Show 4 more →
  • Stale — last commit 2y ago
  • Small team — 3 contributors active in recent commits
  • Single-maintainer risk — top contributor 98% of recent commits
  • No test directory detected
What would change the summary?
  • Use as dependency MixedHealthy if: 1 commit in the last 365 days; diversify commit ownership (top <90%)

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.

Variant:
RepoPilot: Forkable
[![RepoPilot: Forkable](https://repopilot.app/api/badge/macmade/hot?axis=fork)](https://repopilot.app/r/macmade/hot)

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/macmade/hot on X, Slack, or LinkedIn.

Onboarding doc

Onboarding: macmade/Hot

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:

  1. 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.
  2. 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.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/macmade/Hot 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 — Stale — last commit 2y ago

  • 3 active contributors
  • MIT licensed
  • CI configured
  • ⚠ Stale — last commit 2y ago
  • ⚠ Small team — 3 contributors active in recent commits
  • ⚠ Single-maintainer risk — top contributor 98% of recent commits
  • ⚠ 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 macmade/Hot repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/macmade/Hot.

What it runs against: a local clone of macmade/Hot — 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 macmade/Hot | Confirms the artifact applies here, not a fork | | 2 | License is still MIT | Catches relicense before you depend on it | | 3 | Default branch main exists | Catches branch renames | | 4 | Last commit ≤ 681 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>macmade/Hot</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of macmade/Hot. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/macmade/Hot.git
#   cd Hot
#
# 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 macmade/Hot and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "macmade/Hot(\\.git)?\\b" \\
  && ok "origin remote is macmade/Hot" \\
  || miss "origin remote is not macmade/Hot (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(MIT)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"MIT\"" package.json 2>/dev/null) \\
  && ok "license is MIT" \\
  || miss "license drift — was MIT at generation time"

# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
  && ok "default branch main exists" \\
  || miss "default branch main 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 681 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~651d)"
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/macmade/Hot"
  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).

</details>

TL;DR

Hot is a lightweight macOS menu bar application that monitors CPU thermal throttling and thermal pressure in real-time. On Intel Macs it displays CPU temperature, speed limit percentage (throttling), scheduler limit, and core count; on Apple Silicon it shows thermal pressure levels and sensor graphs. The app colorizes menu bar text orange when thermal issues are detected, providing instant visibility into thermal throttling events. Single Xcode project (Hot.xcodeproj) structured as: Hot/Classes/ contains core Swift logic (ApplicationDelegate, ThermalLog monitoring, sensor ViewControllers) plus Objective-C bridging (Hot-Bridging-Header.h for IOKit access); Hot/UI/ contains XIB-based UI files for each window (MainMenu, PreferencesWindowController, SelectSensorsWindowController, GraphWindowController). Supporting utilities in Classes/ for data formatting (TemperatureToString.swift, PercentToString.swift, PressureToString.swift).

👥Who it's for

macOS users (especially power users, developers, and sysadmins) who need to diagnose thermal performance issues on their machines. Contributors interested in low-level hardware monitoring on macOS using IOKit sensors.

🌱Maturity & risk

Active and production-ready. The project has a CI/CD pipeline (GitHub Actions in .github/workflows/ci-mac.yaml), clear Intel vs. Apple Silicon support with divergent feature sets, and maintains MIT licensing. Commit activity appears recent based on the active CI configuration and maintained xcodeproj structure.

Low risk for a single-maintainer project. The codebase is tightly scoped (monitoring only, no external dependencies listed), has no heavy third-party library burden, and solves a self-contained problem. Main risk: single maintainer (Jean-David Gadina) and reliance on private macOS IOKit APIs which could break on future OS releases.

Active areas of work

No specific PR or milestone data visible, but the active CI workflow and divergent Intel/Apple Silicon codepaths suggest ongoing maintenance. The project appears stable and feature-complete rather than in active development mode.

🚀Get running

Clone the repository and open the Xcode project: git clone https://github.com/macmade/Hot.git && cd Hot && open Hot.xcodeproj. Build with Xcode (⌘B) or via xcodebuild: xcodebuild -scheme Hot. Run from Products folder or use Xcode's Run button (⌘R).

Daily commands: Build: xcodebuild -scheme Hot -configuration Release or open Hot.xcodeproj and press ⌘R in Xcode. Run: The built app will appear as a menu bar icon; it starts monitoring immediately. Debug: Open Hot.xcodeproj and run with Xcode's debugger, breakpoints on ApplicationDelegate and ThermalLog classes.

🗺️Map of the codebase

🛠️How to make changes

Adding new sensor displays: Edit Hot/Classes/SensorViewController.swift and Hot/UI/Base.lproj/SensorViewController.xib. Changing thermal thresholds or colors: See Hot/Classes/ApplicationDelegate.swift (menu bar updates) and Hot/Classes/GraphView.swift (pressure visualization). New data formatters: Add new Swift files like Hot/Classes/CustomToString.swift following the pattern of TemperatureToString.swift. Preferences/UI changes: Modify XIB files in Hot/UI/Base.lproj/ and corresponding WindowController.swift files.

🪤Traps & gotchas

IOKit API fragility: Hot relies on private macOS IOKit APIs (sensor keys, throttling info) that are undocumented and subject to breaking changes between OS versions—Intel vs. Apple Silicon have completely different sensor availability. Entitlements required: Hot.entitlements controls app sandbox and sensor access; changes here may break functionality. XIB dependencies: UI changes require both XIB file edits AND corresponding Swift class updates; out-of-sync XIB/code causes crashes. No build dependencies file: No Podfile/Package.swift visible; ensure system frameworks (IOKit, Cocoa) are linked in xcodeproj. Simulator limitation: App likely won't run in iOS Simulator due to IOKit dependency.

💡Concepts to learn

  • IOKit Sensors & Thermal API — Hot directly queries private IOKit services to read CPU temperature, throttling percentages, and thermal pressure—understanding how sensor registration and data types work is essential to adding new metrics
  • macOS Thermal Throttling — The core problem Hot solves is visualizing CPU speed limit (throttling) caused by thermal issues; understanding Intel vs. Apple Silicon throttling behavior is critical for feature parity
  • Objective-C/Swift Bridging — Hot uses a bridging header and Objective-C files to access C APIs; this pattern is necessary because IOKit sensor APIs are C-level and Swift cannot directly call them
  • macOS Menu Bar (Status Bar) Applications — Hot runs exclusively in the menu bar using NSStatusBar; understanding status bar behavior, click handling, and menu construction is essential to UI changes
  • XIB/NSWindowController Pattern — All windows (preferences, graph, sensors) use XIB files paired with Swift controller classes; modifying any window requires understanding this decoupled architecture
  • Intel vs. Apple Silicon Divergence — Hot has entirely different sensor availability on Intel (throttling %) vs. Apple Silicon (thermal pressure); code must branch on architecture and handle missing sensors gracefully
  • Real-Time Data Visualization (GraphView) — GraphView.swift implements a custom NSView that renders scrolling sensor history as a line graph; understanding Core Graphics drawing and data buffering is needed for performance improvements
  • lavoiesl/osx-cpu-temp — Similar CPU temperature monitoring utility for macOS; demonstrates alternative IOKit sensor polling approach
  • nicklockwood/iRate — Complementary macOS utility pattern for menu bar applications with system tray integration and user preferences
  • ryanstreet/SMCKit — Swift library for accessing Apple System Management Controller (SMC) data; relevant for Intel thermal sensor access
  • macmade/Diagnostics — Another system diagnostics utility by the same author; shares IOKit and macOS API patterns with Hot
  • lianghao-liu/my_mac_os — Curated list of macOS system monitoring and performance tools; Hot is often recommended in this context

🪄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 Apple Silicon support documentation and sensor mapping for M3/M4 chips

The repo contains SMC sensor mappings for M1 and M2 (SMC/SMC MacBookAir M1.txt and SMC/SMC MacBookAir M2.txt), but lacks mappings for newer M3/M4 chips. The README mentions 'Differences between Intel and Apple Silicon versions' but is incomplete. New contributors could gather and document sensor IDs for M3/M4 Macs to expand thermal monitoring coverage.

  • [ ] Collect SMC sensor IDs from M3/M4 MacBook Air/Pro models using SMC tools
  • [ ] Create SMC/SMC MacBookAir M3.txt and SMC/SMC MacBookPro M3.txt files following the existing format
  • [ ] Update Hot/Classes/ThermalLog.swift to reference new M3/M4 sensor mappings
  • [ ] Document sensor discovery process in README.md for future M5+ chip support

Implement unit tests for temperature/pressure/percentage conversion utilities

The repo has several conversion utility files (TemperatureToString.swift, PressureToString.swift, PercentToString.swift, IntegerToString.swift) with no corresponding test files. These are critical for accurate thermal display and lack test coverage, making them vulnerable to regressions.

  • [ ] Create Hot/Tests/TemperatureToStringTests.swift with test cases for Celsius/Fahrenheit conversion edge cases
  • [ ] Create Hot/Tests/PercentToStringTests.swift testing boundary values (0%, 100%, decimal precision)
  • [ ] Create Hot/Tests/PressureToStringTests.swift for unit conversion accuracy
  • [ ] Update Hot.xcodeproj to include a new test target and configure CI workflow to run tests

Add GitHub Actions workflow for building Apple Silicon (arm64) release binaries

The CI workflow (.github/workflows/ci-mac.yaml) exists but the repo structure shows both Intel and Apple Silicon support. There's no dedicated workflow for cross-compilation or separate release builds for arm64 architecture. This prevents automated release builds optimized for native M1/M2/M3 performance.

  • [ ] Review current .github/workflows/ci-mac.yaml to understand existing build process
  • [ ] Create .github/workflows/ci-mac-arm64.yaml for Apple Silicon native builds (uses-macos-latest with arm64 runners)
  • [ ] Configure separate artifact uploads for intel and arm64 binaries with architecture-specific naming
  • [ ] Document build requirements and architecture-specific sensor differences in README.md contributing section

🌿Good first issues

  • Add unit tests for data formatters (TemperatureToString.swift, PercentToString.swift, PressureToString.swift)—currently no test files visible in the repo. Create Hot/Classes/Tests/ directory with test cases for edge cases like negative temperatures or 0% throttle.
  • Document the sensor selection feature: Write inline comments in SelectSensorsWindowController.swift explaining which IOKit sensor keys map to which physical sensors on Intel vs. Apple Silicon, with a table in the README showing sensor availability by architecture.
  • Improve preference persistence: Currently preferences may not survive app restarts; audit PreferencesWindowController.swift and verify UserDefaults keys are properly saved/loaded on app launch.

Top contributors

Click to expand

📝Recent commits

Click to expand
  • 9405e2a — chore: 1.9.4-150 (macmade)
  • 8e685a4 — chore: Preparing for 1.9.4 (macmade)
  • 9a42c77 — feat: 1.9.3-148 (macmade)
  • 0ce0f32 — chore: Preparing for 1.9.3 (macmade)
  • 0d34958 — fix: Trying to fix #86 - KVO triggered from the thermal log queue. (macmade)
  • 24e059e — feat: 1.9.2-145 (macmade)
  • feeb9a0 — chore: Preparing for 1.9.2 (macmade)
  • 3b59686 — style: No longer using thin fonts (macmade)
  • 4ac4804 — fix: Fixed display issues on macOS 14 (macmade)
  • 4c0e8dc — chore(README): Updated the GitHub actions badge. (macmade)

🔒Security observations

The Hot application demonstrates good security posture for a macOS menu bar utility. No critical vulnerabilities were identified. The codebase lacks obvious injection risks, hardcoded credentials, or dangerous dependency patterns. The main areas for improvement involve: (1) thorough review of the Objective-C/Swift bridging header to prevent unnecessary API exposure, (2) validation of entitlements to follow least-privilege principles, and (3) careful management of the mixed-language codebase to avoid subtle memory safety issues. The application's focus on reading hardware sensor data (non-user-facing) and lack of network/database components significantly reduces attack surface. Regular security updates and dependency monitoring (if using any external dependencies not shown) are recommended.

  • Medium · Objective-C Bridge Header Potential Exposure — Hot/Classes/Hot-Bridging-Header.h. The file 'Hot-Bridging-Header.h' is used to bridge Swift and Objective-C code. While not inherently dangerous, bridging headers can expose internal implementation details if not properly managed. The header should be carefully reviewed to ensure no sensitive APIs or private implementation details are unnecessarily exposed. Fix: Review the bridging header contents and ensure it only exposes necessary public APIs. Consider using SPM modules instead of bridging headers for better encapsulation.
  • Low · Entitlements File Present — Hot/Hot.entitlements. The application uses an entitlements file (Hot.entitlements) which grants special capabilities. While this is normal for macOS applications, these should be reviewed to ensure only necessary entitlements are requested. Fix: Review the entitlements file to ensure only required capabilities are enabled. Follow the principle of least privilege and remove any unnecessary entitlements that could be exploited.
  • Low · Mixed Language Codebase — Hot/Classes/ (mixed .swift, .m, .h files). The project mixes Swift, Objective-C, and C code (evident from .swift, .m, and .h files). While not a direct vulnerability, mixed language codebases increase complexity and can introduce subtle security issues if not carefully managed. Fix: Consider gradual migration to pure Swift or establish clear boundaries between language layers. Ensure proper input validation and memory safety at language boundaries.

LLM-derived; treat as a starting point, not a security audit.


Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Mixed signals · macmade/Hot — RepoPilot