- Make product analytics actionable for AI agents.
+
+ Stop ignoring your session replays.
- Run global quickstart once, initialize each repo with{" "}
- vesai init, then use
- replay evidence to generate user stories, group stories, and
- research answers your agents can execute. Commands auto-sync the CLI
- to latest main before running.
+ VES AI watches every PostHog session replay and turns them into rich
+ user stories, product insights, and qualitative learnings your team
+ can actually act on.
@@ -80,35 +39,9 @@ export function Hero() {
View on GitHub
diff --git a/website/components/pipeline.tsx b/website/components/pipeline.tsx
index 76a61fc..92977a4 100644
--- a/website/components/pipeline.tsx
+++ b/website/components/pipeline.tsx
@@ -1,26 +1,31 @@
-import { ArrowRight, BrainCircuit, Download, Play, Rocket } from "lucide-react";
+import { ArrowRight, Rocket } from "lucide-react";
+import GoogleCloud from "./icons/google-cloud";
+import Playwright from "./icons/playwright";
+import PostHog from "./icons/posthog";
import { Section } from "./section";
const steps = [
{
- name: "Quickstart",
- detail: "Configure global runtime + render memory budget",
- icon: Download,
+ name: "Connect",
+ detail: "Pull session replays and events from your PostHog project",
+ icon: ,
},
{
- name: "Init",
- detail: "Create project-scoped .vesai config and workspace",
- icon: Play,
+ name: "Render",
+ detail: "Replay each session in headless Chromium via Playwright",
+ icon: ,
},
{
- name: "Heartbeat",
- detail: "Daemon backfills and continuously analyzes new sessions",
- icon: BrainCircuit,
+ name: "Analyze",
+ detail:
+ "Gemini watches each video and extracts structured insights via Vertex AI",
+ icon: ,
},
{
- name: "Ask",
- detail: "Use user, group, and research commands for decisions",
- icon: Rocket,
+ name: "Act",
+ detail:
+ "User, group, and research intelligence ready for your team or your agents",
+ icon: ,
},
];
@@ -28,27 +33,29 @@ export function Pipeline() {
return (
- How It Works
+ How it works
-
- From machine setup to project intelligence artifacts in four steps.
-
{steps.map((step, i) => (
-
+
{i > 0 && (
)}
-
-
+
+ {step.icon}
{step.name}
-
{step.detail}
+
+ {step.detail}
+
))}
diff --git a/website/components/problem.tsx b/website/components/problem.tsx
new file mode 100644
index 0000000..c457a46
--- /dev/null
+++ b/website/components/problem.tsx
@@ -0,0 +1,52 @@
+import { BarChart3, Bug, Video } from "lucide-react";
+import { Section } from "./section";
+
+const cards = [
+ {
+ icon: Video,
+ stat: "<1% watched",
+ text: "Your team records thousands of sessions. Almost none get reviewed.",
+ },
+ {
+ icon: Bug,
+ stat: "Hidden bugs",
+ text: "Real issues hide in replays nobody has time to watch.",
+ },
+ {
+ icon: BarChart3,
+ stat: "Vibes-based decisions",
+ text: "Product decisions get made on gut feel, not evidence from real user behavior.",
+ },
+];
+
+export function Problem() {
+ return (
+
+
+ The replay graveyard
+
+
+ Your PostHog replays are a gold mine. Nobody's watching them.
+
+
+
+ {cards.map((card) => (
+
+
+
+
+
+ {card.stat}
+
+
+ {card.text}
+
+
+ ))}
+
+
+ );
+}
diff --git a/website/components/solution.tsx b/website/components/solution.tsx
new file mode 100644
index 0000000..b476ce9
--- /dev/null
+++ b/website/components/solution.tsx
@@ -0,0 +1,148 @@
+"use client";
+
+import { useState } from "react";
+import { Section } from "./section";
+
+const levels = [
+ {
+ label: "User",
+ question: "How is bryce@company.com doing?",
+ command: "vesai user bryce@company.com",
+ output: `{
+ "email": "bryce@company.com",
+ "sessionCount": 8,
+ "averageSessionScore": 71,
+ "userScore": 65,
+ "health": "At risk — recurring friction in core workflow",
+ "story": "Power user exploring advanced features across 8 sessions over 7 days. Engagement is growing — session duration increased 40% week-over-week and feature breadth expanded from 3 to 7 unique features used. However, a critical blocker emerged: 3 of 8 sessions ended at the same CSV export timeout when datasets exceeded 10k rows. The user attempted workarounds (filtering down, paginating) but ultimately abandoned each time. Separately, filter state resets on back-navigation forced repeated configuration in every session, adding ~2 minutes of friction per visit. This user is deeply invested in the product but hitting real walls that will drive churn if unresolved.",
+ "sessions": [
+ {
+ "sessionId": "s_a1b2c3",
+ "score": 82,
+ "activeSeconds": 342,
+ "features": ["dashboard", "export", "filters"],
+ "issues": ["Export timeout on large dataset"]
+ },
+ {
+ "sessionId": "s_d4e5f6",
+ "score": 45,
+ "activeSeconds": 89,
+ "features": ["export"],
+ "issues": ["Export timeout", "Rage-clicked export button 4x"]
+ },
+ ...
+ ],
+ "markdownPath": ".vesai/workspace/users/bryce-company-com.md"
+}`,
+ },
+ {
+ label: "Group",
+ question: "How is Acme Corp as a customer?",
+ command: "vesai group acme-inc",
+ output: `{
+ "groupId": "acme-inc",
+ "usersAnalyzed": 4,
+ "score": 58,
+ "health": "Adoption declining — intervention recommended",
+ "story": "Acme Inc onboarded 4 users 3 weeks ago with strong initial engagement across the team. Since then, adoption has fragmented. chen@acme.com and priya@acme.com have gone fully inactive (14+ days, last sessions ended in confusion at the integration setup flow). The two remaining active users — sarah@acme.com and mike@acme.com — show narrowing feature usage, down to just dashboard views and basic filters. No user has completed the integration setup flow, which appears to be the critical adoption gate. Sarah attempted it twice but hit a permissions error both times. The account is at high risk of churning within the next renewal cycle without proactive outreach focused on unblocking integration setup.",
+ "users": [
+ {
+ "email": "sarah@acme.com",
+ "sessions": 12,
+ "score": 68,
+ "health": "Engaged but blocked on integrations"
+ },
+ {
+ "email": "mike@acme.com",
+ "sessions": 6,
+ "score": 61,
+ "health": "Narrowing usage — dashboard only"
+ },
+ {
+ "email": "chen@acme.com",
+ "sessions": 3,
+ "score": 42,
+ "health": "Churned — inactive 18 days"
+ },
+ ...
+ ],
+ "markdownPath": ".vesai/workspace/groups/acme-inc.md"
+}`,
+ },
+ {
+ label: "Research",
+ question: "Why are users abandoning checkout?",
+ command: 'vesai research "why are users abandoning checkout?"',
+ output: `{
+ "question": "why are users abandoning checkout?",
+ "answer": "Checkout abandonment is driven by three compounding factors: shipping cost surprise, mobile form friction, and a distracting promo code field. 62% of users who reach checkout complete it on desktop, but mobile completion drops to just 21%. The primary drop-off point is the shipping address step, where mobile users encounter a silent autocomplete failure that forces manual entry. Users who see shipping costs for the first time at this step are 4.7x more likely to back-navigate than users who saw estimated costs earlier in the funnel.",
+ "findings": [
+ "Address autocomplete fails silently on mobile Safari — users see no error, just an empty field that won't advance",
+ "Shipping cost appears only after full address entry — 38% of users who see it immediately navigate back to cart",
+ "Promo code field is positioned above the purchase CTA and captures 23% of user attention time on the checkout page",
+ "Desktop users who encounter form errors recover 80% of the time; mobile users recover only 27%",
+ "Users who complete checkout in one attempt spend avg 47s; users who encounter any friction spend 3m12s and convert at 31%",
+ ...
+ ],
+ "confidence": "high",
+ "supportingSessionIds": [
+ "s_a8f2c", "s_b91d0", "s_c43e7", "s_d67f1",
+ "s_e82a3", "s_f19b7", "s_g44c2", "s_h55d8",
+ ...
+ ],
+ "sessionsConsidered": 47,
+ "sessionsUsed": 14
+}`,
+ },
+];
+
+export function Solution() {
+ const [activeLevel, setActiveLevel] = useState(0);
+ const level = levels[activeLevel]!;
+
+ return (
+
+
+ AI that watches every session
+
+
+ From individual user stories to account-level intelligence to product
+ research — all from your existing PostHog data.
+
+
+
+
+ {levels.map((l, i) => (
+
+ ))}
+
+
+
+
+ “{level.question}”
+
+
+ $ {level.command}
+
+
+
+
+ {level.output}
+
+
+
+
+
+ );
+}
diff --git a/website/components/terminal.tsx b/website/components/terminal.tsx
deleted file mode 100644
index 23807ab..0000000
--- a/website/components/terminal.tsx
+++ /dev/null
@@ -1,91 +0,0 @@
-"use client";
-
-import { useState } from "react";
-import type { TerminalLine } from "../lib/terminal-content";
-import { terminalTabs } from "../lib/terminal-content";
-
-function Line({ line }: { line: TerminalLine }) {
- if (line.type === "blank") {
- return ;
- }
-
- if (line.type === "prompt") {
- return (
-