Skip to content

Releases

v4.9.8

Choose a tag to compare

@github-actions github-actions released this 05 Nov 22:30
v4.9.8
70dbc41

4.9.8 - 2026-11-05

Highlights: Select files in Open panels with dialog file and stop typing filenames into Search; keep exact-window clicks and window focus working when another running app shares the target's name; find exact windows that an app exposes only through its focused or main window; make window focus fall back to Accessibility when macOS declines activation; and start MCP and Agent runtimes when another process owns the capture lane without a Bridge.

  • Select files in Open panels with dialog file, using --path <file> or --path <dir> --name <file>: the full path goes through Go to Folder and the selection is verified before confirming, and a missing file is refused before any input. Open panels have no filename field, so this could not work before. Thanks @realchrisbarnes for the report! #1158.
  • Refuse filename entry into Search, Filter, Tags, or Comments controls in file dialogs, with an actionable error when no safe filename field is available. Thanks @goutamadwant! #1159, refs #1158.
  • Keep exact-window clicks and window focus working when another running app shares the target's name, instead of refusing with an unknown focused window or "Multiple apps match". Focused-window lookups now use the exact process and report only the window Accessibility says is focused, so a click refuses instead of trusting a ranked guess, and its refusal keeps the lookup error. Thanks @Amogusto! #1161.
  • Make window focus fall back to an Accessibility activation request when macOS declines the native one, as it can for apps launched from a shell, instead of timing out. Exact focus is still verified afterward. Refs #1161.
  • Find exact windows that an app exposes only through its focused or main window, such as Figma when AXWindows comes back empty, while retaining exact window-ID and owner checks. Thanks @YarikMix! #1154.
  • Start MCP and Agent runtimes when another live Peekaboo process owns the ScreenCaptureKit lane without a reachable Bridge socket, instead of exiting 1 before the JSON-RPC handshake. Capture-capable tools keep the CAPTURE_FAILED refusal for the session while noncapture tools remain usable. Thanks @chenyuhao0628! #1146, fixes #1145.
  • Clarify exact-window target-changed errors with unavailable identity versus changed components and whether validation failed before the operation, after capture, or after the operation. #1151.
  • Wait 250ms instead of 150ms before restoring the previous clipboard after a temporary paste, and document that restoration is time-based: an app that reads the clipboard later than the restore delay can paste the previous contents, so raise --restore-delay (MCP restore_delay_ms) for slow receivers. #1140, refs #1111.
  • Keep duration labels inside the unit they claim: 59.95s now reads 1m 0s instead of 60.0s, 0.9995s reads 1.0s instead of 1000ms, and non-finite or out-of-range durations read "an unknown duration" instead of trapping. Thanks @rudycelekli! #1149.
  • Say that no windows are available when a window index is requested from an app without windows, instead of Available windows: 0--1. Thanks @rudycelekli! #1150.
  • Docs site: render Markdown images and task-list checkboxes, restore the missing smart-select metadata table cells, keep URL schemes inside highlighted code strings, point source links at the repository, and show read-when hints without YAML quotes. Thanks @rudycelekli! #1141, #1142, #1143, #1144, #1147, #1148.
  • Update Swift Log to 1.16.2 for in-place metadata writes and Swift Configuration to 1.4.0, preserving the Swift 6.2 and macOS baselines.
  • Run main CodeQL analysis on the existing weekly schedule instead of every push, preserving PR scans and independent manual runs.

Verification

Run: https://github.com/openclaw/Peekaboo/actions/runs/42116177681

Verified on xcode-27: arm64, x86_64 under Rosetta, and an independent arm64 runtime audit.

Toolchain and notarization submissions:

{
  "schemaVersion": 1,
  "repository": "openclaw/Peekaboo",
  "tag": "v4.9.8",
  "commit": "70dbc4183f390a5a72d5dc01d8a77eb672217070",
  "teamId": "FWJYW4S8P8",
  "authority": "Developer ID Application: OpenClaw Foundation (FWJYW4S8P8)",
  "toolchain": {
    "build": {
      "xcode": "Xcode 27.1\nBuild version 27A9275",
      "swift": "Apple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1)\nTarget: arm64-apple-macosx27.0.0",
      "sdk": "27.0"
    },
    "sign": {
      "xcode": "Xcode 27.1\nBuild version 27A9275",
      "swift": "Apple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1)\nTarget: arm64-apple-macosx27.0.0",
      "sdk": "27.0"
    }
  },
  "submissions": {
    "dmg": "63553cc2-2595-4808-9d43-a43213367f96",
    "app": "bc5beea1-f97a-4e50-acfc-e4b640d5342a",
    "cli": "fc0b529c-74e7-4380-895d-431be3ecea30"
  },
  "buildNumber": "4090899",
  "edSignature": "owrPIc/oz76hVIMc4PNEwuyUcA7sKgzThcVILcuRtSi5ZJvf6/GfLNH5E9gx7ixpjXWpVp6rE0hgW41wOhaXAQ==",
  "digests": {
    "peekaboo-macos-universal.tar.gz": "88823bb39e16c744c43ffd94c18c3773cd2f7c05bc7843e6e1e2e5da58b9ce76",
    "Peekaboo-4.9.8.dmg": "fcbba5643b425fc7cc337a2a94665480c4d3887f003c9813deb89e17dc34928c",
    "Peekaboo-4.9.8.app.zip": "1b824ec0fea11836a2394ab550bee4e9517b7dabda8ef93700ebeb4263a4a528",
    "peekaboo-macos-x86_64.tar.gz": "7792ac5f4cefbd4473c2766d4905ceb486df8da4aa270399cda214b0f4bed877",
    "peekaboo-macos-arm64.tar.gz": "5b82b246cd7b257b68d15e136a8234848a8e70a5999cdf5526993fb860685bfe"
  },
  "downloaderEntitlements": {
    "bundle": "Contents/Frameworks/Sparkle.framework/Versions/B/XPCServices/Downloader.xpc",
    "entitlements": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict/>\n</plist>\n"
  }
}

Checksums:

aa807c1f426ce2e6a12bf8edbce1e3666736102c07b201343c9269960d1c2827  ASSET-INVENTORY.json
1b824ec0fea11836a2394ab550bee4e9517b7dabda8ef93700ebeb4263a4a528  Peekaboo-4.9.8.app.zip
fcbba5643b425fc7cc337a2a94665480c4d3887f003c9813deb89e17dc34928c  Peekaboo-4.9.8.dmg
6cc71bf3639a7ee98d9017351a7a6fbea1b79d99bcea511ff3df6863b3dd06dc  RELEASE-NOTES.md
3debbce3203329687e4d6dd55d11453a04ac2f39cd06e55d0b44ec4c8f389521  SIGNING-MANIFEST.json
6a07729b7ad3004a7730d7ec1aac95d5a9c697efa0fa450e107c7b1a3207e2be  appcast-entry.json
16a04c20b8f6314acf71013897b76fff2695e664fe3de1889e7fd7701bd8c1b5  appcast.xml
5b82b246cd7b257b68d15e136a8234848a8e70a5999cdf5526993fb860685bfe  peekaboo-macos-arm64.tar.gz
88823bb39e16c744c43ffd94c18c3773cd2f7c05bc7843e6e1e2e5da58b9ce76  peekaboo-macos-universal.tar.gz
7792ac5f4cefbd4473c2766d4905ceb486df8da4aa270399cda214b0f4bed877  peekaboo-macos-x86_64.tar.gz
eec8b37b809d6155266846df6a6832d8cc6fdc526fb3bf73abc05818fe4974e8  steipete-peekaboo-4.9.8.tgz

npm

v4.9.7

Choose a tag to compare

@github-actions github-actions released this 23 Oct 22:07
v4.9.7
5639e70

4.9.7 - 2026-10-23

Highlights: Report window close through the daemon as closed when an app keeps the closed window alive; let see observe Chrome windows whose titles carry the app name or are elided; close apps that re-exec themselves with --foreground; and keep the Mac chat, menu bar and Inspector accurate.

  • Report window close through the daemon or Bridge as closed when the app keeps the closed NSWindow alive, instead of exiting 1 with an indeterminate postcondition: the Bridge readback now applies the same exact-window Accessibility presence check as the in-process path. Thanks @goutamadwant! #1131, fixes #1129.
  • Let peekaboo see observe Chrome and other apps whose Accessibility window title appends the application name or whose WindowServer title is middle-elided, instead of failing with "inconsistent response evidence: window-context window title". Thanks @L1uYun! #1130.
  • Close windows of apps that re-exec themselves with window close --foreground, whose frontmost PID AppKit reports as -1. Thanks @SebTardif! #1124.
  • Classify Dock separators and the Trash from their Accessibility subroles, so peekaboo dock list hides separators unless --include-all is passed, reports included separators as separator instead of blank unknown items, and identifies a localized Trash (such as "Papierkorb") as trash. #1120.
  • Use the Mac app's saved Vision model for image analysis even when its provider does not report vision support (OpenRouter, OpenAI-compatible, LM Studio and many Ollama models), surfacing the provider's error instead of silently switching models. Thanks @SebTardif! #1127.
  • Keep the Mac chat's streaming answer together when you queue a follow-up, and keep Retry on the prompt that failed. Thanks @SebTardif! #1126.
  • Show a failed Mac agent tool as failed, not completed, in the menu bar, while cancelled tools stay cancelled. Thanks @SebTardif! #1134.
  • Highlight the Inspector control in the front window under the pointer, including floating panels and popup items past their window, instead of the smallest control anywhere on screen; windows of untracked apps such as the Dock now stop the hover from reaching what they cover. Thanks @SebTardif! #1133.
  • Place Inspector highlight boxes on the correct display when a display does not start at the primary display's origin. Thanks @SebTardif! #1132.
  • Restore source builds after the pinned MCP Swift SDK commit became unreachable upstream when its pull request branch was rebased. #1135.
  • Remove the unused public DialogError.inputSuppressedUnderTests case from PeekabooAutomationKit along with the dead test-only dialog typing hook that threw it; release builds could never throw it, so only SwiftPM consumers that switch over every DialogError case need to drop that branch. #1123.

Verification

Run: https://github.com/openclaw/Peekaboo/actions/runs/40027354350

Verified on xcode-27: arm64, x86_64 under Rosetta, and an independent arm64 runtime audit.

Toolchain and notarization submissions:

{
  "schemaVersion": 1,
  "repository": "openclaw/Peekaboo",
  "tag": "v4.9.7",
  "commit": "5639e70501010ca9dcae5f594a0b57dd69e9b395",
  "teamId": "FWJYW4S8P8",
  "authority": "Developer ID Application: OpenClaw Foundation (FWJYW4S8P8)",
  "toolchain": {
    "build": {
      "xcode": "Xcode 27.1\nBuild version 27A9275",
      "swift": "Apple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1)\nTarget: arm64-apple-macosx27.0.0",
      "sdk": "27.0"
    },
    "sign": {
      "xcode": "Xcode 27.1\nBuild version 27A9275",
      "swift": "Apple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1)\nTarget: arm64-apple-macosx27.0.0",
      "sdk": "27.0"
    }
  },
  "submissions": {
    "dmg": "49e56865-83ab-4a68-a853-2c9d11c3e7f4",
    "app": "9d527509-3080-4750-9d24-b79476b87508",
    "cli": "b1f7cf90-ea21-4cfb-aa05-15942105d24f"
  },
  "buildNumber": "4090799",
  "edSignature": "J63yDO9tcaY8hjhMx79PCcl5RoaKBdnYK6/dPD8+3S4XLtyrBMJ6te4LVIg5I7UMJTBB+azoNN8cqeKyuCDlCg==",
  "digests": {
    "Peekaboo-4.9.7.app.zip": "ad87379580bdc9a2d96a62f1d3db7545b18306f8fcd96d1b50b4eee033959ed0",
    "peekaboo-macos-universal.tar.gz": "8a4136b9efd4c3a5591840375b024009a3cfb1b5fe994f62268cc755fb37744c",
    "Peekaboo-4.9.7.dmg": "7af21a490c4ff57a183557935cef54a01ce75cc24e515fdf51a3d831cb2573bb",
    "peekaboo-macos-x86_64.tar.gz": "b9abefba42b23fda37e1c682e2493a6aa403b6c72b0eefa9773bea517960cb58",
    "peekaboo-macos-arm64.tar.gz": "147a81a9b31c1b7b7bd5f720674ad7de71951698138d379679678a9ccfdd0a38"
  },
  "downloaderEntitlements": {
    "bundle": "Contents/Frameworks/Sparkle.framework/Versions/B/XPCServices/Downloader.xpc",
    "entitlements": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict/>\n</plist>\n"
  }
}

Checksums:

59febb752aa646a1c9203c9ee33dad7b12f6e1b2e7b5a6e22fa469db7031b719  ASSET-INVENTORY.json
ad87379580bdc9a2d96a62f1d3db7545b18306f8fcd96d1b50b4eee033959ed0  Peekaboo-4.9.7.app.zip
7af21a490c4ff57a183557935cef54a01ce75cc24e515fdf51a3d831cb2573bb  Peekaboo-4.9.7.dmg
7f4b6d1998f735e77485b7111575cac92126f30cf5fd4a5ccf79b80d3d5604e6  RELEASE-NOTES.md
1bb0e451a75669c1916430539baae091779ae5f3ab5a044ff19c34361ae8dc4c  SIGNING-MANIFEST.json
4657d87e137bb4a66ceeb143b8b3b4bc0842b012b17458cc4eaabb16254b54bf  appcast-entry.json
827ceaa347ac07ec90e223b71090107304804ace54fa9149d84bfeda9af53e0a  appcast.xml
147a81a9b31c1b7b7bd5f720674ad7de71951698138d379679678a9ccfdd0a38  peekaboo-macos-arm64.tar.gz
8a4136b9efd4c3a5591840375b024009a3cfb1b5fe994f62268cc755fb37744c  peekaboo-macos-universal.tar.gz
b9abefba42b23fda37e1c682e2493a6aa403b6c72b0eefa9773bea517960cb58  peekaboo-macos-x86_64.tar.gz
b87fd98c8d2e99ed7d2d904a609503c484131bdd944cea45cc6974fab92b9bd7  steipete-peekaboo-4.9.7.tgz

npm

  • Package: @steipete/peekaboo@4.9.7 (latest)
  • Tarball: https://registry.npmjs.org/@steipete/peekaboo/-/peekaboo-4.9.7.tgz
  • Integrity: sha512-JMGqx1jsHMLGyPfG769aAj1ZE5xbG6iHKi/9QWnlEfUX0zGDnX2YwBWRcZSSlWvGLsJ/l+Ocgg1kh7sq1ga5vQ==; the registry tarball is byte-identical to the steipete-peekaboo-4.9.7.tgz asset listed in checksums.txt.
  • Homebrew: openclaw/homebrew-tap formula updated to v4.9.7, with arm64 and x86_64 checksums matching the release assets.

v4.9.6

Choose a tag to compare

@github-actions github-actions released this 20 Oct 22:04
v4.9.6
e08807d

4.9.6 - 2026-10-20

Highlights: Find, inspect and capture apps that re-exec themselves on launch, such as Xcode's Device Hub, whose PID AppKit reports as -1; report window close as closed when an app keeps the closed window alive or quits; use the Mac app's saved Vision model for image analysis; and keep the Mac chat's Stop button, follow-ups, transcript, menu bar and recent sessions reliable.

  • See, inspect, list and capture apps that re-exec themselves on launch, such as Xcode's Device Hub, whose PID AppKit reports as -1, by recovering one verified live process with matching executable and application metadata. Thanks @lukemyself-hub! #1121, fixes #1119.
  • Report window close as closed when the app keeps the closed NSWindow alive, such as Calculator's About panel: an off-screen WindowServer row no longer counts as the window remaining once Accessibility no longer exposes it. Thanks @jandubois! #1116, fixes #1106.
  • Report window close as closed when the owning process exits during close verification (for example the last window of an app that quits) instead of failing with a changed-identity error; a reused PID still counts as a replacement. #1109, refs #1106.
  • Use the Mac app's saved Vision model for screenshots and image analysis: a custom choice is written to agent.visionModel in config.json (as provider/modelId) and used by see/analyze when no model is given, while "Same as agent model" removes it. Thanks @SebTardif! #1110.
  • Save the Mac app's Ollama base URL to config.json so the CLI uses it, and clear it when reset to http://localhost:11434 instead of restoring the old URL on the next launch. Thanks @SebTardif! #1104.
  • Keep the Mac chat's Stop button attached to the running task when you send follow-ups: follow-ups now queue behind the active task and run in order, Stop cancels the in-flight provider request and discards queued follow-ups, and a queued prompt stays with the session it was sent from. Thanks @SebTardif! #1095.
  • Stop recording Mac chat prompts twice from the menu bar or queued follow-ups, stop appending a combined copy of the reply after multi-step runs, and title a new chat from its first prompt again. #1117.
  • Open the chat you clicked under Recent Sessions in the Mac menu bar instead of the one already selected; that window can continue or retry its chat without first switching the menu bar's selection. Thanks @SebTardif! #1108.
  • Keep the Mac menu bar's chat in sync with the conversation: new messages, streamed replies, generated titles and summaries now show up there, and deleting that chat no longer leaves it selected. Thanks @SebTardif! #1107.
  • Keep the Mac app's chat history when sessions.json cannot be decoded: move the unreadable file aside instead of overwriting it, save atomically, and show a notice while saves are blocked. Thanks @SebTardif! #1102.
  • Keep underscores inside words, such as WINDOW_NOT_FOUND or browser_wait_for, literal on the documentation site instead of rendering them as emphasis. Thanks @rudycelekli! #1112.
  • Move macOS CI and qualification jobs to Xcode 27 runners (except CodeQL Swift tracing), retain macOS 15 deployment and runtime-symbol checks, and smoke-test Intel artifacts under Rosetta.

Verification

Run: https://github.com/openclaw/Peekaboo/actions/runs/39500615980

Verified on xcode-27: arm64, x86_64 under Rosetta, and an independent arm64 runtime audit.

Toolchain and notarization submissions:

{
  "schemaVersion": 1,
  "repository": "openclaw/Peekaboo",
  "tag": "v4.9.6",
  "commit": "e08807d08c956471012b595a4d2bddb4dc8031ea",
  "teamId": "FWJYW4S8P8",
  "authority": "Developer ID Application: OpenClaw Foundation (FWJYW4S8P8)",
  "toolchain": {
    "build": {
      "xcode": "Xcode 27.0\nBuild version 27A266a",
      "swift": "Apple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1)\nTarget: arm64-apple-macosx27.0.0",
      "sdk": "27.0"
    },
    "sign": {
      "xcode": "Xcode 27.0\nBuild version 27A266a",
      "swift": "Apple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1)\nTarget: arm64-apple-macosx27.0.0",
      "sdk": "27.0"
    }
  },
  "submissions": {
    "dmg": "f175c24a-7494-474e-8af9-f4321de4f877",
    "app": "490b0c0a-6118-4902-8149-c361755adda0",
    "cli": "410e1d1b-906d-4bd8-8b26-b49d6acd1407"
  },
  "buildNumber": "4090699",
  "edSignature": "gx8RpogTwwgXaXOyT9A6Qs8hwwEE7g0aRduHjQQkwIW9wJtpaHtmQhwHSQNAUDZRcJHjHTm/OD30uEufoL2MBQ==",
  "digests": {
    "Peekaboo-4.9.6.app.zip": "eab12d6ffa348de3b74e4f69ea420a63611ceab198a4aea81e1c166e7089eaed",
    "peekaboo-macos-universal.tar.gz": "01bdd139b7b010630378bbf0e31f54f38fde4501a5805b2bf66b64521b7ceca2",
    "Peekaboo-4.9.6.dmg": "26670b3cf3ecc064b0234e571d840d0405872f6d988802298ef91f0746fa3675",
    "peekaboo-macos-x86_64.tar.gz": "57d67e844d381a796740f087c3f78ea070acfc6bfe6b53de81cb9ea02b980b05",
    "peekaboo-macos-arm64.tar.gz": "5c7de67ba1505d95843e83c154856c9fb93b1d1c4ce626d66a8be0c6e265dc83"
  },
  "downloaderEntitlements": {
    "bundle": "Contents/Frameworks/Sparkle.framework/Versions/B/XPCServices/Downloader.xpc",
    "entitlements": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict/>\n</plist>\n"
  }
}

Checksums:

6bbdd3fa22260b9663ee2bf1c0eed26cbb5a520c53845bc4cddf3be32d0ec229  ASSET-INVENTORY.json
eab12d6ffa348de3b74e4f69ea420a63611ceab198a4aea81e1c166e7089eaed  Peekaboo-4.9.6.app.zip
26670b3cf3ecc064b0234e571d840d0405872f6d988802298ef91f0746fa3675  Peekaboo-4.9.6.dmg
41c8ae1821dc354740c647e916ed5f1da6028119b280c0ecb1e4699618c0a7ac  RELEASE-NOTES.md
336032ae9059982b7dbeaf1d6ca828728ffd775cd53f7ac9ff9c382def07e63a  SIGNING-MANIFEST.json
350bf9f98607b28bf28578accdae691179769607a37592706cadc0b8d680688c  appcast-entry.json
3be8b1d0e082f897be55ff81b181b280185f46f12e6b555b83d6a338c9d1eb6c  appcast.xml
5c7de67ba1505d95843e83c154856c9fb93b1d1c4ce626d66a8be0c6e265dc83  peekaboo-macos-arm64.tar.gz
01bdd139b7b010630378bbf0e31f54f38fde4501a5805b2bf66b64521b7ceca2  peekaboo-macos-universal.tar.gz
57d67e844d381a796740f087c3f78ea070acfc6bfe6b53de81cb9ea02b980b05  peekaboo-macos-x86_64.tar.gz
80c17ac24406022beda0b4552aed1ec340cf7c48dc5d39ab35672c04107a68b1  steipete-peekaboo-4.9.6.tgz

npm

  • Package: @steipete/peekaboo@4.9.6 (latest)
  • Tarball: https://registry.npmjs.org/@steipete/peekaboo/-/peekaboo-4.9.6.tgz
  • Integrity: sha512-gdABsoIraXBkGjt6IAvOuS8tEDtr2s97MBZ/UN0BfnBJQ9DLUddfwLz9sQk18On8HEcOWOaPwRiFQ2ulRhMvMQ==; the registry tarball is byte-identical to the steipete-peekaboo-4.9.6.tgz asset listed in checksums.txt.
  • Homebrew: openclaw/homebrew-tap formula updated to v4.9.6, with arm64 and x86_64 checksums matching the release assets.

v4.9.5

Choose a tag to compare

@github-actions github-actions released this 17 Oct 02:48
v4.9.5
260fc35

4.9.5 - 2026-10-16

Highlights: Let unsigned source builds such as Homebrew core's peekaboo formula run commands in-process immediately instead of waiting on or aborting at daemons they cannot trust, with an explicit same-binary daemon opt-in; stop starting daemons that a granted Peekaboo.app host would outrank; and keep see and multi-app quit outcomes accurate.

  • Fall back to in-process execution immediately when an unsigned source build (such as Homebrew core's peekaboo formula) meets a daemon it cannot trust, instead of waiting out daemon startup or aborting, and add an explicit PEEKABOO_ALLOW_UNSIGNED_DAEMON=1 opt-in that lets such a build trust only its own exact-binary daemon; release-signed builds ignore it. Thanks @fry69! #1089, #1064.
  • Skip auto-starting an on-demand daemon when a granted Peekaboo.app bridge host would be selected anyway, avoiding the daemon's startup wait and an idle permission-less daemon; lifecycle commands, snapshot-owned actions and explicit sockets still start it. #1082, follow-up to #1073.
  • Declare route-specific Accessibility and Event Synthesizing needs for type, paste, press/hotkey, window, menu and menubar, so hosts that explicitly lack them are skipped while grant-free routes and unknown host reports keep working. #1088.
  • Stop reporting complete Accessibility observations as incomplete when an app declines an inapplicable child attribute, such as Calculator's Help search field after a menu opens; preserve readable children and genuine read-failure warnings. Thanks @jandubois! #1094.
  • Keep a multi-application app quit cancelled after a suspected no-op reported as a no-op instead of a partial change that asks callers to recover a side effect. Thanks @SebTardif! #1098.
  • Stop shipping the CI runner's Swift toolchain directory as an LC_RPATH in released CLI binaries, and fail release builds that carry any non-system absolute rpath. #1099.
  • Show macOS 27's renamed "Device Control and Data Access" Settings row in axorc permissions guidance by updating AXorcist. openclaw/AXorcist#102.
  • Render indented code fences, nested and wrapped list items, and parentheses inside link URLs correctly on the documentation site. Thanks @rudycelekli! #1084, #1085, #1086.
  • Update Service Lifecycle to 2.13.0; Swift 6.2 builds select the same runtime code. #1097.

Verification

Run: https://github.com/openclaw/Peekaboo/actions/runs/38988332485

Verified on macos-15 (arm64), macos-15-intel (x86_64), and macos-26 (arm64).

Toolchain and notarization submissions:

{
  "schemaVersion": 1,
  "repository": "openclaw/Peekaboo",
  "tag": "v4.9.5",
  "commit": "260fc35320d6c350af503338b944d68311e2bebb",
  "teamId": "FWJYW4S8P8",
  "authority": "Developer ID Application: OpenClaw Foundation (FWJYW4S8P8)",
  "toolchain": {
    "build": {
      "xcode": "Xcode 27.0\nBuild version 27A266a",
      "swift": "Apple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1)\nTarget: arm64-apple-macosx27.0.0",
      "sdk": "27.0"
    },
    "sign": {
      "xcode": "Xcode 27.0\nBuild version 27A266a",
      "swift": "Apple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1)\nTarget: arm64-apple-macosx27.0.0",
      "sdk": "27.0"
    }
  },
  "submissions": {
    "dmg": "e9528edd-fbf4-4ada-8d06-7593d1f62f21",
    "app": "c002dfaa-810a-4f48-a7e2-9dd77b12e1a5",
    "cli": "df67cfd1-f999-4229-9f1f-1c53bf4f6889"
  },
  "buildNumber": "4090599",
  "edSignature": "rLKDDZhUJm9nbNw06Pijy0AKIz2P1FNW3qUM2hs4DyWwkbs2jrQtwre781E05/w/m89aCb1s0DJHfXHSdVpVDg==",
  "digests": {
    "peekaboo-macos-universal.tar.gz": "0b0ef566de644b9281d817b13c1ac306e8ce75458ad9a4aa13d341eaa114893c",
    "Peekaboo-4.9.5.app.zip": "d176301b0ef4b695c11cbdb8c0bdbbc71f47f866f76c734ddad8343ab5f93e38",
    "Peekaboo-4.9.5.dmg": "f92f0047a1f0e60b7586dea1f83dcfd8e3f1bf42c34bb026f4fc1b0d9efedc77",
    "peekaboo-macos-x86_64.tar.gz": "0d3aaf6f45d2980b973b213f05ad3af826968368127872e6d2d6a40057193faf",
    "peekaboo-macos-arm64.tar.gz": "2f435c736459a3d30279835038fc7e67028875be837f467c87521ea14da3a9ee"
  },
  "downloaderEntitlements": {
    "bundle": "Contents/Frameworks/Sparkle.framework/Versions/B/XPCServices/Downloader.xpc",
    "entitlements": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict/>\n</plist>\n"
  }
}

Checksums:

9948e589b3603fd00edc5781e7dc3d0a273f210afa51f52cf3b193c936f25f78  ASSET-INVENTORY.json
d176301b0ef4b695c11cbdb8c0bdbbc71f47f866f76c734ddad8343ab5f93e38  Peekaboo-4.9.5.app.zip
f92f0047a1f0e60b7586dea1f83dcfd8e3f1bf42c34bb026f4fc1b0d9efedc77  Peekaboo-4.9.5.dmg
73ef0d207f30700f12112c5a8546f79ab5592ac62a51c6b51dd51d44245014ec  RELEASE-NOTES.md
d419bc1890bc9ac4adde56d06067ca115979e5204d3d715f1dcfc615ae224797  SIGNING-MANIFEST.json
a513efb2a8cd002d78b170ca0ad58e1ab6141247b460d2d5fdf398020ef653cb  appcast-entry.json
20ec5ca3e98b0b935e783ff1e6c6375ecf41c2e9fe7535318bb73bf8309c9757  appcast.xml
2f435c736459a3d30279835038fc7e67028875be837f467c87521ea14da3a9ee  peekaboo-macos-arm64.tar.gz
0b0ef566de644b9281d817b13c1ac306e8ce75458ad9a4aa13d341eaa114893c  peekaboo-macos-universal.tar.gz
0d3aaf6f45d2980b973b213f05ad3af826968368127872e6d2d6a40057193faf  peekaboo-macos-x86_64.tar.gz
bbb73e5bb90935bf9f461bd617f214367481b8ceeda656e53017e6d7c65e6663  steipete-peekaboo-4.9.5.tgz

v4.9.4

Choose a tag to compare

@github-actions github-actions released this 16 Oct 05:41
v4.9.4
f793855

4.9.4 - 2026-10-15

Highlights: Keep Peekaboo.app's granted bridge host selected after a command auto-starts an ungranted on-demand daemon, name macOS 27's renamed "Device Control and Data Access" Settings row in permission guidance, explain unsigned source builds such as Homebrew core's peekaboo formula in Bridge and daemon trust failures, and reject non-finite coordinates and regions.

  • Keep a granted Peekaboo.app bridge host selected when an on-demand daemon started from an ungranted terminal reports missing Accessibility, Event Synthesizing or Screen Recording, instead of downgrading every caller's permissions until the daemon idles out. Thanks @joshua-koehler! #1073.
  • Show macOS 27's renamed "Device Control and Data Access" Settings row for Accessibility and Event Synthesizing, and consistently name "Screen & System Audio Recording", in peekaboo permissions, MCP permission tools, and permission errors. Thanks @fry69! #1071.
  • Explain in Bridge and daemon trust failures when the running peekaboo is an unsigned source build (such as Homebrew core's peekaboo formula) and point to the notarized openclaw/tap or npm install. Thanks @fry69! #1064.
  • Reject nan and infinite coordinates and regions in click, move, capture live, capture action, see --region and the MCP click tool instead of dispatching a non-finite point or capture rect, and ignore non-finite agent verification target points. Thanks @rudycelekli! #1074, #1075, #1076.
  • Update SwiftNIO to 2.104.0 and Service Lifecycle to 2.12.1, including its Unix signal dispatch-source leak fix, while preserving the Swift 6.2 and macOS baselines.

Verification

Run: https://github.com/openclaw/Peekaboo/actions/runs/38854053952

Verified on macos-15 (arm64), macos-15-intel (x86_64), and macos-26 (arm64).

Toolchain and notarization submissions:

{
  "schemaVersion": 1,
  "repository": "openclaw/Peekaboo",
  "tag": "v4.9.4",
  "commit": "f793855df9a35a4a697a78d26d8305d057e15c2e",
  "teamId": "FWJYW4S8P8",
  "authority": "Developer ID Application: OpenClaw Foundation (FWJYW4S8P8)",
  "toolchain": {
    "build": {
      "xcode": "Xcode 27.0\nBuild version 27A266a",
      "swift": "Apple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1)\nTarget: arm64-apple-macosx27.0.0",
      "sdk": "27.0"
    },
    "sign": {
      "xcode": "Xcode 27.0\nBuild version 27A266a",
      "swift": "Apple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1)\nTarget: arm64-apple-macosx27.0.0",
      "sdk": "27.0"
    }
  },
  "submissions": {
    "dmg": "2ee2d8b1-ddb8-4ef1-b3bc-c9235c67a6cc",
    "app": "2a14e6ff-5187-4ef3-b902-ea46afd06ff2",
    "cli": "8b9cf00f-ecf3-4e01-9351-8e203503cc73"
  },
  "buildNumber": "4090499",
  "edSignature": "gH37wy4Z1sHFiUJfJDXZu+G/rKwJuxyooC280GR6wBJAtQf6/EMdpbJ7lNsS7hTI6+moc2F9on9B3REyfGIuCg==",
  "digests": {
    "peekaboo-macos-universal.tar.gz": "cf385eb18b94c4261c28b62e1e8033d993c6fe272a4254fbaa5dcb8ddf3c26bb",
    "Peekaboo-4.9.4.app.zip": "7f2093fac76ddb369266f5cc31b71a6e804464d0e87a248f8464ea63c720676c",
    "Peekaboo-4.9.4.dmg": "2b9c1d8a958e47ef1a07d4790b35c47ccb3b52075190c071e23149a7c4071346",
    "peekaboo-macos-x86_64.tar.gz": "b43ef52695f6ee6a12ca1b2cdc5fcfb63f669a81b4e7776e39b6f08c9694d2ef",
    "peekaboo-macos-arm64.tar.gz": "a1d04316c526a5f1b933b16d284d05ff0c4b95e4f640939b1703fa36b2c461b9"
  },
  "downloaderEntitlements": {
    "bundle": "Contents/Frameworks/Sparkle.framework/Versions/B/XPCServices/Downloader.xpc",
    "entitlements": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict/>\n</plist>\n"
  }
}

Checksums:

6661b1955d2309d33fca422c37a77a6aa719fc9cb294a8e8afb0804691f5a3f8  ASSET-INVENTORY.json
7f2093fac76ddb369266f5cc31b71a6e804464d0e87a248f8464ea63c720676c  Peekaboo-4.9.4.app.zip
2b9c1d8a958e47ef1a07d4790b35c47ccb3b52075190c071e23149a7c4071346  Peekaboo-4.9.4.dmg
0bdb4d4bd393a3756134351a9b5b481939e823d8b1a441e54dfee62f5985a192  RELEASE-NOTES.md
a15415e3d4e70b11313c69650c4aadc0312301cafb49c09c5b19474de6ad7d31  SIGNING-MANIFEST.json
606364dc2deb9ee0c1758c4b42ca3befd55f3d63fe2b25382eb920b4ec29a65b  appcast-entry.json
0fe1912c644b3cc19170828fbff95e6cafe13ca94dffcb76e0e35f20de0b3668  appcast.xml
a1d04316c526a5f1b933b16d284d05ff0c4b95e4f640939b1703fa36b2c461b9  peekaboo-macos-arm64.tar.gz
cf385eb18b94c4261c28b62e1e8033d993c6fe272a4254fbaa5dcb8ddf3c26bb  peekaboo-macos-universal.tar.gz
b43ef52695f6ee6a12ca1b2cdc5fcfb63f669a81b4e7776e39b6f08c9694d2ef  peekaboo-macos-x86_64.tar.gz
a95e4e52d87bf8d769c84ab78c7aec6827556dd2e868c8344b91cd84bf536277  steipete-peekaboo-4.9.4.tgz

v4.9.3

Choose a tag to compare

@github-actions github-actions released this 14 Oct 10:34
v4.9.3
dcb8570

4.9.3 - 2026-10-14

Highlights: Give manual peekaboo daemon start the same readiness budget as automatic startup and report the real authentication or probe failure instead of a generic timeout, keep agent tool results readable when they contain backslashes or newlines, and harden the MCP wrapper's fatal-error and restart handling.

  • Use the shared 10-second readiness budget for manual daemon startup, preserve authentication and probe failure diagnostics, and honor PEEKABOO_DAEMON_SOCKET consistently across daemon commands without relaxing host trust. Thanks @fry69! #1064.
  • Prevent agent tool results from showing "Invalid JSON result" for fallback messages containing backslashes or newlines. #1068.
  • Shut down the owned MCP server and exit with status 1 after fatal wrapper errors or unhandled rejections, while retaining successful signal-driven shutdown. Thanks @rudycelekli! #1039.
  • Keep repeated MCP wrapper starts from spawning duplicate servers and validate timing options before scheduling, preserving explicit zero delays. Thanks @rudycelekli! #1020, #1021.
  • Classify cooperative and URL cancellation as CANCELLED while preserving existing standardized errors. Thanks @rudycelekli! #1042.
  • Apply error-only log filtering consistently to historical queries and live streams, including with debug verbosity, in both log helpers. Thanks @rudycelekli! #1033.
  • Preserve ordered-list start numbers, honor code-fence delimiters and lengths, and keep emphasis punctuation literal in link destinations and autolinks on the documentation site. Thanks @rudycelekli! #1029, #1028, #1030.
  • Remove unused public PeekabooFoundation symbols (TimeInterval.nanoseconds, performOperation(_:errorContext:), RecoverableError, ErrorRecoveryManager, ErrorRecoveryFailure, and InteractionTargetSelector.Policy.windowCLI); SwiftPM consumers referencing them must drop those references, while no shipped Peekaboo or OpenClaw path used them.
  • Remove unused local release helpers, appcast and tracked release-notes tooling; document hosted publication while preserving terminal/fleet archive and notarization checks.

Verification

Run: https://github.com/openclaw/Peekaboo/actions/runs/38544050540

Verified on macos-15 (arm64), macos-15-intel (x86_64), and macos-26 (arm64).

Toolchain and notarization submissions:

{
  "schemaVersion": 1,
  "repository": "openclaw/Peekaboo",
  "tag": "v4.9.3",
  "commit": "dcb8570efad33c9992241203aff71cc78c1ea376",
  "teamId": "FWJYW4S8P8",
  "authority": "Developer ID Application: OpenClaw Foundation (FWJYW4S8P8)",
  "toolchain": {
    "build": {
      "xcode": "Xcode 27.0\nBuild version 27A266a",
      "swift": "Apple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1)\nTarget: arm64-apple-macosx27.0.0",
      "sdk": "27.0"
    },
    "sign": {
      "xcode": "Xcode 27.0\nBuild version 27A266a",
      "swift": "Apple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1)\nTarget: arm64-apple-macosx27.0.0",
      "sdk": "27.0"
    }
  },
  "submissions": {
    "dmg": "f5500953-8fdf-486b-90a2-d3265ae62d20",
    "app": "45ddf7be-a611-478f-a7fc-6ef17e2c335f",
    "cli": "5b261307-8757-4908-8ed1-f4528f27b394"
  },
  "buildNumber": "4090399",
  "edSignature": "zWt0nEx2TFpOi+oQ1ZdN/Xb7HD1APw/4DoI7IRHvfvkQXr1rmVgnSXskxXvBR6gaXrlaHT1RNCRM3v4yYwF+AQ==",
  "digests": {
    "peekaboo-macos-universal.tar.gz": "ca68e62692316547d4b03035eabc32f76e07fb8291f71285d396adfce0aa2851",
    "Peekaboo-4.9.3.dmg": "a162c9e5a20727f24cc527a07e995dd6a7e17643631108de377df263b97ae1a2",
    "peekaboo-macos-x86_64.tar.gz": "05dbd80c75952c701f20b5a7f03b07732fb5911e7069cfc246cc8d32ef8f63ce",
    "peekaboo-macos-arm64.tar.gz": "730226f8302358666d58889b2b48670ce99959005d468491df6bd639b3f51907",
    "Peekaboo-4.9.3.app.zip": "24320fd1bcb8a94fcefe315bcd55d55ad9c13a3cd4729064b5b0463d53333f45"
  },
  "downloaderEntitlements": {
    "bundle": "Contents/Frameworks/Sparkle.framework/Versions/B/XPCServices/Downloader.xpc",
    "entitlements": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict/>\n</plist>\n"
  }
}

Checksums:

7dd31b95d2cf48de544e5c2e5b8466ee679c34b5e6439f388c087f9e44327421  ASSET-INVENTORY.json
24320fd1bcb8a94fcefe315bcd55d55ad9c13a3cd4729064b5b0463d53333f45  Peekaboo-4.9.3.app.zip
a162c9e5a20727f24cc527a07e995dd6a7e17643631108de377df263b97ae1a2  Peekaboo-4.9.3.dmg
c2ec182dcf85572b82106e734d08cc5aec72a5a148dd2c5605736e2a4612fcbd  RELEASE-NOTES.md
5b0760c6a9e37c247834ddaa7198e02d39c593ae19c507052c0ec2a25f0bcc97  SIGNING-MANIFEST.json
825708cc964238b17fb211ce8c3914b41ef87bfe69d39a063ea2caeb9decded9  appcast-entry.json
78f92cb01a808186c5b0bd57fad0df721c04e528802dd1a9838ca19cf9c88bf0  appcast.xml
730226f8302358666d58889b2b48670ce99959005d468491df6bd639b3f51907  peekaboo-macos-arm64.tar.gz
ca68e62692316547d4b03035eabc32f76e07fb8291f71285d396adfce0aa2851  peekaboo-macos-universal.tar.gz
05dbd80c75952c701f20b5a7f03b07732fb5911e7069cfc246cc8d32ef8f63ce  peekaboo-macos-x86_64.tar.gz
b0322e064d311a8265c48fd736ef520c1db35478f592ebeb1699087e8032be7a  steipete-peekaboo-4.9.3.tgz

v4.9.2

Choose a tag to compare

@github-actions github-actions released this 12 Oct 21:15
v4.9.2
959665e

4.9.2 - 2026-10-12

Highlights: Create CLI child-process pipes close-on-exec with Swift Subprocess 1.0.1 so they no longer leak into other children, build signed and notarized releases on GitHub Actions behind an approval gate, and keep local notarization working on congested uplinks with a parallel Notary API upload fallback.

  • Update Swift Subprocess to 1.0.1 for close-on-exec pipe handling and single-owner output-descriptor cleanup in CLI child processes, preserving the Swift 6.2 and macOS baselines.
  • Add an approval-gated GitHub Actions release path for signed and notarized universal app, DMG, CLI, npm, and Homebrew deliverables, with independent artifact verification and an appcast closeout PR.
  • Fall back to parallel Notary REST uploads for terminal-qualification notarization when API-key notarization hits a notarytool transport failure, with explicit transport selection, bounded retries, and unchanged artifact verification.

Verification

Run: https://github.com/openclaw/Peekaboo/actions/runs/38304250943

Verified on macos-15 (arm64), macos-15-intel (x86_64), and macos-26 (arm64).

Toolchain and notarization submissions:

{
  "schemaVersion": 1,
  "repository": "openclaw/Peekaboo",
  "tag": "v4.9.2",
  "commit": "959665e5f59358da5b15ddb726970d3e022efd41",
  "teamId": "FWJYW4S8P8",
  "authority": "Developer ID Application: OpenClaw Foundation (FWJYW4S8P8)",
  "toolchain": {
    "build": {
      "xcode": "Xcode 27.0\nBuild version 27A266a",
      "swift": "Apple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1)\nTarget: arm64-apple-macosx27.0.0",
      "sdk": "27.0"
    },
    "sign": {
      "xcode": "Xcode 27.0\nBuild version 27A266a",
      "swift": "Apple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1)\nTarget: arm64-apple-macosx27.0.0",
      "sdk": "27.0"
    }
  },
  "submissions": {
    "dmg": "485b935b-6df0-45bc-90f7-a6891457c11e",
    "app": "0caf939e-e36e-45b8-b517-c2c5f813a4c9",
    "cli": "592fc773-253a-472f-adf8-73ae541dac96"
  },
  "buildNumber": "4090299",
  "edSignature": "H1pvP9DbOfoAERsTSTA0J66wb2t3nUxeg93anz2elCBvNWel3rv5KQFrmk3yyLCnOz1/kOOwTHMFIGxAPHPyDQ==",
  "digests": {
    "peekaboo-macos-universal.tar.gz": "ed45d3a9b83cdc26a1cc8ef158f2b1258a6539d68ed63c8f6efb410ece0c1043",
    "Peekaboo-4.9.2.dmg": "b752f86d1b2b97321236906afb020676b92869511b790a6d5c87611e53fdbc0a",
    "peekaboo-macos-x86_64.tar.gz": "08ac8a14a146456cc08c7842a120bbd735d18174ae536b8645dc89a06abb2fec",
    "peekaboo-macos-arm64.tar.gz": "d0679fdccab7295261add8be4880a7ba0f87a8e6e1aa0fec1d21c6c98c79f448",
    "Peekaboo-4.9.2.app.zip": "4988c2a653363a67d461be3165ab64ca4ad890783e463f47b5c1bc93b171ecb1"
  },
  "downloaderEntitlements": {
    "bundle": "Contents/Frameworks/Sparkle.framework/Versions/B/XPCServices/Downloader.xpc",
    "entitlements": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict/>\n</plist>\n"
  }
}

Checksums:

841d47a120a82adfc36fc9e69f652866111989ca57b294469b1ab2f2ab27de9c  ASSET-INVENTORY.json
4988c2a653363a67d461be3165ab64ca4ad890783e463f47b5c1bc93b171ecb1  Peekaboo-4.9.2.app.zip
b752f86d1b2b97321236906afb020676b92869511b790a6d5c87611e53fdbc0a  Peekaboo-4.9.2.dmg
584a0867920376445562cc0ceab691f397b7606c952298ff946121e3ca5fffdc  RELEASE-NOTES.md
138d481ff77f468b8a28fbce02fb5f059e1851074b0e9e666d01dc2b7a0e4fd2  SIGNING-MANIFEST.json
7d6eef87658e5e4f9e6b16ffb8c539292f14df6603e12eef34543dba2f5293e4  appcast-entry.json
abbfa88464116ddf0f6b5f3da783c06404124c902927773c4e6dec8ccf5c2199  appcast.xml
d0679fdccab7295261add8be4880a7ba0f87a8e6e1aa0fec1d21c6c98c79f448  peekaboo-macos-arm64.tar.gz
ed45d3a9b83cdc26a1cc8ef158f2b1258a6539d68ed63c8f6efb410ece0c1043  peekaboo-macos-universal.tar.gz
08ac8a14a146456cc08c7842a120bbd735d18174ae536b8645dc89a06abb2fec  peekaboo-macos-x86_64.tar.gz
523bf913b80111c096519fa0c571d45321577306de5f65a571d3e90b2c56e6f0  steipete-peekaboo-4.9.2.tgz

v4.9.1

Choose a tag to compare

@steipete steipete released this 11 Oct 20:14
e060b6b

4.9.1 - 2026-10-10

Highlights: Stop idle peekaboo mcp servers from burning CPU whenever other applications launch or quit, accept renamed or symlinked CLI executables, refuse to overwrite configuration files that cannot be read, and keep capture output intact at the retention limit.

  • Stop an idle peekaboo mcp (and other window-tracking hosts) from burning CPU whenever unrelated applications launch or quit: AXorcist now indexes workspace applications by identity and stops re-reading resolved PIDs, cutting the cost from ~0.68 s to ~0.02 s of CPU per launch and quit on a Mac with ~600 running applications. Thanks @coygeek for the detailed report! #1005.
  • Accept renamed or symlinked CLI executables when routing commands, normalizing agent tasks, and classifying JSON result envelopes.
  • Refuse configuration mutations (custom provider add/remove, configuration updates) when an existing config file cannot be read, instead of overwriting it with defaults or cached data. Thanks @rudycelekli! #1007.
  • Retain capture-action child stdout/stderr when the 64 KiB retention limit splits a trailing UTF-8 scalar, instead of discarding the whole valid prefix and recording an empty stream receipt. Thanks @rudycelekli! #1006.
  • Accept signed global coordinates for foreground MCP move and drag within existing magnitude bounds, preserving target guards and before-delivery validation. Thanks @rudycelekli! #963.
  • Update AXorcist to 0.2.2 so SwiftPM consumers of Peekaboo's library products get the idle-observer CPU fix, plus collectAll request-timeout handling, complete observation subscriptions, and fast observer-removal failure reporting.
  • Update the shared Swift Log lock to 1.16.1 and Swift Configuration to 1.2.2 for corrected multiplexed log metadata and empty configuration values, preserving the supported Swift and macOS baselines.
  • Preserve documentation source text through syntax highlighting, parse CRLF metadata, render unfinished EOF fences, retain link entities/query parameters, and assign unique heading targets. Thanks @rudycelekli! #931, #939, #940, #969, #971.
  • Link the npm version page from the published GitHub release body, keeping scoped package paths literal and requiring the registry package name to match the local package before rendering.
  • Publish the Sparkle minimum macOS version as the item element Sparkle reads, migrating existing feed entries whose enclosure attribute Sparkle ignored.

Verification

Proof

Peekaboo 4.9.1 is built from the frozen source commit recorded in release-plan.json: e060b6ba21792b327ce2a10368f57c8e569dc712.

  • Release preparation: 4.9.1 publishes from release/4.9.1 (#1015), created from main at e59c220d with the driver's --release-branch mode. The branch adds chore(release): prepare Peekaboo 4.9.1. AXorcist 0.2.2 (https://github.com/openclaw/AXorcist/releases/tag/v0.2.2) was published first, with signed and notarized axorc archives and the Homebrew formula reconciled, and #1014 aligned the public Package.swift pin and the submodule on it. The SwiftPM consumer contract resolved 0.2.2 from the published tag. An independent Codex P0–P2 review of the preparation passed with no findings: all 10 root changelog entries survive verbatim with contributor credits, the release notes equal the root 4.9.1 section, the CLI section mirrors its 7 CLI-facing entries, and the highlights and README claims are supported by the entries. Version-surface, docs-lint and release-preflight contract checks, plus a deterministic prepare-release --dry-run against the freshly built CLI, passed on the branch. The publication preflight runs the complete prepare-release against the freshly built CLI. A first publication attempt from d7c9c319 stopped before any public action. Apple's notarization upload for the built CLI repeatedly aborted on a saturated uplink. Separately, that commit's supplemental release validation failed twice in the AXorcist dependency suite: the new resolved-wrapper regression asserted exact read counts that raced flushMetadata's fence snapshot on the hosted runner (99 reads). The test-only fix (openclaw/AXorcist#99) counts only already-resolved wrapper reads, and its assertions still fail with the production skip disabled. The branch picks it up in build(deps): pick up AXorcist's deterministic monitor regression, leaving the public Package.swift pin at exact 0.2.2, and was rebuilt from that head.
  • Headline fix (#1005/#1013): measured with release builds of Peekaboo main, using the issue's methodology (idle peekaboo mcp --no-remote after the MCP handshake, ~594 running applications, 60 short-lived titled processes, two interleaved rounds per build), CPU per unrelated launch and quit dropped from 0.668/0.684 s to 0.025/0.021 s. Idle CPU was unchanged.
  • Native toolchains: the universal CLI was built, signed and notarized on clawstudio (Xcode 27.2 (27B5019j), Swift 6.4 (swiftlang-6.4.0.34.1), macOS SDK 27.2, macOS 27.0.1). It was then copied byte-for-byte to megaclaw, which builds, signs and notarizes the app and DMG and runs publication from a relocated staging clone of release/4.9.1 with the pinned release helper (Xcode 27.0 (27A266a), the same Swift 6.4 compiler build, macOS SDK 27.0, macOS 27.0, Node 26.11.1, pnpm 11.28.4). The driver's --reuse-built-cli re-verifies that CLI's signature, version, source commit and Swift runtime imports before preflight.
  • Publication host relocation: on clawstudio, dozens of concurrent agent processes saturated the uplink, and Apple notarization uploads aborted for about 10 hours (single-stream uploads ran at about 47 KB/s). The CLI was notarized through Apple's Notary REST API with a parallel S3 upload (submission f9b5f55d-b09d-4fc6-b47c-db7d7e1b076b, Accepted), and the remaining uploads moved to megaclaw. Relaunches on clawstudio stopped before any public action; some also hit load-sensitive preflight tests, which are being hardened separately. The release source is unchanged.
  • The publication driver runs the complete native preflight on the frozen source before packaging, then builds, signs, and notarizes the universal CLI, app, and DMG.
  • npm publication runs through the Publish npm release tarball workflow, the registered npm trusted publisher for @steipete/peekaboo. It publishes the exact tarball uploaded to this release, after checking it against checksums.txt and its embedded name and version, with signed provenance. The driver's resume then verifies registry integrity against the retained tarball.

Older-runtime qualification

  • The driver's Swift runtime import audit verifies every CLI slice against the macOS 26.5 SDK runtime baseline (minimum macOS 15.0). It rejects unsupported strong runtime imports, including _swift_initBorrow, before packaging.
  • Before publication is confirmed, the packaged arm64, x86_64, and universal archives are independently audited against the same SDK's Swift runtime export lists (following re-exports), then launched with all Xcode, Command Line Tools, and cryptex toolchain paths denied.

Exact-source hosted validation

Coverage limits: no physical macOS 26 or macOS 15 machine ran the 4.9.1 bytes. SwiftLint reports existing non-serious violations; the hosted SwiftLint gate passes. The renamed-executable fix was proven with a copied binary and a real pb symlink running --version and see --help only, with no capture or input. Window tracking for newly launched applications is covered by AXorcist's monitor tests rather than live desktop proof.

Publication source: e060b6ba21792b327ce2a10368f57c8e569dc712. Publication requires successful completion of the linked exact-source workflows.

v4.9.0

Choose a tag to compare

@steipete steipete released this 07 Oct 14:47
7020aed

4.9.0 - 2026-10-06

Highlights: Add exact app- and PID-scoped menu-bar extra clicks, keep foreground file dialogs bound to their parent window, tailor Agent guidance to the acquired tool catalog, show visualizer overlays from a hidden companion app, restore clipboard slots faithfully across processes, and harden release archive and artifact validation.

  • Add exact app/PID-scoped menu-extra clicks with bounded AX owner preparation and revalidation, preserving displayed-CG names and indices without scanning unrelated applications. Thanks @buremba! #953.
  • Keep targeted foreground file-dialog focus, navigation, and result receipts under one parent-window owner; negotiate exact execution with Bridge hosts and scope document reads to that parent without losing file-on-disk verification when Save closes it.
  • Fix application-targeted file sheets losing their parent-window identity; preserve compatible panels and ignore unrelated alerts when selecting a unique file panel. Thanks @buremba! #951.
  • Recognize native file-panel identifiers and reuse fresh classification evidence to avoid redundant button scans; batch strict dialog AX reads without truncating hierarchy discovery.
  • Recognize equivalent saved-file paths such as /tmp and /private/tmp in dialog diagnostics, preserving reported paths and directory-only enforcement.
  • Tailor Agent and learn guidance to the available tool catalog, removing irrelevant recipes while preserving execution authority, observation requirements and session history.
  • Show eligible visualizer overlays from a hidden companion app without unhiding or activating it, accepting input, or changing background-input suppression.
  • Avoid redundant PNG encoding for unchanged live capture frames, preserving original bytes and metadata while retaining transformed-frame encoding, actual-byte caps, and artifact validation.
  • Restore clipboard slots from the current persisted contents instead of a stale per-process cache, and keep multi-item clipboards' item order and boundaries through save and restore. Thanks @rudycelekli! #990.
  • Update AXorcist to 0.2.1 to unwrap live Accessibility values and clear inherited typing and final hotkey modifier flags. Thanks @jandubois! #797.
  • Prepare the final-qualification launcher's atomic receipt publisher before spawning the suspended coordinator, so loaded release Macs no longer spend the identity-acknowledgement window compiling Swift; each use still re-verifies the exact executable, and the exit receipt keeps a fresh build.
  • Reject negative SDK automation waits before preparation or earlier input, and keep large positive waits safely cancellable without integer overflow. Thanks @rudycelekli! #973.
  • Preserve literal environment values inside configuration JSON strings and omit expanded documents from decode warnings; retain numeric substitutions and credential references. Thanks @rudycelekli! #972.
  • Reject non-ASCII tar size/checksum text and PAX record lengths/keys before decoding can disguise malformed bytes, preserving binary tar numbers and UTF-8 values. Thanks @rudycelekli! #966.
  • Retain failed browser connection attempts across ordinary provider tools and invalidate cached verification after socket loss, preventing implicit reconnects and stale success. Thanks @rudycelekli! #949.
  • Honor cancellation and connection deadlines during browser application-metadata reads; reconcile failures without repeating a blocked lookup, retaining connected or uncertain provider ownership. Thanks @rudycelekli! #950.
  • Preserve literal log-helper search and filter text without shell re-parsing, including quotes, backslashes and trailing newlines; retain output, streaming and private-mode arguments. Thanks @rudycelekli! #934.
  • Reject missing log-helper option values promptly with a targeted usage error instead of looping indefinitely, before any log access; match native log severity for historical error-only queries. Thanks @rudycelekli! #938.
  • Preserve conventional shell exit statuses when a wrapped source-build command is terminated by a signal, while retaining mapping integrity checks and lock cleanup. Thanks @rudycelekli! #932.
  • Reject malformed or overflowing release versions before computing build numbers, preserving stable versions and supported alpha/beta/rc aliases instead of allowing extra identifiers to alias a different build. Thanks @rudycelekli! #936.
  • Require explicit npm error codes when detecting unpublished versions; server/authentication failures and contradictory responses no longer become absence merely because a diagnostic contains E404. Thanks @rudycelekli! #965.
  • Reject symlinked or nonregular controller sources and catalogs when producing source receipts, while preserving regular executable files and frozen-commit receipts. Thanks @rudycelekli! #957.
  • Bound ZIP data descriptors before allocating or reading their untrusted gap, preserving valid descriptor checks while avoiding malformed-archive memory amplification. Thanks @rudycelekli! #967.
  • Resolve composed symlink targets before accepting artifact trees and archives, refusing root escapes and native-unreadable chains beyond 32 traversals while preserving contained framework and dangling links. Thanks @rudycelekli! #954.
  • Reject archive entries nested beneath regular files as well as symlinks, independent of entry order, before extraction. Thanks @rudycelekli! #955.
  • Fix the Playground log wrapper's moved script path and clarify repository-root examples, preserving arguments and exit status. Thanks @rudycelekli! #933.
  • Fix signed Bridge typing receipts after already-empty clears and already-satisfied caret moves, preserving zero-dispatch no-ops and strict key, delivery and dispatch-count validation.
  • Preserve accepted dispatch evidence and retry-unsafe status after unchanged readback instead of reporting a no-dispatch no-op or a safe retry; positively observed changes still confirm the action. Thanks @rudycelekli! #942.
  • Preserve recorded response-loss evidence when action sequences or quit batches are cancelled, retaining indeterminate outcomes and unsafe retry guidance. Thanks @rudycelekli! #943.
  • Share literal-replacement eligibility between native typing and Bridge validation without changing confirmation policy, and clarify that typing counts represent keystrokes and accepted typing units rather than raw event or Accessibility setter calls.
  • Accept equivalent PID aliases consistently in read-only window listing and target resolution, while retaining conflicting-PID errors and strict single-selector mutation gates. Thanks @rudycelekli! #945.
  • Clarify type --clear help and generated learning guidance to distinguish eligible native Accessibility clearing from keyboard routes, without changing delivery, targeting, or success rules.
  • Format complete keyboard shortcut names without rewriting substrings, distinguish forward and backward delete aliases in compatibility summaries, and reuse the immutable symbol table. Thanks @rudycelekli! #962.
  • Preserve fractional timeout durations in command and dialog diagnostics instead of truncating them to whole seconds, without changing deadlines or error codes. Thanks @rudycelekli! #946.
  • Preserve pending native-operation evidence when combining action receipts, without downgrading it to accepted delivery or weakening response-loss and retry-safety semantics. Thanks @rudycelekli! #944.
  • Escape update-feed URLs and metadata as XML while preserving decoded values and literal replacement characters, including multi-parameter URLs. Thanks @rudycelekli! #935.
  • Validate Swift compatibility-library loader paths and required library architectures per executable slice, so another architecture cannot hide a missing path. Thanks @rudycelekli! #937.
  • Reject ZIP entries with unconsumed trailing DEFLATE bytes before extraction, even when their inflated size and CRC match. Thanks @rudycelekli! #956.
  • Distinguish missing blank title-bar space from changed retained geometry in background paste preparation diagnostics, without relaxing clearance or input guards.
  • Keep CLI and MCP action summaries explicit about unverified or unreported receiver effects, and report paste clipboard cleanup separately without changing canonical outcomes, JSON, retry rules, or exit status.
  • Strip terminal control scalars from agent/task titles before both VibeTunnel and ANSI output, preserving Unicode joiners and preventing embedded title text from injecting terminal commands. Thanks @rudycelekli! #964.
  • Avoid agent-summary crashes on unrepresentable numeric metadata, preserve each consumer's rounding and lookup rules, and report unusable shell exit codes as unavailable rather than success. Thanks @rudycelekli! #961.
  • Preserve apostrophes and escaped characters in JSON documentation reading hints, retaining the legacy single-quoted fallback and malformed-input diagnostics. Thanks @rudycelekli! #941.
  • Explain evaluated Bridge host requirements when see --fresh cannot obtain authenticated producer-bound snapshots, instead of incorrectly claiming fresh AX is unsupported or a binary update is sufficient; preserve host selection, trust, and error codes.
  • Correct the visualizer log helper's receiver subsystem and include info/debug output while preserving explicit predicates, without changing logging settings or rendering behavior.
  • Preserve failed log-query exit statuses through tail-limited terminal and file output instead of reporting success from the downstream pipeline. Thanks @rudycelekli! #959.
  • Preserve complete JSON log output and forward live events without waiting for stream completion; retain line limits for completed text queries. Thanks @rudycelekli! #958.
  • Bound npm MCP wrapper shutdown: cancel pending restarts, allow five seconds for the owned server to exit after SIGTERM, then terminate that same child if necessary. Thanks @rudycelekli! #947.
  • Keep MCP wrapper imports free of server-start side effects for eval, print and stdin cons...
Read more

v4.8.0

Choose a tag to compare

@steipete steipete released this 04 Oct 22:59
4d43dc9

4.8.0 - 2026-10-03

Highlights: Add exact-window background drag, text selection, and coordinate scrolling to the CLI and MCP, make background rich paste work in freshly launched windows and fence it against concurrent clipboard changes, extend background scrolling to Safari, add opt-in fresh Accessibility reads to see, and recover capture readiness after slow startup checks.

  • Add bounded exact-window background drag to CLI and MCP using one held-pointer owner, generation-bound last-point cleanup, and protocol-1.39 receipts; preserve explicit foreground gestures and report unverified retry-unsafe delivery without claiming the drop succeeded.
  • Report missing background-drag source and destination IDs as explicit retry-safe, zero-dispatch ELEMENT_NOT_FOUND refusals without inventing receiver receipts or changing foreground error semantics.
  • Preserve captured focused-element evidence in signed background-drag target attribution, avoiding false receipt failures while retaining unverified delivery and retry-unsafe outcomes.
  • Prepare exact standard background windows for temporary rich/binary paste using observed blank chrome and retained editor state, preserving clipboard ownership, foreground isolation, owed releases, and truthful composite receipts through Bridge protocol 1.41. #877.
  • Fence temporary exact-window background paste with the retained clipboard write generation, refusing unsupported hosts before writing and stopping new key-downs after another copy while preserving owed key releases and newer clipboard contents.
  • Report failed background rich-paste preparation observations as no-input refusals, preserving earlier clipboard/preparation effects and avoiding misleading claims that a focus request was sent.
  • Add explicit --allow-temporary-clipboard authority for Agent and public MCP to paste bounded base64 payloads through fresh exact-window snapshots while keeping UI background-only, requiring fresh resume opt-in, preserving ownership-aware cleanup and retry-unsafe receipts, and retaining nested/managed Agent attenuation.
  • Preserve input-delivery and message-only refusal causes across composed background preparation outcomes, including content-free native chrome observation diagnostics, without changing dispatch or retry safety.
  • Preserve the underlying cause of failed background paste preparation reads, without changing input dispatch, deadlines, or retry safety.
  • Add background select-text / MCP select_text for literal, context-disambiguated selections and caret placement, including unfocused native fields, with UTF-16 source-drift checks, unchanged-text verification, and protocol-1.42 receipts without keyboard or clipboard fallback.
  • Add exact-window background coordinate scrolling via CLI --at / --global and MCP coords, preferring the nearest proven AX scroll owner and allowing pixel-authorized native-WebKit wheel delivery without an exposed owner, preserving the requested point and retry-unsafe receipts, and refusing older hosts through protocol 1.43.
  • Recognize Safari's framework-linked executable and scroll-area containers for eligible exact-window background wheel dispatch, preserving hidden-app exclusions, exact receipt checks, and unverified retry-unsafe outcomes.
  • Add opt-in see --fresh and MCP see / inspect_ui freshness with uncached AX evidence, truthful used_cache metadata, and fail-closed host compatibility while preserving default caching and partial-tree limits.
  • Preserve native Accessibility date values as ISO-8601 UTC timestamps in UI observations instead of silently omitting them, including Calendar's date-valued controls.
  • Recover ScreenCaptureKit readiness when a slow startup safety scan later completes, preserving fail-closed capture while pending or failed and the existing per-capture ownership checks.
  • Validate Bridge Agent and live certification-producer executables against the running universal-binary slice, avoiding false identity refusals while preserving exact code, path, process-generation, file, and peer-trust checks.
  • Redact inline base64 payloads from Agent live tool-call previews, including nested and partially streamed values, without changing authorized tool input.
  • Remove proven duplicate see / inspect_ui element listings from Agent provider requests while preserving observation evidence, raw MCP/CLI output, and saved history.
  • Preserve known clipboard cleanup status through Agent paste errors and public MCP metadata, keeping provider claims isolated and canonical dispatch, target, and retry semantics unchanged.
  • Preserve plain and attributed Accessibility value labels in menu listing, path selection, and menu-extra matching, keeping title precedence and ambiguous-name refusals unchanged.
  • Preserve a native text field's coherently observed post-value selection for the dependent caret update, while refusing later state or focus drift without rebasing or replay and retaining nested typing failure diagnostics.
  • Preserve retry-safe no-dispatch outcomes for background wheel failures before the first event, including stale or out-of-window geometry, without weakening accepted-prefix or uncertain-delivery failures.
  • Preserve unsupported background scrolls as exact-target, retry-safe no-dispatch refusals through Bridge instead of reporting a possible mutation or implying all background scroll is Accessibility-only.
  • Preserve reported receiver receipts in MCP background scroll errors without changing retry safety, snapshot invalidation, or foreground global-input attribution.
  • Preserve reported process-generation and exact-window receipts in CLI and MCP paste errors after unconfirmed targeted input, without changing retry safety or attributing shared clipboard effects to a window.
  • Report conflicting concrete snapshot and target selectors in set-value and action as retry-safe, non-dispatched INVALID_INPUT refusals instead of unknown, unverifiable errors; clarify the targeting alternatives.
  • Preserve Bridge route, reported target receipts, hints, and causes on typed stale-snapshot CLI refusals instead of replacing them with local errors; keep snapshot-consumption and finalization safeguards unchanged.
  • Keep app-launch bundle paths and selector proofs consistent across canonical spellings, fixing background verification under /private/tmp while preserving process-generation, ambiguity, and caller-local alias checks.
  • Fix Bridge verification when macOS hides the caller's window title, preserving exact process/window identity, fresh Accessibility reads, and strict signed-receipt validation.
  • Distinguish unreadable exact-window focus evidence from actual window mismatches, retaining the AX observation stage and native error without changing background input guards or retry safety.
  • Reuse normalized Agent tool-result claims when building execution traces, eliminating duplicate canonical validation while preserving failure, dispatch, and redaction semantics.
  • Clarify that see pixels and Accessibility metadata are not acquired atomically, and explain how to verify an asynchronous action without replaying it.
  • Explain when listed windows are rejected by coordinate-target eligibility without exposing their titles or changing the filters, and preserve already-completed setup focus plus the later refusal diagnostic in cursor-move errors. #869.
  • Explain that exact-window paste capability refusals can result from custom-socket Bridge trust limits, not only an outdated host, without changing trust or retry behavior.
  • Clarify that deprecated app launch --no-focus is a compatibility no-op: default launch only verifies an already-running app, while cold launch still requires explicit foreground consent.
  • Clarify that foreground paste does not confirm receiver consumption, explain how to inspect an unconfirmed paste outcome instead of replaying it, and add a charset-safe HTML hyperlink paste example. Thanks @marcoantoniofassa! #885.
  • Clarify backward versus forward Delete key names and supported Command modifiers in press help and docs, without changing key mappings.
  • Refresh Playground testing guidance for v4 inventories, signed fixtures, fresh exact-window snapshots, and background outcome verification without input replay.
  • Bind companion-app installation and rollback quits to verified exact-path process generations, refusing ambiguous targets, inspection failures, and uncertain retries without raw PID signals. #874.
  • Bound ScreenCaptureKit process-safety signing inspections to two concurrent workers across censuses, preserving complete blocker collection, identity checks, registration retries, and fail-closed readiness.
  • Sign debug CLI builds with the canonical Peekaboo CLI identifier so they satisfy existing GUI Bridge and deployment healthcheck identity checks.
  • Repair first-party GUI qualification by admitting the signed controller and validating canonical global/window receipt scopes; preserve exact authenticated inventory binding and avoid repeating an acknowledged owner disconnect after an evidence error.
  • Remove idle certification-coordinator exit delays by clearing completed child-wait timers and their listeners, preserving normal output draining and bounded TERM/KILL cleanup.

Compatibility

  • Exact-window background drag requires a GUI Bridge host at protocol 1.39, exact-window background rich/binary paste requires the clipboard-fenced protocol 1.40 path (cold-window preparation uses 1.41), background text selection requires protocol 1.42, and exact-window background coordinate scrolling requires protocol 1.43. Screenshot-backed see --fresh through a Bridge host requires its fresh Accessibility tree capability. With an older Peekaboo app as the Bridge host, these fail closed before any clipboard write or input; update the app together with the CLI.

Verification

  • Source commit: 4d43dc9d80cd2aa3787a27f54b76d692db1dcf8f
  • Release plan SHA-256: `e70a17b5d8af944a0da809e481a...
Read more