Previously hidden entirely when NEXT_PUBLIC_GIT_REPO_URL was unset, which meant it never appeared on localhost or on anyone else's clone that hadn't explicitly configured it. It should always point somewhere - the canonical repo (git.ciagent.org) is the sensible default everywhere, overridable only by a deployment that runs its own separate git server. Co-Authored-By: Claude Sonnet 5 <[email protected]>
150 lines
6.4 KiB
TypeScript
150 lines
6.4 KiB
TypeScript
"use client";
|
|
|
|
import Link from "next/link";
|
|
import { Building2, LineChart, Mail, Radar, ShieldCheck, Sparkles } from "lucide-react";
|
|
import { useSystemStatus } from "@/hooks/use-auth";
|
|
import { isLocalConvenience } from "@/lib/auth";
|
|
|
|
// The canonical, authoritative repo - shown by default on every deployment
|
|
// (including someone else's clone running on their own machine) unless
|
|
// NEXT_PUBLIC_GIT_REPO_URL overrides it, e.g. because that clone runs its
|
|
// own self-hosted git server instead of pointing back at this one.
|
|
const CANONICAL_GIT_REPO_URL = "https://git.ciagent.org/saksham/CIAgent";
|
|
|
|
const steps = [
|
|
{
|
|
title: "Add a company",
|
|
body: "Point CI Agent at a competitor's public website and tell it what you actually care about — manufacturing expansion, pricing, hiring, patents, whatever matters to you.",
|
|
icon: Building2,
|
|
},
|
|
{
|
|
title: "Choose a schedule",
|
|
body: "Hourly to monthly, or a custom cron expression. The scheduler picks up changes automatically — no code changes required to add a company.",
|
|
icon: Radar,
|
|
},
|
|
{
|
|
title: "We collect public sources",
|
|
body: "Official site, press releases, RSS/news feeds, SEC filings, GitHub, careers pages, and any custom URLs you add — all fetched through an SSRF-safe, robots.txt-respecting pipeline.",
|
|
icon: ShieldCheck,
|
|
},
|
|
{
|
|
title: "An LLM turns evidence into a report",
|
|
body: "Every claim in the report traces back to a stored source document. Inferences are clearly labeled and confidence-scored — never presented as fact.",
|
|
icon: Sparkles,
|
|
},
|
|
{
|
|
title: "Changes are scored and explained",
|
|
body: "New runs are compared to prior snapshots. Meaningful changes get a severity (Critical/High/Medium/Low) and a confidence score, with noise filtered out.",
|
|
icon: LineChart,
|
|
},
|
|
{
|
|
title: "You get notified",
|
|
body: "Email (and optional SMS) alerts above your chosen severity threshold, with evidence and a link back to the full report in your dashboard.",
|
|
icon: Mail,
|
|
},
|
|
];
|
|
|
|
export default function LandingPage() {
|
|
const { data: systemStatus } = useSystemStatus();
|
|
const isLocalhost = systemStatus ? isLocalConvenience(systemStatus) : false;
|
|
|
|
return (
|
|
<main className="min-h-screen">
|
|
<header className="border-b border-slate-200 bg-white">
|
|
<div className="mx-auto flex max-w-6xl items-center justify-between px-6 py-4">
|
|
<span className="text-lg font-semibold tracking-tight text-slate-900">CI Agent</span>
|
|
<nav className="flex items-center gap-3">
|
|
<a
|
|
href={process.env.NEXT_PUBLIC_GIT_REPO_URL || CANONICAL_GIT_REPO_URL}
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
className="rounded-md px-3 py-2 text-sm font-medium text-slate-700 hover:bg-slate-100"
|
|
>
|
|
Git Repository
|
|
</a>
|
|
<Link
|
|
href="/login"
|
|
className="rounded-md px-3 py-2 text-sm font-medium text-slate-700 hover:bg-slate-100"
|
|
>
|
|
Sign in
|
|
</Link>
|
|
<Link
|
|
href="/register"
|
|
className="rounded-md px-3 py-2 text-sm font-medium text-slate-700 hover:bg-slate-100"
|
|
>
|
|
Create account
|
|
</Link>
|
|
<Link
|
|
href="/dashboard"
|
|
className="focus-ring rounded-md bg-brand-600 px-3 py-2 text-sm font-semibold text-white hover:bg-brand-700"
|
|
>
|
|
{isLocalhost ? "Open dashboard (local mode)" : "Open dashboard"}
|
|
</Link>
|
|
</nav>
|
|
</div>
|
|
</header>
|
|
|
|
<section className="mx-auto max-w-4xl px-6 py-20 text-center">
|
|
<h1 className="text-4xl font-bold tracking-tight text-slate-900 sm:text-5xl">
|
|
Know what your competitors are doing —{" "}
|
|
<span className="text-brand-600">before it shows up on your roadmap.</span>
|
|
</h1>
|
|
<p className="mx-auto mt-6 max-w-2xl text-lg text-slate-600">
|
|
CI Agent monitors the companies you choose, collects only publicly available information,
|
|
and turns it into evidence-linked intelligence reports with severity- and
|
|
confidence-scored alerts.
|
|
</p>
|
|
<div className="mt-8 flex items-center justify-center gap-3">
|
|
<Link
|
|
href="/dashboard"
|
|
className="focus-ring rounded-md bg-brand-600 px-5 py-3 text-sm font-semibold text-white shadow-sm hover:bg-brand-700"
|
|
>
|
|
{isLocalhost ? "Try it in local mode" : "Try it now"}
|
|
</Link>
|
|
<Link
|
|
href="/register"
|
|
className="focus-ring rounded-md border border-slate-300 bg-white px-5 py-3 text-sm font-semibold text-slate-800 hover:bg-slate-50"
|
|
>
|
|
Create an account
|
|
</Link>
|
|
</div>
|
|
</section>
|
|
|
|
<section className="border-t border-slate-200 bg-white py-16">
|
|
<div className="mx-auto max-w-6xl px-6">
|
|
<h2 className="text-center text-2xl font-semibold text-slate-900">
|
|
How monitoring works
|
|
</h2>
|
|
<div className="mt-10 grid gap-8 sm:grid-cols-2 lg:grid-cols-3">
|
|
{steps.map((step) => (
|
|
<div key={step.title} className="rounded-lg border border-slate-200 p-6">
|
|
<step.icon className="h-6 w-6 text-brand-600" aria-hidden />
|
|
<h3 className="mt-4 font-semibold text-slate-900">{step.title}</h3>
|
|
<p className="mt-2 text-sm leading-relaxed text-slate-600">{step.body}</p>
|
|
</div>
|
|
))}
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<section className="border-t border-slate-200 bg-slate-900 py-14 text-slate-100">
|
|
<div className="mx-auto max-w-4xl px-6 text-center">
|
|
<h2 className="text-xl font-semibold">Only publicly available information</h2>
|
|
<p className="mx-auto mt-3 max-w-2xl text-sm leading-relaxed text-slate-300">
|
|
CI Agent never bypasses CAPTCHAs, login walls, paywalls, or anti-bot controls, and
|
|
respects robots.txt. Every source document keeps its original URL and retrieval
|
|
timestamp, and every source failure is recorded transparently — a report is never
|
|
presented as complete when a source failed to collect.
|
|
</p>
|
|
</div>
|
|
</section>
|
|
|
|
<footer className="bg-white py-8">
|
|
<p className="text-center text-xs text-slate-500">
|
|
CI Agent — local-first competitive intelligence monitoring.
|
|
</p>
|
|
</footer>
|
|
</main>
|
|
);
|
|
}
|