An analytics dashboard that talks back
What changed in v2 — streaming AI throughout the product, severity-routed anomaly alerts, URL-as-source-of-truth filters, and editorial weekly reports.
When we shipped v1 we said the AI-traffic detector was the wedge and the rest was table stakes done carefully. Six weeks later we know the wedge works — people open the dashboard for the ChatGPT and Claude columns. What we noticed second is that they don't always know what those columns mean. Doubling from twelve sessions to twenty-four is not the same kind of news as doubling from a thousand to two thousand, and a number on a card can't tell you which.
So v2 is about the part of the product that interprets the numbers. The data layer is the same. The narration layer is new.
What changed
Every page narrates itself. The Overview, Realtime, Sources, Pages, and GEO screens now open with a one-paragraph summary that streams in as you land. Not the templated "Welcome back, you have 1,247 visitors this week" filler — a paragraph that actually looks at this week's data and tells you the most interesting thing in it. Mobile share jumped eleven points. ChatGPT referrals doubled. Your /pricing page lost eight percent of converts. The first sentence is usually enough.
It streams because waiting twenty seconds for a paragraph feels worse than reading one as it's being written. Token-by-token rendering is the difference between "the AI is thinking" and "the AI is talking." We borrowed the instinct from chat interfaces and applied it to analytics. The whole release came out of asking what else got better when we stopped batching.
GEO recommendations stream now too. The old flow ran the model, waited, then dumped five cards onto the screen. The new flow renders each card as it arrives, in order of impact. You can read the first recommendation and decide whether you care while the fifth is still being generated. We kept the cache, so cached results replay the same way — same UX, no double charge.
Cmd+K answers stream. Or hit "/" — that works too now. Recent questions persist for six. Suggested follow-ups appear under each answer.
Anomaly banners gained an Explain button. Hit it on a spike or a drop and Claude pulls the top pages from today and yesterday as context, then writes you a sixty-word paragraph explaining what probably happened. It's not a diagnosis — it's a hypothesis written by a model that's read your data. Rate-limited to ten an hour per user so it doesn't get used as a punching bag.
What we didn't do
We didn't add a chatbot to the corner of the screen. The dashboard is the chat — every surface is already a question, and the answers stream in where you asked them.
We didn't migrate to the Vercel AI SDK. It would have saved us a few hundred lines of plumbing and locked us into a single-provider adapter. PerchLens streams across OpenRouter → DeepSeek → Anthropic with the same fallback chain as our single-shot calls. A $0.0003 GEO run still costs $0.0003 streaming. That matters for a $9/month product.
We didn't redesign the dashboard. The page layouts are the same as v1.9. The narration sits above the metric cards in a quiet ruled panel that disappears once it's been read. It's additive.
The smaller things
A handful of changes from the same sprint that don't fit a section heading:
Severity-routed anomaly alerts. Spikes only go to your webhook (Slack, Discord) since they're rarely emergencies. Drops email and webhook. Drops where you lost ninety-five percent or more of your traffic get a 🚨 URGENT prefix and a red Block Kit panel. The Severity field is now in every payload for downstream filtering.
Editorial weekly reports. We rewrote the email template typography end-to-end. Georgia serif headings, tighter measure, warmer cream background, soft 4% shadows on metric cards instead of the hard 1px borders. Same data, reads like a column in a magazine instead of a status report. The top GEO recommendation now leads the email — pulled from the cache the streaming endpoint already warms, so the email cost stays at zero.
URL-synced date filters. The date filter now writes to the URL — ?from=2026-01-01&to=2026-01-31&range=Q1+2026. "Save this view" is now just "bookmark this URL." Paste a URL into Slack to share the exact dashboard state someone needs to look at. No backend table, no new storage, no sync logic — the URL is the saved view.
What's next
The first thing we want to ship after this is auto-imports for chart annotations. v1.9 added the data model (a pinned event sits on a date and renders as a line on every chart on that site) and the user-pinned source. The schema also supports GitHub Releases, Vercel deploys, and a generic webhook — those importers are next, so a v1.7 release on GitHub or a production deploy on Vercel becomes a labelled vertical line on every chart automatically. You'll be able to look at a traffic spike and see "v1.7 launch" sitting underneath it.
After that, the thing we keep coming back to is a desktop client. Most analytics dashboards live in a browser tab. Browsers are bad places for things you check ten times a day. We've been prototyping a small native-shell client that opens to your live numbers in under a second and shows a menubar indicator for the active visitor count. Nothing to announce yet — we're still figuring out whether it's worth the maintenance cost of a real app versus a PWA install. But the idea of a dashboard you don't have to find a tab for keeps pulling us back.
If you've been on a v1.x — v2.0 is live now, no migration, no opt-in. Sign in and the narrations are there. If you want to read the full changelog, it's here.
— The PerchLens team