{
  "schema": 1,
  "about": "Machine-readable facts about plottypus, for citation. Every number carries the date it was checked and its conditions. Human-readable: https://plottypus.com/llms.txt",
  "checked": "2026-09-24",
  "product": {
    "name": "plottypus",
    "summary": "A native Apple Silicon system monitor for the terminal: one Rust binary (ratatui TUI) that reads CPU and GPU watts, clocks, temperatures, fans, memory, network, disk and processes from IOReport, the SMC, Mach and sysctl, without sudo.",
    "url": "https://plottypus.com",
    "author": "Lay Sheth",
    "contact": "hello@plottypus.com",
    "license": "Free to use under the EULA. The source is not open.",
    "price": "Free. Every live reading stays free.",
    "pro": {
      "on_sale": false,
      "plan": "Planned: $9 at launch, then $12, one time, three Macs, every 1.x update. Built once the free launch passes 500 installs or stars."
    },
    "privacy": "The app makes no network connections. The site sets no cookies. Vercel Analytics and Speed Insights count page views and load times."
  },
  "release": {
    "version": "1.0.0",
    "released": "2026-09-23",
    "commit": "7e7c1aa904527829c00b1746ba8ebdbe375e96b3",
    "notes": "https://plottypus.com/changelog",
    "download": {
      "url": "https://plottypus.com/download/v1.0.0/plottypus-v1.0.0-macos-arm64.tar.gz",
      "sha256": "89cdc2d1993dde0607d942103f393fb5bda6b38e1666ef96c3534d2c56e59f9b",
      "bytes": 1069399,
      "contains": [
        "plottypus",
        "LICENSE",
        "EULA.md",
        "README.md",
        "CHANGELOG.md",
        "THIRD_PARTY_NOTICES.html"
      ]
    },
    "binary": {
      "bytes": 2166064,
      "arch": "arm64",
      "signing": "ad-hoc signed, not notarized"
    },
    "install": {
      "script": "curl -fsSL https://plottypus.com/install.sh | sh",
      "script_installs_to": "~/.local/bin (override with --prefix DIR); verifies the SHA-256; no sudo",
      "homebrew": "a Homebrew tap is coming"
    },
    "latest_api": "https://plottypus.com/api/latest"
  },
  "requirements": {
    "platform": "macOS on Apple Silicon",
    "macos": "Apple Silicon (M1–M5). Tested on macOS 27.0; the binary targets macOS 11+.",
    "chips": "M1 to M5, including Pro, Max and Ultra",
    "tested_hardware": "measured on a MacBook Pro with an M5 Pro (Mac17,8): 6 Super + 12 Performance cores, 20-core GPU, 24 GB",
    "sudo": false
  },
  "capabilities": [
    {
      "id": "cpu-watts",
      "text": "Live CPU watts without sudo on the M5 Pro (SMC rails). On other Apple Silicon chips plottypus holds the last published IOReport value with its age, and shows — once it is more than 10 s old, which on macOS 27 is often."
    },
    {
      "id": "smc-calibration",
      "text": "The M5 Pro SMC rail reading is within about 10% of IOReport."
    },
    {
      "id": "no-fake-zero",
      "text": "A value the Mac does not give is shown as —, never 0; anything under 0.05 W counts as absent, never printed as 0."
    },
    {
      "id": "per-process-watts",
      "text": "Per-process watts from the kernel's per-task energy counter."
    },
    {
      "id": "json",
      "text": "plottypus --json and --json-stream: JSON schema 1, macmon field names, null for unmeasured."
    },
    {
      "id": "interval",
      "text": "Sample interval 100 ms to 60 s, 500 ms by default."
    },
    {
      "id": "themes",
      "text": "10 built-in themes, plus auto (built from your terminal's palette)"
    },
    {
      "id": "smc-keys",
      "text": "Reads 3,626 SMC keys on the M5 Pro."
    },
    {
      "id": "tests",
      "text": "1,649 tests in the 1.0.0 workspace."
    },
    {
      "id": "network",
      "text": "It makes no network connections and sends no telemetry."
    }
  ],
  "coming_in_1_1": [
    "timeline",
    "reports",
    "alerts",
    "record/replay",
    "serve",
    "CSV export",
    "app grouping",
    "shell completions",
    "man page"
  ],
  "power_on_macos_27": {
    "finding": "On macOS 27 the PMGR \"Energy Model\" IOReport counters publish in batches 2–108 s apart, and sometimes not for tens of minutes. Tools that turn a per-interval delta into watts then read CPU at 0 W between batches.",
    "batch_gap_s": {
      "min": 2,
      "max": 108
    },
    "plottypus": "Live CPU watts without sudo on the M5 Pro (SMC rails). On other Apple Silicon chips plottypus holds the last published IOReport value with its age, and shows — once it is more than 10 s old, which on macOS 27 is often.",
    "held_value_stale_after_s": 10,
    "machine": "M5 Pro (Mac17,8), macOS 27.0, on AC power, no sudo",
    "source": "docs/research/13-ioreport-and-power.md §3 (20-minute capture, fixture energy_rawts_20min.txt)"
  },
  "self_cost": {
    "conditions": "M5 Pro, macOS 27, median of 3, 160×45",
    "cpu_default_interval": {
      "text": "about 1.5% of one core at the default 500 ms",
      "cpu_pct_of_one_core": 1.48,
      "interval_ms": 500
    },
    "cpu_1s_interval": {
      "text": "about 1% of one core at 1 s",
      "cpu_pct_of_one_core": 1.01,
      "interval_ms": 1000
    },
    "idle_redraws": {
      "text": "0 redraws while idle",
      "per_s": 0
    },
    "energy": {
      "text": "under 0.01 W of its own on an idle Mac",
      "w_at_500ms": 0.007,
      "estimate": "the kernel per-task energy counter (ri_energy_nj)"
    },
    "before_rewrite": "Before the rewrite it cost 7.06% of a core at 250 ms, 5.09% at 1 s and 0.18 W, with 106 empty redraws a second.",
    "method": "perf-smoke.py: 3 fresh processes, 5 s warm-up, 20 s window each, median; CPU from proc_pid_rusage",
    "source": "docs/research/12-self-cost.md \"Wave 3 regression and the perf pass\" table (1.48, range 1.41–1.59; load 1.7–3.8)"
  },
  "comparisons": {
    "machine": "M5 Pro (Mac17,8), macOS 27.0, on AC power, no sudo",
    "plottypus_cpu_watts": "plottypus 1.0.0 printed 21–50 W for CPU in 30 of 30 samples in the same 30 s that macmon printed 0.0 W (our M5 Pro, 2026-09-24).",
    "cpu_watts_macos_27": [
      {
        "tool": "macmon",
        "version": "0.8.2",
        "url": "https://github.com/vladkens/macmon",
        "status": "measured-zero",
        "finding": "macmon 0.8.2 printed CPU 0.00 W in 120 of 120 one-second samples, and 30 of 30 in a run beside plottypus, with the CPU at 100% and system power at 40–90 W (our M5 Pro, macOS 27.0, 2026-09-24). Tracked upstream as issue #76 (open).",
        "checked": "2026-09-24",
        "sources": [
          "https://github.com/vladkens/macmon/issues/76",
          "https://github.com/vladkens/macmon/pull/77"
        ]
      },
      {
        "tool": "mactop",
        "version": "2.1.5",
        "url": "https://github.com/metaspartan/mactop",
        "status": "measured-zero",
        "finding": "mactop 2.1.5 printed CPU 0.0 W in 20 of 20 one-second samples, run beside macmon and plottypus with its own system power at 19–96 W (our M5 Pro, macOS 27.0, 2026-09-24). Its code turns an IOReport \"Energy Model\" sample delta into watts by dividing by the sampling window, the method macOS 27 batching breaks.",
        "checked": "2026-09-24",
        "sources": []
      },
      {
        "tool": "Stats",
        "version": "3.0.17",
        "url": "https://github.com/exelban/stats",
        "status": "reported-zero",
        "finding": "Users report CPU power at 0.00 W on macOS 27 (issues #3608, #3621, versions 3.0.15–3.0.16). The maintainer says macOS is not reporting the value and #3621 stays open. The 3.0.17 notes (2026-09-20) do not mention it. Not measured by us.",
        "checked": "2026-09-24",
        "sources": [
          "https://github.com/exelban/stats/issues/3621",
          "https://github.com/exelban/stats/issues/3608",
          "https://github.com/exelban/stats/releases/tag/v3.0.17"
        ]
      },
      {
        "tool": "macpow",
        "version": "0.1.19",
        "url": "https://github.com/k06a/macpow",
        "status": "same-method-unmeasured",
        "finding": "Not measured by us. Its code divides an IOReport sample delta by the elapsed milliseconds, the method macOS 27 batching breaks. No macOS 27 issue is filed in its tracker.",
        "checked": "2026-09-24",
        "sources": []
      }
    ],
    "self_cost": [
      {
        "tool": "plottypus",
        "version": "1.0.0",
        "interval_ms": 500,
        "cpu_pct_of_one_core": 1.48,
        "cpu_pct_range": [
          1.41,
          1.59
        ],
        "energy_w": 0.007,
        "measured": "2026-09-23",
        "conditions": "Mac17,8 (M5 Pro), macOS 27.0 (26A428), AC power; load 1.7–3.8"
      },
      {
        "tool": "plottypus",
        "version": "1.0.0",
        "interval_ms": 1000,
        "cpu_pct_of_one_core": 1.01,
        "cpu_pct_range": [
          1.01,
          1.07
        ],
        "energy_w": 0.006,
        "measured": "2026-09-23",
        "conditions": "Mac17,8 (M5 Pro), macOS 27.0 (26A428), AC power; load 1.7–3.8"
      },
      {
        "tool": "btop",
        "version": "1.4.7",
        "interval_ms": 2000,
        "cpu_pct_of_one_core": 1.3,
        "cpu_pct_range": [
          1.28,
          1.42
        ],
        "energy_w": 0.011,
        "measured": "2026-09-23",
        "conditions": "Mac17,8 (M5 Pro), macOS 27.0 (26A428), AC power; default 2 s interval; load 1.2–1.9"
      },
      {
        "tool": "btop",
        "version": "1.4.7",
        "interval_ms": 1000,
        "cpu_pct_of_one_core": 2.28,
        "cpu_pct_range": [
          2.14,
          2.44
        ],
        "energy_w": 0.028,
        "measured": "2026-09-23",
        "conditions": "Mac17,8 (M5 Pro), macOS 27.0 (26A428), AC power; update_ms = 1000; load 1.2–1.9"
      },
      {
        "tool": "macmon",
        "version": "0.8.2",
        "interval_ms": 1000,
        "cpu_pct_of_one_core": 1.47,
        "cpu_pct_range": [
          1.33,
          1.47
        ],
        "energy_w": 0.005,
        "measured": "2026-09-23",
        "conditions": "Mac17,8 (M5 Pro), macOS 27.0 (26A428), AC power; default 1 s; load 1.2–1.9"
      }
    ],
    "rule": "A tool not listed here was not measured. \"same-method-unmeasured\" means its source uses the interval-delta method; we did not run it."
  }
}
