Skip to main content
macverify

CI PyPI License: MIT

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 sudosudo, 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.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

macverify-1.1.0.tar.gz (130.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

macverify-1.1.0-py3-none-any.whl (127.1 kB view details)

Uploaded Python 3

File details

Details for the file macverify-1.1.0.tar.gz.

File metadata

  • Download URL: macverify-1.1.0.tar.gz
  • Upload date:
  • Size: 130.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for macverify-1.1.0.tar.gz
Algorithm Hash digest
SHA256 d5ed77c6269b96fdc242a8fc8ea73a2cc20bbd443dcd8adb59cedc0d7b05a57d
MD5 d627ac99ee4d84530030af6525c6288a
BLAKE2b-256 5b786b2cd00850cceb43f455c163e335fff0152ab5f04988bb9dca7ce77c34cc

See more details on using hashes here.

Provenance

The following attestation bundles were made for macverify-1.1.0.tar.gz:

Publisher: publish.yml on ShanedixonGit/macverify

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file macverify-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: macverify-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 127.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for macverify-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6fe7f17417e47bbcdfd5d15ad4f852b3f0cd8082bee98ad397f3f5f443f5a6b4
MD5 293c416d7be50c2fc95e12c1ded23e21
BLAKE2b-256 d8e7511f025b91b0b211f801461d9c43612922466c9de2b5828aa3ca2bff373b

See more details on using hashes here.

Provenance

The following attestation bundles were made for macverify-1.1.0-py3-none-any.whl:

Publisher: publish.yml on ShanedixonGit/macverify

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

1.1.0 This release

2 files

1.0.1

2 files

1.0.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page