Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
131 changes: 131 additions & 0 deletions apps/web/app/Pricing/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
'use client';

import React from 'react';

export default function PricingPage() {
return (
<main>
<section id="pricing" style={{ padding: '60px 5vw', borderTop: '1px solid var(--border)' }}>
<div style={{ maxWidth: 800, margin: '0 auto' }}>
<p className="section-label" style={{ color: 'var(--amber)', marginBottom: 12 }}>
{'// WHY OPSCORD'}
</p>
<h2
style={{
fontWeight: 800,
fontSize: 'clamp(26px,4vw,46px)',
letterSpacing: '-0.025em',
marginBottom: 12,
}}
>
Your current tools cost a fortune
</h2>
<p style={{ color: 'var(--muted)', fontSize: 16, marginBottom: 40, lineHeight: 1.75 }}>
And they still don&apos;t tell you the root cause.
</p>

<div className="card" style={{ overflow: 'auto', padding: 0 }}>
<table style={{ width: '100%', borderCollapse: 'collapse', fontSize: 13 }}>
<thead>
<tr
style={{
background: 'rgba(255,255,255,0.03)',
borderBottom: '1px solid var(--border)',
}}
>
{['Tool', 'Causality AI', 'Real-time', 'Unified View', 'Price/mo'].map((h) => (
<th
key={h}
style={{
padding: '14px 16px',
textAlign: 'left',
fontFamily: 'var(--font-space-mono)',
fontSize: 11,
color: 'var(--muted)',
textTransform: 'uppercase',
letterSpacing: '0.06em',
fontWeight: 600,
}}
>
{h}
</th>
))}
</tr>
</thead>
<tbody>
{[
{ 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) => (
<tr
key={row.tool}
style={{
borderBottom: '1px solid rgba(99,139,255,0.08)',
background: row.highlight ? 'rgba(99,102,241,0.1)' : undefined,
...(row.highlight
? {
boxShadow: 'inset 0 0 0 1px rgba(99,102,241,0.3)',
}
: {}),
}}
>
<td style={{ padding: '12px 16px', fontWeight: row.highlight ? 700 : 400 }}>
{row.tool}
</td>
{[row.ai, row.rt, row.uv].map((val, j) => (
<td key={j} style={{ padding: '12px 16px' }}>
<span
style={{
fontFamily: 'var(--font-space-mono)',
fontSize: 11,
fontWeight: 700,
padding: '2px 10px',
borderRadius: 6,
...(val === '✓'
? {
background: 'rgba(16,185,129,0.15)',
color: '#10b981',
border: '1px solid rgba(16,185,129,0.3)',
}
: val === '✗'
? {
background: 'rgba(239,68,68,0.15)',
color: '#ef4444',
border: '1px solid rgba(239,68,68,0.3)',
}
: {
background: 'rgba(245,158,11,0.15)',
color: '#f59e0b',
border: '1px solid rgba(245,158,11,0.3)',
}),
}}
>
{val}
</span>
</td>
))}
<td
style={{
padding: '12px 16px',
fontFamily: 'var(--font-space-mono)',
fontSize: 13,
}}
>
{row.highlight ? (
<span style={{ color: 'var(--sky)', fontWeight: 700 }}>{row.price}</span>
) : (
row.price
)}
</td>
</tr>
))}
</tbody>
</table>
</div>
</div>
</section>
</main>
);
}
64 changes: 64 additions & 0 deletions apps/web/app/architecture/page.tsx
Original file line number Diff line number Diff line change
@@ -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 (
<main>
<section
style={{
padding: '80px 5vw',
borderTop: '1px solid var(--border)',
background: 'rgba(99,139,255,0.02)',
}}
>
<div style={{ maxWidth: 1080, margin: '0 auto' }}>
<p className="section-label" style={{ color: 'var(--blue)', marginBottom: 12 }}>
{'// ARCHITECTURE'}
</p>
<h2
style={{
fontWeight: 800,
fontSize: 'clamp(26px,4vw,46px)',
letterSpacing: '-0.025em',
marginBottom: 12,
}}
>
Built to <span className="gradient-text">scale</span>
</h2>
<p style={{ color: 'var(--muted)', fontSize: 16, marginBottom: 40, lineHeight: 1.75 }}>
Event-driven microservices. PostgreSQL + Redis + SQS. Express.js REST API.
</p>

<ArchitectureDiagram />

<div style={{ display: 'flex', justifyContent: 'center', gap: 12, marginTop: 24 }}>
{[
{ label: '10 services', c: '#3b82f6' },
{ label: '3 data stores', c: '#7c3aed' },
{ label: '4 input sources', c: '#10b981' },
].map((p) => (
<span
key={p.label}
style={{
fontSize: 12,
fontWeight: 600,
padding: '7px 16px',
borderRadius: 20,
background: p.c + '18',
border: `1px solid ${p.c}44`,
color: p.c,
}}
>
{p.label}
</span>
))}
</div>
</div>
</section>
</main>
);
}
138 changes: 138 additions & 0 deletions apps/web/app/components/Navbar.tsx
Original file line number Diff line number Diff line change
@@ -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 (
<span
style={{
display: 'inline-block', width: size, height: size,
borderRadius: '50%', background: color,
animation: 'pulse 1.4s infinite', flexShrink: 0,
}}
/>
);
}

function MobileMenu({ open, onClose }: { open: boolean; onClose: () => void }) {
if (!open) return null;
return (
<div
style={{
position: 'fixed', inset: 0, background: 'rgba(5,10,20,0.95)',
zIndex: 200, display: 'flex', flexDirection: 'column',
alignItems: 'center', justifyContent: 'center', gap: 24,
}}
onClick={onClose}
>
{[
{ label: 'Features', href: '/features' },
{ label: 'How It Works', href: '/how-it-works' },
{ label: 'Architecture', href: '/architecture' },
{ label: 'Pricing', href: '/pricing' },
].map((l) => (
<Link
key={l.label}
href={l.href}
style={{ color: '#f1f5f9', fontSize: 20, fontWeight: 600, textDecoration: 'none' }}
onClick={onClose}
>
{l.label}
</Link>
))}
</div>
);
}

export function Navbar() {
const [menuOpen, setMenuOpen] = useState(false);

return (
<>
<MobileMenu open={menuOpen} onClose={() => setMenuOpen(false)} />

<nav className="sticky top-0 z-50 h-14 sm:h-16 px-4 sm:px-6 lg:px-[5vw] flex items-center justify-between bg-[rgba(5,10,20,0.85)] backdrop-blur-[16px] border-b border-border">
<span
className="gradient-text"
style={{ fontFamily: 'var(--font-space-mono)', fontSize: 20, fontWeight: 700 }}
>
OpsCord
</span>

<div className="hidden md:flex items-center gap-7">
{[
{ label: 'Features', href: '/features' },
{ label: 'How It Works', href: '/how-it-works' },
{ label: 'Architecture', href: '/architecture' },
{ label: 'Pricing', href: '/pricing' },
].map((l) => (
<Link
key={l.label}
href={l.href}
style={{
fontSize: 13,
color: 'var(--muted)',
textDecoration: 'none',
transition: 'color 0.2s',
}}
onMouseEnter={(e) => (e.currentTarget.style.color = '#f1f5f9')}
onMouseLeave={(e) => (e.currentTarget.style.color = 'var(--muted)')}
>
{l.label}
</Link>
))}
</div>

<div className="flex items-center gap-2 sm:gap-3 min-w-0">
<div className="hidden sm:flex items-center gap-2">
<div className="inline-flex items-center gap-2 rounded-full border border-[rgba(220,38,38,0.35)] bg-[rgba(220,38,38,0.12)] px-3 py-1">
<PulsingDot />
<span
className="font-space-mono text-[10px] uppercase tracking-[0.1em]"
style={{ color: '#fca5a5' }}
>
SEED STAGE
</span>
</div>

<Link
href="/analyzer"
className="inline-flex rounded-lg border border-[rgba(99,102,241,0.3)] bg-[rgba(99,102,241,0.1)] px-3 py-2 text-sm text-[#818cf8] transition-colors"
>
Code Analyzer
</Link>

<Link
href="/sign-in"
className="inline-flex rounded-lg border border-border px-3 py-2 text-sm text-text transition-colors"
>
Sign In
</Link>
</div>

<Link
href="/sign-up"
className="hidden sm:inline-flex items-center rounded-xl bg-gradient-to-br from-blue-500 to-violet-500 px-3 py-2 text-sm font-semibold text-white shadow-[0_0_20px_rgba(99,102,241,0.3)]"
>
Get Early Access →
</Link>

<button
className="md:hidden ml-2 text-2xl flex items-center justify-center"
onClick={() => setMenuOpen(true)}
style={{
background: 'none',
border: 'none',
color: 'var(--text)',
cursor: 'pointer',
padding: '4px',
}}
>
</button>
</div>
</nav>
</>
);
}
Loading
Loading