Ask anything about your product, or jump to a page.
Everything Irv has shipped, in reverse chronological order. Most entries trace back to a single PR that introduced the feature, with the LinkedIn-quality summary you might have read about.
When Irv spots a metric drop or an unusual cohort, hit "Investigate this." A canvas opens with the relevant metrics, pages, and recent commits already placed, connected, and compared. You're not starting an investigation — you're finishing one.
Same data as the email brief, different surface. Each morning Irv renders a ~60-second MP3 narrated by OpenAI's gpt-4o-mini-tts. Three style presets per project — calm (NPR Daily feel), energetic (morning-radio host, default), punchy (sports-radio momentum). Read-along transcript on the dashboard. Subscribe to one project's feed or a single personal cross-project feed at /app/account — pastes into Apple Podcasts, Overcast, Pocket Casts. ~$0.015 per episode.
Every project dashboard (and /app/admin/self) now lists users who've called irv.identify(email). Each row: the country we saw on their first identify (sticky — a user who travels still shows where they signed up from), email or distinct_id, and a relative last-seen time. Demo + pk_irv show masked emails by default; the data owner sees the real addresses.
lucide-react (imported in 70+ files), recharts and @base-ui/react now barrel-rewrite via experimental.optimizePackageImports. @tanstack/react-query-devtools (~40 KB gzipped) gated behind a build-time NODE_ENV check so it DCE-eliminates from prod. @next/bundle-analyzer + shadcn (CLI) moved out of dependencies. The 919-line marketing landing page was marked "use client" for no reason — zero hooks, zero handlers — dropped the directive so the whole hero + four-act section + trust strip ships as server HTML.
An Upstash plan-limit overage took down every Redis-touching endpoint with an empty-body HTTP 500, including the public landing-page signup form. The waitlist endpoint now wraps its rate-limit check in try/catch (best-effort spam protection that fails open, not closed) and has an outer try/catch that returns proper JSON { error: "internal" } instead of an unhandled-exception 500. A small circuit-breaker for the other ~30 Redis-touching routes is the follow-up.
Clicking 'Refresh insights' on the dogfood dashboard was returning unknown_project_key because pk_irv has no row in the project store on purpose (it's a reserved key, sibling to pk_demo). Fix: synthesise a virtual Project at request time when the caller is the creator — lovable_url = https://www.irv.dev so the same HTML-grounded insights pipeline that runs against customer apps now runs against irv.dev itself. Project store is never written to; the synth is throwaway.
Single home for every creator-only surface — Platform stats, Waitlist, Feedback, AI cost — with a shielded Admin link in the top bar visible only to the creator email. Server-gated via isCreator(); non-creators are redirected to /app so the route doesn't even leak its existence.
Users were (rightly) complaining about the broad repo scope. New consent screen at /app/connect/github explains exactly what Irv uses GitHub for, then lets you pick Public repos only (public_repo, recommended for Lovable/Bolt/Replit apps) or All repos (repo, for private code). Per-repo GitHub-App installations are the next step.
Thumbnail-scale view of every widget on the canvas with a viewport rectangle showing what you're looking at. Click anywhere on the minimap to recenter. Useful once boards have 15+ widgets.
Per-canvas opt-in toggle. Flip on, get /canvas/<slug>. Read-only. Numbers frozen at share time so people see what you saw, not a moving target. The interpretation prose Irv wrote on each connection travels with the share.
Daily Brief gets an "Open on canvas" button (drops the whole brief — metrics + cohorts + priorities-as-notes — onto a fresh board). Per-priority pills on each "what moved" row. Change-effects rows get pills too. Top pages list batches the top 5 onto a fresh canvas. Causation correlation rows drop both metrics + the Pearson r as a note.
Toggle digests on at /app/account → demo email lands in your inbox immediately, with a yellow "this is a test" banner so you know the data isn't yours. Same renderer as the cron-triggered digest, so what you see is what you'll get. "Send test email" button stays available for re-sends.
Three starter investigations (Pricing, Signup deep-dive, Revenue cohort spread) — each materializes against your live analytics so connection labels are populated on first load. Magic Wand multi-selects widgets and writes an AI summary connected to all of them. Tidy button auto-layouts the board grouped by widget type.
New surface at /app/<id>/canvas. Drop metrics, pages, cohorts, commits onto a freeform board; shift + drag between two widgets and Irv writes the analytical interpretation onto the line. Pearson + p-value for metric × metric, cohort share for metric × cohort, page share for metric × page. Reuses the existing lib/stats engines — instant, deterministic, free.
Reframed as "AI tool that ships analytics for you" with three concrete acts (Morning Brief / PR bot / Ask Irv). Sub-hero strip pulls Dashboard / Claude Desktop / CLI / Email up front so the multi-surface story lands above the fold. v1 + v2 kept as ?v=1 / ?v=2 revert paths.
Opt-in toggle in project settings spins up /changelog/<slug> for any project. Auto-generated from your commits + shipped prompts paired with their measured metric impact. No manual posts to write.
The PR-review bot already detected new buttons / forms without nearby irv.track() and suggested the right event names. Now it goes the rest of the way: opens a companion PR with the actual code change patched in.
Three layers on top of the Phase 1 token split. PII redaction on ingest (emails / phones / SSNs / IPs). Per-project Origin allowlist for ingest. 1000 reqs/min sliding window per read token, token-scoped so leaked bots can't burn the owner's quota.
Pre-fix, the same pk_live_… key was both the SDK ingest token (visible in your customer's HTML) AND the dashboard read token. Now they're separate: ingest keys are write-only, read tokens (irv_read_…, SHA-256 hashed at rest) are required for every read endpoint. 9 endpoints locked.
Button next to the range picker. Ask in plain English ("why did /pricing bounce go up this week?"), get an answer with citations + a collapsible "how I checked" trace listing every analytics tool the LLM called. Multi-turn tool-use loop, ~$0.02-0.05 per question.
FDR-corrected proportion z-tests across every dimension × metric combination. Surfaces the segments where bounce / errors / 404s deviate from the global baseline ("mobile-Safari users on /pricing bounce 3x baseline, q=0.003"). Fed into the daily brief automatically.
Six sections: headline · tl;dr · what moved · ranked priorities (action / expected impact / why-now) · EOD watchpoints · continuity from yesterday. Generated daily, ~$0.05 per run. Voice rules enforced: specific, observation-vs-hypothesis discipline, no fluff.
No Ship-to-AI click required. Every commit, shipped prompt, and tracking-plan change gets the [-3d, +3d] before/after delta computed automatically. Verdicts: positive / negative / inconclusive (within ±5% noise). Confidence scales with magnitude × sample size.
Connect GitHub. Open a PR. Bot parses the diff, finds new buttons / forms without irv.track(), flags removed tracking calls, surfaces the page-traffic impact, links any past insights touching the same files. Updates the same comment on subsequent pushes.
Three weighted components: form coverage (40%) · declared events firing in last 30d (30%) · top-clicked elements matching tracked events (30%). Surfaces severity-sorted gaps with snake_case event-name suggestions. Updates on every push.
Every insight gets a 0-100 confidence badge — LLM-emitted, then deterministically recalibrated by hard evidence (commit_sha bumps +10, missing metric_refs −20, anomaly without metric_refs −25). Ranked top-3 candidates panel shows what was ruled out, not just what won.
Channel grouping (Direct / Search / Social / Email / Paid / Referral with regional Google TLDs and 25 social hosts), new-vs-returning split, 24-hour UTC heatmap, top-clicked element per page.
Five new SDK autocaptures: $form_submit (field counts only, never values), $click_outbound with destination host, $scroll_milestone at 25/50/75/100%, $error for sync + unhandled rejections, $page_not_found via heuristic + manual irv.notFound() API.
npm i -g irv-cli then irv stats --range=30d. Fourteen commands talking to the same MCP endpoint Claude Desktop uses. Read-only and stable across releases.
Add Irv as a Model Context Protocol server. Then ask Claude things like "what's the highest-priority fix on my SaaS this week?" and it calls Irv's tools to pull real numbers + return a tool-driven answer.
Visitors, prompts shipped, outcomes measured, top insights — opt-in, hour-of-day configurable per user. Sent via Resend.
Vercel Speed Insights tracks Core Web Vitals on the dashboard itself. @next/bundle-analyzer integrated for shipping leaner JS.