macverify 1.1.0 — macOS 11+, Python 3.9+, zero dependencies, fully offline.
A read-only, offline inventory of a Mac: what is installed, what runs at login, what listens on the network, which protections are on, where credential-shaped values sit in plain files, and how your AI assistants (Claude Code, GitHub Copilot, OpenAI Codex) are configured and what they cost to load. It writes an HTML report, a JSON dataset and a list of remediation commands, then stops.
What this is NOT
macverify is not antivirus. It is not malware detection. It is not real-time protection. It does not scan for known threats. It has no signature database, computes no file hashes, consults no reputation service, and makes no network request, so nothing it sees is ever compared against a threat feed.
It takes a point-in-time, read-only inventory of your toolchain, config hygiene and AI-assistant setup, and flags things worth reviewing yourself. A launchd job that exists, is signed and starts at login looks the same from here whether it is a printer helper or a backdoor.
Run a real scanner alongside it: Malwarebytes, KnockKnock or LuLu. Scan first — removing adware changes what this report is built from.
Installation
pipx install macverify
Or with pip, if you do not use pipx:
pip install --user macverify
No build step, no dependencies. To install nothing at all, clone and run in place:
git clone https://github.com/ShanedixonGit/macverify.git
cd macverify
python3 -m macverify
Verify it before you run it
This tool reads your machine, so do not take its word for it. From a clone, these must all return nothing:
grep -rn "shell=True\|os\.system\|os\.popen" --include='*.py' macverify/
grep -rnE "\b(eval|exec)[[:space:]]*\(|pickle" --include='*.py' macverify/
grep -rn "urllib\|requests\.\|http\.client\|urlopen\|httpx" --include='*.py' macverify/
No shell execution, no dynamic evaluation, no network client. The same claims are enforced as tests, which CI re-runs on every push:
/usr/bin/python3 -m compileall -q macverify
/usr/bin/python3 -m unittest discover -s tests -t .
SECURITY.md lists each claim and how it is checked.
Usage
macverify --check # what this Mac can be audited for, then exit
macverify # the full run
--check collects nothing, and is the safe way to see what a run would cover.
A full run takes 30-60 seconds. It asks where to save first, so the reports land
somewhere you will find them again:
Where should the reports be saved?
press Enter for ~/.macverify/reports
or type a folder, for example ~/Downloads/macverify
a report names your host, apps and credential-shaped values, so avoid a folder that syncs
save to>
Press Enter to accept the default, ~/.macverify/reports (0700). Pass --out DIR to name the folder outright, or --no-prompt to take the default without
being asked; a run whose input is not a terminal never asks, so scripts and CI
are unaffected. A directory macverify creates is 0700 and every report file is
0600, wherever you put it. The path of the finished report is printed as a
file:// link at the end of the run.
-h, --help show this help message and exit
--version print the installed version and exit
--only DOMAIN run only this domain (repeatable)
--skip DOMAIN skip this domain (repeatable)
--json-only write the JSON dataset only
--html-only write the HTML report only
--out DIR output directory, used without asking (default:
~/.macverify/reports)
--no-prompt do not ask where to save; use the default directory
--timeout S per-command timeout in seconds (default: 8)
--lang {en,es} report label language (default: en)
--project PATH extra project root to inspect for AI assistant config
(repeatable)
--verbose print per-domain progress to stderr
--list-domains list domain names and exit
--quick-fixes print the quick-fix plan to stdout as well as writing the
reports
--check report what this machine can be audited for, then exit
without collecting
macverify --quick-fixes
macverify --only security --only network
A run writes audit_<timestamp>.html (self-contained), audit_<timestamp>.json
(full dataset), remediation.md and ai_assistant_findings.json. See
examples/ for the JSON shape and how to pull findings out of it.
What it reads, and what it never does
Sixteen domains: toolchain, packages, shell_env, hardware, storage,
services, containers, network, security, identity, secrets,
permissions, claude_code, github_copilot, openai_codex, ai_assistants.
Missing tools are reported as unavailable, never as an error.
It never makes a network request. It never calls sudo — sudo, su, doas,
sudoedit, security and systemsetup are refused by its command runner, so
no code path can elevate. It never modifies system state; fixes are printed,
never executed. It never captures a secret value: the secrets domain records the
file, line, detector and a masked prefix, never the value. It never reads AI
session transcripts, only their file metadata.
Reports are sensitive: an audit_*.json names your host, user, applications,
SSH key paths, privacy grants and anything credential-shaped. Read one before
you send it anywhere.
Let an AI assistant triage the report
SKILL.md is a self-contained skill that runs the audit, reads the
dataset and returns a short ranked list of fixes rather than eighty raw
findings. For Claude Code, copy it to ~/.claude/skills/macverify-review/; for
Codex, append it to your AGENTS.md. It never runs a destructive command
without asking, and never runs sudo on your behalf.
Requirements
macOS 11+ and Python 3.9+; every Mac since macOS 12.3 ships a suitable
python3. No third-party packages, at install time or runtime.
License
MIT. See LICENSE. Also CONTRIBUTING.md, CHANGELOG.md, SECURITY.md and design_notes.md.
Metadata
Release files for macverify 1.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| macverify-1.1.0.tar.gz | 130.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| macverify-1.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 257.2 kB
Release files / macverify-1.1.0.tar.gz
| Download URL | macverify-1.1.0.tar.gz |
|---|---|
| Size | 130.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d5ed77c6269b96fdc242a8fc8ea73a2cc20bbd443dcd8adb59cedc0d7b05a57d
|
|
BLAKE2b-256 checksum How to use checksums |
5b786b2cd00850cceb43f455c163e335fff0152ab5f04988bb9dca7ce77c34cc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 2, 2026.
Transparency logRelease files / macverify-1.1.0-py3-none-any.whl
| Download URL | macverify-1.1.0-py3-none-any.whl |
|---|---|
| Size | 127.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6fe7f17417e47bbcdfd5d15ad4f852b3f0cd8082bee98ad397f3f5f443f5a6b4
|
|
BLAKE2b-256 checksum How to use checksums |
d8e7511f025b91b0b211f801461d9c43612922466c9de2b5828aa3ca2bff373b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 2, 2026.
Transparency log