PeonPing/peon-pingPublic

Warcraft III Peon voice notifications (+ more!) for Claude Code, Codex, IDEs, and any AI agent. Stop babysitting your terminal. Employ a Peon today.

AI summary: Audio and visual notifications for when AI coding agents need your attention.

Stars
5K
+4 today
Forks
369
Watchers
6
Open issues
22
Open PRs
5
Contributors
~163
Commits
787
Branches
76

ShellMITCreated Feb 9, 2026Last push 14d agoLatest release v2.35.1+14 stars this week+18 this month

Star history

since Feb 8, 2026
02K4KFeb 2026Apr 2026Jun 2026Aug 2026
5K stars as of Aug 7, 2026, tracked back to Feb 8, 2026. Historical curve reconstructed from public GitHub event archives, calibrated to the current total.

Contribution activity

commits per day, last 52 weeks
AugSepOctNovDecJanFebMarAprMayJunJulAugMonWedFri2025-08-09: 0 commits2025-08-10: 0 commits2025-08-11: 0 commits2025-08-12: 0 commits2025-08-13: 0 commits2025-08-14: 0 commits2025-08-15: 0 commits2025-08-16: 0 commits2025-08-17: 0 commits2025-08-18: 0 commits2025-08-19: 0 commits2025-08-20: 0 commits2025-08-21: 0 commits2025-08-22: 0 commits2025-08-23: 0 commits2025-08-24: 0 commits2025-08-25: 0 commits2025-08-26: 0 commits2025-08-27: 0 commits2025-08-28: 0 commits2025-08-29: 0 commits2025-08-30: 0 commits2025-08-31: 0 commits2025-09-01: 0 commits2025-09-02: 0 commits2025-09-03: 0 commits2025-09-04: 0 commits2025-09-05: 0 commits2025-09-06: 0 commits2025-09-07: 0 commits2025-09-08: 0 commits2025-09-09: 0 commits2025-09-10: 0 commits2025-09-11: 0 commits2025-09-12: 0 commits2025-09-13: 0 commits2025-09-14: 0 commits2025-09-15: 0 commits2025-09-16: 0 commits2025-09-17: 0 commits2025-09-18: 0 commits2025-09-19: 0 commits2025-09-20: 0 commits2025-09-21: 0 commits2025-09-22: 0 commits2025-09-23: 0 commits2025-09-24: 0 commits2025-09-25: 0 commits2025-09-26: 0 commits2025-09-27: 0 commits2025-09-28: 0 commits2025-09-29: 0 commits2025-09-30: 0 commits2025-10-01: 0 commits2025-10-02: 0 commits2025-10-03: 0 commits2025-10-04: 0 commits2025-10-05: 0 commits2025-10-06: 0 commits2025-10-07: 0 commits2025-10-08: 0 commits2025-10-09: 0 commits2025-10-10: 0 commits2025-10-11: 0 commits2025-10-12: 0 commits2025-10-13: 0 commits2025-10-14: 0 commits2025-10-15: 0 commits2025-10-16: 0 commits2025-10-17: 0 commits2025-10-18: 0 commits2025-10-19: 0 commits2025-10-20: 0 commits2025-10-21: 0 commits2025-10-22: 0 commits2025-10-23: 0 commits2025-10-24: 0 commits2025-10-25: 0 commits2025-10-26: 0 commits2025-10-27: 0 commits2025-10-28: 0 commits2025-10-29: 0 commits2025-10-30: 0 commits2025-10-31: 0 commits2025-11-01: 0 commits2025-11-02: 0 commits2025-11-03: 0 commits2025-11-04: 0 commits2025-11-05: 0 commits2025-11-06: 0 commits2025-11-07: 0 commits2025-11-09: 0 commits2025-11-10: 0 commits2025-11-11: 0 commits2025-11-12: 0 commits2025-11-13: 0 commits2025-11-14: 0 commits2025-11-15: 0 commits2025-11-16: 0 commits2025-11-17: 0 commits2025-11-18: 0 commits2025-11-19: 0 commits2025-11-20: 0 commits2025-11-21: 0 commits2025-11-22: 0 commits2025-11-23: 0 commits2025-11-24: 0 commits2025-11-25: 0 commits2025-11-26: 0 commits2025-11-27: 0 commits2025-11-28: 0 commits2025-11-29: 0 commits2025-11-30: 0 commits2025-12-01: 0 commits2025-12-02: 0 commits2025-12-03: 0 commits2025-12-04: 0 commits2025-12-05: 0 commits2025-12-06: 0 commits2025-12-07: 0 commits2025-12-08: 0 commits2025-12-09: 0 commits2025-12-10: 0 commits2025-12-11: 0 commits2025-12-12: 0 commits2025-12-13: 0 commits2025-12-14: 0 commits2025-12-15: 0 commits2025-12-16: 0 commits2025-12-17: 0 commits2025-12-18: 0 commits2025-12-19: 0 commits2025-12-20: 0 commits2025-12-21: 0 commits2025-12-22: 0 commits2025-12-23: 0 commits2025-12-24: 0 commits2025-12-25: 0 commits2025-12-26: 0 commits2025-12-27: 0 commits2025-12-28: 0 commits2025-12-29: 0 commits2025-12-30: 0 commits2025-12-31: 0 commits2026-01-01: 0 commits2026-01-02: 0 commits2026-01-03: 0 commits2026-01-04: 0 commits2026-01-05: 0 commits2026-01-06: 0 commits2026-01-07: 0 commits2026-01-08: 0 commits2026-01-09: 0 commits2026-01-10: 0 commits2026-01-11: 0 commits2026-01-12: 0 commits2026-01-13: 0 commits2026-01-14: 0 commits2026-01-15: 0 commits2026-01-16: 0 commits2026-01-17: 0 commits2026-01-18: 0 commits2026-01-19: 0 commits2026-01-20: 0 commits2026-01-21: 0 commits2026-01-22: 0 commits2026-01-23: 0 commits2026-01-24: 0 commits2026-01-25: 0 commits2026-01-26: 0 commits2026-01-27: 0 commits2026-01-28: 0 commits2026-01-29: 0 commits2026-01-30: 0 commits2026-01-31: 0 commits2026-02-01: 0 commits2026-02-02: 0 commits2026-02-03: 0 commits2026-02-04: 0 commits2026-02-05: 0 commits2026-02-06: 0 commits2026-02-07: 0 commits2026-02-08: 0 commits2026-02-09: 23 commits2026-02-10: 17 commits2026-02-11: 14 commits2026-02-12: 118 commits2026-02-13: 71 commits2026-02-14: 40 commits2026-02-15: 13 commits2026-02-16: 18 commits2026-02-17: 31 commits2026-02-18: 44 commits2026-02-19: 15 commits2026-02-20: 11 commits2026-02-21: 7 commits2026-02-22: 5 commits2026-02-23: 9 commits2026-02-24: 4 commits2026-02-25: 7 commits2026-02-26: 9 commits2026-02-27: 5 commits2026-02-28: 1 commit2026-03-01: 7 commits2026-03-02: 6 commits2026-03-03: 3 commits2026-03-04: 2 commits2026-03-05: 9 commits2026-03-06: 8 commits2026-03-07: 8 commits2026-03-08: 2 commits2026-03-09: 3 commits2026-03-10: 3 commits2026-03-11: 2 commits2026-03-12: 1 commit2026-03-13: 2 commits2026-03-14: 5 commits2026-03-15: 0 commits2026-03-16: 4 commits2026-03-17: 0 commits2026-03-18: 3 commits2026-03-19: 1 commit2026-03-20: 9 commits2026-03-21: 1 commit2026-03-22: 1 commit2026-03-23: 0 commits2026-03-24: 3 commits2026-03-25: 3 commits2026-03-26: 2 commits2026-03-27: 1 commit2026-03-28: 0 commits2026-03-29: 5 commits2026-03-30: 4 commits2026-03-31: 2 commits2026-04-01: 1 commit2026-04-02: 1 commit2026-04-03: 5 commits2026-04-04: 0 commits2026-04-05: 5 commits2026-04-06: 0 commits2026-04-07: 1 commit2026-04-08: 1 commit2026-04-09: 0 commits2026-04-10: 1 commit2026-04-11: 5 commits2026-04-12: 0 commits2026-04-13: 0 commits2026-04-14: 14 commits2026-04-15: 2 commits2026-04-16: 3 commits2026-04-17: 1 commit2026-04-18: 1 commit2026-04-19: 4 commits2026-04-20: 0 commits2026-04-21: 0 commits2026-04-22: 0 commits2026-04-23: 0 commits2026-04-24: 0 commits2026-04-25: 11 commits2026-04-26: 0 commits2026-04-27: 0 commits2026-04-28: 6 commits2026-04-29: 1 commit2026-04-30: 0 commits2026-05-01: 6 commits2026-05-02: 0 commits2026-05-03: 0 commits2026-05-04: 0 commits2026-05-05: 5 commits2026-05-06: 0 commits2026-05-07: 0 commits2026-05-08: 0 commits2026-05-09: 0 commits2026-05-10: 0 commits2026-05-11: 0 commits2026-05-12: 0 commits2026-05-13: 4 commits2026-05-14: 1 commit2026-05-15: 0 commits2026-05-16: 0 commits2026-05-17: 1 commit2026-05-18: 1 commit2026-05-19: 0 commits2026-05-20: 0 commits2026-05-21: 0 commits2026-05-22: 0 commits2026-05-23: 0 commits2026-05-24: 0 commits2026-05-25: 0 commits2026-05-26: 0 commits2026-05-27: 0 commits2026-05-28: 0 commits2026-05-29: 3 commits2026-05-30: 2 commits2026-05-31: 0 commits2026-06-01: 0 commits2026-06-02: 0 commits2026-06-03: 0 commits2026-06-04: 0 commits2026-06-05: 0 commits2026-06-06: 0 commits2026-06-07: 0 commits2026-06-08: 3 commits2026-06-09: 1 commit2026-06-10: 0 commits2026-06-11: 0 commits2026-06-12: 0 commits2026-06-13: 0 commits2026-06-14: 0 commits2026-06-15: 0 commits2026-06-16: 0 commits2026-06-17: 0 commits2026-06-18: 0 commits2026-06-19: 0 commits2026-06-20: 5 commits2026-06-21: 0 commits2026-06-22: 2 commits2026-06-23: 0 commits2026-06-24: 0 commits2026-06-25: 0 commits2026-06-26: 0 commits2026-06-27: 3 commits2026-06-28: 0 commits2026-06-29: 0 commits2026-06-30: 0 commits2026-07-01: 1 commit2026-07-02: 3 commits2026-07-03: 0 commits2026-07-04: 0 commits2026-07-05: 0 commits2026-07-06: 0 commits2026-07-07: 2 commits2026-07-08: 1 commit2026-07-09: 0 commits2026-07-10: 0 commits2026-07-11: 0 commits2026-07-12: 0 commits2026-07-13: 0 commits2026-07-14: 0 commits2026-07-15: 0 commits2026-07-16: 0 commits2026-07-17: 0 commits2026-07-18: 1 commit2026-07-19: 9 commits2026-07-20: 0 commits2026-07-21: 0 commits2026-07-22: 0 commits2026-07-23: 0 commits2026-07-24: 1 commit2026-07-25: 0 commits2026-07-26: 0 commits2026-07-27: 0 commits2026-07-28: 0 commits2026-07-29: 0 commits2026-07-30: 0 commits2026-07-31: 0 commits2026-08-01: 0 commits2026-08-02: 0 commits2026-08-03: 0 commits2026-08-04: 0 commits2026-08-05: 0 commits2026-08-06: 0 commits2026-08-07: 0 commits2026-08-08: 0 commits
680 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Community-driven

    ~163 contributors

  • Permissive license

    MIT

  • Continuous integration

    Automated checks passing

What peon-ping does

peon-ping prevents context switching loss by alerting you when your AI coding agent finishes a task or requires permission. It monitors agents like Claude Code, Cursor, and GitHub Copilot, triggering bold on-screen banners and classic voice lines from games like Warcraft and StarCraft. This ensures you do not waste time checking on a paused agent. It also supports agents selecting their own notification sounds via the Model Context Protocol (MCP).

Developers using terminal-based or IDE-integrated AI coding agents who frequently multitask. It is a lightweight shell utility easy to integrate.

  • Feature: Audio notifications featuring classic game character voice lines.
  • Feature: Bold, visual on-screen banners to grab attention when tabbed away.
  • Feature: Wide compatibility with major AI agents like Claude Code, Cursor, and Codex.
  • Feature: MCP support allowing agents to programmatically choose their notification sound.
  • Feature: Multi-language documentation covering English, Korean, Chinese, and Japanese.

Where teams use it

Unattended Agent Execution

Letting an agent run a long task in the background while you focus on other work.

Prompt Permission Alerts

Getting notified instantly when an agent hits a permission boundary and needs human approval.

Multi-agent Workflows

Managing multiple agents simultaneously and knowing exactly when each one finishes.

Focus Management

Reducing the cognitive load of repeatedly checking terminal windows for agent status.

Getting started: Follow the specific shell configuration instructions provided in the repository to hook into your preferred AI agent.

README

main branch

peon-ping

English | 한국어 | 中文 | 日本語

macOS WSL2 Linux Windows MSYS2 SSH License

Claude Code Amp Gemini CLI GitHub Copilot Codex Cursor OpenCode Kilo CLI Kiro Kimi Code Windsurf Antigravity OpenClaw Rovo Dev CLI DeepAgents oh-my-pi Qwen Code iFlow CLI Trae Kiro IDE ECA

Game character voice lines + visual overlay notifications when your AI coding agent needs attention — or let the agent pick its own sound via MCP.

AI coding agents don't notify you when they finish or need permission. You tab away, lose focus, and waste 15 minutes getting back into flow. peon-ping fixes this with voice lines and bold on-screen banners from Warcraft, StarCraft, Portal, Zelda, and more — works with Claude Code, Amp, GitHub Copilot, Codex, Cursor, OpenCode, Kilo CLI, Kiro, Kimi Code, Windsurf, Google Antigravity, Rovo Dev CLI, DeepAgents, Qwen Code, iFlow CLI, Trae, Kiro IDE, ECA, and any MCP client.

See it in actionpeonping.com

demo-avatar.mp4



Install

Option 1: Homebrew (recommended)

brew install PeonPing/tap/peon-ping

Then run peon-ping-setup to register hooks and download sound packs. macOS and Linux.

Option 2: Installer script (macOS, Linux, WSL2)

curl -fsSL https://raw.githubusercontent.com/PeonPing/peon-ping/main/install.sh | bash

⚠️ WSL2 audio notes. peon-ping plays audio on the Windows side. On first run it probes your Windows host once (cached per Windows build) to pick the best playback path:

  • On Windows 10 / Windows 11 pre-24H2, WPF MediaPlayer is used directly — native MP3 + WAV, no extra dependencies.

  • On Windows 11 24H2+ (build 26100+), Microsoft removed legacy Windows Media Player from the OS and WPF MediaPlayer fails (MILAVERR_INVALIDWMPVERSION). peon-ping falls back to System.Media.SoundPlayer, which uses the Win32 PlaySound API and works everywhere — but it's WAV-only, so MP3 packs require ffmpeg to transcode on the fly:

    sudo apt update; sudo apt install -y ffmpeg

You can override the auto-detection with PEON_WSL_AUDIO_BACKEND=auto|mediaplayer|soundplayer:

  • auto (default) — probe + cache as described above
  • mediaplayer — force WPF MediaPlayer over the WSL UNC path (fails silently on 24H2+)
  • soundplayer — force tmpfile copy + SoundPlayer (universal, requires ffmpeg for non-WAV files)

Option 3: Installer for Windows

Invoke-WebRequest -Uri "https://raw.githubusercontent.com/PeonPing/peon-ping/main/install.ps1" -OutFile ".\install.ps1" -UseBasicParsing
powershell -ExecutionPolicy Bypass -File .\install.ps1

Installs a curated starter set of packs by default. Re-run to update while preserving config/state. Or pick your packs interactively at peonping.com and get a custom install command.

Windows installer parameters:

  • -All — install all available packs
  • -Packs peon,sc_kerrigan,... — install specific packs only
  • -Lang en,fr,... — install only packs matching language(s)
  • -Local — install packs, config, hooks, and skills into ./.claude/ for the current project
  • -Global — explicit global install (same as default)
  • -InitLocalConfig — create ./.claude/hooks/peon-ping/config.json only

-Local does not install the global peon CLI shim or modify your user PATH. Hooks are registered in the project-level ./.claude/settings.json with absolute paths so they work from any working directory within the project.

Windows examples:

powershell -ExecutionPolicy Bypass -File .\install.ps1 -All
powershell -ExecutionPolicy Bypass -File .\install.ps1 -Packs peon,sc_kerrigan
powershell -ExecutionPolicy Bypass -File .\install.ps1 -Local
powershell -ExecutionPolicy Bypass -File .\install.ps1 -InitLocalConfig

If the initial download fails with a TLS error on older Windows PowerShell, run this once in the same session and retry:

[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12

Option 4: Clone and inspect first

git clone https://github.com/PeonPing/peon-ping.git
cd peon-ping
./install.sh

On Windows PowerShell:

git clone https://github.com/PeonPing/peon-ping.git
Set-Location peon-ping
.\install.ps1

Option 5: Nix (macOS, Linux)

Run directly from source without installing:

nix run github:PeonPing/peon-ping -- status
nix run github:PeonPing/peon-ping -- packs install peon

Or install to your profile:

nix profile install github:PeonPing/peon-ping

Development shell (bats, shellcheck, nodejs):

nix develop  # or use direnv

Home Manager module (declarative configuration)

For reproducible setups, use the Home Manager module:

# In your home.nix or flake.nix
{ inputs, pkgs, ... }:

let
  peonCursorAdapterPath = "${inputs.peon-ping.packages.${pkgs.system}.default}/share/peon-ping/adapters/cursor.sh";
in {
  imports = [ inputs.peon-ping.homeManagerModules.default ];

  programs.peon-ping = {
    enable = true;
    package = inputs.peon-ping.packages.${pkgs.system}.default;
    claudeCodeIntegration = true;

    settings = {
      default_pack = "glados";
      volume = 0.7;
      enabled = true;
      desktop_notifications = true;
      categories = {
        "session.start" = true;
        "task.complete" = true;
        "task.error" = true;
        "input.required" = true;
        "resource.limit" = true;
        "user.spam" = true;
      };
    };

    # Install packs from og-packs (simple string notation)
    # and custom sources (attrset with name + src)
    installPacks = [
      "peon"
      "glados"
      "sc_kerrigan"
      # Custom pack from GitHub (openpeon.com registry)
      {
        name = "mr_meeseeks";
        src = pkgs.fetchFromGitHub {
          owner = "kasperhendriks";
          repo = "openpeon-mrmeeseeks";
          rev = "main";  # or use a commit hash for reproducibility
          sha256 = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
        };
      }
    ];
    enableZshIntegration = true;
  };

  # Optional extra IDE hooks, like Cursor
  home.file.".cursor/hooks.json".text = builtins.toJSON {
    version = 1;
    hooks = {
      afterAgentResponse = [{ command = "bash ${peonCursorAdapterPath} afterAgentResponse"; }];
      stop               = [{ command = "bash ${peonCursorAdapterPath} stop"; }];
    };
  };
}

Sound pack installation: The installPacks option supports two formats:

  • Simple strings (e.g., "peon", "glados") — fetched from the og-packs repository
  • Custom sources — attrset with name and src fields, where src can be any Nix fetcher result (e.g., pkgs.fetchFromGitHub)

For packs listed on openpeon.com, find the GitHub repository link and use pkgs.fetchFromGitHub:

{
  name = "pack_name";
  src = pkgs.fetchFromGitHub {
    owner = "github-owner";
    repo = "repo-name";
    rev = "main";  # or a commit hash/tag
    sha256 = "";   # Leave empty first, Nix will tell you the correct hash
  };
}

Claude Code hooks: set programs.peon-ping.claudeCodeIntegration = true; to install the Claude Code hook scripts under ~/.claude/hooks/peon-ping/ and merge the standard peon-ping hook entries into ~/.claude/settings.json.

Other IDE hooks: adapters for other IDEs are still opt-in so the module does not overwrite unrelated IDE settings. peon-ping provides adapter scripts such as cursor.sh in adapters/, and you can wire them like this:

${inputs.peon-ping.packages.${pkgs.system}.default}/share/peon-ping/adapters/$YOUR_IDE.sh EVENT_NAME

See the Cursor example above.

What you'll hear

Event CESP Category Examples
Session starts session.start "Ready to work!", "Something need doing?"
Task finishes task.complete "Work complete.", "Work, work."
Agent acknowledged task task.acknowledge "I can do that.", "Be happy to.", "Okie dokie." (disabled by default)
Permission needed input.required "Hmm?", "What you want?", "Yes?"
Tool or command error task.error "Me not that kind of orc!", "Ugh."
Rate or token limit hit resource.limit "Why not?"
Rapid prompts (3+ in 10s) user.spam "Whaaat?", "Me busy, leave me alone!", "No time for play."

Plus large overlay banners on every screen (macOS/WSL/MSYS2) and terminal tab titles (● project: done) — you'll know something happened even if you're in another app.

peon-ping implements the Coding Event Sound Pack Specification (CESP) — an open standard for coding event sounds that any agentic IDE can adopt.

Quick controls

Need to mute sounds and notifications during a meeting or pairing session? Two options:

Method Command When
Slash command /peon-ping-toggle While working in Claude Code
CLI peon toggle From any terminal tab

Prefer it to happen automatically? Set focus_detect to have peon-ping honor macOS Focus / Do Not Disturb. Sounds and notifications go quiet whenever a Focus is on and resume when you turn it off. See also headphones_only and meeting_detect.

Other CLI commands:

Windows note: Windows currently supports the day-one controls (status, toggle, volume, core packs, notifications on/off, debug, logs, trainer). More advanced commands like setup, rotation, preview, and mobile are tracked as follow-up Windows parity work.

peon setup                # Interactive setup wizard (volume, categories, notifications)
peon pause                # Mute sounds
peon resume               # Unmute sounds
peon mute                 # Alias for 'pause'
peon unmute               # Alias for 'resume'
peon status               # Check if paused or active (concise)
peon status --verbose     # Show full details (notifications, headphones, IDEs, etc.)
peon volume               # Show current volume
peon volume 0.7           # Set volume (0.0–1.0)
peon rotation             # Show current rotation mode
peon rotation random      # Set rotation mode (random|round-robin|session_override)
peon packs list           # List installed sound packs
peon packs list --registry # Browse all available packs in the registry
peon packs community      # List all registry packs grouped by trust tier (Windows)
peon packs search <query> # Search registry packs by name (Windows)
peon packs install <p1,p2> # Install packs from the registry
peon packs install --all  # Install all packs from the registry
peon packs install-local <path> # Install a pack from a local directory
peon packs use <name>     # Switch to a specific pack (auto-installs from registry on Windows)
peon packs use --install <name>  # Switch to pack, installing from registry if needed
peon packs next           # Cycle to the next pack
peon packs remove <p1,p2> # Remove specific packs
peon packs bind <name>    # Bind a pack to the current directory
peon packs bind --pattern <path> # Bind a pack to a directory pattern, e.g. "*/services"
peon packs unbind         # Remove the current directory
peon packs bindings       # List all assigned bindings
peon packs ide-bind <ide> <name> # Bind a pack to an IDE id, e.g. codex
peon packs ide-unbind <ide> # Remove an IDE binding
peon packs ide-bindings   # List all IDE-based bindings
peon packs exclude add <path> # Silence sounds & notifications for a glob or directory
peon packs exclude remove <path> # Stop silencing the given path
peon packs exclude list   # List silenced paths
peon sounds list [pack]   # List sounds in a pack, marking disabled ones
peon sounds disable <category> <file> [--pack=<name>]  # Mute a single sound within a pack
peon sounds enable <category> <file> [--pack=<name>]   # Re-enable a previously disabled sound
peon notifications on     # Enable desktop notifications
peon notifications off    # Disable desktop notifications
peon notifications overlay   # Use large overlay banners (default)
peon notifications standard  # Use standard system notifications
peon notifications test      # Send a test notification
peon notifications position [pos]    # Get/set notification position (top-left, top-center, top-right, bottom-left, bottom-center, bottom-right)
peon notifications dismiss [N]       # Get/set auto-dismiss time in seconds (0 = persistent)
peon notifications label [text|reset] # Get/set project label override for notifications
peon notifications template [key] [fmt]  # Get/set/reset message templates (keys: stop, permission, error, idle, question)
peon preview              # Play all sounds from session.start
peon preview <category>   # Play all sounds from a specific category
peon preview --list       # List all categories in the active pack
peon mobile ntfy <topic>  # Set up phone notifications (free)
peon mobile off           # Disable phone notifications
peon mobile test          # Send a test notification
peon debug on             # Enable debug logging
peon debug off            # Disable debug logging
peon debug status         # Show debug state, log directory, file count, total size
peon logs                 # Show last 50 lines of today's log
peon logs --last N        # Show last N lines across all log files
peon logs --session ID    # Filter today's log by session ID
peon logs --session ID --all  # Search all log files for session ID
peon logs --clear         # Delete all log files (with confirmation)
peon relay --daemon       # Start audio relay (for SSH/devcontainer)
peon relay --stop         # Stop background relay

Available CESP categories for peon preview: session.start, task.acknowledge, task.complete, task.error, input.required, resource.limit, user.spam. (Extended categories session.end and task.progress are defined in the CESP spec and supported by pack manifests, but not currently triggered by built-in hook events.)

Tab completion is supported — type peon packs use <TAB> to see available pack names.

Pausing mutes sounds and desktop notifications instantly. Persists across sessions until you resume. Tab titles remain active when paused.

Configuration

Quickstart — peon setup

The fastest way to configure peon-ping is the interactive wizard:

peon setup

It walks you through every common setting in one go — press Enter at any prompt to keep the current value:

  ╔══════════════════════════════════════╗
  ║       peon-ping  setup wizard        ║
  ╚══════════════════════════════════════╝

  ── Volume ──
  > Volume (0.0 - 1.0) (0.5):

  ── Sound categories ──
  >   Session start [on/off] (on):
  >   Task acknowledge [on/off] (off):
  >   Task complete [on/off] (on):
  >   Task error [on/off] (on):
  >   Input required (permissions, questions) [on/off] (on):
  >   Resource limit (context compaction) [on/off] (on):
  >   User spam (rapid prompts) [on/off] (on):

  ── Notifications ──
  > Desktop notifications [on/off] (on):

  Overlay theme:
    1) Neon (cyberpunk)
    2) Glass (translucent)
    3) Sakura (cherry blossom)
    4) Jarvis (iron man)
  > Theme [neon]:

  Notification position:
    1) Top center
    2) Top right
    ...
  > Position [top-center]:

  Auto-dismiss:
    1) Persistent (click to dismiss)
    2) 3 seconds
    3) 4 seconds
    ...
  > Dismiss time [4]:

  ✓ Configuration saved!

What the wizard covers:

  • Volume — playback volume (0.0 – 1.0)
  • Sound categories — enable/disable each CESP category individually (session start, task complete, permission prompts, errors, etc.)
  • Desktop notifications — master switch for overlay banners
  • Overlay theme — choose the visual style (neon, glass, sakura, jarvis)
  • Position — where notifications appear (top-center, top-right, etc.)
  • Auto-dismiss — how long notifications stay visible (0 = persistent, click to dismiss)

When you're done, the wizard prints a summary and saves everything to ~/.claude/hooks/peon-ping/config.json. You can rerun peon setup anytime to tweak settings — it always shows your current values as defaults.

Tip: All individual peon subcommands (peon volume, peon notifications position top-right, etc.) still work if you prefer scripting or tweaking one setting at a time — see the Quick controls section.

Slash commands and manual config

peon-ping also installs slash commands in Claude Code:

  • /peon-ping-toggle — mute/unmute sounds
  • /peon-ping-config — change any setting (volume, packs, categories, etc.)
  • /peon-ping-rename <name> — give this session a custom name shown in notification titles and the terminal tab title (zero tokens, hook-intercepted); no argument resets to auto-detect

You can also just ask Claude to change settings for you — e.g. "enable round-robin pack rotation", "set volume to 0.3", or "add glados to my pack rotation". No need to edit config files manually.

Config location depends on install mode:

  • Global install: $CLAUDE_CONFIG_DIR/hooks/peon-ping/config.json (default ~/.claude/hooks/peon-ping/config.json)
  • Local install: ./.claude/hooks/peon-ping/config.json
{
  "volume": 0.5,
  "categories": {
    "session.start": true,
    "task.acknowledge": true,
    "task.complete": true,
    "task.error": true,
    "input.required": true,
    "resource.limit": true,
    "user.spam": true
  }
}

Independent Controls

peon-ping has three independent controls that can be mixed and matched:

Config Key Controls Affects Sounds Affects Desktop Popups Affects Mobile Push
enabled Master audio switch ✅ Yes ❌ No ❌ No
desktop_notifications Desktop popup banners ❌ No ✅ Yes ❌ No
mobile_notify.enabled Phone push notifications ❌ No ❌ No ✅ Yes

This means you can:

  • Keep sounds but disable desktop popups: peon notifications off

  • Keep desktop popups but disable sounds: peon pause

  • Enable mobile push without desktop popups: set desktop_notifications: false and mobile_notify.enabled: true

  • volume: 0.0–1.0 (quiet enough for the office)

  • desktop_notifications: true/false — toggle desktop notification popups independently from sounds (default: true). When disabled, sounds continue playing but visual popups are suppressed. Mobile notifications are unaffected.

  • notification_style: "overlay" or "standard" — controls how desktop notifications appear (default: "overlay")

    • overlay: large, visible banners — JXA Cocoa overlay on macOS, Windows Forms popup on WSL/MSYS2. Clicking the overlay focuses your terminal (supports Ghostty, Warp, iTerm2, Zed, Terminal.app). On iTerm2, clicking focuses the correct tab/pane/window — not just the app.
    • standard: system notifications — terminal-notifier / osascript on macOS, Windows toast on WSL/MSYS2. When terminal-notifier is installed (brew install terminal-notifier), clicking a standard notification focuses your terminal automatically (supports Ghostty, Warp, iTerm2, Zed, Terminal.app). On native Windows, clicking a toast notification focuses the IDE or terminal window (supports VS Code, Cursor, Windsurf, Windows Terminal, PowerShell). With multiple windows open, the notification targets the exact window that originated the event via PID-based process tree matching.
  • overlay_theme: "jarvis", "glass", "sakura", or omit for the default overlay — macOS only (default: none)

    • jarvis: circular HUD with rotating arcs, graduation ticks, and progress ring
    • glass: glassmorphism panel with accent color bar, progress line, and timestamp
    • sakura: zen garden with bonsai tree and animated cherry blossom petals
  • categories: Toggle individual CESP sound categories on/off (e.g. "session.start": false to disable greeting sounds)

  • annoyed_threshold / annoyed_window_seconds: How many prompts in N seconds triggers the user.spam easter egg

  • silent_window_seconds: Suppress task.complete sounds and notifications for tasks shorter than N seconds. (e.g. 10 to only hear sounds for tasks that take longer than 10 seconds)

  • session_start_cooldown_seconds (number, default: 30): Deduplicates greeting sounds when multiple workspaces start at the same time (e.g. opening OpenCode or Cursor with many folders). Only the first session start plays the greeting; subsequent ones within this window stay silent. Set to 0 to disable deduplication and always play a greeting.

  • suppress_idle_prompt_repeats (boolean, default: true): Claude Code re-fires its idle_prompt notification every ~60s while the terminal is unfocused. peon-ping routes idle_prompt to task.complete so you still get a sound when input is needed — but without dedupe the same sound replays on every poke. When true, an idle_prompt is suppressed if a task.complete for the same session already fired inside idle_prompt_suppress_window_seconds. Set to false to restore the periodic nudge.

  • idle_prompt_suppress_window_seconds (number, default: 3600): Window used by suppress_idle_prompt_repeats. After a task.complete fires for a session, subsequent idle_prompt notifications for that session stay silent for this many seconds. Set to 0 to disable the window (effectively the same as suppress_idle_prompt_repeats: false).

  • suppress_subagent_complete (boolean, default: false): Suppress sounds and notifications from sub-agent activity. When Claude Code's Task tool dispatches parallel sub-agents, each one fires its own events: a completion sound on finish, task.error on failed Bash commands, input.required on permission requests. Set this to true to hear only the parent session's sounds. Events fired from inside a sub-agent are detected via the agent_id field Claude Code adds to their hook payloads; separate-session sub-agents (older clients, other IDEs) are still detected by the SubagentStart timing heuristic.

  • default_pack: The fallback pack used when no more specific rule applies (default: "peon"). Replaces the old active_pack key — existing configs are migrated automatically on peon update.

  • path_rules: Array of { "pattern": "...", "pack": "..." } objects. Assigns a pack to sessions based on the working directory using glob matching (*, ?). First matching rule wins. Beats pack_rotation and default_pack; overridden by session_override assignments.

    "path_rules": [
      { "pattern": "*/work/client-a/*", "pack": "glados" },
      { "pattern": "*/personal/*",      "pack": "peon" }
    ]
  • exclude_dirs: Array of glob or directory patterns. If the current working directory matches one of these entries, all sounds and notifications are silenced for that invocation (the hook logs suppressed=True reason=excluded_dir pattern=<match>). Bare directory paths also match descendants, so "~/conductor/workspaces" silences everything under that tree. Use this for noisy background agents (e.g. CodexBar/ClaudeProbe), throwaway scratch dirs, or sensitive workspaces where audio alerts are unwanted.

    "exclude_dirs": [
      "~/conductor/workspaces",
      "~/Library/Application Support/CodexBar*"
    ]
  • ide_rules: Array of { "ide": "...", "pack": "..." } objects. Assigns a pack by IDE/source after path_rules and before rotation/default fallback. First matching rule wins. Common ids: claude, codex, cursor, opencode, kilo, kiro, gemini, copilot, windsurf, kimi, antigravity, amp, deepagents, openclaw, rovodev.

    "ide_rules": [
      { "ide": "codex",  "pack": "glados" },
      { "ide": "claude", "pack": "peon" }
    ]
  • pack_rotation: Array of pack names (e.g. ["peon", "sc_kerrigan", "peasant"]). Used when pack_rotation_mode is random or round-robin. Leave empty [] to use default_pack (or path_rules / ide_rules) only.

  • pack_rotation_mode: "random" (default), "round-robin", or "session_override". With random/round-robin, each session picks one pack from pack_rotation. With session_override, the /peon-ping-use <pack> command assigns a pack per session. Invalid or missing packs fall back through the hierarchy. ("agentskill" is accepted as a legacy alias for "session_override".)

  • session_ttl_days (number, default: 7): Expire stale per-session pack assignments older than N days. Keeps .state.json from growing unbounded when using session_override mode.

  • headphones_only (boolean, default: false): Only play sounds when headphones or external audio devices are detected. When enabled, sounds are suppressed if built-in speakers are the active output — useful for open offices. Check status with peon status. Supported on macOS (via system_profiler) and Linux (via PipeWire wpctl or PulseAudio pactl).

  • terminal_tab_title (boolean, default: true): Update the terminal tab title with the current session status (for example ● project: done). Set to false if you already manage tab titles with your own shell prompt or terminal automation and only want peon-ping's sounds/notifications.

  • tmux_passthrough (boolean, default: false): Pass the tab title and iTerm2 tab-color escapes through tmux's DCS passthrough to the host terminal (requires tmux 3.3a+ with set -g allow-passthrough on). Off by default because a tmux client multiplexes many panes/windows onto a single host terminal tab with no per-pane addressing: when several agent sessions run at once, every hook (including from background panes) repaints that one shared tab on a last-writer-wins basis, so it no longer reflects any single session. Leave it off and let tmux's own window/status line carry per-session state; enable it only if you run one tmux window per terminal tab (so 1 tab = 1 session). Has no effect outside tmux, where the escapes are always emitted.

  • suppress_sound_when_tab_focused (boolean, default: false): Skip sound playback when the terminal tab that generated the hook event is the currently active/focused tab. Sounds still play for background tabs as an alert that something happened elsewhere. Desktop and mobile notifications are unaffected. Useful when you only want audio cues from tabs you're not watching. macOS only (uses osascript to check frontmost app and iTerm2 tab focus).

  • meeting_detect Detects if the microphone is currently being used and temporarily suppresses the audio only until the microphone is no longer in use. Notification still appears.

  • focus_detect (boolean, default: false): Honor macOS Focus / Do Not Disturb. peon-ping plays sounds via afplay and draws overlays in a custom window, and both bypass Notification Center, so the system Focus toggle has no effect on them by default. When enabled, peon-ping reads the Focus state directly and suppresses output whenever any Focus (Do Not Disturb, Work, Sleep, etc.) is active, then resumes automatically when you turn Focus off. Mobile push (if configured) is unaffected, since your phone honors its own Focus. macOS only, and it fails open (if the Focus state can't be read, sounds play as normal).

  • focus_detect_mode (string, default: "all"): What focus_detect suppresses while a Focus is active. "all" mutes both the sound and the overlay/desktop notification. "sound" mutes only the sound (notifications still appear). "notifications" mutes only the notification (sound still plays). Ignored when focus_detect is false.

  • notification_position (string, default: "top-center"): Where overlay notifications appear on screen. Options: "top-left", "top-center", "top-right", "bottom-left", "bottom-center", "bottom-right".

  • notification_dismiss_seconds (number, default: 4): Auto-dismiss overlay notifications after N seconds. Set to 0 for persistent notifications that require a click to dismiss.

  • notification_all_screens (boolean, default: true): Show overlay notifications on all screens (true) or only the main screen (false). Themed overlays (glass, jarvis, sakura) previously only showed on one screen — existing configs with those themes are migrated to false automatically. macOS only.

  • CLAUDE_SESSION_NAME env var: Set before launching claude to give a session a custom name. Shows in both desktop notification titles and terminal tab titles. Priority over all config-based naming. Example: CLAUDE_SESSION_NAME="Auth Refactor" claude or export CLAUDE_SESSION_NAME="Feature: Auth" then claude. Each terminal gets its own title automatically since peon-ping runs as a child of that Claude instance.

  • notification_title_override (string, default: ""): Override the project name shown in notification titles. When empty, the project name is auto-detected from /peon-ping-rename > CLAUDE_SESSION_NAME > .peon-label > notification_title_script > project_name_map > git repo name > folder name.

  • notification_title_marker (string, default: "●"): Character(s) shown before the project name in notification titles and terminal tab titles. Desktop notification titles use Project by default; terminal tab titles keep Project: status. Set to "" to disable. Example: "🔔".

  • notification_title_ide (boolean, default: false): Include the normalized IDE label in desktop notification titles as Project - IDE. When disabled, the title stays Project and the message/body carries the status/details.

  • notification_title_script (string, default: ""): Shell command run at event time to compute the project name dynamically. Receives env vars: PEON_SESSION_ID, PEON_CWD, PEON_HOOK_EVENT, PEON_IDE, PEON_SESSION_NAME. Use stdout (trimmed, max 50 chars); non-zero exit falls through to the next tier. PEON_IDE is the normalized IDE/source id such as codex or claude. Example: "basename $PEON_CWD".

  • project_name_map (object, default: {}): Map directory paths to custom project labels for notifications. Keys are path patterns, values are display names. Example: { "/home/user/work/client-a": "Client A" }.

  • notification_templates (object, default: {}): Custom message/body format strings for notification events. Keys are event types (stop, permission, error, idle, question), values are template strings with variable substitution. Available variables: {project}, {ide}, {ide_id}, {summary}, {tool_name}, {status}, {event}. Example: { "stop": "{status}: {summary}", "permission": "{status}: {tool_name}" }.

Pack Selection Hierarchy

peon-ping resolves which sound pack to use through a 6-layer hierarchy. The first layer that produces a valid, installed pack wins:

Priority Layer Source How to set
1 (highest) session_override Per-session assignment /peon-ping-use <pack> skill or MCP
2 path_rules Glob match on working directory peon packs bind or path_rules in config
3 ide_rules IDE/source match peon packs ide-bind or ide_rules in config
4 pack_rotation Random or round-robin from a list pack_rotation array + pack_rotation_mode in config
5 default_pack Static fallback peon packs use <name> or default_pack in config
6 (lowest) hardcoded Built-in default "peon"

If a layer references a pack that is not installed, it falls through to the next layer. If exclude_dirs matches the current working directory, the entire invocation is silenced — no sound, no notification.

Per-Project Pack Assignment (path_rules)

Assign different sound packs to different projects based on directory path. Use the CLI or edit config.json directly.

CLI (recommended):

peon packs bind glados                     # Bind glados to the current directory
peon packs bind sc_kerrigan --pattern "*/services/*"  # Bind to a glob pattern
peon packs bind duke_nukem --install       # Bind and install from registry if needed
peon packs unbind                          # Remove binding for the current directory
peon packs unbind --pattern "*/services/*" # Remove a specific pattern binding
peon packs bindings                        # List all bindings

Manual config:

View on GitHub

Recent activity

commits and pull requests

Recent open issues

view all

Releases and announcements

51 total
  1. v2.35.1v2.35.1Jul 24, 20262 downloads

    **Full Changelog**: https://github.com/PeonPing/peon-ping/compare/v2.35.0...v2.35.1

  2. v2.35.0v2.35.0Jul 19, 20264 downloads

    ## What's Changed * fix: don't log user prompt content in UserPromptSubmit hooks by @paskal in https://github.com/PeonPing/peon-ping/pull/553 * fix: uninstaller handles symlinked rc files and removes the rename hook by @paskal in https://github.com/PeonPing/peon-ping/pull/554 * nix: build meeting-detect and peon-play swift helpers by @starcraft66 in https://github.com/PeonPing/peon-ping/pull/552 * fix(warp): focus the exact tab on notification click via WARP_FOCUS_URL by @csatib02 in https://github.com/PeonPing/peon-ping/pull/551 * fix(security): prevent dangerous path resolution and reject piped execution in uninstaller by @piersjones in https://github.com/PeonPing/peon-ping/pull/559 * fix(codex): prevent dangling hooks from interrupting sessions by @zenvor in https://github.com/PeonPing/peon-ping/pull/557 * Focus the exact terminal window when a standard notification is clicked (macOS) by @KyleOps in https://github.com/PeonPing/peon-ping/pull/556 * Fix overlay subtitle rendering + tmux-aware focus and click-to-pane by @lukewang1024 in https://github.com/PeonPing/peon-ping/pull/555 ## New Contributors * @starcraft66 made their first contribution in https://github.com/PeonPing/peo

  3. v2.34.0v2.34.0Jul 7, 20264 downloads

    ## What's Changed * feat(codex): 增加 stable hooks 自动注册 by @zenvor in https://github.com/PeonPing/peon-ping/pull/549 ## New Contributors * @zenvor made their first contribution in https://github.com/PeonPing/peon-ping/pull/549 **Full Changelog**: https://github.com/PeonPing/peon-ping/compare/v2.33.0...v2.34.0

  4. v2.33.0v2.33.0Jul 2, 20261 downloads

    ## What's Changed * Fix leading audio clipped on the first sound after idle (pre-roll silence) by @trogulja in https://github.com/PeonPing/peon-ping/pull/544 * Fix install/uninstall deleting other tools' hooks named notify.sh by @trogulja in https://github.com/PeonPing/peon-ping/pull/546 * Support newer Antigravity state layouts by @JackFurton in https://github.com/PeonPing/peon-ping/pull/542 ## New Contributors * @trogulja made their first contribution in https://github.com/PeonPing/peon-ping/pull/544 * @JackFurton made their first contribution in https://github.com/PeonPing/peon-ping/pull/542 **Full Changelog**: https://github.com/PeonPing/peon-ping/compare/v2.32.0...v2.33.0

  5. v2.32.0v2.32.0Jun 27, 20261 downloads

    ## What's Changed * feat(install): --openpeon tool-agnostic install root (~/.openpeon) by @muunkky in https://github.com/PeonPing/peon-ping/pull/533 * feat(tmux): configurable tab title/color passthrough, off by default by @lukewang1024 in https://github.com/PeonPing/peon-ping/pull/540 ## New Contributors * @lukewang1024 made their first contribution in https://github.com/PeonPing/peon-ping/pull/540 **Full Changelog**: https://github.com/PeonPing/peon-ping/compare/v2.31.1...v2.32.0

Code frequency

additions and deletions
+47.4K-47.4KWeek of 2026-02-08: +47,369 linesWeek of 2026-02-08: -21,029 linesWeek of 2026-02-15: +15,131 linesWeek of 2026-02-15: -5,965 linesWeek of 2026-02-22: +10,530 linesWeek of 2026-02-22: -493 linesWeek of 2026-03-01: +7,807 linesWeek of 2026-03-01: -190 linesWeek of 2026-03-08: +1,039 linesWeek of 2026-03-08: -364 linesWeek of 2026-03-15: +27,021 linesWeek of 2026-03-15: -1,804 linesWeek of 2026-03-22: +47,227 linesWeek of 2026-03-22: -19,887 linesWeek of 2026-03-29: +1,042 linesWeek of 2026-03-29: -1,386 linesWeek of 2026-04-05: +2,056 linesWeek of 2026-04-05: -143 linesWeek of 2026-04-12: +3,622 linesWeek of 2026-04-12: -591 linesWeek of 2026-04-19: +3,700 linesWeek of 2026-04-19: -222 linesWeek of 2026-04-26: +2,893 linesWeek of 2026-04-26: -326 linesWeek of 2026-05-03: +894 linesWeek of 2026-05-03: -317 linesWeek of 2026-05-10: +3,077 linesWeek of 2026-05-10: -48 linesWeek of 2026-05-17: +14 linesWeek of 2026-05-17: -9 linesWeek of 2026-05-24: +827 linesWeek of 2026-05-24: -345 linesWeek of 2026-05-31: +0 linesWeek of 2026-05-31: -0 linesWeek of 2026-06-07: +2,314 linesWeek of 2026-06-07: -21 linesWeek of 2026-06-14: +486 linesWeek of 2026-06-14: -54 linesWeek of 2026-06-21: +167 linesWeek of 2026-06-21: -24 linesWeek of 2026-06-28: +343 linesWeek of 2026-06-28: -63 linesWeek of 2026-07-05: +1,313 linesWeek of 2026-07-05: -147 linesWeek of 2026-07-12: +27 linesWeek of 2026-07-12: -3 linesWeek of 2026-07-19: +1,357 linesWeek of 2026-07-19: -414 linesWeek of 2026-07-26: +0 linesWeek of 2026-07-26: -0 linesWeek of 2026-08-02: +0 linesWeek of 2026-08-02: -0 linesFeb 8, 2026Aug 2, 2026
+180.3K lines added, -53.8K removed over the last year.

Commits per week

last 52 weeks
2830Week of 2025-08-09: 0 commitsWeek of 2025-08-16: 0 commitsWeek of 2025-08-23: 0 commitsWeek of 2025-08-30: 0 commitsWeek of 2025-09-06: 0 commitsWeek of 2025-09-13: 0 commitsWeek of 2025-09-20: 0 commitsWeek of 2025-09-27: 0 commitsWeek of 2025-10-04: 0 commitsWeek of 2025-10-11: 0 commitsWeek of 2025-10-18: 0 commitsWeek of 2025-10-25: 0 commitsWeek of 2025-11-01: 0 commitsWeek of 2025-11-09: 0 commitsWeek of 2025-11-16: 0 commitsWeek of 2025-11-23: 0 commitsWeek of 2025-11-30: 0 commitsWeek of 2025-12-07: 0 commitsWeek of 2025-12-14: 0 commitsWeek of 2025-12-21: 0 commitsWeek of 2025-12-28: 0 commitsWeek of 2026-01-04: 0 commitsWeek of 2026-01-11: 0 commitsWeek of 2026-01-18: 0 commitsWeek of 2026-01-25: 0 commitsWeek of 2026-02-01: 0 commitsWeek of 2026-02-08: 283 commitsWeek of 2026-02-15: 139 commitsWeek of 2026-02-22: 40 commitsWeek of 2026-03-01: 43 commitsWeek of 2026-03-08: 18 commitsWeek of 2026-03-15: 18 commitsWeek of 2026-03-22: 10 commitsWeek of 2026-03-29: 18 commitsWeek of 2026-04-05: 13 commitsWeek of 2026-04-12: 21 commitsWeek of 2026-04-19: 15 commitsWeek of 2026-04-26: 13 commitsWeek of 2026-05-03: 5 commitsWeek of 2026-05-10: 5 commitsWeek of 2026-05-17: 2 commitsWeek of 2026-05-24: 5 commitsWeek of 2026-05-31: 0 commitsWeek of 2026-06-07: 4 commitsWeek of 2026-06-14: 5 commitsWeek of 2026-06-21: 5 commitsWeek of 2026-06-28: 4 commitsWeek of 2026-07-05: 3 commitsWeek of 2026-07-12: 1 commitsWeek of 2026-07-19: 10 commitsWeek of 2026-07-26: 0 commitsWeek of 2026-08-02: 0 commitsAug 9, 2025Aug 2, 2026
680 commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 5 commitsSun 1:00 — 1 commitsSun 2:00 — 3 commitsSun 3:00 — 2 commitsSun 4:00 — 2 commitsSun 5:00 — 2 commitsSun 6:00 — 2 commitsSun 7:00 — 0 commitsSun 8:00 — 2 commitsSun 9:00 — 3 commitsSun 10:00 — 0 commitsSun 11:00 — 0 commitsSun 12:00 — 1 commitsSun 13:00 — 3 commitsSun 14:00 — 2 commitsSun 15:00 — 5 commitsSun 16:00 — 1 commitsSun 17:00 — 1 commitsSun 18:00 — 4 commitsSun 19:00 — 7 commitsSun 20:00 — 2 commitsSun 21:00 — 2 commitsSun 22:00 — 1 commitsSun 23:00 — 1 commitsMon 0:00 — 2 commitsMon 1:00 — 5 commitsMon 2:00 — 2 commitsMon 3:00 — 3 commitsMon 4:00 — 0 commitsMon 5:00 — 1 commitsMon 6:00 — 1 commitsMon 7:00 — 0 commitsMon 8:00 — 2 commitsMon 9:00 — 1 commitsMon 10:00 — 5 commitsMon 11:00 — 5 commitsMon 12:00 — 3 commitsMon 13:00 — 5 commitsMon 14:00 — 1 commitsMon 15:00 — 8 commitsMon 16:00 — 10 commitsMon 17:00 — 2 commitsMon 18:00 — 2 commitsMon 19:00 — 12 commitsMon 20:00 — 0 commitsMon 21:00 — 0 commitsMon 22:00 — 5 commitsMon 23:00 — 1 commitsTue 0:00 — 1 commitsTue 1:00 — 0 commitsTue 2:00 — 1 commitsTue 3:00 — 1 commitsTue 4:00 — 1 commitsTue 5:00 — 0 commitsTue 6:00 — 2 commitsTue 7:00 — 1 commitsTue 8:00 — 0 commitsTue 9:00 — 4 commitsTue 10:00 — 2 commitsTue 11:00 — 7 commitsTue 12:00 — 4 commitsTue 13:00 — 2 commitsTue 14:00 — 2 commitsTue 15:00 — 6 commitsTue 16:00 — 0 commitsTue 17:00 — 15 commitsTue 18:00 — 7 commitsTue 19:00 — 7 commitsTue 20:00 — 1 commitsTue 21:00 — 4 commitsTue 22:00 — 7 commitsTue 23:00 — 17 commitsWed 0:00 — 4 commitsWed 1:00 — 1 commitsWed 2:00 — 2 commitsWed 3:00 — 0 commitsWed 4:00 — 0 commitsWed 5:00 — 2 commitsWed 6:00 — 4 commitsWed 7:00 — 6 commitsWed 8:00 — 5 commitsWed 9:00 — 7 commitsWed 10:00 — 6 commitsWed 11:00 — 9 commitsWed 12:00 — 4 commitsWed 13:00 — 5 commitsWed 14:00 — 1 commitsWed 15:00 — 4 commitsWed 16:00 — 3 commitsWed 17:00 — 2 commitsWed 18:00 — 5 commitsWed 19:00 — 5 commitsWed 20:00 — 6 commitsWed 21:00 — 1 commitsWed 22:00 — 1 commitsWed 23:00 — 3 commitsThu 0:00 — 5 commitsThu 1:00 — 2 commitsThu 2:00 — 1 commitsThu 3:00 — 1 commitsThu 4:00 — 1 commitsThu 5:00 — 1 commitsThu 6:00 — 1 commitsThu 7:00 — 1 commitsThu 8:00 — 3 commitsThu 9:00 — 4 commitsThu 10:00 — 8 commitsThu 11:00 — 11 commitsThu 12:00 — 18 commitsThu 13:00 — 10 commitsThu 14:00 — 8 commitsThu 15:00 — 12 commitsThu 16:00 — 20 commitsThu 17:00 — 19 commitsThu 18:00 — 5 commitsThu 19:00 — 4 commitsThu 20:00 — 3 commitsThu 21:00 — 3 commitsThu 22:00 — 15 commitsThu 23:00 — 7 commitsFri 0:00 — 6 commitsFri 1:00 — 3 commitsFri 2:00 — 3 commitsFri 3:00 — 7 commitsFri 4:00 — 7 commitsFri 5:00 — 2 commitsFri 6:00 — 2 commitsFri 7:00 — 4 commitsFri 8:00 — 4 commitsFri 9:00 — 6 commitsFri 10:00 — 8 commitsFri 11:00 — 8 commitsFri 12:00 — 5 commitsFri 13:00 — 6 commitsFri 14:00 — 3 commitsFri 15:00 — 5 commitsFri 16:00 — 8 commitsFri 17:00 — 1 commitsFri 18:00 — 3 commitsFri 19:00 — 5 commitsFri 20:00 — 7 commitsFri 21:00 — 7 commitsFri 22:00 — 6 commitsFri 23:00 — 8 commitsSat 0:00 — 2 commitsSat 1:00 — 15 commitsSat 2:00 — 10 commitsSat 3:00 — 4 commitsSat 4:00 — 2 commitsSat 5:00 — 0 commitsSat 6:00 — 0 commitsSat 7:00 — 4 commitsSat 8:00 — 6 commitsSat 9:00 — 4 commitsSat 10:00 — 4 commitsSat 11:00 — 3 commitsSat 12:00 — 6 commitsSat 13:00 — 3 commitsSat 14:00 — 4 commitsSat 15:00 — 0 commitsSat 16:00 — 3 commitsSat 17:00 — 7 commitsSat 18:00 — 3 commitsSat 19:00 — 1 commitsSat 20:00 — 1 commitsSat 21:00 — 3 commitsSat 22:00 — 4 commitsSat 23:00 — 1 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.
DateListRankStars gained
Feb 13, 2026daily#9+170
  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    385.5K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    384.4K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    384.4K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    384.4K stars · TypeScript

  • obra/superpowers

    An agentic skills framework & software development methodology that works.

    268.6K stars · Shell

  • affaan-m/ECC

    The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.

    238.5K stars · JavaScript