diff --git a/apps/web/app/Pricing/page.tsx b/apps/web/app/Pricing/page.tsx
new file mode 100644
index 0000000..049b42c
--- /dev/null
+++ b/apps/web/app/Pricing/page.tsx
@@ -0,0 +1,131 @@
+'use client';
+
+import React from 'react';
+
+export default function PricingPage() {
+ return (
+
+
+
+
+ {'// WHY OPSCORD'}
+
+
+ Your current tools cost a fortune
+
+
+ And they still don't tell you the root cause.
+
+
+
+
+
+
+ {['Tool', 'Causality AI', 'Real-time', 'Unified View', 'Price/mo'].map((h) => (
+ |
+ {h}
+ |
+ ))}
+
+
+
+ {[
+ { tool: 'PagerDuty', ai: '✗', rt: '✓', uv: 'partial', price: '$299' },
+ { tool: 'Datadog APM', ai: '✗', rt: '✓', uv: '✗', price: '$420' },
+ { tool: 'OpsGenie', ai: '✗', rt: 'partial', uv: '✗', price: '$198' },
+ { tool: 'OpsCord', ai: '✓', rt: '✓', uv: '✓', price: 'TBD', highlight: true },
+ ].map((row) => (
+
+ |
+ {row.tool}
+ |
+ {[row.ai, row.rt, row.uv].map((val, j) => (
+
+
+ {val}
+
+ |
+ ))}
+
+ {row.highlight ? (
+ {row.price}
+ ) : (
+ row.price
+ )}
+ |
+
+ ))}
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/apps/web/app/architecture/page.tsx b/apps/web/app/architecture/page.tsx
new file mode 100644
index 0000000..1ceaaa2
--- /dev/null
+++ b/apps/web/app/architecture/page.tsx
@@ -0,0 +1,64 @@
+'use client';
+
+import React from 'react';
+import dynamic from 'next/dynamic';
+
+const ArchitectureDiagram = dynamic(() => import('@/components/ArchitectureDiagram'), { ssr: false });
+
+export default function ArchitecturePage() {
+ return (
+
+
+
+
+ {'// ARCHITECTURE'}
+
+
+ Built to scale
+
+
+ Event-driven microservices. PostgreSQL + Redis + SQS. Express.js REST API.
+
+
+
+
+
+ {[
+ { label: '10 services', c: '#3b82f6' },
+ { label: '3 data stores', c: '#7c3aed' },
+ { label: '4 input sources', c: '#10b981' },
+ ].map((p) => (
+
+ {p.label}
+
+ ))}
+
+
+
+
+ );
+}
diff --git a/apps/web/app/components/Navbar.tsx b/apps/web/app/components/Navbar.tsx
new file mode 100644
index 0000000..2412133
--- /dev/null
+++ b/apps/web/app/components/Navbar.tsx
@@ -0,0 +1,138 @@
+'use client';
+
+import React, { useState } from 'react';
+import Link from 'next/link';
+
+function PulsingDot({ color = '#ef4444', size = 7 }: { color?: string; size?: number }) {
+ return (
+
+ );
+}
+
+function MobileMenu({ open, onClose }: { open: boolean; onClose: () => void }) {
+ if (!open) return null;
+ return (
+
+ {[
+ { label: 'Features', href: '/features' },
+ { label: 'How It Works', href: '/how-it-works' },
+ { label: 'Architecture', href: '/architecture' },
+ { label: 'Pricing', href: '/pricing' },
+ ].map((l) => (
+
+ {l.label}
+
+ ))}
+
+ );
+}
+
+export function Navbar() {
+ const [menuOpen, setMenuOpen] = useState(false);
+
+ return (
+ <>
+ setMenuOpen(false)} />
+
+
+ >
+ );
+}
\ No newline at end of file
diff --git a/apps/web/app/features/pages.tsx b/apps/web/app/features/pages.tsx
new file mode 100644
index 0000000..78ef2ac
--- /dev/null
+++ b/apps/web/app/features/pages.tsx
@@ -0,0 +1,399 @@
+'use client';
+
+import React, { useState, useEffect } from 'react';
+
+export default function FeaturesPage() {
+ const [epsCount, setEpsCount] = useState(847);
+
+ useEffect(() => {
+ const iv = setInterval(() => setEpsCount(800 + Math.floor(Math.random() * 100)), 3000);
+ return () => clearInterval(iv);
+ }, []);
+
+ return (
+
+
+ {'// CAPABILITIES'}
+
+
+ Everything your on-call team needs
+
+
+ From raw webhook noise to a ranked root-cause list in under 40ms.
+
+
+
+ {/* Card 1 — Causality Scoring */}
+
+
+
+ Core AI
+
+
🔍
+
+ Causality Scoring Engine
+
+
+ AI ranks which event caused the incident. Not just correlation — actual root cause
+ with per-event confidence scores and signal ranking.
+
+
+ {['root cause', 'confidence %', 'multi-signal', 'ranked list'].map((t) => (
+
+ {t}
+
+ ))}
+
+
+
+ {/* Card 2 — Real-Time Ingestion */}
+
+
+ Event Layer
+
+
⚡
+
Real-Time Ingestion
+
+ Webhooks, API watch & polling. Express.js receiver processes all sources in under
+ 40ms p99 with Redis-backed deduplication.
+
+
+
+ events / second
+
+
+ {epsCount}
+
+
+
+
+ {/* Card 3 — Unified Incident View (span 2) */}
+
+
+
+ Dashboard
+
+
+ 🎯 Unified Incident View
+
+
+ Every incident, every source, every signal — one dashboard. Ranked by causality,
+ filterable by severity, and updated in real-time.
+
+
+
+
+ ACTIVE INCIDENTS
+
+ {[
+ {
+ dot: '#ef4444',
+ title: 'K8s pod crash → deploy #2847',
+ sev: 'Critical',
+ sevC: '#ef4444',
+ },
+ { dot: '#f97316', title: 'Redis cache miss storm', sev: 'High', sevC: '#f97316' },
+ { dot: '#eab308', title: 'GitHub webhook spike', sev: 'Medium', sevC: '#eab308' },
+ ].map((r, i) => (
+
+
+
+ {r.title}
+
+
+ {r.sev}
+
+
+ ))}
+
+
+
+ {/* Card 4 — Multi-Source Intelligence */}
+
+
+ Integrations
+
+
🔗
+
+ Multi-Source Intelligence
+
+
+ All normalized into one event stream. One schema. One place.
+
+
+ {[
+ { name: 'CircleCI', c: '#00D4AA' },
+ { name: 'GitHub', c: '#f0883e' },
+ { name: 'Kubernetes', c: '#326CE5' },
+ { name: 'Datadog', c: '#a78bfa' },
+ ].map((s) => (
+
+ {s.name}
+
+ ))}
+
+
+
+ {/* Card 5 — Instant Alerting */}
+
+
+ Outputs
+
+
🔔
+
Instant Alerting
+
+ Push causality-ranked summaries to your team instantly. Fully programmable via REST
+ API.
+
+
+ {['Slack Bot', 'React Dashboard', 'Webhooks API', 'Mobile App'].map((t) => (
+
+ {t}
+
+ ))}
+
+
+
+ }
+
+
+ );
diff --git a/apps/web/app/how-it-works/pages.tsx b/apps/web/app/how-it-works/pages.tsx
new file mode 100644
index 0000000..89aab74
--- /dev/null
+++ b/apps/web/app/how-it-works/pages.tsx
@@ -0,0 +1,288 @@
+'use client';
+
+import React from 'react';
+import dynamic from 'next/dynamic';
+
+const EventFeed = dynamic(() => import('@/components/EventFeed'), { ssr: false });
+
+function PulsingDot({ color = '#ef4444', size = 7 }: { color?: string; size?: number }) {
+ return (
+
+ );
+}
+
+export default function HowItWorksPage() {
+ return (
+
+ {/* ── HOW IT WORKS ── */}
+
+
+
+ {'// PIPELINE'}
+
+
+ From noise to root cause
+
+
+ Four stages. Sub-second. Every time.
+
+
+
+ {[
+ {
+ num: '01',
+ icon: '📥',
+ label: 'Events In',
+ color: '#3b82f6',
+ body: 'CircleCI, GitHub, K8s & Datadog push events via webhooks or polling',
+ },
+ {
+ num: '02',
+ icon: '⚙️',
+ label: 'Normalize',
+ color: '#6366f1',
+ body: 'Event Processor & Normalizer creates a unified event schema',
+ },
+ {
+ num: '03',
+ icon: '🧠',
+ label: 'AI Score',
+ color: '#7c3aed',
+ body: 'Causality Scoring Engine ranks root causes with confidence scores',
+ },
+ {
+ num: '04',
+ icon: '📣',
+ label: 'Alert Team',
+ color: '#38bdf8',
+ body: 'Results delivered to Slack, Dashboard & Webhooks. Sub-second.',
+ },
+ ].map((step, i) => (
+
(e.currentTarget.style.background = 'rgba(255,255,255,0.03)')}
+ onMouseLeave={(e) => (e.currentTarget.style.background = 'transparent')}
+ >
+
+ STEP {step.num}
+
+
{step.icon}
+
+ {step.label}
+
+
{step.body}
+
+ ))}
+
+
+
+
+ {/* ── LIVE EVENT DEMO ── */}
+
+
+ {/* Left */}
+
+
+ {'// LIVE DEMO'}
+
+
+ Watch it work
+
+
+ This simulation shows how OpsCord processes real-time events and produces causality
+ scores for active incidents.
+
+
+ {/* Causality Scores */}
+
+
+ ◆ CAUSALITY SCORE · latest incident
+
+ {[
+ { label: 'K8s pod OOMKilled', pct: 87, color: '#ef4444' },
+ { label: 'CircleCI deploy #2847', pct: 64, color: '#f97316' },
+ { label: 'Redis cache miss', pct: 31, color: '#eab308' },
+ ].map((bar) => (
+
+
+ {bar.label}
+
+ {bar.pct}%
+
+
+
+
+ ))}
+
+
+ {/* Root Cause Box */}
+
+
+ ROOT CAUSE IDENTIFIED
+
+
+ 🔍 K8s pod OOMKilled
+
+
+ Confidence: 87% · 3 contributing factors
+
+
+
+
+ {/* Right — Live Event Feed */}
+
+
+
+
+ LIVE
+
+
+ streaming events
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx
index 97092d1..bddce55 100644
--- a/apps/web/app/layout.tsx
+++ b/apps/web/app/layout.tsx
@@ -24,7 +24,10 @@ export default function RootLayout({ children }: { children: React.ReactNode })
return (
- {children}
+
+
+ {children}
+
);
diff --git a/apps/web/app/page.tsx b/apps/web/app/page.tsx
index c0e4aff..c5efb17 100644
--- a/apps/web/app/page.tsx
+++ b/apps/web/app/page.tsx
@@ -33,37 +33,6 @@ function PulsingDot({ color = '#ef4444', size = 7 }: { color?: string; size?: nu
);
}
-/* ── Mobile Menu ──────────────────────────── */
-function MobileMenu({ open, onClose }: { open: boolean; onClose: () => void }) {
- if (!open) return null;
- return (
-
- {['Features', 'How It Works', 'Architecture', 'Pricing'].map((l) => (
-
- {l}
-
- ))}
-
- );
-}
/* ── Inline Event Card for Hero ───────────── */
function MiniEventPreview() {
@@ -179,7 +148,7 @@ function MiniEventPreview() {
/* LANDING PAGE */
/* ═══════════════════════════════════════════ */
export default function LandingPage() {
- const [menuOpen, setMenuOpen] = useState(false);
+
const [archOpen, setArchOpen] = useState(false);
const [toast, setToast] = useState(false);
const [email, setEmail] = useState('');
@@ -289,85 +258,9 @@ export default function LandingPage() {
)}
- setMenuOpen(false)} />
+
- {/* ── NAVBAR ──────────────────────── */}
-
+
{/* ── HERO ────────────────────────── */}
- {/* ── FEATURES BENTO GRID ─────────── */}
-
-
- {'// CAPABILITIES'}
-
-
- Everything your on-call team needs
-
-
- From raw webhook noise to a ranked root-cause list in under 40ms.
-
+
-
- {/* Card 1 — Causality Scoring */}
-
-
-
- Core AI
-
-
🔍
-
- Causality Scoring Engine
-
-
- AI ranks which event caused the incident. Not just correlation — actual root cause
- with per-event confidence scores and signal ranking.
-
-
- {['root cause', 'confidence %', 'multi-signal', 'ranked list'].map((t) => (
-
- {t}
-
- ))}
-
-
+
- {/* Card 2 — Real-Time Ingestion */}
-
-
- Event Layer
-
-
⚡
-
Real-Time Ingestion
-
- Webhooks, API watch & polling. Express.js receiver processes all sources in under
- 40ms p99 with Redis-backed deduplication.
-
-
-
- events / second
-
-
- {epsCount}
-
-
-
-
- {/* Card 3 — Unified Incident View (span 2) */}
-
-
-
- Dashboard
-
-
- 🎯 Unified Incident View
-
-
- Every incident, every source, every signal — one dashboard. Ranked by causality,
- filterable by severity, and updated in real-time.
-
-
-
-
- ACTIVE INCIDENTS
-
- {[
- {
- dot: '#ef4444',
- title: 'K8s pod crash → deploy #2847',
- sev: 'Critical',
- sevC: '#ef4444',
- },
- { dot: '#f97316', title: 'Redis cache miss storm', sev: 'High', sevC: '#f97316' },
- { dot: '#eab308', title: 'GitHub webhook spike', sev: 'Medium', sevC: '#eab308' },
- ].map((r, i) => (
-
-
-
- {r.title}
-
-
- {r.sev}
-
-
- ))}
-
-
-
- {/* Card 4 — Multi-Source Intelligence */}
-
-
- Integrations
-
-
🔗
-
- Multi-Source Intelligence
-
-
- All normalized into one event stream. One schema. One place.
-
-
- {[
- { name: 'CircleCI', c: '#00D4AA' },
- { name: 'GitHub', c: '#f0883e' },
- { name: 'Kubernetes', c: '#326CE5' },
- { name: 'Datadog', c: '#a78bfa' },
- ].map((s) => (
-
- {s.name}
-
- ))}
-
-
+
- {/* Card 5 — Instant Alerting */}
-
-
- Outputs
-
-
🔔
-
Instant Alerting
-
- Push causality-ranked summaries to your team instantly. Fully programmable via REST
- API.
-
-
- {['Slack Bot', 'React Dashboard', 'Webhooks API', 'Mobile App'].map((t) => (
-
- {t}
-
- ))}
-
-
-
-
-
- {/* ── HOW IT WORKS ───────────────── */}
-
-
-
- {'// PIPELINE'}
-
-
- From noise to root cause
-
-
- Four stages. Sub-second. Every time.
-
-
-
- {[
- {
- num: '01',
- icon: '📥',
- label: 'Events In',
- color: '#3b82f6',
- body: 'CircleCI, GitHub, K8s & Datadog push events via webhooks or polling',
- },
- {
- num: '02',
- icon: '⚙️',
- label: 'Normalize',
- color: '#6366f1',
- body: 'Event Processor & Normalizer creates a unified event schema',
- },
- {
- num: '03',
- icon: '🧠',
- label: 'AI Score',
- color: '#7c3aed',
- body: 'Causality Scoring Engine ranks root causes with confidence scores',
- },
- {
- num: '04',
- icon: '📣',
- label: 'Alert Team',
- color: '#38bdf8',
- body: 'Results delivered to Slack, Dashboard & Webhooks. Sub-second.',
- },
- ].map((step, i) => (
-
(e.currentTarget.style.background = 'rgba(255,255,255,0.03)')}
- onMouseLeave={(e) => (e.currentTarget.style.background = 'transparent')}
- >
-
- STEP {step.num}
-
-
{step.icon}
-
- {step.label}
-
-
{step.body}
-
- ))}
-
-
-
-
- {/* ── LIVE EVENT DEMO ─────────────── */}
-
-
- {/* Left */}
-
-
- {'// LIVE DEMO'}
-
-
- Watch it work
-
-
- This simulation shows how OpsCord processes real-time events and produces causality
- scores for active incidents.
-
-
- {/* Causality Scores */}
-
-
- ◆ CAUSALITY SCORE · latest incident
-
- {[
- { label: 'K8s pod OOMKilled', pct: 87, color: '#ef4444' },
- { label: 'CircleCI deploy #2847', pct: 64, color: '#f97316' },
- { label: 'Redis cache miss', pct: 31, color: '#eab308' },
- ].map((bar) => (
-
-
- {bar.label}
-
- {bar.pct}%
-
-
-
-
- ))}
-
-
- {/* Root Cause Box */}
-
-
- ROOT CAUSE IDENTIFIED
-
-
- 🔍 K8s pod OOMKilled
-
-
- Confidence: 87% · 3 contributing factors
-
-
-
-
- {/* Right — Live Event Feed */}
-
-
-
-
- LIVE
-
-
- streaming events
-
-
-
-
-
-
-
- {/* ── ARCHITECTURE ───────────────── */}
-
-
-
- {'// ARCHITECTURE'}
-
-
- Built to scale
-
-
- Event-driven microservices. PostgreSQL + Redis + SQS. Express.js REST API.
-
-
-
-
-
- {[
- { label: '10 services', c: '#3b82f6' },
- { label: '3 data stores', c: '#7c3aed' },
- { label: '4 input sources', c: '#10b981' },
- ].map((p) => (
-
- {p.label}
-
- ))}
-
-
-
-
- {/* ── COMPETITOR COMPARISON ─────── */}
-
-
-
- {'// WHY OPSCORD'}
-
-
- Your current tools cost a fortune
-
-
- And they still don't tell you the root cause.
-
-
-
-
-
-
- {['Tool', 'Causality AI', 'Real-time', 'Unified View', 'Price/mo'].map((h) => (
- |
- {h}
- |
- ))}
-
-
-
- {[
- { tool: 'PagerDuty', ai: '✗', rt: '✓', uv: 'partial', price: '$299' },
- { tool: 'Datadog APM', ai: '✗', rt: '✓', uv: '✗', price: '$420' },
- { tool: 'OpsGenie', ai: '✗', rt: 'partial', uv: '✗', price: '$198' },
- { tool: 'OpsCord', ai: '✓', rt: '✓', uv: '✓', price: 'TBD', highlight: true },
- ].map((row) => (
-
- |
- {row.tool}
- |
- {[row.ai, row.rt, row.uv].map((val, j) => (
-
-
- {val}
-
- |
- ))}
-
- {row.highlight ? (
- {row.price}
- ) : (
- row.price
- )}
- |
-
- ))}
-
-
-
-
-
+
+
{/* ── BUILDING IN PUBLIC / WAITLIST ── */}