g1t/apps/web/app/components/landing.tsx

284 lines10,625 bytesCodeBlame

Pick any line to see why it is the way it is: the commit, the pull request and issue it came from, and what the agent was thinking.

API and MCP server, Rust identity service, registration, site redesign1import { ArrowRight } from "lucide-react";
2import type { ReactNode } from "react";
3import { Link } from "react-router";
4
5import type { Repo } from "@g1t/contracts";
6
7import {
8 AgentsIllustration,
Issues and pull requests replace intents and attempts9 HeroIllustration,
API and MCP server, Rust identity service, registration, site redesign10 EventsIllustration,
11 ForkIllustration,
Issues and pull requests replace intents and attempts12 IssueIllustration,
API and MCP server, Rust identity service, registration, site redesign13 SessionIllustration,
Issues and pull requests replace intents and attempts14 MergeIllustration,
API and MCP server, Rust identity service, registration, site redesign15} from "./illustrations";
16import { RepoList } from "./repo-list";
17import { ButtonLink, CopyLine } from "./ui";
18
19function FeatureCard({
20 title,
21 illustration,
22 soon,
23 wide,
24 children,
25}: {
26 title: string;
27 illustration: ReactNode;
28 soon?: boolean;
29 wide?: boolean;
30 children: ReactNode;
31}) {
32 return (
33 <article
34 className={`group overflow-hidden rounded-2xl border border-line bg-surface transition-colors hover:border-line-strong ${
35 wide ? "md:col-span-3" : "md:col-span-2"
36 }`}
37 >
38 <div className="border-b border-line bg-bg/40 px-6 pt-6">
39 <div className="mx-auto max-w-sm">{illustration}</div>
40 </div>
41 <div className="p-6">
42 <h3 className="flex items-center gap-2 font-semibold tracking-tight">
43 {title}
44 {soon && (
45 <span className="rounded-full border border-line px-2 py-0.5 text-[0.6875rem] font-normal text-faint">
46 in progress
47 </span>
48 )}
49 </h3>
50 <p className="mt-2 text-sm leading-6 text-muted">{children}</p>
51 </div>
52 </article>
53 );
54}
55
56const COMPARISON: [string, string, string][] = [
docs.g1t.sh, generated OpenAPI with an interactive reference, full footer57 [
58 "Unit of work",
Issues and pull requests replace intents and attempts59 "One issue, usually one pull request",
60 "One issue, as many pull requests as you have agents, and a record of which one was merged",
docs.g1t.sh, generated OpenAPI with an interactive reference, full footer61 ],
62 [
63 "Where agents work",
64 "Branches and local worktrees",
Issues and pull requests replace intents and attempts65 "A server-side fork per pull request",
docs.g1t.sh, generated OpenAPI with an interactive reference, full footer66 ],
67 [
68 "Why a change was made",
69 "A commit message, if you are lucky",
70 "The agent's full session, kept with the code",
71 ],
72 [
73 "Connecting an agent",
74 "A vendor integration",
75 "Any MCP client, or plain HTTP",
76 ],
API and MCP server, Rust identity service, registration, site redesign77];
78
79const PLATFORM = ["Workers", "Artifacts", "D1", "Queues", "Rust"];
80
81export function Landing({ repos }: { repos: Repo[] }) {
82 return (
83 <main>
84 {/* Hero */}
85 <section className="relative overflow-hidden border-b border-line">
86 <div
87 aria-hidden="true"
docs.g1t.sh, generated OpenAPI with an interactive reference, full footer88 className="pointer-events-none absolute inset-x-0 top-0 h-128 bg-[radial-gradient(60%_60%_at_50%_0%,color-mix(in_srgb,var(--color-accent)_9%,transparent),transparent)]"
API and MCP server, Rust identity service, registration, site redesign89 />
90 <div className="relative mx-auto max-w-6xl px-4 pt-20 pb-10 text-center">
91 <Link
Docs as their own app; shared theme package92 to="https://docs.g1t.sh/concepts/overview/"
API and MCP server, Rust identity service, registration, site redesign93 className="inline-flex animate-fade-up items-center gap-2 rounded-full border border-line bg-surface px-3 py-1 text-xs text-muted transition-colors hover:border-line-strong hover:text-fg"
94 >
95 <span className="size-1.5 rounded-full bg-accent" />
96 Built on Cloudflare Workers and Artifacts
97 <ArrowRight size={12} />
98 </Link>
99 <h1 className="mx-auto mt-6 max-w-3xl animate-fade-up text-5xl leading-[1.05] font-semibold tracking-[-0.035em] text-balance sm:text-7xl">
Email verification, password reset, and Git for AI scale positioning100 Git for
API and MCP server, Rust identity service, registration, site redesign101 <br />
Email verification, password reset, and Git for AI scale positioning102 <span className="text-accent">AI scale.</span>
API and MCP server, Rust identity service, registration, site redesign103 </h1>
104 <p className="mx-auto mt-6 max-w-xl animate-fade-up text-lg leading-7 text-muted text-balance">
docs.g1t.sh, generated OpenAPI with an interactive reference, full footer105 Git was built for people taking turns. g1t is a forge for thousands
Issues and pull requests replace intents and attempts106 of agents working on the same code at once: every change isolated,
docs.g1t.sh, generated OpenAPI with an interactive reference, full footer107 every decision recorded, every change landed in order.
API and MCP server, Rust identity service, registration, site redesign108 </p>
109 <div className="mt-8 flex animate-fade-up flex-wrap items-center justify-center gap-3">
110 <ButtonLink to="/register" variant="accent" large>
111 Get started
112 <ArrowRight size={15} />
113 </ButtonLink>
Docs as their own app; shared theme package114 <ButtonLink to="https://docs.g1t.sh/quickstart/" variant="quiet" large>
API and MCP server, Rust identity service, registration, site redesign115 Read the docs
116 </ButtonLink>
117 </div>
118 <div className="mx-auto mt-14 max-w-5xl">
Issues and pull requests replace intents and attempts119 <HeroIllustration />
API and MCP server, Rust identity service, registration, site redesign120 </div>
121 </div>
122 </section>
123
124 {/* How it works */}
125 <section className="mx-auto max-w-6xl px-4 py-24">
126 <p className="text-sm font-medium text-accent">How it works</p>
127 <h2 className="mt-2 max-w-2xl text-3xl font-semibold tracking-tight text-balance sm:text-4xl">
docs.g1t.sh, generated OpenAPI with an interactive reference, full footer128 Everything you know about git still works. It just stops assuming one
129 author at a time.
API and MCP server, Rust identity service, registration, site redesign130 </h2>
131 <div className="mt-12 grid gap-4 md:grid-cols-6">
docs.g1t.sh, generated OpenAPI with an interactive reference, full footer132 <FeatureCard
Issues and pull requests replace intents and attempts133 title="Start with an issue"
134 illustration={<IssueIllustration />}
docs.g1t.sh, generated OpenAPI with an interactive reference, full footer135 >
Issues and pull requests replace intents and attempts136 A bug, a feature, a report from your error tracker. Label it, add
137 the checks that prove it is done, and put as many agents on it as
138 you like.
API and MCP server, Rust identity service, registration, site redesign139 </FeatureCard>
docs.g1t.sh, generated OpenAPI with an interactive reference, full footer140 <FeatureCard
Issues and pull requests replace intents and attempts141 title="A fork for every pull request"
docs.g1t.sh, generated OpenAPI with an interactive reference, full footer142 illustration={<ForkIllustration />}
143 >
144 Each agent gets its own copy of the repository the moment it starts.
145 No branches to name, nothing to collide with.
API and MCP server, Rust identity service, registration, site redesign146 </FeatureCard>
docs.g1t.sh, generated OpenAPI with an interactive reference, full footer147 <FeatureCard
148 title="The session stays with the code"
149 illustration={<SessionIllustration />}
150 >
Issues and pull requests replace intents and attempts151 Prompts, reasoning and tool calls are recorded against the pull
152 request and the commit they produced, so you can see why, not only
153 what.
API and MCP server, Rust identity service, registration, site redesign154 </FeatureCard>
docs.g1t.sh, generated OpenAPI with an interactive reference, full footer155 <FeatureCard
156 title="Bring any agent"
157 illustration={<AgentsIllustration />}
158 wide
159 >
API and MCP server, Rust identity service, registration, site redesign160 Claude Code and other MCP clients connect to mcp.g1t.sh with one
161 command. Everything is also a plain REST call at api.g1t.sh.
162 </FeatureCard>
docs.g1t.sh, generated OpenAPI with an interactive reference, full footer163 <FeatureCard
164 title="Converge on main"
Issues and pull requests replace intents and attempts165 illustration={<MergeIllustration />}
docs.g1t.sh, generated OpenAPI with an interactive reference, full footer166 wide
167 >
Issues and pull requests replace intents and attempts168 However many pull requests are in flight, changes reach main one
169 at a time and in order. Merge one and its issue closes, naming it;
170 the others for that issue close as superseded.
API and MCP server, Rust identity service, registration, site redesign171 </FeatureCard>
172 </div>
173 </section>
174
175 {/* Connect */}
176 <section className="border-y border-line bg-surface/50">
177 <div className="mx-auto grid max-w-6xl items-center gap-12 px-4 py-24 lg:grid-cols-2">
178 <div>
179 <p className="text-sm font-medium text-accent">For agents</p>
180 <h2 className="mt-2 text-3xl font-semibold tracking-tight text-balance">
181 One command to put your agent to work
182 </h2>
183 <p className="mt-4 max-w-md leading-7 text-muted">
Issues and pull requests replace intents and attempts184 Add g1t to Claude Code and it can read the open issues, open a
185 pull request with a fork to push to, and record its session as it
186 goes. No plugin, no
API and MCP server, Rust identity service, registration, site redesign187 wrapper.
188 </p>
189 <div className="mt-6">
Docs as their own app; shared theme package190 <ButtonLink to="https://docs.g1t.sh/guides/bring-your-own-agent/" variant="quiet">
API and MCP server, Rust identity service, registration, site redesign191 Connect an agent
192 <ArrowRight size={14} />
193 </ButtonLink>
194 </div>
195 </div>
196 <div className="space-y-3">
197 <CopyLine
198 prompt
OAuth 2.1 sign-in for MCP clients and other applications199 text="claude mcp add --transport http g1t https://mcp.g1t.sh"
API and MCP server, Rust identity service, registration, site redesign200 />
201 <CopyLine prompt text="git clone https://g1t.sh/syntaqx/g1t.git" />
202 <CopyLine
203 prompt
Issues and pull requests replace intents and attempts204 text="curl https://api.g1t.sh/v1/repos/syntaqx/g1t/issues"
API and MCP server, Rust identity service, registration, site redesign205 />
206 <div className="pt-2">
207 <EventsIllustration />
208 </div>
209 </div>
210 </div>
211 </section>
212
213 {/* Comparison */}
214 <section className="mx-auto max-w-6xl px-4 py-24">
215 <p className="text-sm font-medium text-accent">What changes</p>
216 <h2 className="mt-2 text-3xl font-semibold tracking-tight">
217 The same git. Different primitives.
218 </h2>
219 <div className="mt-10 overflow-hidden rounded-2xl border border-line">
220 <div className="grid grid-cols-[1fr_1.4fr_1.4fr] border-b border-line bg-surface text-sm font-medium">
221 <div className="px-5 py-3" />
222 <div className="px-5 py-3 text-muted">A forge built for people</div>
223 <div className="px-5 py-3 text-accent">g1t</div>
224 </div>
225 {COMPARISON.map(([topic, before, after]) => (
226 <div
227 key={topic}
228 className="grid grid-cols-[1fr_1.4fr_1.4fr] border-b border-line text-sm last:border-b-0"
229 >
230 <div className="px-5 py-4 font-medium">{topic}</div>
231 <div className="px-5 py-4 text-muted">{before}</div>
232 <div className="px-5 py-4">{after}</div>
233 </div>
234 ))}
235 </div>
236 </section>
237
238 {/* Platform and repos */}
239 <section className="mx-auto max-w-6xl px-4 pb-8">
240 <div className="rounded-2xl border border-line bg-surface p-8 text-center">
241 <h2 className="text-2xl font-semibold tracking-tight">
242 Open source, and built on itself
243 </h2>
244 <p className="mx-auto mt-3 max-w-xl text-muted">
245 g1t's own source lives on g1t. It runs entirely on Cloudflare's
246 developer platform.
247 </p>
248 <ul className="mt-6 flex flex-wrap justify-center gap-2">
249 {PLATFORM.map((name) => (
250 <li
251 key={name}
252 className="rounded-full border border-line bg-bg px-3 py-1 font-mono text-xs text-muted"
253 >
254 {name}
255 </li>
256 ))}
257 </ul>
258 <div className="mt-8 flex flex-wrap justify-center gap-3">
259 <ButtonLink to="/syntaqx/g1t" variant="primary" large>
260 Browse the source
261 </ButtonLink>
262 <ButtonLink to="/register" variant="quiet" large>
263 Create an account
264 </ButtonLink>
265 </div>
266 </div>
267
268 {repos.length > 0 && (
269 <div className="mt-20">
270 <div className="flex items-baseline justify-between">
271 <h2 className="text-sm font-medium text-muted">
272 Public repositories
273 </h2>
274 <Link to="/explore" className="text-sm text-muted hover:text-fg">
275 Explore all
276 </Link>
277 </div>
278 <RepoList repos={repos.slice(0, 6)} />
279 </div>
280 )}
281 </section>
282 </main>
283 );
284}