{"id":48698601,"url":"https://github.com/erha19/ping-island","last_synced_at":"2026-05-16T07:25:21.871Z","repository":{"id":349989943,"uuid":"1200530675","full_name":"erha19/ping-island","owner":"erha19","description":"A macOS menu bar (Vibe Island liked ) app that monitors AI coding sessions in a Dynamic Island-style surface — approve, respond, and jump back to the right window, all from the notch. 一款 macOS 菜单栏应用，以灵动岛风格集中监控多个 AI 编程助手的会话，支持审批、追问和窗口跳转","archived":false,"fork":false,"pushed_at":"2026-05-01T17:09:31.000Z","size":274444,"stargazers_count":381,"open_issues_count":15,"forks_count":44,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-01T19:13:31.694Z","etag":null,"topics":["agents","island","vibe-coding","vibe-island"],"latest_commit_sha":null,"homepage":"https://erha19.github.io/ping-island","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/erha19.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-04-03T14:22:16.000Z","updated_at":"2026-05-01T14:50:08.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/erha19/ping-island","commit_stats":null,"previous_names":["erha19/ping-island"],"tags_count":26,"template":false,"template_full_name":null,"purl":"pkg:github/erha19/ping-island","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erha19%2Fping-island","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erha19%2Fping-island/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erha19%2Fping-island/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erha19%2Fping-island/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/erha19","download_url":"https://codeload.github.com/erha19/ping-island/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erha19%2Fping-island/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32528665,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-02T01:12:54.858Z","status":"online","status_checked_at":"2026-05-02T02:00:05.923Z","response_time":132,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agents","island","vibe-coding","vibe-island"],"created_at":"2026-04-11T09:07:48.595Z","updated_at":"2026-05-16T07:25:21.864Z","avatar_url":"https://github.com/erha19.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003cimg src=\"docs/images/ping-island-icon.svg\" width=\"64\" height=\"64\" alt=\"Ping Island app icon\" valign=\"middle\"\u003e\u0026nbsp;\n  Ping Island\n\u003c/h1\u003e\n\u003cp align=\"center\"\u003e\n  \u003cb\u003eAI coding session monitor for the macOS menu bar\u003c/b\u003e\u003cbr\u003e\n  \u003ca href=\"https://erha19.github.io/\"\u003eWebsite\u003c/a\u003e •\n  \u003ca href=\"#installation\"\u003eInstall\u003c/a\u003e •\n  \u003ca href=\"#features\"\u003eFeatures\u003c/a\u003e •\n  \u003ca href=\"#buddy-detach\"\u003eBuddy Detach\u003c/a\u003e •\n  \u003ca href=\"#supported-tools\"\u003eSupported Tools\u003c/a\u003e •\n  \u003ca href=\"#build-from-source\"\u003eBuild\u003c/a\u003e •\n  \u003ca href=\"#contributors\"\u003eContributors\u003c/a\u003e •\n  \u003ca href=\"docs/privacy-policy.md\"\u003ePrivacy\u003c/a\u003e\u003cbr\u003e\n  English | \u003ca href=\"README.zh-CN.md\"\u003e简体中文\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/erha19/ping-island/releases\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/v/release/erha19/ping-island?display_name=tag\u0026style=flat-square\" alt=\"Latest release\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/erha19/ping-island/releases\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/downloads/erha19/ping-island/total?style=flat-square\" alt=\"Release downloads\"\u003e\n  \u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/macOS-14%2B-0A84FF?style=flat-square\u0026logo=apple\u0026logoColor=white\" alt=\"macOS 14 or later\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Swift-6.1-FA7343?style=flat-square\u0026logo=swift\u0026logoColor=white\" alt=\"Swift 6.1\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Clients-12%2B-111827?style=flat-square\" alt=\"Supports 12 plus client families\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/License-Apache%202.0-4F46E5?style=flat-square\" alt=\"Apache 2.0 license\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/images/notch-panel.png\" width=\"480\" alt=\"Ping Island preview\"\u003e\n\u003c/p\u003e\n\n\n\u003cp align=\"center\"\u003e\n  \u003csub\u003eWatch active coding sessions, answer follow-up questions, and jump back to the right terminal or IDE window.\u003c/sub\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003csub\u003eOfficial website: \u003ca href=\"https://erha19.github.io/ping-island/\"\u003eerha19.github.io/ping-island\u003c/a\u003e\u003c/sub\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/images/mascots/claude.gif\" width=\"36\" alt=\"Claude mascot\" title=\"Claude Code\"\u003e\u0026nbsp;\n  \u003cimg src=\"docs/images/mascots/codex.gif\" width=\"36\" alt=\"Codex mascot\" title=\"Codex\"\u003e\u0026nbsp;\n  \u003cimg src=\"docs/images/mascots/gemini.gif\" width=\"36\" alt=\"Gemini CLI mascot\" title=\"Gemini CLI\"\u003e\u0026nbsp;\n  \u003cimg src=\"docs/images/mascots/hermes.gif\" width=\"36\" alt=\"Hermes Agent mascot\" title=\"Hermes Agent\"\u003e\u0026nbsp;\n  \u003cimg src=\"docs/images/mascots/qwen.gif\" width=\"36\" alt=\"Qwen Code mascot\" title=\"Qwen Code\"\u003e\u0026nbsp;\n  \u003cimg src=\"docs/images/mascots/kimi.gif\" width=\"36\" alt=\"Kimi CLI mascot\" title=\"Kimi CLI\"\u003e\u0026nbsp;\n  \u003cimg src=\"docs/images/mascots/openclaw.gif\" width=\"36\" alt=\"OpenClaw mascot\" title=\"OpenClaw\"\u003e\u0026nbsp;\n  \u003cimg src=\"docs/images/mascots/opencode.gif\" width=\"36\" alt=\"OpenCode mascot\" title=\"OpenCode\"\u003e\u0026nbsp;\n  \u003cimg src=\"docs/images/mascots/cursor.gif\" width=\"36\" alt=\"Cursor mascot\" title=\"Cursor\"\u003e\u0026nbsp;\n  \u003cimg src=\"docs/images/mascots/qoder.gif\" width=\"36\" alt=\"Qoder mascot\" title=\"Qoder\"\u003e\u0026nbsp;\n  \u003cimg src=\"docs/images/mascots/codebuddy.gif\" width=\"36\" alt=\"CodeBuddy mascot\" title=\"CodeBuddy\"\u003e\u0026nbsp;\n  \u003cimg src=\"docs/images/mascots/copilot.gif\" width=\"36\" alt=\"GitHub Copilot mascot\" title=\"GitHub Copilot\"\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003csub\u003eClaude Code · Codex · Gemini CLI · Hermes Agent · Qwen Code · Kimi CLI · OpenClaw · OpenCode · Cursor · Qoder · CodeBuddy · GitHub Copilot\u003c/sub\u003e\n\u003c/p\u003e\n\n\u003ca id=\"buddy-detach\"\u003e\u003c/a\u003e\n## Buddy Detach in v0.5.0+\n\nStarting in `v0.5.0` - the first release after `v0.4.0` - Ping Island can detach the active Buddy from the notch. Press and hold the notch, drag the Buddy upward out of the notch area, and it becomes an independent floating companion that stays with you across other windows.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/images/ping-island-0.5.0-buddy-detach.png\" width=\"960\" alt=\"Ping Island v0.5.0 Buddy detach poster\"\u003e\n\u003c/p\u003e\n\n- **Three-step interaction** - press and hold, drag outward, then let go to keep the Buddy floating.\n- **Independent floating presence** - keep session awareness visible even when you are no longer watching the top notch.\n- **Free placement with low disruption** - move the Buddy where it helps without pinning it to the menu bar.\n- **Same Island context** - the floating Buddy still represents the same live session, mascot identity, and progress cues.\n\n## What is Ping Island?\n\nPing Island is a macOS menu bar app that expands into a compact session surface when your coding agents need attention. It listens to Claude-style hooks, Codex hooks, Gemini CLI hooks, Hermes Agent plugin hooks, Qwen Code hooks, Kimi CLI hooks, OpenClaw internal hooks plus session transcripts, the Codex app-server, OpenCode plugins, and compatible IDE integrations so approvals, input requests, completions, and session summaries show up without babysitting terminal tabs.\n\nIf you have seen [Vibe Island](https://vibeisland.app/), Ping Island is positioned as an independent open-source alternative in the same category: a native macOS notch/menu bar surface for monitoring and controlling AI coding sessions.\n\n## Features\n\nPing Island focuses on the moments that actually interrupt coding flow, then keeps them visible and actionable from a native macOS notch surface.\n\n- **Attention-first UI** - Stay compact until a session needs approval, input, review, or intervention.\n- **Act from the notch** - Approve tools, deny requests, and answer follow-up prompts without hunting through tabs.\n- **Claude Code auto-approve** - Turn on per-session auto-approval when you want Claude Code to stop pausing on every permission request.\n- **One-click return** - Jump back to the right iTerm2, Ghostty, Terminal.app, tmux pane, or IDE window.\n- **SSH terminal support** - Bootstrap a remote PingIslandBridge over SSH, rewrite the remote Claude-compatible hooks to point back at your Mac, and keep remote terminal activity visible in the same local Island UI.\n- **Multi-agent coverage** - Track Claude Code, Codex, Gemini CLI, Hermes Agent, Qwen Code, Kimi CLI, OpenClaw, OpenCode, Cursor, Qoder, CodeBuddy, WorkBuddy, GitHub Copilot, and other compatible sessions in one place.\n- **OpenClaw gateway support** - Follow OpenClaw sessions from managed internal hooks, then refill the conversation from OpenClaw's local session transcripts so the Island UI can show the actual back-and-forth instead of a single inbound message.\n- **Codex hook + app-server sync** - Support Codex CLI hooks, live app-server threads, and rollout parsing fallback when needed.\n- **Custom sounds** - Pick per-event macOS sounds or import local sound packs for your own notification style.\n- **Custom agent mascots** - Give each client its own animated mascot override across the notch, session list, and hover UI.\n- **Buddy detach in v0.5.0+** - Drag the active Buddy out of the notch so it can stay nearby as an independent floating companion.\n- **Hermes courier-fox mascot** - Hermes Agent uses a gold courier fox with a winged helmet and satchel so plugin-hook sessions stay visually distinct from the Claude/Qwen family.\n- **Qwen capybara mascot** - Qwen Code now ships with a mint-scarf capybara mascot tuned for prompt, reply, and notification-heavy flows.\n- **Kimi keyboard-orb mascot** - Kimi CLI keeps its original blue keyboard-orb mascot so its hook sessions stay visually distinct in the README strip and app UI.\n\n\u003ca id=\"supported-tools\"\u003e\u003c/a\u003e\n## Supported Tools\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/images/ping-island-mascot-poster.png\" width=\"960\" alt=\"Ping Island supported tools poster\"\u003e\n\u003c/p\u003e\n\nPing Island also ships VS Code-compatible focus extensions for VS Code, Cursor, CodeBuddy, WorkBuddy, and Qoder. `QoderWork` is hook-only today and does not participate in the IDE extension path.\n\nQoder IDE and Qoder CLI both store hooks in `~/.qoder/settings.json`, but Ping Island treats them as separate managed integrations because their hook behavior is not identical. On launch, Ping Island checks `qodercli -v`; when the local CLI is newer than 0.2.5, it refreshes only the Qoder CLI managed entries while preserving Qoder IDE hooks and unrelated JSON settings. New Qoder CLI follows Claude Code-compatible blocking hooks and response payloads, while Qoder IDE and `QoderWork` stay notify-only so Ping Island does not submit answers or approvals back into those clients.\n\nCodeBuddy IDE and CodeBuddy CLI both use `~/.codebuddy/settings.json`, but Ping Island manages them as separate hook profiles. The CodeBuddy CLI profile writes its own `codebuddy-cli` hooks, uses the CLI's Claude-compatible hook response shape, and preserves CodeBuddy IDE hooks plus unrelated settings in the same file.\n\nHermes Agent is integrated through a generated plugin directory at `~/.hermes/plugins/ping_island/`. Hermes' gateway hook directories under `~/.hermes/hooks/` do not run in the CLI, so Ping Island uses the official `ctx.register_hook()` plugin surface to observe prompt submission, tool activity, model replies, and session end events.\n\nQwen Code is supported as a first-class hook client through `~/.qwen/settings.json`, and its built-in mascot is the mint-scarf capybara shown in the README GIF strip. The visual is meant to feel calm and dependable, while still carrying a small Qwen-tinted scarf and reply bubble instead of another generic bird or blob.\n\nKimi CLI is supported through its official hooks in `~/.kimi/config.toml`. Ping Island installs managed `[[hooks]]` entries while preserving unrelated TOML configuration, treats Kimi `Stop` as an assistant-turn completion rather than a closed session, and waits for `SessionEnd` before marking the session ended. Its built-in mascot is the original blue keyboard-orb GIF shown above.\n\nOpenClaw is supported through a managed internal hook directory under `~/.openclaw/hooks/` plus transcript-aware session refresh from `~/.openclaw/agents/main/sessions/`. That combination lets Ping Island surface OpenClaw's lightweight message hooks quickly, then backfill the full conversation from the local session log once the assistant reply lands.\n\nSSH support is a core workflow, not a sidecar script. Ping Island can bootstrap a bridge onto a remote macOS or Linux host, rewrite remote Claude-compatible and Qwen Code hook configs to use that bridge, install supported OpenClaw internal hooks on the remote host, and keep a bidirectional forwarding path back into the local menu-bar UI. That means approvals, follow-up questions, notifications, and jump-back routing from remote SSH terminals still land in the same Island surface on your Mac.\n\nThe mascot GIFs used throughout this README are generated from the live `MascotView` implementation via `./scripts/render-mascots.sh`.\nThe OpenClaw feature poster in `docs/images/ping-island-openclaw-poster.png` is generated via `./scripts/render-openclaw-poster.sh`.\n\n\u003ca id=\"installation\"\u003e\u003c/a\u003e\n## Installation\n\n### Install with Homebrew Cask\n\n```bash\nbrew tap erha19/tap\nbrew install --cask ping-island\n```\n\n### Download a Release\n\n1. Visit the [official website](https://erha19.github.io/ping-island/) for the product overview and latest download link, or go straight to [Releases](https://github.com/erha19/ping-island/releases).\n2. Download the latest DMG.\n3. Move `Ping Island.app` into your Applications folder.\n4. Launch the app and start the clients you want Ping Island to monitor.\n\n\u003e On first launch, macOS may ask you to confirm the app or grant Accessibility / Apple Events permissions for focus features.\n\n\u003ca id=\"build-from-source\"\u003e\u003c/a\u003e\n### Build from Source\n\nRequires macOS 14+ and an Xcode toolchain that can build the Xcode project and the Swift 6.1 `Prototype` package tests.\n\n```bash\ngit clone https://github.com/erha19/ping-island.git\ncd ping-island\n\n# Debug build\nxcodebuild -project PingIsland.xcodeproj -scheme PingIsland -configuration Debug build\n\n# Release build\nxcodebuild -project PingIsland.xcodeproj -scheme PingIsland -configuration Release build\n```\n\nTo create a locally shareable unsigned package for local testing:\n\n```bash\n./scripts/package-unsigned.sh\n```\n\nThe script re-signs the built app bundle with a consistent ad-hoc signature before creating the `.dmg` and `.zip`, which helps embedded frameworks launch more reliably on another machine. The package is still unsigned for distribution and not notarized, so first launch may still require `Open` from Finder's context menu or manual quarantine removal.\nThe generated files land in `releases/unsigned/` as `PingIsland-\u003cversion\u003e.dmg` and `PingIsland-\u003cversion\u003e.zip`.\nThe DMG uses the repo-tracked installer artwork at `docs/images/ping-island-dmg-installer-background.png` by default; set `PING_ISLAND_DMG_BACKGROUND_SOURCE` if you want to preview a different background locally.\n\nTo create signed and notarized release packages in GitHub Actions, configure the release secrets described in [docs/sparkle-release.md](docs/sparkle-release.md) and run `.github/workflows/release-packages.yml` against a `v*` tag or the manual workflow dispatch input. Homebrew Cask publishing is documented in [docs/homebrew-cask-release.md](docs/homebrew-cask-release.md).\n\nThe same workflow also publishes a Linux `PingIslandBridge` asset that Ping Island can download when bootstrapping Linux SSH hosts.\n\nFor the full notarized release flow and the GitHub Releases backed Sparkle appcast setup, see [docs/sparkle-release.md](docs/sparkle-release.md).\n\n## Testing\n\nThe fastest full-repo regression path is:\n\n```bash\n./scripts/test.sh\n```\n\nThat covers:\n\n```bash\nswift test --package-path Prototype\nxcodebuild -project PingIsland.xcodeproj -scheme PingIsland -configuration Debug CODE_SIGNING_ALLOWED=NO test -only-testing:PingIslandTests\nxcodebuild -project PingIsland.xcodeproj -scheme PingIsland -configuration Debug CODE_SIGN_IDENTITY=- test\n```\n\nUseful targeted slices:\n\n```bash\nswift test --package-path Prototype --filter IslandBridgeE2ETests\nxcodebuild -project PingIsland.xcodeproj -scheme PingIsland -configuration Debug CODE_SIGNING_ALLOWED=NO test -only-testing:PingIslandTests\nxcodebuild -project PingIsland.xcodeproj -scheme PingIsland -configuration Debug CODE_SIGN_IDENTITY=- test -only-testing:PingIslandUITests\n```\n\nIf `PingIslandUITests-Runner` stays suspended on macOS, run the UI tests from Xcode with a valid local signing identity and check `amfid` / `AppleSystemPolicy` logs before treating it as an app regression.\n\n## Settings\n\nPing Island currently ships a 4-category settings panel:\n\n- **General** - launch at login and baseline app behavior\n- **Display** - notch display target and placement behavior\n- **Mascot** - client mascot previews, per-client overrides, animation states\n- **Sound** - event-specific sounds, sound pack mode, sound pack import\n\n## Custom Sounds\n\nPing Island currently supports three sound modes under `Settings -\u003e Sound`:\n\n- **System sounds** - choose a macOS sound for each event.\n- **Built-in 8-bit** - use Island's bundled retro sound set, including the fixed client startup sound.\n- **Sound pack** - load a local OpenPeon / CESP-compatible pack from disk.\n\n### Quick setup\n\n1. Open `Settings -\u003e Sound`.\n2. Turn on `Enable sounds`.\n3. Pick the mode you want:\n   - `System sounds` if you just want a different macOS sound per event.\n   - `Sound pack` if you want fully custom audio files.\n4. Preview each event with the play button and leave only the event toggles you want enabled.\n\n### Import a local sound pack\n\n1. Switch `Sound mode` to `Sound pack`.\n2. Click `Import local sound pack`.\n3. Choose a folder that contains `openpeon.json`.\n4. Pick the imported pack from the `Sound pack` dropdown.\n\nPing Island also auto-discovers packs placed under `~/.openpeon/packs` and `~/.claude/hooks/peon-ping/packs`.\n\n### Minimal sound pack layout\n\n```text\nmy-pack/\n  openpeon.json\n  session-start.wav\n  attention.ogg\n  complete.mp3\n  error.wav\n  limit.wav\n```\n\n```json\n{\n  \"cesp_version\": \"1.0\",\n  \"name\": \"my-pack\",\n  \"display_name\": \"My Pack\",\n  \"categories\": {\n    \"task.acknowledge\": {\n      \"sounds\": [{ \"file\": \"session-start.wav\", \"label\": \"Session Start\" }]\n    },\n    \"input.required\": {\n      \"sounds\": [{ \"file\": \"attention.ogg\", \"label\": \"Attention\" }]\n    },\n    \"task.complete\": {\n      \"sounds\": [{ \"file\": \"complete.mp3\", \"label\": \"Complete\" }]\n    },\n    \"task.error\": {\n      \"sounds\": [{ \"file\": \"error.wav\", \"label\": \"Error\" }]\n    },\n    \"resource.limit\": {\n      \"sounds\": [{ \"file\": \"limit.wav\", \"label\": \"Limit\" }]\n    }\n  }\n}\n```\n\n### Event mapping\n\n- `Processing started` checks `task.acknowledge`, then `session.start`.\n- `Attention required` checks `input.required`.\n- `Task completed` checks `task.complete`.\n- `Task error` checks `task.error`.\n- `Resource limit` checks `resource.limit`.\n\nRelease builds can also publish a Linux `PingIslandBridge` artifact alongside the macOS app packages, which Ping Island uses when bootstrapping remote SSH hosts that are not running macOS.\n\nSound packs can use `.wav`, `.mp3`, or `.ogg` files. If a selected pack does not provide a matching category for an event, Ping Island falls back to the macOS system sound selected for that event.\n\n## How It Works\n\n```text\nClaude / Codex / Gemini CLI / Hermes Agent / Qwen Code / Kimi CLI / OpenCode / Cursor / Qoder / CodeBuddy / WorkBuddy / Copilot / ...\n  -\u003e hook or app-server event\n    -\u003e Ping Island monitor + normalization layer\n      -\u003e SessionStore\n        -\u003e SessionMonitor / NotchViewModel\n          -\u003e notch, list, hover preview, completion popup\n```\n\nImplementation details worth knowing:\n\n- Claude-family tools enter through managed hook files plus the embedded `PingIslandBridge` launcher.\n- Codex sessions can come from hook events or the live `codex app-server` websocket monitor.\n- Gemini CLI hooks are installed into `~/.gemini/settings.json`; tool matchers use Gemini's regex-based hook matcher syntax.\n- Qwen Code hooks are installed into `~/.qwen/settings.json`; the bridge follows the official event names and uses `Stop` / `SessionEnd` / `Notification` messages to surface popup-ready summaries in Island.\n- Kimi CLI hooks are installed into `~/.kimi/config.toml`; Ping Island preserves unrelated TOML content and maps Kimi `Stop` to turn completion while `SessionEnd` closes the session.\n- OpenCode is wired through a generated plugin file under `~/.config/opencode/plugins/` and enabled from the documented global config at `~/.config/opencode/opencode.json`; legacy `config.json` entries are still recognized for cleanup.\n- Remote SSH hosts can bootstrap `PingIslandBridge`, rewrite remote Claude-compatible hooks to target that bridge, and forward remote events back into the local Ping Island UI.\n- Focus routing spans iTerm2, Ghostty, Terminal.app, tmux, and VS Code-compatible IDE extensions.\n\n## Requirements\n\n- macOS 14.0 or later\n- Best experience on MacBooks with a notch, but external displays are supported too\n- Install whichever CLI or desktop clients you want Ping Island to monitor\n\n## Contributors\n\nThanks to everyone who has helped shape Ping Island through code, issues, ideas, testing, docs, design feedback, and release validation.\n\nSee the full contributor history on the [GitHub contributors graph](https://github.com/erha19/ping-island/graphs/contributors).\n\n## Acknowledgments\n\nPing Island follows the lineage of notch-first agent monitors such as [claude-island](https://github.com/farouqaldori/claude-island), and adapts that idea into a broader multi-client session surface with hooks, app-server sync, and IDE routing.\n\n## License\n\nApache 2.0 - see [LICENSE.md](LICENSE.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ferha19%2Fping-island","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ferha19%2Fping-island","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ferha19%2Fping-island/lists"}