Voice guardrails for coding agents.
pillow runs in the background while you use Claude Code. It stays quiet most of the time, and only speaks when something needs your attention:
- dangerous or irreversible operations
- possible goal drift
- session recap + cost summary
It can also support physical slap-to-interrupt on Apple Silicon Macs.
brew install AMOORCHING/pillow/pillow-cligo install github.com/AMOORCHING/pillow/cmd/pillow@latest
go install github.com/AMOORCHING/pillow/cmd/pillowsensord@latest # optional, slap detectiongit clone https://github.com/AMOORCHING/pillow
cd pillow
make buildThis produces ./bin/pillow and ./bin/pillowsensord. You can either run them
directly from ./bin/ or copy them somewhere in your PATH:
sudo cp bin/pillow bin/pillowsensord /usr/local/bin/pillow setup # if installed to PATH
./bin/pillow setup # if running from sourceThis creates ~/.config/pillow/config.toml and walks you through:
- Anthropic key (for cloud summaries + drift checks)
- Cartesia key (for cloud voice)
- privacy mode (
cloud,hybrid, orlocal) - optional slap detection
bash plugin/install.shWhat this does:
- installs hook scripts to
~/.config/pillow/hooks/ - installs
pillow-hookinto your PATH - merges hook config into
~/.claude/settings.json(whenjqis installed)
If jq is missing, install it and run the installer again.
In one terminal, start the main daemon:
pillow # if installed to PATH
./bin/pillow # if running from sourceKeep this running.
If you want slap-to-interrupt (Apple Silicon only), start the sensor daemon in a
second terminal with sudo (it needs root for accelerometer access):
sudo pillowsensord # if installed to PATH
sudo ./bin/pillowsensord # if running from sourceclaude "refactor auth middleware to use JWT"If hooks are installed correctly, pillow will now monitor tool calls and narrate important events.
Note: The hooks silently no-op when the daemon isn't running — you won't see errors in Claude Code if you forget to start pillow.
Run these checks after setup:
pillow status
pillow configExpected behavior:
pillow statussays the daemon is running (when started)pillow configprints your saved config
pillow # start daemon (foreground)
pillow --verbose # verbose logs
pillow setup # setup wizard
pillow config # show current config
pillow config edit # edit config in $EDITOR
pillow status # daemon/session status
pillow recap # get current session recap
pillow history # recent interrupt historyRequires Apple Silicon. The sensor daemon needs sudo for accelerometer access
and must run in its own terminal alongside the main daemon:
sudo pillowsensord # if installed to PATH
sudo ./bin/pillowsensord # if running from sourceYou can also manage it through the main CLI:
pillow sensord start # starts pillowsensord in background (needs sudo)
pillow sensord status
pillow sensord stop| Mode | Summarizer | TTS | Drift detection | Data leaving machine |
|---|---|---|---|---|
cloud |
Anthropic Haiku | Cartesia | Yes | summaries, narration text, drift checks |
hybrid |
Anthropic Haiku | Local (say/piper) |
Yes | summaries, drift checks |
local |
Template-based | Local (say/piper) |
No | nothing |
Environment variables ANTHROPIC_API_KEY and CARTESIA_API_KEY override config file values.
pillow is a daemon with a local Unix socket API. Claude Code hooks send tool events to it.
It classifies calls into:
block(can interrupt and require negotiation)warn(narrated caution)none(silent)
By default it does not narrate every event; it only narrates high-signal moments.
Start it in another terminal:
pillowCheck:
pillowdaemon is runningbash plugin/install.shcompleted successfully~/.claude/settings.jsoncontains pillow hookspillow-hookis available in yourPATH
Install jq, then run:
bash plugin/install.sh- only supported on Apple Silicon Mac
pillowsensordmust be running as root — eithersudo pillowsensordin a separate terminal, orpillow sensord start(which invokessudofor you)- slap threshold may be too high in config — check with
pillow config edit
make build
make test
make vet
make cleanMIT