Start, stop, or check the anvil-pulse dashboard — a live local web page showing active anvil claims (actor, phase, elapsed, lease countdown), the event feed, and stuck-state detection (healthy / quiet / possibly wedged / lease expired) for long autonomous runs. Use when the user asks to "watch this run", "open the anvil dashboard", "is the agent stuck?", "monitor the claims", "start/stop pulse", or wants a heartbeat view of an anvil project. Also installs an optional Claude Code statusline se...
Scanned 9/6/2026
Install to Claude Code
npx -y skills add fakoli/fakoli-plugins --skill pulse --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Pulse?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/fakoli-pulse)More formats (shields.io, HTML) on the badges page.
---
name: pulse
description: Start, stop, or check the anvil-pulse dashboard — a live local web page showing active anvil claims (actor, phase, elapsed, lease countdown), the event feed, and stuck-state detection (healthy / quiet / possibly wedged / lease expired) for long autonomous runs. Use when the user asks to "watch this run", "open the anvil dashboard", "is the agent stuck?", "monitor the claims", "start/stop pulse", or wants a heartbeat view of an anvil project. Also installs an optional Claude Code statusline segment on request. Read-only over anvil state; sends nothing externally.
---
# anvil pulse
A local operator dashboard for anvil projects. It polls `anvil status --json`
and tails the append-only `events.jsonl`, then serves a single self-contained
web page. It never writes anvil state.
Resolve `PLUGIN_ROOT` from this installed skill (`../..`), not from the target project or an assumed shell variable. Keep the project path explicit.
## Toolkit (bundled)
```
$PLUGIN_ROOT/scripts/start-server.sh # start (prints {"event":"server-started","url":...})
$PLUGIN_ROOT/scripts/stop-server.sh # stop
$PLUGIN_ROOT/scripts/check-server.sh # is it running?
$PLUGIN_ROOT/scripts/statusline-segment.sh # optional Claude Code statusline segment
```
All scripts take `--project-dir <path>` (default: cwd). Requires `node` and the
`anvil` CLI on PATH.
## Start the dashboard
1. Confirm the target project is anvil-initialized: `anvil status --json --cwd <project>`
exits 0. If not, tell the user and stop — the dashboard has nothing to show.
2. Run:
```bash
bash "$PLUGIN_ROOT/scripts/start-server.sh" --project-dir <project>
```
3. Parse the JSON line and give the user the `url`. Suggest opening it in a
browser; it live-updates every ~2.5s.
4. On Windows/Git Bash and environments setting `CODEX_CI`, the script auto-runs in the foreground
(detached processes get reaped there). In that case start it with the shell
tool's background/run-in-background mode so it survives the turn, or tell
the user to run it in a separate terminal:
`bash .../start-server.sh --project-dir <project> --foreground`
Options worth knowing: `--port <n>` for a stable URL, `--state-dir <dir>` if
anvil state lives in a non-default workspace dir (auto-discovery checks
`<project>/.anvil`, `<project>/bin/.anvil`, then the exact path-hashed workspace under
`~/.anvil/workspaces/`. A same-named checkout is never selected as a fallback;
use an explicit `--state-dir` for legacy or custom layouts).
Suggest adding `.anvil-pulse/` to the project's `.gitignore` (pid/log files
live there).
## Stop / check
```bash
bash "$PLUGIN_ROOT/scripts/stop-server.sh" --project-dir <project>
bash "$PLUGIN_ROOT/scripts/check-server.sh" --project-dir <project>
```
## Reading the board
- Each active claim card shows task, actor, latest `progress.noted` phase,
elapsed time, live lease countdown, and time since last observed event.
- Staleness classification (server defaults via `PULSE_QUIET_SECONDS` /
`PULSE_WEDGED_SECONDS` = 300/900; retune live per request with
`/api/pulse?quiet_seconds=600&wedged_seconds=1800` — no restart needed):
- **healthy** — activity within the quiet threshold
- **quiet** — no activity for 5-15 min; often a long tool call or model wait
- **possibly wedged** — silent beyond 15 min with a live lease; worth a look
- **lease expired** — the claim's lease ran out; the run may have died
- When the user asks "is it stuck?", read `/api/pulse` yourself and answer from
`claims[].staleness` + `last_activity_seconds` instead of guessing:
`curl --fail --silent --show-error --max-time 10 http://localhost:<port>/api/pulse`
## Optional: Claude Code statusline segment
Only on explicit request — this edits the user's own statusline script.
Requires `python3` or `python` on PATH (the segment parses anvil's JSON;
on Windows, `python3` is often a broken WindowsApps stub, so the script tries
both — but at least one must actually work).
1. Read `~/.claude/settings.json` -> `statusLine.command` to find the script
(commonly `~/.claude/statusline-command.sh`). If no statusline is configured,
explain how to set one up instead of creating files unasked.
2. IDEMPOTENCY CHECK: grep the script for `# anvil-pulse segment` first. If
present, the segment is already installed — update the existing block in
place if the path changed; NEVER append a second copy (it would render
twice).
3. For a requested installation, append this snippet to the END of
their script after inspecting its existing structure (it prints nothing outside anvil projects):
```bash
# anvil-pulse segment
pulse_seg="$(bash "<absolute-plugin-path>/scripts/statusline-segment.sh" "$workspace_dir" 2>/dev/null)"
[[ -n "$pulse_seg" ]] && printf ' | %s' "$pulse_seg"
```
Replace `<absolute-plugin-path>` with the resolved installed plugin root
and `$workspace_dir` with however their script names the current workspace
variable (read the script first; do not assume).
4. The segment caches `anvil status` for 10s (`ANVIL_PULSE_STATUSLINE_TTL`)
under `~/.cache/anvil-pulse/`; on a transient anvil failure it serves the
previous cached segment instead of blanking.
## Other harnesses
- **Codex**: start the server in a persistent terminal and open its browser page.
This plugin supplies a dashboard skill; it does not configure recurring
automation or notifications merely by starting the dashboard.
- **OpenClaw**: see `$PLUGIN_ROOT/docs/openclaw.md` for the zero-code
Gateway cron recipe (`anvil notify-digest --announce`) and the planned
control-ui embed.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!