Pulse Analytics
Every qm new --mode=rails ships with Pulse: a complete first-party analytics stack. No third-party tracking. No cookies. Privacy-first.
What's Included
| Component | Purpose |
|---|---|
public/t.js | Lightweight page tracker (page_view, duration) |
POST /e | Event ingestion endpoint |
/admin/analytics | Dashboard: top pages, traffic sources, devices |
config/pulse_events.yml | Key events registry |
bin/mcp_server | Claude Desktop MCP server (7 tools) |
Architecture
| Layer | Components |
|---|---|
| Models | Event, SessionRecord, DailyMetric |
| Services | Analytics::Collector, SessionManager, BotDetector, IpHasher, Rollup, Reporter, EventTracker |
| Jobs | AnalyticsRollupJob (daily), EventPruneJob (90-day retention) |
| Controllers | EventsController, Admin::AnalyticsController |
Event Types
| Event | Trigger | Properties |
|---|---|---|
page_view | Page load (automatic) | referrer, title |
duration | Page exit (automatic) | seconds |
| Custom events | Pulse.track() or EventTracker | User-defined |
Custom Key Events
Register domain-specific events:
qm generate event signup --description="User signed up"
Track from JavaScript:
window.Pulse.track('signup', { plan: 'pro' })
Track from Ruby:
Analytics::EventTracker.new.track('signup',
path: '/register',
properties: { plan: 'pro' }
)
MCP Server
Claude Desktop integration via bin/mcp_server. 7 tools:
| Tool | Description |
|---|---|
pulse_summary | Analytics summary for a date range |
pulse_top_pages | Top pages by views |
pulse_traffic_sources | Referrer breakdown |
pulse_devices | Device type distribution |
pulse_event_counts | Event counts by type |
pulse_list_events | List registered key events |
pulse_register_event | Register a new key event |
Setup in claude_desktop_config.json:
{
"mcpServers": {
"pulse": {
"command": "ruby",
"args": ["bin/mcp_server"],
"cwd": "/path/to/your-app"
}
}
}
Privacy
- IPs hashed with salted SHA256 (first 16 chars, not reversible)
- No cookies; sessions use
sessionStorage(cleared on browser close) - Bot detection: scoring system flags known bots and suspicious patterns
- 90-day event retention (configurable via
EventPruneJob) - Admin access via HTTP basic auth (credentials or env vars)