import React, { useEffect, useRef, useState } from "react";
import "./landing.css";
// Premium GitPilot landing page — dark, minimal, animated.
// Public page only: "Get started" / "Sign in" route to the separate /auth page.
const GITHUB_URL = "https://github.com/ruslanmv/gitpilot";
const DOCS_URL = "https://ruslanmv.com/gitpilot/";
// --- tiny inline icons (no dependencies) ----------------------------------
const I = {
shield: ,
target: ,
code: ,
brain: ,
map: ,
bolt: ,
check2: ,
bot: ,
home: ,
flow: ,
gear: ,
copy: ,
ext: ,
lock: ,
arrowL: ,
arrowR: ,
ask: ,
play: ,
eye: ,
git: ,
};
// The multi-agent pipeline — the heart of GitPilot, shown as a carousel.
const AGENTS = [
{
n: "01", name: "Explorer", role: "Context", ic: I.brain,
title: "It reads your repo before it writes a line.",
desc: "Explorer scans your full repository, git history, test suite, and dependencies — so every plan starts from real knowledge, not guesses.",
mock: (
explorer
✓ Reading src/auth/login.ts
✓ Indexed 142 files · 18 modules
✓ Parsed git log — 1,204 commits
⟳ Mapping 854 tests to sources…
),
},
{
n: "02", name: "Planner", role: "Strategy", ic: I.map,
title: "A step-by-step plan you approve first.",
desc: "Planner drafts a safe, reviewable plan with diffs and surfaces risks before any file is touched. Nothing runs until you say go.",
mock: (
plan · 3 steps
1 Add validateEmail() to login.ts
2 Wire validation into the submit handler
3 Add 2 unit tests for edge cases
Approve & ExecuteDismiss
),
},
{
n: "03", name: "Coder", role: "Execution", ic: I.bolt,
title: "It writes the code and runs your tests.",
desc: "Coder applies the plan, runs your test suite, and self-corrects on failure — iterating until everything passes. Diffs are shown before they're applied.",
mock: (
login.ts
+ if (!validateEmail(email)) {"{"}+ return error("Enter a valid email");+ {"}"} await signIn(email, password);
✓ npm test — 3 passed
),
},
{
n: "04", name: "Reviewer", role: "Quality", ic: I.check2,
title: "It reviews the work and ships it.",
desc: "Reviewer validates the output, re-runs the suite, and drafts your commit message and pull-request summary — ready for you to merge.",
mock: (
pull request
feat(auth): validate email on login
✓ All 854 tests passing
✓ Commit message drafted
✓ PR summary ready to merge
),
},
];
const MODES = [
{ ic: I.ask, t: "Ask", tag: "Default", d: "Approve every dangerous action. You see the diff and click Allow or Deny before anything is written." },
{ ic: I.play, t: "Auto", tag: "Fastest", d: "Trust the plan and let every tool run automatically — no prompts. Best for experienced users." },
{ ic: I.eye, t: "Plan", tag: "Read-only", d: "Generate and display the full plan with diffs, but block all file writes and commands." },
];
const STEPS = [
{ t: "Connect a repository", d: "Authorize GitPilot securely with GitHub device flow — or run fully local with Ollama." },
{ t: "Describe the task", d: "Ask in plain language. Explorer and Planner turn it into a reviewable plan." },
{ t: "Approve & ship", d: "Coder writes and tests the change; Reviewer drafts the commit and PR. You stay in control." },
];
// Reveal-on-scroll wrapper (IntersectionObserver, no dependency).
function Reveal({ children, className = "", style, delay = 0 }) {
const ref = useRef(null);
const [shown, setShown] = useState(false);
useEffect(() => {
const el = ref.current;
if (!el) return undefined;
if (typeof IntersectionObserver === "undefined") { setShown(true); return undefined; }
const io = new IntersectionObserver(
([e]) => { if (e.isIntersecting) { setShown(true); io.disconnect(); } },
{ threshold: 0.12 }
);
io.observe(el);
return () => io.disconnect();
}, []);
return (
{children}
);
}
function AgentCarousel() {
const [active, setActive] = useState(0);
const [paused, setPaused] = useState(false);
const n = AGENTS.length;
useEffect(() => {
if (paused) return undefined;
const t = setInterval(() => setActive((a) => (a + 1) % n), 5200);
return () => clearInterval(t);
}, [paused, n]);
const go = (i) => setActive(((i % n) + n) % n);
const cur = AGENTS[active];
return (
Most AI tools are a single model behind a chat box. GitPilot orchestrates configurable agent topologies — routing dispatch, ReAct loops with subagents, and task pipelines — so specialized roles explore, plan, build, and review your code.
{/* execution modes */}
You hold the controls
Three modes. You decide how far it goes.
Switch per session. Diffs are shown before they're applied; tests run before anything is committed. No surprises.
{MODES.map((m, i) => (
{m.ic}
{m.tag}
{m.t}
{m.d}
))}
{/* how it works */}
From idea to pull request
{STEPS.map((s, i) => (
{i + 1}
{s.t}
{s.d}
))}
{/* CTA band */}
Ship better code, without giving up control.
Start free and local with Ollama, or bring your own OpenAI, Claude, or watsonx key.