Skip to content
630 linesCodeBlameRaw
1import { ArrowRight, Check, KeyRound, PackageCheck, ScrollText, ShieldCheck } from "lucide-react";
2import type { CSSProperties, ReactNode } from "react";
3import { Link } from "react-router";
4
5import { type Provider, PROVIDERS } from "@g1t/contracts";
6
7import { AgentSetup } from "./agent-setup";
8import { DeployArt, HeroArt, Live, PlanArt, QueueArt, TeamArt, WhyArt } from "./art";
9import { ProviderMark } from "./model-providers";
10import { ButtonLink, CopyLine } from "./ui";
11
12const DOCS = "https://docs.g1t.sh";
13
14/** A small label above a heading, in the mono face. */
15function Eyebrow({ children }: { children: ReactNode }) {
16 return <p className="font-mono text-xs tracking-[0.2em] text-accent uppercase">{children}</p>;
17}
18
19function Tags({ items }: { items: string[] }) {
20 return (
21 <ul className="mt-6 flex flex-wrap gap-1.5">
22 {items.map((item) => (
23 <li
24 key={item}
25 className="rounded-full bg-bg/80 px-2.5 py-1 font-mono text-[0.6875rem] tracking-wide text-muted uppercase ring-1 ring-line"
26 >
27 {item}
28 </li>
29 ))}
30 </ul>
31 );
32}
33
34/** A link in running copy that leads to the docs or another page. */
35function More({ to, children }: { to: string; children: ReactNode }) {
36 return (
37 <Link to={to} className="group mt-7 inline-flex items-center gap-1.5 text-sm font-medium text-fg hover:text-accent">
38 {children}
39 <ArrowRight size={14} className="transition-transform group-hover:translate-x-0.5" />
40 </Link>
41 );
42}
43
44/** A drawing in its own card, on the page's dark gray. */
45function ArtFrame({ children }: { children: ReactNode }) {
46 return (
47 <Live className="relative overflow-hidden rounded-3xl bg-surface/60 px-4 py-6 ring-1 ring-line sm:px-8">
48 <div
49 aria-hidden="true"
50 className="pointer-events-none absolute inset-x-0 -bottom-24 h-48 bg-[radial-gradient(50%_60%_at_50%_100%,rgb(182_168_255/0.08),transparent)]"
51 />
52 <div className="relative mx-auto max-w-lg">{children}</div>
53 </Live>
54 );
55}
56
57/**
58 * One of the product's pillars: what it does, the features that prove it,
59 * and a drawing of the idea, on alternating sides.
60 */
61function Pillar({
62 eyebrow,
63 title,
64 art,
65 points,
66 more,
67 flip,
68 children,
69}: {
70 eyebrow: string;
71 title: string;
72 art: ReactNode;
73 points: string[];
74 more: [string, string];
75 flip?: boolean;
76 children: ReactNode;
77}) {
78 return (
79 <article className="grid items-center gap-10 py-14 lg:grid-cols-2 lg:gap-16">
80 <div className={flip ? "lg:order-2" : undefined}>
81 <Eyebrow>{eyebrow}</Eyebrow>
82 <h3 className="mt-3 text-2xl font-semibold tracking-tight text-balance sm:text-3xl">{title}</h3>
83 <p className="mt-4 max-w-xl leading-7 text-muted">{children}</p>
84 <ul className="mt-6 grid gap-2.5 text-sm sm:grid-cols-2">
85 {points.map((point) => (
86 <li key={point} className="flex gap-2.5 text-fg-soft">
87 <Check size={15} className="mt-0.5 shrink-0 text-accent" />
88 <span>{point}</span>
89 </li>
90 ))}
91 </ul>
92 <More to={more[1]}>{more[0]}</More>
93 </div>
94 <div className={flip ? "lg:order-1" : undefined}>
95 <ArtFrame>{art}</ArtFrame>
96 </div>
97 </article>
98 );
99}
100
101/** Facts under the opening, each one true today. */
102const FACTS: [string, string][] = [
103 ["$0", "for the forge: repositories, issues, pull requests and review. No card."],
104 ["+20%", "on what compute costs g1t. That is the whole markup, and there is no seat price."],
105 ["MCP", "connects Claude Code, Codex, OpenCode or Cursor to your workspace: one command or one config file."],
106 ["MIT", "licensed. g1t's own source lives on g1t and lands through its own queue."],
107];
108
109const FLOW: [string, string][] = [
110 ["Brief", "Write the outcome you want, in plain words, or open an issue as you always would."],
111 ["Plan", "A planner agent splits it into issues, each saying what done looks like, and the order they depend on."],
112 ["Agents", "Each issue gets an agent as it unblocks. They know what the others are changing, and tell each other."],
113 ["Review", "Checks run in clean sandboxes; a second agent reviews; you ask for changes and the agent makes them."],
114 ["Main", "The queue tests every change with what lands before it. Main moves only to what passed, and production follows."],
115];
116
117/** The forge itself, for the people on the team. */
118const FORGE = [
119 "Git over HTTPS",
120 "Public and private repositories",
121 "Issues and labels",
122 "Pull requests and forks",
123 "Line comments and reviews",
124 "Protected branches",
125 "Required approvals",
126 "Workspaces and roles",
127 "Profiles",
128 "Search and Explore",
129 "Webhooks",
130 "Import from any git host",
131 "REST API and OpenAPI",
132 "MCP server",
133 "OAuth sign-in",
134];
135
136const SECURE: { icon: ReactNode; title: string; about: string; to: string }[] = [
137 {
138 icon: <ShieldCheck size={18} />,
139 title: "Push protection",
140 about: "A push that adds a key or a token is refused before it lands, and the history is scanned for ones already there.",
141 to: `${DOCS}/guides/security/`,
142 },
143 {
144 icon: <PackageCheck size={18} />,
145 title: "Dependency upkeep",
146 about: "Each vulnerable dependency that has a fixed version becomes an upgrade issue, and an agent lands the upgrade through the same checks as any change.",
147 to: `${DOCS}/guides/security/#dependency-upkeep`,
148 },
149 {
150 icon: <KeyRound size={18} />,
151 title: "Guardrails and credentials",
152 about: "What an agent may reach, run and spend is enforced outside its sandbox. Each run gets its own credential; your model keys never reach it.",
153 to: `${DOCS}/guides/guardrails/`,
154 },
155 {
156 icon: <ScrollText size={18} />,
157 title: "Audit log on every workspace",
158 about: "Every action by people, tokens and agents, with whether it was allowed and the rule that decided. Kept 90 days on the plan and 7 free, with export.",
159 to: `${DOCS}/guides/audit-log/`,
160 },
161];
162
163/** The systems g1t connects to, shown on the landing page. */
164const STACK: Provider[] = [
165 "anthropic",
166 "openai",
167 "gemini",
168 "xai",
169 "mistral",
170 "deepseek",
171 "azure_openai",
172 "openrouter",
173 "groq",
174 "sentry",
175 "jira",
176 "linear",
177];
178
179/** What happens to a production error once Sentry is connected. */
180const LOOP = [
181 "Sentry: TypeError in checkout",
182 "g1t opens an issue, with the stack trace",
183 "An agent fixes it; another reviews it",
184 "The merge queue lands it on main",
185 "Sentry marks the error resolved",
186];
187
188const PRICES: { name: string; price: string; unit?: string; about: string }[] = [
189 {
190 name: "The forge",
191 price: "$0",
192 about: "Public and private repositories, git, issues, pull requests, reviews, search and the audit log. No card.",
193 },
194 {
195 name: "The g1t plan",
196 price: "$20",
197 unit: "a month per workspace",
198 about: "$10 of usage included. Unlimited members. Agents, checks, the merge queue and deployments.",
199 },
200 {
201 name: "Usage",
202 price: "Cost + 20%",
203 about: "Past what is included, everything is priced at what it costs g1t plus 20%, under a spend limit you set.",
204 },
205];
206
207const PLATFORM = ["Workers", "Artifacts", "Containers", "D1", "Queues", "Durable Objects", "AI Gateway", "Rust"];
208
209/**
210 * The signed-out home page: what g1t is, what it does, and how to start.
211 * It lists no one's repositories; those are a click away under Explore.
212 */
213export function Landing() {
214 return (
215 <main className="overflow-x-clip">
216 {/* The opening. */}
217 <section className="dusk relative">
218 <div
219 aria-hidden="true"
220 className="dusk-planet pointer-events-none absolute -top-[30rem] left-1/2 size-[60rem] -translate-x-[10%] rounded-full"
221 />
222 <div className="relative mx-auto max-w-6xl px-4 pt-20 text-center sm:pt-24">
223 <Link
224 to={`${DOCS}/concepts/overview/`}
225 className="inline-flex animate-fade-up items-center gap-2 rounded-full bg-bg/50 px-3 py-1 text-xs text-fg-soft ring-1 ring-white/10 backdrop-blur transition-colors hover:bg-bg/70"
226 >
227 <span className="size-1.5 rounded-full bg-accent" />
228 Open source · built on Cloudflare
229 <ArrowRight size={12} />
230 </Link>
231 <h1 className="mx-auto mt-7 max-w-4xl animate-fade-up text-[2.75rem] leading-[1.04] font-semibold tracking-tight text-balance sm:text-7xl">
232 Where people and agents{" "}
233 <span className="bg-gradient-to-r from-fg via-[#d9d1ff] to-accent bg-clip-text text-transparent">
234 ship software together.
235 </span>
236 </h1>
237 <p className="mx-auto mt-7 max-w-2xl animate-fade-up text-lg leading-8 text-fg-soft/80 text-balance">
238 g1t is the git platform for the whole job. Plan in issues, assign work to agents like
239 teammates, land it through checks that hold, and deploy every change to the edge. Open
240 source, and priced at what it costs.
241 </p>
242 <div className="mt-9 flex animate-fade-up flex-wrap items-center justify-center gap-3">
243 <ButtonLink to="/register" variant="primary" large>
244 Start for free
245 <ArrowRight size={15} />
246 </ButtonLink>
247 <ButtonLink to="#how" variant="quiet" large>
248 See how it works
249 </ButtonLink>
250 </div>
251 <p className="mx-auto mt-5 max-w-xl animate-fade-up text-sm text-fg-soft/60 text-balance">
252 The forge is free, with no card. Agents and checks start with a trial after a card check;
253 deployments come with the g1t plan.
254 </p>
255 </div>
256 <Live className="relative mx-auto max-w-6xl px-2 pt-6 pb-2 sm:px-4">
257 <HeroArt className="w-full" />
258 </Live>
259 <div aria-hidden="true" className="h-16 bg-gradient-to-b from-transparent to-bg" />
260 </section>
261
262 {/* Facts, each one true today. Above the hero's fade, with a border of
263 its own: a ring is a shadow, and the fade drew over its top edge. */}
264 <section className="relative z-10 mx-auto max-w-6xl px-4">
265 <dl className="grid gap-px overflow-hidden rounded-2xl border border-line bg-line sm:grid-cols-2 lg:grid-cols-4">
266 {FACTS.map(([figure, about]) => (
267 <div key={figure} className="bg-bg px-6 py-6">
268 <dt className="font-mono text-2xl font-medium tracking-tight text-fg">{figure}</dt>
269 <dd className="mt-2 text-sm leading-6 text-muted">{about}</dd>
270 </div>
271 ))}
272 </dl>
273 </section>
274
275 {/* The pillars. */}
276 <section className="mx-auto max-w-6xl px-4 pt-24">
277 <div className="max-w-3xl">
278 <Eyebrow>One place, idea to production</Eyebrow>
279 <h2 className="mt-3 text-3xl font-semibold tracking-tight text-balance sm:text-5xl">
280 Everything between an idea and the people using it.
281 </h2>
282 <p className="mt-5 max-w-2xl text-lg leading-8 text-muted">
283 Agents are members of the forge, not a tool beside it. They take issues, review, answer
284 each other and fix what fails, under the same rules, records and review as everyone
285 else.
286 </p>
287 </div>
288
289 <div className="mt-6 divide-y divide-line">
290 <Pillar
291 eyebrow="Agents as teammates"
292 title="Assign an agent like anyone on the team"
293 art={<TeamArt className="w-full" />}
294 points={[
295 "Assign an issue, or @mention g1t anywhere",
296 "Told what the others are changing while they work",
297 "Agents ask each other, and ask you, through the forge",
298 "Steer a run while it works, or stop it",
299 "Memory per project and per workspace",
300 "Your own agent over MCP, its session on the pull request",
301 ]}
302 more={["How g1t works on issues", `${DOCS}/guides/working-with-g1t/`]}
303 >
304 Every agent works in its own sandbox and its own fork. It sees what is in flight, files
305 what it finds instead of widening its change, comments on the work of others, and
306 defers to people.
307 </Pillar>
308
309 <Pillar
310 flip
311 eyebrow="Outcomes"
312 title="Hand off an outcome, not just a task"
313 art={<PlanArt className="w-full" />}
314 points={[
315 "A brief planned into issues with dependencies",
316 "Your workflows' required checks on every change",
317 "Work starts as each dependency lands",
318 "The plan as a live graph, with its cost",
319 ]}
320 more={["Hand off an outcome", `${DOCS}/guides/outcomes/`]}
321 >
322 Write what should be true. A planner turns it into issues, each saying what done looks
323 like, and the order they depend on. Agents take each issue as it unblocks, and you
324 watch the whole outcome converge.
325 </Pillar>
326
327 <Pillar
328 eyebrow="Ship safely"
329 title="Main only moves to what passed"
330 art={<QueueArt className="w-full" />}
331 points={[
332 "Checks run by g1t in a clean sandbox",
333 "Workflows in GitHub Actions syntax",
334 "A merge queue that tests changes together",
335 "Conflicts found on every push, before a merge",
336 "Catch up with main in seconds",
337 "Reviews by people and by agents",
338 ]}
339 more={["The merge queue", `${DOCS}/guides/merge-queue/`]}
340 >
341 Checks are run by g1t, never by the agent being checked. The queue tests each change
342 together with what lands ahead of it; one that breaks goes back to its author with what
343 failed, and main never sees it.
344 </Pillar>
345
346 <Pillar
347 flip
348 eyebrow="Context"
349 title="Every line knows why it is there"
350 art={<WhyArt className="w-full" />}
351 points={[
352 "Sessions recorded onto pull requests",
353 "Why-blame on any line",
354 "A context hub agents search before they start",
355 "Search across code, issues and people",
356 ]}
357 more={["Sessions and why-blame", `${DOCS}/guides/why-blame/`]}
358 >
359 Pick any line. g1t shows the commit that changed it, the pull request and issue it came
360 from, and the agent&apos;s own session: what it read, ran and decided. The reasoning stays
361 with the code, for people and for the next agent.
362 </Pillar>
363
364 <Pillar
365 eyebrow="Run it"
366 title="Every change, live on the edge"
367 art={<DeployArt className="w-full" />}
368 points={[
369 "A live preview for every pull request",
370 "Production on every merge to main",
371 "Custom domains, with certificates",
372 "Projects that depend on each other",
373 ]}
374 more={["Deployments", `${DOCS}/guides/deployments/`]}
375 >
376 Turn on deployments and every pull request gets its own address on g1t.page; merging
377 ships production. Reviewers, and the agents reviewing for you, click through a change
378 instead of reading a diff. An app nobody visits runs nothing and costs nothing.
379 </Pillar>
380 </div>
381 </section>
382
383 {/* How it flows */}
384 <section id="how" className="scroll-mt-20 border-y border-line bg-surface/40">
385 <div className="mx-auto max-w-6xl px-4 py-24">
386 <Eyebrow>How it flows</Eyebrow>
387 <h2 className="mt-3 text-3xl font-semibold tracking-tight">From a sentence to main</h2>
388 <Live>
389 <ol className="relative mt-12 grid gap-6 md:grid-cols-5">
390 {/* From the first step's dot to the last one's, and no further: five
391 columns with 1.5rem gaps put the last dot 1rem into the last
392 column, so the line stops one column, less that, from the end. */}
393 <span
394 aria-hidden="true"
395 className="absolute top-4 right-[calc((100%-6rem)/5-1rem)] left-4 hidden h-px bg-gradient-to-r from-accent/50 via-warn/50 to-success/70 md:block"
396 >
397 <span className="flow-runner absolute inset-0">
398 <span className="absolute -top-[3px] -left-[3.5px] size-[7px] rounded-full bg-accent shadow-[0_0_12px_2px_rgb(182_168_255/0.6)]" />
399 </span>
400 </span>
401 {FLOW.map(([step, about], index) => (
402 <li key={step} className="relative">
403 <span
404 className={`flow-step relative flex size-8 items-center justify-center rounded-full font-mono text-xs ring-1 ${
405 index === FLOW.length - 1 ? "bg-success text-bg ring-success" : "bg-bg text-fg-soft ring-line-strong"
406 }`}
407 style={{ "--delay": `${index * 2}s` } as CSSProperties}
408 >
409 {index + 1}
410 </span>
411 <h3 className="mt-4 font-semibold">{step}</h3>
412 <p className="mt-1.5 text-sm leading-6 text-muted">{about}</p>
413 </li>
414 ))}
415 </ol>
416 </Live>
417 </div>
418 </section>
419
420 {/* The forge, for people. */}
421 <section className="mx-auto max-w-6xl px-4 py-24">
422 <div className="grid gap-10 lg:grid-cols-[1fr_1.2fr] lg:gap-16">
423 <div>
424 <Eyebrow>Collaborate</Eyebrow>
425 <h2 className="mt-3 text-3xl font-semibold tracking-tight text-balance">
426 A complete forge for the people on your team
427 </h2>
428 <p className="mt-4 max-w-md leading-7 text-muted">
429 Issues, branches, pull requests and reviews, the way your team already works, with
430 agents as members alongside you. Work by hand, hand work off, or both on the same
431 issue.
432 </p>
433 <More to={`${DOCS}/concepts/overview/`}>How g1t works</More>
434 </div>
435 <div className="rounded-3xl bg-surface p-7 ring-1 ring-line">
436 <p className="text-sm font-medium">Included in every workspace</p>
437 <Tags items={FORGE} />
438 </div>
439 </div>
440 </section>
441
442 {/* Secure by default */}
443 <section className="mx-auto max-w-6xl px-4 pb-24">
444 <Eyebrow>Secure by default</Eyebrow>
445 <h2 className="mt-3 max-w-2xl text-3xl font-semibold tracking-tight text-balance">
446 Safe to hand the work to, and healthy without anyone watching
447 </h2>
448 <div className="mt-10 grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
449 {SECURE.map((item) => (
450 <Link
451 key={item.title}
452 to={item.to}
453 className="group rounded-2xl bg-surface p-6 ring-1 ring-line transition-colors hover:ring-line-strong"
454 >
455 <span className="flex size-9 items-center justify-center rounded-lg bg-bg text-accent ring-1 ring-line">{item.icon}</span>
456 <h3 className="mt-5 font-semibold">{item.title}</h3>
457 <p className="mt-2 text-sm leading-6 text-muted">{item.about}</p>
458 </Link>
459 ))}
460 </div>
461 </section>
462
463 {/* Connect */}
464 <section className="border-y border-line bg-surface/40">
465 <div className="mx-auto grid max-w-6xl items-center gap-12 px-4 py-24 lg:grid-cols-2">
466 <div>
467 <Eyebrow>Bring your own agent</Eyebrow>
468 <h2 className="mt-3 text-3xl font-semibold tracking-tight text-balance">
469 Any agent that speaks MCP joins the team
470 </h2>
471 <p className="mt-4 max-w-md leading-7 text-muted">
472 Add g1t to Claude Code, Codex, OpenCode or Cursor and it can read the plan, take an
473 issue, open a pull request with a fork to push to, and see what the others are doing.
474 Install the hook in Claude Code and its session is recorded onto the pull request as
475 it works. g1t&apos;s own agents use the same tools.
476 </p>
477 <p className="mt-4 max-w-md leading-7 text-muted">
478 Every action is a REST route and an MCP tool, with an OpenAPI document and signed
479 webhooks for every event.
480 </p>
481 <div className="mt-6 flex flex-wrap gap-3">
482 <ButtonLink to={`${DOCS}/guides/bring-your-own-agent/`} variant="quiet">
483 Connect an agent
484 <ArrowRight size={14} />
485 </ButtonLink>
486 <ButtonLink to={`${DOCS}/reference/api/`} variant="quiet">
487 API reference
488 </ButtonLink>
489 </div>
490 </div>
491 <div className="space-y-3">
492 <AgentSetup />
493 <CopyLine prompt text="curl -fsSL https://g1t.sh/install/claude.sh | sh" />
494 <CopyLine prompt text="git clone https://g1t.sh/flagon-io/g1t.git" />
495 <CopyLine prompt text="curl https://api.g1t.sh/repos/flagon-io/g1t/queue" />
496 </div>
497 </div>
498 </section>
499
500 {/* Your stack */}
501 <section className="mx-auto grid max-w-6xl items-center gap-12 px-4 py-24 lg:grid-cols-2">
502 <div className="lg:order-2">
503 <Eyebrow>Your stack</Eyebrow>
504 <h2 className="mt-3 text-3xl font-semibold tracking-tight text-balance">
505 Your models. Your alerts. Your tickets.
506 </h2>
507 <p className="mt-4 max-w-md leading-7 text-muted">
508 Run g1t&apos;s agents on g1t&apos;s models, or on your own accounts with any of the labs and
509 platforms, and choose which model does which work. Keys stay with g1t: an agent&apos;s
510 sandbox only ever holds a token for its own run.
511 </p>
512 <p className="mt-4 max-w-md leading-7 text-muted">
513 Connect Sentry and a new error becomes an issue, an agent fixes it, and Sentry hears it
514 was resolved. Mention TECH-1234 and the agent reads the Jira ticket.
515 </p>
516 <More to={`${DOCS}/guides/integrations/`}>See the integrations</More>
517 </div>
518 <div className="space-y-6 lg:order-1">
519 <div className="grid grid-cols-3 gap-2 sm:grid-cols-4">
520 {STACK.map((provider) => (
521 <div key={provider} className="flex flex-col items-center gap-2 rounded-xl bg-surface px-2 py-3 ring-1 ring-line">
522 <ProviderMark provider={provider} size={30} />
523 <span className="w-full text-center text-xs leading-tight text-muted">{PROVIDERS[provider].label}</span>
524 </div>
525 ))}
526 </div>
527 <ol className="space-y-2 font-mono text-[0.8125rem]">
528 {LOOP.map((step, index) => (
529 <li key={step} className="flex items-center gap-3 text-fg-soft">
530 <span className="flex size-6 shrink-0 items-center justify-center rounded-full bg-surface text-xs text-faint ring-1 ring-line">
531 {index + 1}
532 </span>
533 {step}
534 </li>
535 ))}
536 </ol>
537 </div>
538 </section>
539
540 {/* Pricing, in one band. */}
541 <section className="mx-auto max-w-6xl px-4 pb-24">
542 <div className="flex flex-wrap items-end justify-between gap-6">
543 <div>
544 <Eyebrow>Pricing</Eyebrow>
545 <h2 className="mt-3 max-w-2xl text-3xl font-semibold tracking-tight text-balance">
546 What it costs to run, plus 20%. Never per seat.
547 </h2>
548 </div>
549 <More to="/pricing">See every price</More>
550 </div>
551 <div className="mt-10 grid gap-px overflow-hidden rounded-3xl bg-line ring-1 ring-line md:grid-cols-3">
552 {PRICES.map((item) => (
553 <div key={item.name} className="bg-surface p-7">
554 <p className="text-sm text-muted">{item.name}</p>
555 <p className="mt-3 flex flex-wrap items-baseline gap-x-2">
556 <span className="text-3xl font-semibold tracking-tight">{item.price}</span>
557 {item.unit && <span className="text-sm text-muted">{item.unit}</span>}
558 </p>
559 <p className="mt-3 text-sm leading-6 text-muted">{item.about}</p>
560 </div>
561 ))}
562 </div>
563 </section>
564
565 {/* Open source */}
566 <section className="mx-auto max-w-6xl px-4 pb-24">
567 <div className="grid gap-10 rounded-3xl bg-surface p-8 ring-1 ring-line sm:p-10 lg:grid-cols-[1.3fr_1fr]">
568 <div>
569 <Eyebrow>Open source</Eyebrow>
570 <h2 className="mt-3 text-3xl font-semibold tracking-tight text-balance">Open, and built on itself</h2>
571 <p className="mt-4 max-w-xl leading-7 text-muted">
572 g1t is MIT licensed. Its own source lives on g1t, and its changes land through its own
573 merge queue. Your code is plain git: leaving is a <code className="font-mono text-fg-soft">git clone</code>.
574 </p>
575 <p className="mt-4 max-w-xl leading-7 text-muted">
576 You can run the core forge yourself with Docker Compose today: accounts, repositories,
577 issues, pull requests and search. It is an early version, and agents, deployments and
578 context search still run only on g1t.sh.
579 </p>
580 <div className="mt-7 flex flex-wrap gap-3">
581 <ButtonLink to="/flagon-io/g1t" variant="quiet">
582 Browse the source
583 </ButtonLink>
584 <ButtonLink to={`${DOCS}/guides/self-hosting/`} variant="quiet">
585 Run g1t yourself
586 </ButtonLink>
587 </div>
588 </div>
589 <div className="flex flex-col justify-between gap-6">
590 <div>
591 <p className="text-sm font-medium">Built on Cloudflare</p>
592 <ul className="mt-4 flex flex-wrap gap-2">
593 {PLATFORM.map((name) => (
594 <li key={name} className="rounded-full bg-bg/60 px-3 py-1 font-mono text-xs text-fg-soft ring-1 ring-line">
595 {name}
596 </li>
597 ))}
598 </ul>
599 </div>
600 <p className="text-sm leading-6 text-muted">
601 g1t is made by Flagon, Inc., a small, independent software company.
602 </p>
603 </div>
604 </div>
605 </section>
606
607 {/* The close. */}
608 <section className="mx-auto max-w-6xl px-4 pb-8">
609 <div className="dusk relative overflow-hidden rounded-3xl px-6 py-16 text-center ring-1 ring-line">
610 <h2 className="mx-auto max-w-2xl text-3xl font-semibold tracking-tight text-balance sm:text-4xl">
611 Bring your team. Bring your agents.
612 </h2>
613 <p className="mx-auto mt-4 max-w-xl text-fg-soft/80 text-balance">
614 Create a workspace in a minute and push your first repository. The forge is free; start
615 the plan when you want agents and deployments.
616 </p>
617 <div className="mt-8 flex flex-wrap justify-center gap-3">
618 <ButtonLink to="/register" variant="primary" large>
619 Create your workspace
620 <ArrowRight size={15} />
621 </ButtonLink>
622 <ButtonLink to={`${DOCS}/quickstart/`} variant="quiet" large>
623 Read the quickstart
624 </ButtonLink>
625 </div>
626 </div>
627 </section>
628 </main>
629 );
630}