CLI tool
vladkens/macmon avatar
vladkens/macmon

macmon for Apple Silicon Monitoring

🦀🌡️ Real-time system monitor for Apple Silicon Macs (M1–M5). No sudo. TUI, JSON/Prometheus metrics server, and Rust library.

2,043 stars94 forksRustMIT

At a glance

What is it?
macmon is a Rust system monitor for Apple Silicon Macs that reads CPU, GPU, ANE, temperature, memory, and process metrics without sudo. It supports a terminal UI, JSON output, a Prometheus endpoint, and library use through docs.rs.
Who is it for?
macmon fits individual Apple Silicon users, Rust applications, and local Prometheus setups that need CPU, GPU, power, temperature, memory, and process data without root access. It is a poor fit for Intel Macs, non-macOS hosts, or deployments requiring documented authentication and remote-access controls.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 2 days ago.
What is it written in?
Mainly Rust, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

Why macmon Targets Apple Silicon

macmon addresses a specific gap in monitoring on Apple Silicon Macs. The project describes itself as a sudo-free performance monitor and reads real-time CPU, GPU, ANE power, temperatures, memory statistics, and process data through a private macOS API that provides the same data exposed by `powermetrics`. This matters because the familiar system-level utility normally requires elevated access, while macmon is intended to run under the logged-in user's permissions.

The intended users include developers who want a quick terminal view, operators collecting local machine metrics, and Rust developers who need the monitoring implementation as a library rather than as a separate application. Its scope is Apple Silicon hardware running macOS. The repository description names M1 through M5 Macs, so users looking for a cross-platform monitor or an Intel Mac solution should not treat this project as a general-purpose replacement.

The available views cover several levels of detail. The interface combines metric boxes with a process list, while the data interfaces expose the same system information as JSON or Prometheus text. This gives users both an interactive diagnostic tool and machine-readable output without requiring a separate GUI application.

How macmon Collects and Presents Metrics

The documented mechanism is a private macOS API. The README states that macmon uses the same data source as `powermetrics`, but without root access. The project is written in Rust, and `Cargo.toml` defines the `macmon` package with a default `app` feature. That feature pulls in command-line parsing, terminal rendering, serialization, and related application dependencies. The package also exposes library-oriented source through its `lib` target, with documentation published on docs.rs.

In interactive mode, macmon displays metric boxes above a process list. The process list can be filtered by a comma-separated set of terms. Matching is case-insensitive and applies to process names or process IDs. Terms beginning with `!` exclude matches, while `Enter` retains a filter and `Esc` clears it. The README also states that `?` displays the available keys in the terminal interface.

For automated collection, `pipe` emits JSON snapshots. The `serve` command turns the same collection process into an HTTP service. `/json` returns the current snapshot, while `/metrics` returns Prometheus text format. The documented Prometheus names include `macmon_cpu_temp_celsius`, `macmon_cpu_power_watts`, `macmon_fan_speed_rpm`, `macmon_cpu_scaled_ratio`, and `macmon_cpu_active_ratio`. Labels preserve details such as the chip name, fan, and CPU tier. In a macOS virtual machine, the README notes that some power and frequency fields may be limited, so VM deployments should not assume that every physical-device metric is present.

Installing macmon and Running Its First Collection

The primary installation path documented by the README is Homebrew:

bash
brew install macmon

That command installs the published `macmon` formula. The README also lists MacPorts, Cargo, and Nix as alternatives. The Cargo route is relevant when the command is being installed from the published crate:

bash
cargo install macmon

After installation, run the command without a subcommand to open the terminal UI:

bash
macmon

The documented default update interval is 1000 milliseconds. A first automated check can collect a finite set of JSON samples and pass them to `jq` for readable output:

bash
macmon pipe -s 10 -i 500 | jq

The `pipe` subcommand collects 10 samples at 500-millisecond intervals. This is a more suitable first check than leaving the command running indefinitely because it terminates after the requested sample count. The README does not document required permissions beyond stating that macmon runs without sudo.

Serving macmon Metrics to Prometheus

The `serve` subcommand starts an HTTP metrics service. Its default settings are port 9090 and a 1000-millisecond sampling interval. The following command binds the service to localhost, which limits network exposure compared with the default listener configuration:

bash
macmon serve --host 127.0.0.1

The service exposes two documented endpoints:

text
GET /json
GET /metrics

`GET /json` returns a current metrics snapshot, while `GET /metrics` returns Prometheus text format. A custom port and interval can be supplied separately:

bash
macmon serve -p 8080 -i 500

The repository includes `examples/grafana`, described as a local demo stack for Prometheus and Grafana. That example is useful for checking integration shape, but the README does not claim that the service includes authentication, TLS, or a remote-access policy. Those controls must therefore be handled outside macmon or verified in the deployment configuration.

For login startup, `macmon serve --install` creates a launchd agent at `~/Library/LaunchAgents/com.macmon.plist`. The README states that this agent starts on login and restarts on crash. The documented removal command is `macmon serve --uninstall`. A custom port and localhost binding are supported during installation as well.

Library Use and Build Boundaries

macmon is not limited to its command-line application. The repository identifies it as a Rust library and publishes documentation at `https://docs.rs/macmon`. The package metadata specifies an Apple Silicon target for docs.rs and separates application dependencies behind the default `app` feature. The Makefile includes a check for the library without default features:

bash
cargo check $(CARGO_FLAGS) --lib --no-default-features

That distinction matters to Rust developers who want data collection logic without pulling in the complete terminal application. The repository includes `examples/demo.rs`, but the contents of that example are not described here, so its exact API call should be taken from the source or docs.rs rather than inferred from its filename.

The build system uses `cargo build --release --locked`, and the Makefile provides `check`, `test`, and `build` targets. A developer using the project from source should account for Rust toolchain requirements associated with edition 2024 and the repository's lint configuration. The documented `prepare` target additionally invokes `cargo +nightly fmt`, `cargo clippy`, and `cargo check`, but that target changes files with formatting and lint fixes, so it is not equivalent to a read-only build.

Operational Limits and Maintenance Cost

The clearest limitation is platform specificity. macmon is built for Apple Silicon Macs and relies on a private macOS API. Private APIs can change with macOS releases, and the README does not document a compatibility matrix or a fallback for machines where a requested metric is unavailable. The release history includes v0.10.0 on 2026-10-14 and v0.9.0 on 2026-10-07, but those releases alone do not establish future compatibility.

The VM note is another boundary. Some power and frequency fields are limited in a macOS VM, which means a dashboard or alert rule should account for missing or incomplete metrics. The README also does not document data retention, metric cardinality limits, authentication, TLS, or a rollback procedure for the launchd agent. Operators who need those capabilities must verify them in their surrounding infrastructure.

Maintenance status is recent rather than historical: the repository is not archived, and the last push was on 2026-10-17. The project has a v0.10.0 release dated 2026-10-14. It is licensed under MIT, so the source and license are publicly available, but license status does not guarantee compatibility with every future macOS release or private API change.

macmon Compared with Direct Command-Line Collection

A direct alternative is to invoke `powermetrics` and process its output yourself. The approach differs materially. `powermetrics` is the underlying source referenced by the README, while macmon packages that data into an interactive terminal UI, JSON snapshots, an HTTP server, and a Rust library. A custom script would need to handle command execution, parsing, sample timing, process data, serialization, service management, and any monitoring integration itself.

That makes macmon more convenient when the required interfaces already match a project need. The trade-off is dependence on a private macOS API and a narrower platform target. A team that needs an officially supported cross-platform metrics path may prefer another monitoring stack. A team working only with Apple Silicon and needing local JSON or Prometheus output gets more project-specific functionality from macmon without creating a custom collector.

Editorial conclusion

macmon fits individual Apple Silicon users, Rust applications, and local Prometheus setups that need CPU, GPU, power, temperature, memory, and process data without root access. It is a poor fit for Intel Macs, non-macOS hosts, or deployments requiring documented authentication and remote-access controls. Verify private API compatibility on the target Mac model and inspect the exact `/metrics`, `/json`, and launchd behavior before adopting it as an operational service.

Frequently asked questions

Does macmon require sudo on Apple Silicon Macs?

No. The README describes macmon as a sudo-free performance monitor and states that it reads the relevant data through a private macOS API.

How do I install macmon on macOS?

The documented Homebrew command is `brew install macmon`. The README also lists MacPorts, Cargo, and Nix installation methods.

Can macmon expose metrics to Prometheus?

Yes. Run `macmon serve` and use the `/metrics` endpoint, which returns Prometheus text format. The default port is 9090 and the default interval is 1000 milliseconds.

Does macmon work as a Rust library?

Yes. The repository identifies macmon as a Rust library, publishes its documentation on docs.rs, and includes a library check without default features in the Makefile.

What happens when macmon runs inside a macOS virtual machine?

The README states that power and frequency information is limited in a macOS VM. Metrics consumers should account for missing or incomplete fields rather than assuming every physical-device reading is available.

Official sources

  1. License: MIT
  2. Project website
  3. README
  4. Releases
  5. vladkens/macmon on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/vladkens-macmon.svg)](https://hysenlabs.com/projects/vladkens-macmon)

Was this useful?