Open Source · MIT License · v0.2.0

An 8-layer engine that turns raw events
into named friction patterns.

Velum takes raw JSON event streams and returns structured friction patterns with confidence scores and AI-generated hypotheses. Schema-free. One POST endpoint. Self-host in minutes.

POST /api/v1/analyze → response
$ curl -X POST http://localhost:8080/api/v1/analyze \
    -d '{"events": [...]}'

{
  "patterns": [{
    "type": "retry_storm",
    "severity": "critical",
    "confidence": 0.96,
    "affected_users": 847,
    "hypothesis": "2.3s btn_pay latency — no loading state visible"
  }],
  "status": "ok"
}
View on GitHub → Join Waitlist

MIT License  ·  Self-hostable  ·  One POST endpoint  ·  Agent-ready

This is what your data looks like right now.

On the left: raw noise. On the right: what Velum extracts from it.

incoming events
12,847 events / min
1707500000 {"event":"checkout_page_view","user_id":"usr-101","device":"mobile"}
1707500002 {"event":"scroll","depth":340,"user_id":"usr-203"}
1707500003 {"event":"click","target":"btn_pay","user_id":"usr-101"}
1707500005 {"event":"page_view","path":"/pricing","user_id":"usr-445"}
1707500008 {"event":"click","target":"btn_pay","user_id":"usr-101","error":"card_declined"}
1707500010 {"event":"focus","field":"card_number","user_id":"usr-312"}
1707500012 {"event":"click","target":"btn_pay","user_id":"usr-101","error":"card_declined"}
1707500015 {"event":"idle","ms":45000,"user_id":"usr-445"}
1707500018 {"event":"page_view","path":"/pricing","user_id":"usr-445"}
1707500020 {"event":"blur","field":"card_number","user_id":"usr-312"}
1707500021 {"event":"exit","user_id":"usr-312","type":"abandon"}
1707500023 {"event":"click","target":"btn_back","user_id":"usr-445"}
1707500025 {"event":"click","target":"btn_pay","user_id":"usr-101","error":"timeout"}
1707500028 {"event":"page_view","path":"/features","user_id":"usr-445"}
1707500030 {"event":"click","target":"btn_back","user_id":"usr-445"}
1707500033 {"event":"exit","user_id":"usr-101","type":"rage_quit"}
1707500035 {"event":"page_view","path":"/pricing","user_id":"usr-445"}
1707500038 {"event":"exit","user_id":"usr-445","type":"abandon"}
velum pipeline
detected patterns
4 patterns
🔥 Retry Storm Critical
usr-101 clicked pay 4× in 25s
error_code: card_declined → timeout
confidence: 0.96 · flow: checkout
🔄 Confusion Loop Warning
usr-445 looped pricing↔features
45s hesitation between navigations
confidence: 0.89 · flow: evaluation
😶 Silent Abandonment Warning
usr-312 focused card field, paused, left
no error · no retry · session: 12s total
confidence: 0.91 · flow: checkout
AI Hypothesis

"Payment retry storm likely caused by 2.3s button latency — users don't see processing state. Confusion loop on pricing suggests hidden fee anxiety. Recommend: add loading indicator, surface fees on pricing page."

The problem

You're collecting events.
You're not extracting patterns from them.

📡

The events are there

Raw JSON streaming through your pipeline — Segment, Kafka, direct instrumentation. Hundreds of thousands per day.

> checkout_btn_click: 4,231
> conversion_rate: 3.2%
> avg_session: 4m 12s
🔍

But streams don't self-analyze

Retry storms, confusion loops, silent drop-offs — they're encoded in the event sequence. Writing detection logic for each one doesn't scale.

> custom query #1: retry detection
> custom query #2: loop detection
> custom query #47: ...
🔥

So someone writes a one-off script

An engineer queries the logs. The pattern recurs next sprint. No one connects the dots. The same friction ships again.

> Time to diagnosis: 2-4 weeks
> Pattern recurrence: every release
> Root cause found: rarely
What Velum Detects

Hidden friction your funnel metrics will never surface.

Critical
🔥

Retry Storm

Users hammering the same button — latency, missing feedback, or broken state.

usr-101: click click click click
Critical
😶

Silent Abandonment

Users arrive, see, and leave. No clicks. No scrolls. Just gone.

usr-312: view → ............ → exit
Warning
🔄

Confusion Loop

Back and forth between pages — uncertain, looking for answers they can't find.

usr-445: A→B→A→B→A→ exit
Warning

Hesitation

Long pauses before critical actions — doubt, anxiety, hidden friction.

usr-628: view_price → 47s pause → exit
Signal
🚪

Early Dropoff

Users abandon earlier than baseline — something broke or changed.

baseline: step 4 · actual: step 1
Signal

Bypass Behavior

Users skip expected steps — smart shortcut or broken flow?

expected: 1→2→3→4 · actual: 1→4
What makes Velum different

They tell you what happened.
Velum tells you why.

Amplitude · Mixpanel
PostHog · Hotjar
Velum
Event counting & funnels
Session replay
Friction pattern detection
Explains why users struggle
manual
Cross-user analysis at scale
Zero config / schema-free
AI root cause hypotheses
Self-hostable & open source
Agent-ready API

Velum runs alongside your existing stack — it doesn't replace it.
Feed it the same events you already track. Get back structured patterns and root cause hypotheses, not just counts.

How It Works

Eight layers. One API call. Real-time results.

Send raw JSON events. Get back structured friction patterns with AI-powered hypotheses.

01
Context Enrichment
Classifies unknown properties (error_code, plan_name) as targets or conditions.
AI-powered
02
Vocab Discovery
Tokenizes event names. Learns domain language. No config needed.
AI-powered
03
Event Normalization
Converts snake_case, camelCase, dot.notation into canonical form.
deterministic
04
Session Reconstruction
Re-assembles scattered events into coherent user journeys.
deterministic
05
Behavior Analysis
Tags each action as hesitation, retry, exploration, or abandonment.
deterministic
06
Friction Pattern Detection
Aggregates signals across users into named friction patterns with confidence scores.
deterministic
07
Baseline Comparison
Compares against historical snapshots. Flags what's new, increasing, or anomalous.
deterministic
08
AI Hypothesis
Generates natural language summaries with actionable explanations for each anomaly.
AI-powered
API-First

One endpoint.
Every agent.

Your AI agent POSTs events. Velum returns structured friction patterns, confidence scores, and AI hypotheses as JSON. The agent decides what to do next.

Step 1
Your Agent
POST raw event batches over HTTP. No SDK, no schema — any JSON works.
resp = requests.post(
  "/api/v1/analyze",
  json={"events": batch}
)
# → 200 OK, patterns inside
events
Step 2
v_
Velum Analyzes
8-layer deterministic pipeline. Pattern detection, confidence scoring, AI hypothesis generation — all in one call.
8 layers  ·  < 200ms  ·  structured JSON
patterns
Step 3
Agent Acts
Parse the response. Route by severity. Trigger your downstream systems automatically.
p = resp["patterns"][0]
# severity: critical, users: 847
if p["severity"] == "critical":
  jira.create(p)
🎫
File Tickets
jira · linear · github
jira.create_issue({
  "type": "retry_storm",
  "sev": "critical"
})
🚨
Trigger Alerts
slack · pagerduty · opsgenie
slack.post({
  "text": "847 users affected",
  "channel": "#oncall"
})
🎛
Toggle Features
launchdarkly · split · flags
ld.toggle({
  "flag": "checkout_v2",
  "enabled": true
})
📊
Feed Dashboards
grafana · datadog · prometheus
metrics.push({
  "pattern": "retry_storm",
  "confidence": 0.96
})
Deploy Your Way

Self-host it. Or let us run it.

Full control with self-hosting, or zero-ops with Velum Cloud. Same pipeline, same results.

Self-Hosted

Run on your infrastructure

Deploy Velum on your own servers. Your data never leaves your network. Full source access.

  • Go binary — single process, minimal dependencies
  • PostgreSQL for storage — use your existing DB
  • Bring your own LLM key for AI layers
  • Full data sovereignty — nothing phones home
  • Docker, Kubernetes, or bare metal
$ git clone https://github.com/gokulnair2001/Velum.git
$ cp example.config.yaml config.yaml
$ go run cmd/velum/main.go
✓ velum listening on :8080
Velum Cloud

Zero-ops, fully managed Coming Soon

In Development

We handle infrastructure, scaling, and upgrades. You send events, we return quantified friction patterns and prioritized healing recommendations.

  • No servers to manage — just an API endpoint
  • Auto-scaling to handle traffic spikes
  • Managed AI models — no API keys needed
  • Historical pattern storage and trend analysis
  • Deeper analysis with richer, more detailed results
Join Cloud Waitlist →

Used by engineers from

Lowe's
Google
Motive
Powerplay
Swiggy
Lowe's
Google
Motive
Powerplay
Swiggy
Open Source

Deploy it.
Own your data.

Clone the repo, run the binary, point it at your event stream. MIT licensed. No vendor lock-in. Full source access.

MIT License  ·  Self-hosted by default  ·  No vendor lock-in