pr_01m47d15m3e54sn21z27rpy5n9/apps/web/app/components/landing.tsx
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 redesign | 1 | import { ArrowRight } from "lucide-react"; |
| 2 | import type { ReactNode } from "react"; | |
| 3 | import { Link } from "react-router"; | |
| 4 | ||
| Polish: phones, copy boxes, the plan page, the landing page, a real glide | 5 | import { type Provider, PROVIDERS, type Repo } from "@g1t/contracts"; |
| API and MCP server, Rust identity service, registration, site redesign | 6 | |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 7 | import { ConvergeArt, PlanArt, QueueArt, TeamArt, WhyArt } from "./art"; |
| Polish: phones, copy boxes, the plan page, the landing page, a real glide | 8 | import { ProviderMark } from "./model-providers"; |
| API and MCP server, Rust identity service, registration, site redesign | 9 | import { RepoList } from "./repo-list"; |
| 10 | import { ButtonLink, CopyLine } from "./ui"; | |
| 11 | ||
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 12 | /** A small label above a heading, in the mono face. */ |
| 13 | function Eyebrow({ children }: { children: ReactNode }) { | |
| 14 | return <p className="font-mono text-xs tracking-[0.2em] text-merged uppercase">{children}</p>; | |
| 15 | } | |
| 16 | ||
| 17 | function Tags({ items }: { items: string[] }) { | |
| 18 | return ( | |
| 19 | <ul className="mt-5 flex flex-wrap gap-1.5"> | |
| 20 | {items.map((item) => ( | |
| 21 | <li | |
| 22 | key={item} | |
| 23 | 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" | |
| 24 | > | |
| 25 | {item} | |
| 26 | </li> | |
| 27 | ))} | |
| 28 | </ul> | |
| 29 | ); | |
| 30 | } | |
| 31 | ||
| 32 | /** A card with a line drawing above its words, on a faint grid. */ | |
| 33 | function Card({ | |
| API and MCP server, Rust identity service, registration, site redesign | 34 | title, |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 35 | art, |
| 36 | tags, | |
| API and MCP server, Rust identity service, registration, site redesign | 37 | wide, |
| 38 | children, | |
| 39 | }: { | |
| 40 | title: string; | |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 41 | art: ReactNode; |
| 42 | tags?: string[]; | |
| API and MCP server, Rust identity service, registration, site redesign | 43 | wide?: boolean; |
| 44 | children: ReactNode; | |
| 45 | }) { | |
| 46 | return ( | |
| 47 | <article | |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 48 | className={`group relative overflow-hidden rounded-3xl bg-surface p-7 ring-1 ring-line transition-colors hover:ring-line-strong ${ |
| 49 | wide ? "md:col-span-2" : "" | |
| API and MCP server, Rust identity service, registration, site redesign | 50 | }`} |
| 51 | > | |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 52 | <h3 className="text-lg font-semibold tracking-tight">{title}</h3> |
| 53 | <div className={`mx-auto mt-2 ${wide ? "max-w-md" : "max-w-xs"} opacity-90 transition-opacity group-hover:opacity-100`}> | |
| 54 | {art} | |
| API and MCP server, Rust identity service, registration, site redesign | 55 | </div> |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 56 | <p className="mt-2 text-sm leading-6 text-muted">{children}</p> |
| 57 | {tags && <Tags items={tags} />} | |
| API and MCP server, Rust identity service, registration, site redesign | 58 | </article> |
| 59 | ); | |
| 60 | } | |
| 61 | ||
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 62 | const FLOW: [string, string][] = [ |
| 63 | ["Brief", "Write the outcome you want, in plain words."], | |
| 64 | ["Plan", "A planner agent splits it into issues, each with checks that prove it done, and the order they depend on."], | |
| 65 | ["Agents", "Each issue gets an agent as it unblocks. They know what the others are doing, and tell each other."], | |
| 66 | ["Review", "Checks run in clean sandboxes; a second agent reviews; you ask for changes and the agent makes them."], | |
| 67 | ["Main", "The queue tests every change together with what lands before it, and main moves only to what passed."], | |
| 68 | ]; | |
| 69 | ||
| 70 | const BASICS = [ | |
| 71 | "Issues and labels", | |
| 72 | "Branches and forks", | |
| 73 | "Pull requests", | |
| 74 | "Line comments and reviews", | |
| 75 | "Protected branches", | |
| 76 | "Required approvals", | |
| 77 | "Workspaces and teams", | |
| 78 | "Access tokens", | |
| 79 | "Git over HTTPS", | |
| 80 | "REST API", | |
| 81 | "MCP server", | |
| 82 | "OAuth sign-in", | |
| Polish: phones, copy boxes, the plan page, the landing page, a real glide | 83 | "Any model provider", |
| 84 | "Sentry, Jira, Linear", | |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 85 | ]; |
| 86 | ||
| API and MCP server, Rust identity service, registration, site redesign | 87 | const COMPARISON: [string, string, string][] = [ |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 88 | ["What you hand over", "A pull request to review", "An outcome, which becomes a plan of issues and lands on main"], |
| 89 | ["Many agents at once", "Separate pull requests to compare and untangle", "A team: told about each other's work, filing what they find, talking through the forge"], | |
| 90 | ["Is it done?", "Whatever the author says they ran", "The issue's checks, run by the forge in a clean sandbox"], | |
| 91 | ["When two changes collide", "A merge conflict, or a broken main", "Tested together in the queue first; the one that breaks goes back to its agent"], | |
| 92 | ["What main promises", "Whatever passed when each change merged", "Every check of every issue that ever landed, on every change since"], | |
| 93 | ["Why is this line here?", "A commit message, if you are lucky", "The commit, the pull request, the issue and the agent's own account"], | |
| 94 | ["You in the loop", "Reading every diff", "Asking for changes, approving, steering; the agents do the rest"], | |
| API and MCP server, Rust identity service, registration, site redesign | 95 | ]; |
| 96 | ||
| Polish: phones, copy boxes, the plan page, the landing page, a real glide | 97 | /** The systems g1t connects to, shown on the landing page. */ |
| 98 | const STACK: Provider[] = [ | |
| 99 | "anthropic", | |
| 100 | "openai", | |
| 101 | "gemini", | |
| 102 | "xai", | |
| 103 | "mistral", | |
| 104 | "deepseek", | |
| 105 | "azure_openai", | |
| 106 | "openrouter", | |
| 107 | "groq", | |
| 108 | "sentry", | |
| 109 | "jira", | |
| 110 | "linear", | |
| 111 | ]; | |
| 112 | ||
| 113 | /** What happens to a production error once Sentry is connected. */ | |
| 114 | const LOOP = [ | |
| 115 | "Sentry: TypeError in checkout", | |
| 116 | "g1t opens an issue, with the stack trace", | |
| 117 | "An agent fixes it; another reviews it", | |
| 118 | "The merge queue lands it on main", | |
| 119 | "Sentry marks the error resolved", | |
| 120 | ]; | |
| 121 | ||
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 122 | const PLATFORM = ["Workers", "Artifacts", "Containers", "D1", "Queues", "AI Gateway", "Rust"]; |
| API and MCP server, Rust identity service, registration, site redesign | 123 | |
| 124 | export function Landing({ repos }: { repos: Repo[] }) { | |
| 125 | return ( | |
| 126 | <main> | |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 127 | {/* The opening: the sky after dusk, agents converging on main. */} |
| 128 | <section className="dusk relative overflow-hidden"> | |
| API and MCP server, Rust identity service, registration, site redesign | 129 | <div |
| 130 | aria-hidden="true" | |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 131 | className="dusk-planet pointer-events-none absolute -top-[30rem] left-1/2 size-[60rem] -translate-x-[10%] rounded-full" |
| API and MCP server, Rust identity service, registration, site redesign | 132 | /> |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 133 | <div className="relative mx-auto max-w-6xl px-4 pt-24 pb-6 text-center"> |
| API and MCP server, Rust identity service, registration, site redesign | 134 | <Link |
| Docs as their own app; shared theme package | 135 | to="https://docs.g1t.sh/concepts/overview/" |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 136 | 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" |
| API and MCP server, Rust identity service, registration, site redesign | 137 | > |
| 138 | <span className="size-1.5 rounded-full bg-accent" /> | |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 139 | A git forge for teams of agents |
| API and MCP server, Rust identity service, registration, site redesign | 140 | <ArrowRight size={12} /> |
| 141 | </Link> | |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 142 | <h1 className="mx-auto mt-7 max-w-4xl animate-fade-up text-5xl leading-[1.04] font-semibold tracking-[-0.035em] text-balance sm:text-7xl"> |
| 143 | Hand off the outcome. | |
| API and MCP server, Rust identity service, registration, site redesign | 144 | <br /> |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 145 | <span className="bg-gradient-to-r from-[#d9d1ff] via-[#ffd4b8] to-accent bg-clip-text text-transparent"> |
| 146 | A team of agents ships it. | |
| 147 | </span> | |
| API and MCP server, Rust identity service, registration, site redesign | 148 | </h1> |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 149 | <p className="mx-auto mt-7 max-w-2xl animate-fade-up text-lg leading-8 text-fg-soft/80 text-balance"> |
| 150 | Everything you expect from GitHub: issues, branches, pull requests, review. On top of | |
| 151 | it, describe what you want and g1t plans it, puts agents on every part at once, keeps | |
| 152 | them working as a team, and lands it on main through checks that hold. | |
| API and MCP server, Rust identity service, registration, site redesign | 153 | </p> |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 154 | <div className="mt-9 flex animate-fade-up flex-wrap items-center justify-center gap-3"> |
| 155 | <ButtonLink to="/register" variant="primary" large> | |
| API and MCP server, Rust identity service, registration, site redesign | 156 | Get started |
| 157 | <ArrowRight size={15} /> | |
| 158 | </ButtonLink> | |
| Docs as their own app; shared theme package | 159 | <ButtonLink to="https://docs.g1t.sh/quickstart/" variant="quiet" large> |
| API and MCP server, Rust identity service, registration, site redesign | 160 | Read the docs |
| 161 | </ButtonLink> | |
| 162 | </div> | |
| 163 | </div> | |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 164 | <div className="relative mx-auto max-w-5xl px-4 pb-4"> |
| 165 | <ConvergeArt className="w-full" /> | |
| 166 | </div> | |
| 167 | <div aria-hidden="true" className="h-24 bg-gradient-to-b from-transparent to-bg" /> | |
| API and MCP server, Rust identity service, registration, site redesign | 168 | </section> |
| 169 | ||
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 170 | {/* The three things only g1t does. */} |
| API and MCP server, Rust identity service, registration, site redesign | 171 | <section className="mx-auto max-w-6xl px-4 py-24"> |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 172 | <Eyebrow>Agents as a team</Eyebrow> |
| 173 | <h2 className="mt-3 max-w-3xl text-3xl font-semibold tracking-tight text-balance sm:text-4xl"> | |
| 174 | Hosting git is the easy part. g1t is built for what comes after: many agents, one | |
| 175 | codebase, nobody refereeing. | |
| API and MCP server, Rust identity service, registration, site redesign | 176 | </h2> |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 177 | <div className="mt-12 grid gap-4 md:grid-cols-3"> |
| 178 | <Card title="Outcomes, not pull requests" art={<PlanArt className="w-full" />} tags={["Brief", "Plan", "Dependencies", "Checks"]}> | |
| 179 | Write what you want. A planner agent turns it into issues with acceptance checks and | |
| 180 | the order they depend on; agents start on each one as it unblocks. | |
| 181 | </Card> | |
| 182 | <Card title="Agents that work as a team" art={<TeamArt className="w-full" />} tags={["Overlap", "Handoffs", "Questions", "People first"]}> | |
| 183 | Every agent is told what the others are changing. They open issues for what they find | |
| 184 | instead of widening their change, comment on each other's work, and defer to people. | |
| 185 | </Card> | |
| 186 | <Card title="Main only moves forward" art={<QueueArt className="w-full" />} tags={["Merge queue", "Speculative", "Contract checks"]}> | |
| 187 | Changes are tested together with whatever lands before them, against every check that | |
| 188 | ever passed. One that breaks goes back to its agent; main never sees it. | |
| 189 | </Card> | |
| 190 | <Card title="Why is this line here?" art={<WhyArt className="w-full" />} tags={["Why-blame", "Sessions", "Provenance"]} wide> | |
| 191 | Pick any line. g1t shows the commit that last changed it, the pull request and issue | |
| 192 | it came from, and the agent's own account of why: the reasoning stays with the code. | |
| 193 | </Card> | |
| 194 | <article className="rounded-3xl bg-surface p-7 ring-1 ring-line"> | |
| 195 | <h3 className="text-lg font-semibold tracking-tight">And everything you expect</h3> | |
| 196 | <p className="mt-2 text-sm leading-6 text-muted"> | |
| 197 | Work by hand exactly as you would on GitHub. Agents are a teammate you can assign, | |
| 198 | not a different way of working. | |
| 199 | </p> | |
| 200 | <Tags items={BASICS} /> | |
| 201 | </article> | |
| 202 | </div> | |
| 203 | </section> | |
| 204 | ||
| 205 | {/* How it flows */} | |
| 206 | <section className="border-y border-line bg-surface/40"> | |
| 207 | <div className="mx-auto max-w-6xl px-4 py-24"> | |
| 208 | <Eyebrow>How it flows</Eyebrow> | |
| 209 | <h2 className="mt-3 text-3xl font-semibold tracking-tight">From a sentence to main</h2> | |
| 210 | <ol className="relative mt-12 grid gap-6 md:grid-cols-5"> | |
| 211 | <span | |
| 212 | aria-hidden="true" | |
| 213 | className="absolute top-4 right-8 left-8 hidden h-px bg-gradient-to-r from-merged/50 via-warn/50 to-accent/70 md:block" | |
| 214 | /> | |
| 215 | {FLOW.map(([step, about], index) => ( | |
| 216 | <li key={step} className="relative"> | |
| 217 | <span | |
| 218 | className={`relative flex size-8 items-center justify-center rounded-full font-mono text-xs ring-1 ${ | |
| 219 | index === FLOW.length - 1 | |
| 220 | ? "bg-accent text-bg ring-accent" | |
| 221 | : "bg-bg text-fg-soft ring-line-strong" | |
| 222 | }`} | |
| 223 | > | |
| 224 | {index + 1} | |
| 225 | </span> | |
| 226 | <h3 className="mt-4 font-semibold">{step}</h3> | |
| 227 | <p className="mt-1.5 text-sm leading-6 text-muted">{about}</p> | |
| 228 | </li> | |
| 229 | ))} | |
| 230 | </ol> | |
| API and MCP server, Rust identity service, registration, site redesign | 231 | </div> |
| 232 | </section> | |
| 233 | ||
| 234 | {/* Connect */} | |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 235 | <section className="mx-auto grid max-w-6xl items-center gap-12 px-4 py-24 lg:grid-cols-2"> |
| 236 | <div> | |
| 237 | <Eyebrow>Bring your own agent</Eyebrow> | |
| 238 | <h2 className="mt-3 text-3xl font-semibold tracking-tight text-balance"> | |
| 239 | Any agent joins the team with one command | |
| 240 | </h2> | |
| 241 | <p className="mt-4 max-w-md leading-7 text-muted"> | |
| 242 | Add g1t to Claude Code and it can read the plan, take an issue, open a pull request | |
| Record your own agent's sessions automatically | 243 | with a fork to push to and see what the others are doing. Install the hook and its |
| 244 | session is recorded onto the pull request as it works. g1t's own agents use the | |
| 245 | same tools. | |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 246 | </p> |
| 247 | <div className="mt-6"> | |
| 248 | <ButtonLink to="https://docs.g1t.sh/guides/bring-your-own-agent/" variant="quiet"> | |
| 249 | Connect an agent | |
| 250 | <ArrowRight size={14} /> | |
| 251 | </ButtonLink> | |
| API and MCP server, Rust identity service, registration, site redesign | 252 | </div> |
| 253 | </div> | |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 254 | <div className="space-y-3"> |
| 255 | <CopyLine prompt text="claude mcp add --transport http g1t https://mcp.g1t.sh" /> | |
| Record your own agent's sessions automatically | 256 | <CopyLine prompt text="curl -fsSL https://g1t.sh/install/claude.sh | sh" /> |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 257 | <CopyLine prompt text="git clone https://g1t.sh/syntaqx/g1t.git" /> |
| 258 | <CopyLine prompt text="curl https://api.g1t.sh/repos/syntaqx/g1t/queue" /> | |
| 259 | </div> | |
| API and MCP server, Rust identity service, registration, site redesign | 260 | </section> |
| 261 | ||
| Polish: phones, copy boxes, the plan page, the landing page, a real glide | 262 | {/* Your stack */} |
| 263 | <section className="mx-auto grid max-w-6xl items-center gap-12 px-4 pb-24 lg:grid-cols-2"> | |
| 264 | <div className="lg:order-2"> | |
| 265 | <Eyebrow>Your stack</Eyebrow> | |
| 266 | <h2 className="mt-3 text-3xl font-semibold tracking-tight text-balance"> | |
| 267 | Your models. Your alerts. Your tickets. | |
| 268 | </h2> | |
| 269 | <p className="mt-4 max-w-md leading-7 text-muted"> | |
| 270 | Run g1t's agents on g1t's models, or on your own accounts with any of the labs and | |
| 271 | platforms, and choose which model does which work. Keys stay with g1t: an agent's | |
| 272 | sandbox only ever holds a token for its own run. | |
| 273 | </p> | |
| 274 | <p className="mt-4 max-w-md leading-7 text-muted"> | |
| 275 | Connect Sentry and a new error becomes an issue, an agent fixes it, and Sentry hears | |
| 276 | it was resolved, before anyone was paged. Mention TECH-1234 and the agent reads the | |
| 277 | Jira ticket. | |
| 278 | </p> | |
| 279 | <div className="mt-6"> | |
| 280 | <ButtonLink to="https://docs.g1t.sh/guides/integrations/" variant="quiet"> | |
| 281 | See the integrations | |
| 282 | <ArrowRight size={14} /> | |
| 283 | </ButtonLink> | |
| 284 | </div> | |
| 285 | </div> | |
| 286 | <div className="space-y-6 lg:order-1"> | |
| 287 | <div className="grid grid-cols-3 gap-2 sm:grid-cols-4"> | |
| 288 | {STACK.map((provider) => ( | |
| 289 | <div | |
| 290 | key={provider} | |
| 291 | className="flex flex-col items-center gap-2 rounded-xl bg-surface px-2 py-3 ring-1 ring-line" | |
| 292 | title={PROVIDERS[provider].label} | |
| 293 | > | |
| 294 | <ProviderMark provider={provider} size={30} /> | |
| 295 | <span className="w-full text-center text-xs leading-tight text-muted">{PROVIDERS[provider].label}</span> | |
| 296 | </div> | |
| 297 | ))} | |
| 298 | </div> | |
| 299 | <ol className="space-y-2 font-mono text-[0.8125rem]"> | |
| 300 | {LOOP.map((step, index) => ( | |
| 301 | <li key={step} className="flex items-center gap-3 text-fg-soft"> | |
| 302 | <span className="flex size-6 shrink-0 items-center justify-center rounded-full bg-surface text-xs text-faint ring-1 ring-line"> | |
| 303 | {index + 1} | |
| 304 | </span> | |
| 305 | {step} | |
| 306 | </li> | |
| 307 | ))} | |
| 308 | </ol> | |
| 309 | </div> | |
| 310 | </section> | |
| 311 | ||
| API and MCP server, Rust identity service, registration, site redesign | 312 | {/* Comparison */} |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 313 | <section className="mx-auto max-w-6xl px-4 pb-24"> |
| 314 | <Eyebrow>What changes</Eyebrow> | |
| 315 | <h2 className="mt-3 text-3xl font-semibold tracking-tight">The same git. A different job.</h2> | |
| 316 | <div className="mt-10 overflow-hidden rounded-3xl ring-1 ring-line"> | |
| 317 | <div className="grid grid-cols-[1fr_1.3fr_1.6fr] bg-surface text-sm font-medium"> | |
| API and MCP server, Rust identity service, registration, site redesign | 318 | <div className="px-5 py-3" /> |
| 319 | <div className="px-5 py-3 text-muted">A forge built for people</div> | |
| 320 | <div className="px-5 py-3 text-accent">g1t</div> | |
| 321 | </div> | |
| 322 | {COMPARISON.map(([topic, before, after]) => ( | |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 323 | <div key={topic} className="grid grid-cols-[1fr_1.3fr_1.6fr] border-t border-line text-sm"> |
| API and MCP server, Rust identity service, registration, site redesign | 324 | <div className="px-5 py-4 font-medium">{topic}</div> |
| 325 | <div className="px-5 py-4 text-muted">{before}</div> | |
| 326 | <div className="px-5 py-4">{after}</div> | |
| 327 | </div> | |
| 328 | ))} | |
| 329 | </div> | |
| 330 | </section> | |
| 331 | ||
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 332 | {/* Open source */} |
| API and MCP server, Rust identity service, registration, site redesign | 333 | <section className="mx-auto max-w-6xl px-4 pb-8"> |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 334 | <div className="dusk relative overflow-hidden rounded-3xl p-10 text-center ring-1 ring-line"> |
| 335 | <h2 className="text-2xl font-semibold tracking-tight">Open source, and built on itself</h2> | |
| 336 | <p className="mx-auto mt-3 max-w-xl text-fg-soft/80"> | |
| 337 | g1t's own source lives on g1t, and its changes land through its own queue. It runs | |
| 338 | entirely on Cloudflare's developer platform. | |
| API and MCP server, Rust identity service, registration, site redesign | 339 | </p> |
| 340 | <ul className="mt-6 flex flex-wrap justify-center gap-2"> | |
| 341 | {PLATFORM.map((name) => ( | |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 342 | <li key={name} className="rounded-full bg-bg/60 px-3 py-1 font-mono text-xs text-fg-soft ring-1 ring-white/10"> |
| API and MCP server, Rust identity service, registration, site redesign | 343 | {name} |
| 344 | </li> | |
| 345 | ))} | |
| 346 | </ul> | |
| 347 | <div className="mt-8 flex flex-wrap justify-center gap-3"> | |
| 348 | <ButtonLink to="/syntaqx/g1t" variant="primary" large> | |
| 349 | Browse the source | |
| 350 | </ButtonLink> | |
| 351 | <ButtonLink to="/register" variant="quiet" large> | |
| 352 | Create an account | |
| 353 | </ButtonLink> | |
| 354 | </div> | |
| 355 | </div> | |
| 356 | ||
| 357 | {repos.length > 0 && ( | |
| 358 | <div className="mt-20"> | |
| 359 | <div className="flex items-baseline justify-between"> | |
| A dusk palette and isometric line art, with the landing page rewritten around agents as a team | 360 | <h2 className="text-sm font-medium text-muted">Public repositories</h2> |
| API and MCP server, Rust identity service, registration, site redesign | 361 | <Link to="/explore" className="text-sm text-muted hover:text-fg"> |
| 362 | Explore all | |
| 363 | </Link> | |
| 364 | </div> | |
| 365 | <RepoList repos={repos.slice(0, 6)} /> | |
| 366 | </div> | |
| 367 | )} | |
| 368 | </section> | |
| 369 | </main> | |
| 370 | ); | |
| 371 | } |