For developers
Sentry for UX friction
Behavioral instrumentation that catches rage clicks, dead clicks, form friction, and post-deploy regressions, turns them into ranked issues, and verifies your fixes. TypeScript-first, framework wrappers, MCP built in.
<script
src="https://flusterduck.com/d.js"
data-key="fd_pub_YOUR_KEY"
data-dnt="false"
async
></script>data-dnt="false" matters: we capture no PII, no form values, and no text content, so DNT filtering only costs you visibility.
What goes over the wire
What we capture
- Clicks, taps, and the element selectors they land on
- Scroll depth, hesitation, and timing patterns
- Navigation paths and back-and-forth loops
- Viewport size and browser class
- Deploy markers, so regressions get blamed correctly
What we never touch
- Form values, passwords, or raw keystrokes
- Page text content of any kind
- Session replay or DOM recording
- Raw IP addresses (hashed at the edge)
- Third-party ad or cross-site cookies
The signals
100 detectors run in the browser. These are the ones you'll meet first, each one a named, typed signal, not a blob of events.
rage_clickSame element hammered in rapid succession. Pure frustration.
dead_clickA click on something that looks interactive and does nothing.
form_frictionRefills, corrections, and stalls inside a form field.
navigation_loopUsers bouncing between the same pages, hunting for something.
misclickTaps that land just off-target, usually a tap-target problem.
deploy_regressionConfusion that climbed right after a deploy. We name the deploy.
MCP: your AI tools, plugged in
@flusterduck/mcp-server exposes your friction data to Claude Desktop, Claude Code, or any MCP client. Ask "what's the worst issue on checkout this week?" and get the real answer. Bring your own Claude.
{
"mcpServers": {
"flusterduck": {
"command": "npx",
"args": ["-y", "@flusterduck/mcp-server"],
"env": {
"FLUSTERDUCK_MCP_KEY": "fd_mcp_...",
"FLUSTERDUCK_SITE_ID": "your-site-id"
}
}
}
}