Haptic feedback from your coding agents.
Get tactile feedback when your AI agent completes tasks, encounters errors, or requests input — feel the rhythm of your coding session through your MacBook's trackpad.
"Why not just use system notifications?"
I tried that. Banners popping up, sounds dinging — it felt noisy and annoying. Every notification pulled my eyes away from what I was doing, broke my flow, and honestly just became another thing to dismiss.
I wanted something quieter. A subtle nudge that says "hey, I'm done" without screaming for attention. Something I could feel without having to look. (I'm the kind of person who always has Do Not Disturb on.)
That's what haptic feedback does — it's silent, ambient, and stays out of your way until you need it.
Modern MacBooks have a Force Touch trackpad that doesn't physically click. Instead, it uses a linear actuator (Taptic Engine) to simulate the sensation of a click through precise vibrations.
Vibe Haptic taps into macOS's private MultitouchSupport.framework to trigger these haptic actuations programmatically. When your AI agent finishes a task or needs attention, the trackpad vibrates with distinct patterns you can feel under your fingers.
claude plugin marketplace add devxoul/vibe-haptic
claude plugin install vibe-haptic
Or within Claude Code:
/plugin marketplace add devxoul/vibe-haptic
/plugin install vibe-haptic
Add to your opencode.jsonc:
{
"plugins": [
"vibe-haptic@1.1.0"
]
}
Everything works out of the box — just install and go. But if you want to tweak the patterns or map different events, here's how.
Create vibe-haptic.json in your config directory:
~/.claude/vibe-haptic.json or .claude/vibe-haptic.json~/.config/opencode/vibe-haptic.json or .opencode/vibe-haptic.json{
"patterns": {
"success": { "beat": "6/1.5 6/0.8 4/0.5" },
"error": { "beat": "6/2.0 6/2.0 6/2.0" }
},
"events": {
"stop": "dopamine",
"prompt": "alert"
}
}
Events map agent actions to haptic patterns:
| Event | Trigger | Claude Code | OpenCode |
|---|---|---|---|
stop |
Agent finishes and becomes idle | ✓ | ✓ |
prompt |
Agent asks for input (select option, permission, etc.) | ✓ | ✓ |
stop event — Fires when the agent completes its work:
- Claude Code: Triggered by the Stop hook event when the agent finishes responding
- OpenCode: Triggered when session status changes to idle
prompt event — Fires when the agent needs your attention:
- Claude Code: Triggered by Notification hook events (permission requests, tool approvals, etc.)
- OpenCode: Triggered by permission.updated or question.asked events
Haptic feedback is defined using a beat notation:
"6/0.8 4/1.0 6/0.5"
3 minimal, 4 medium, 5 weak, 6 strong/intensity: Optional intensity (0.0-2.0) — 6/0.5 = strong actuation at half intensityExamples:
- 6 6 6 — three strong taps with short pauses
- 6/2.0 6/0.5 — loud tap followed by soft tap
- 66 — rapid double tap (no pause)
- 6 6 — two taps with longer pause
| Pattern | Beat | Description |
|---|---|---|
vibe |
6/0.8 3/1.0 6/1.0 |
Signature rhythm (default for stop event) |
alert |
6/0.5 6/1.0 6/0.5 |
Attention pulse (default for prompt event) |
dopamine |
6666666 5/1.0 4/1.0 3/1.0 |
Reward cascade |
noise |
6543654365436543 |
Rapid texture |
MIT
$ claude mcp add vibe-haptic \
-- python -m otcore.mcp_server <graph>