Skip to content
642 linesCodeBlameRaw

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.

Prices keep themselves current with what g1t pays1import { ArrowUpRight } from "lucide-react";
2
status.g1t.sh with incident management, invites that land you in the workspace, settings as pages, usage without quotas3import { type FeaturePlan, type FreeTier, MICROS_PER_DOLLAR, type Price } from "@g1t/contracts";
Prices keep themselves current with what g1t pays4
5import type { Route } from "./+types/pricing";
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look6import { wholeDollars } from "../lib/billing";
Social cards for every page: og.g1t.sh7import { page } from "../lib/meta";
Prices keep themselves current with what g1t pays8import { TimeAgo } from "../components/ui";
9import { billing } from "../lib/services.server";
10
Social cards for every page: og.g1t.sh11export function meta(args: Route.MetaArgs) {
12 return page(args, {
13 title: "Pricing · g1t",
Team plan, an open-source pool, monthly trials and honest metering; the sidebar for everyone; a workspace that stays put14 description:
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look15 "The forge is free. One plan, $20 a month per workspace with $10 of usage included; usage at what it costs g1t plus 20%. No seats, ever.",
Social cards for every page: og.g1t.sh16 });
Prices keep themselves current with what g1t pays17}
18
19export async function loader() {
Billing accounts, terms and enterprises; g1t is no longer free20 const [book, status] = await Promise.all([billing.prices().catch(() => null), billing.status().catch(() => null)]);
21 return { book, free: status?.free ?? false };
Prices keep themselves current with what g1t pays22}
23
24/** A price in dollars, with as many digits as it needs to say anything. */
25function money(micros: number): string {
26 const dollars = micros / MICROS_PER_DOLLAR;
27 if (dollars >= 1) return `$${dollars.toFixed(2)}`;
28 if (dollars >= 0.01) return `$${dollars.toFixed(3)}`;
29 return `$${dollars.toPrecision(2)}`;
30}
31
32/** Per second is easier to read per minute. */
33function perUnit(price: Price, micros: number): string {
34 return price.unit === "second" ? `${money(micros * 60)} a minute` : `${money(micros)} per ${price.unit}`;
35}
36
Team plan, an open-source pool, monthly trials and honest metering; the sidebar for everyone; a workspace that stays put37function gigabytes(bytes: number): string {
38 return `${Math.round((bytes / 1e9) * 10) / 10} GB`;
39}
40
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look41function count(n: number): string {
42 return n.toLocaleString("en-US");
43}
44
Usage, Billing settings and prepaid AI credit; fixes from the UX audit45/** Price-book rows the table shows in rows of their own, or not at all. */
46const SHOWN_APART = new Set(["app_month", "agent_models", "agent_tokens", "gateway_models", "card_fee_percent", "card_fee_fixed"]);
47
Team plan, an open-source pool, monthly trials and honest metering; the sidebar for everyone; a workspace that stays put48/** What the page says when billing cannot be reached: the published defaults. */
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look49const DEFAULT_FREE: Required<FreeTier> = {
50 trialWorkspaceMicros: 5_000_000,
51 trialMonthlyPoolMicros: 100_000_000,
52 ossPoolMicros: 25_000_000,
53 ossRepoMicros: 2_000_000,
Team plan, an open-source pool, monthly trials and honest metering; the sidebar for everyone; a workspace that stays put54 freePrivateStorageBytes: 1_000_000_000,
Audit logs are kept by plan: a week on free, 90 days on the plan, and what staff set for an account in sudo55 auditRetentionDays: 7,
56 planAuditRetentionDays: 90,
Team plan, an open-source pool, monthly trials and honest metering; the sidebar for everyone; a workspace that stays put57 minChargeMicros: 5_000_000,
status.g1t.sh with incident management, invites that land you in the workspace, settings as pages, usage without quotas58 gitOperationsIncluded: 50_000,
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look59 paidStartCeilingMicros: 100_000_000,
60 overageForgiveCostMicros: 50_000_000,
Team plan, an open-source pool, monthly trials and honest metering; the sidebar for everyone; a workspace that stays put61};
62
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look63const DEFAULT_PLAN: FeaturePlan = {
64 feature: "plan",
65 title: "g1t",
66 monthlyCents: 2000,
67 includes: [
status.g1t.sh with incident management, invites that land you in the workspace, settings as pages, usage without quotas68 "$10 of usage each month at cost plus 20%, used first",
69 "Everyone in the workspace at one price, never per person",
70 "Unlimited projects, previews and repositories",
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look71 "Agents, checks, workflows, the merge queue, deployments and semantic search",
status.g1t.sh with incident management, invites that land you in the workspace, settings as pages, usage without quotas72 "Usage past $10 is charged at cost plus 20%, up to your spend limit",
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look73 ],
status.g1t.sh with incident management, invites that land you in the workspace, settings as pages, usage without quotas74 overage: "Everything is metered from the first unit at what it costs g1t plus 20%. Unused included usage does not roll over.",
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look75};
76
Team plan, an open-source pool, monthly trials and honest metering; the sidebar for everyone; a workspace that stays put77/** The ways to reach g1t about an enterprise account. */
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look78const ENTERPRISE_MAIL = "mailto:hey@flagon.io?subject=Enterprise%20billing%20for%20g1t";
Team plan, an open-source pool, monthly trials and honest metering; the sidebar for everyone; a workspace that stays put79
Prices keep themselves current with what g1t pays80const HOW = [
81 {
82 title: "Our cost, passed through",
Usage, Billing settings and prepaid AI credit; fixes from the UX audit83 body: "Every sandbox second, build and app request costs g1t money at Cloudflare. Each is metered and charged at that cost plus 20%, from the first second and the first request. Models are charged at the provider's price with no markup, plus a flat agent rate per million tokens for what g1t adds around them, from prepaid AI credit. Use a little, pay a little.",
Prices keep themselves current with what g1t pays84 },
85 {
86 title: "Prices follow costs, by themselves",
Git storage hardened, pages in tens of milliseconds, honest security alerts, and costs reconciled daily87 body: "Model runs are charged at what Cloudflare's AI Gateway priced each request at, so a provider's price change reaches you the same day. Every day, sandbox, build and app costs are checked against what Cloudflare billed g1t; when one moves, its price moves with it, and the change is listed below. The rest are Cloudflare's published prices, marked as such.",
Prices keep themselves current with what g1t pays88 },
89 {
Prices are what g1t pays plus 20%, from the first second90 title: "The 20% is the overhead",
Usage, Billing settings and prepaid AI credit; fixes from the UX audit91 body: "It pays for running g1t and for building and keeping up the features you use. The same 20% on everything but models, whose overhead is the agent rate, and nothing bundled in.",
Prices are what g1t pays plus 20%, from the first second92 },
93 {
Prices keep themselves current with what g1t pays94 title: "No seats, ever",
Site, sudo, API and docs: tax, card fees and free workspace limits95 body: "Once a workspace is on the plan, add as many people and agents as you like. It pays one flat price for the plan, and for what it uses past what the plan includes.",
96 },
97 {
98 title: "Prices exclude tax",
99 body: "Every price here is before tax. Stripe adds sales tax, VAT or GST where it applies, worked out from the billing address, and shows it as its own line before you pay and on every receipt and invoice. A valid business tax ID is applied where the law says so.",
100 },
101 {
102 title: "Card fees are passed on, nothing more",
103 body: "Paying by card adds Stripe's card processing fee as its own line, shown before you pay, so the 20% is never spent on fees. A bank transfer or invoiced billing has no card fee.",
Prices keep themselves current with what g1t pays104 },
105];
106
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look107/** One row of the free-and-plan table. */
108type Row = { what: string; free: string; plan: string; note?: string };
109
110function rows(tier: Required<FreeTier>): Row[] {
111 return [
112 {
113 what: "The forge",
114 free: "Free",
115 plan: "Included",
116 note: "Public and private repositories, issues, pull requests, reviews, protected branches, code owners, search and Explore.",
117 },
118 {
119 what: "Agents, checks, workflows, merge queue",
120 free: "After a card check: the trial, and the open-source pool for checks, workflows and the merge queue on public repositories",
121 plan: "From the plan's included usage, then at cost plus 20%",
122 },
123 {
status.g1t.sh with incident management, invites that land you in the workspace, settings as pages, usage without quotas124 what: "Projects and previews",
125 free: "Not available: deployments run on g1t's machines",
126 plan: "Unlimited, and never charged for. An app no one visits costs nothing.",
127 },
128 {
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look129 what: "Deployments",
130 free: "Not available",
status.g1t.sh with incident management, invites that land you in the workspace, settings as pages, usage without quotas131 plan: "Builds by the second, app requests, CPU time and custom domains, each from the first at cost plus 20%",
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look132 },
133 {
134 what: "Semantic search",
135 free: "After a card check, from the trial",
136 plan: "From the plan's included usage, then at cost plus 20%",
137 },
138 {
139 what: "Private storage",
140 free: `${gigabytes(tier.freePrivateStorageBytes)}, never charged. Past it, pushes to private repositories stop until you make room or start the plan.`,
status.g1t.sh with incident management, invites that land you in the workspace, settings as pages, usage without quotas141 plan: `${gigabytes(tier.freePrivateStorageBytes)} free, then at cost plus 20%. Pushes never stop.`,
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look142 note: "Public repositories are never charged for storage.",
143 },
144 {
145 what: "Git operations",
status.g1t.sh with incident management, invites that land you in the workspace, settings as pages, usage without quotas146 free: `${count(tier.gitOperationsIncluded)} a month, never charged. Past it, slowed to 60 an hour until the month turns.`,
147 plan: `${count(tier.gitOperationsIncluded)} a month free, then at cost plus 20%. Never slowed.`,
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look148 note: "Clones, fetches and pushes through g1t.",
149 },
150 {
Git storage hardened, pages in tens of milliseconds, honest security alerts, and costs reconciled daily151 what: "Actions cache",
152 free: "2 GiB an entry and 10 GiB a repository, never charged",
153 plan: "The same limits, with what it stores at cost plus 20%",
154 },
155 {
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look156 what: "Audit log",
157 free: `${tier.auditRetentionDays} days, with export`,
Audit logs are kept by plan: a week on free, 90 days on the plan, and what staff set for an account in sudo158 plan: `${tier.planAuditRetentionDays} days, with export`,
159 note: "Longer by arrangement. Older entries are deleted each day.",
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look160 },
Teams and CODEOWNERS, labels and milestones, dependency updates, the security suite, and a clearer top bar161 {
162 what: "Secret scanning, push protection, vulnerability alerts, security updates",
163 free: "Included",
164 plan: "Included",
165 note: "Custom patterns, validity checks, code scanning, dependency review and the security overview on private repositories are the Security and quality activation. On public repositories they are free.",
166 },
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look167 { what: "Single sign-on", free: "On every plan, once it is built", plan: "On every plan, once it is built" },
168 {
Site, sudo, API and docs: tax, card fees and free workspace limits169 what: "Members",
170 free: "Only the people already in it: a free workspace cannot add members, invite people or invite outside collaborators",
171 plan: "Unlimited, never per seat",
172 note: "Each person can own one free workspace. More workspaces need the plan.",
173 },
174 {
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look175 what: "Usage past what is included",
176 free: "Not possible: a free workspace never runs up a bill",
status.g1t.sh with incident management, invites that land you in the workspace, settings as pages, usage without quotas177 plan: "Charged at cost plus 20%, up to a spend limit you set. No quotas: only your limit stops anything.",
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look178 },
179 ];
180}
181
Prices keep themselves current with what g1t pays182export default function Pricing({ loaderData }: Route.ComponentProps) {
Billing accounts, terms and enterprises; g1t is no longer free183 const { book, free } = loaderData;
Prices keep themselves current with what g1t pays184 const checked = book?.prices.map((p) => p.checkedAt).filter((at): at is string => !!at).sort().at(-1);
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look185 const given = Object.fromEntries(Object.entries(book?.free ?? {}).filter(([, value]) => value != null));
186 const tier: Required<FreeTier> = { ...DEFAULT_FREE, ...given };
187 const plan = book?.plans?.find((p) => p.feature === "plan") ?? DEFAULT_PLAN;
Teams and CODEOWNERS, labels and milestones, dependency updates, the security suite, and a clearer top bar188 // The Security and quality activation, as the price book prices it.
189 const securityPlan = book?.plans?.find((p) => p.feature === "security") ?? null;
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look190 const price = plan.monthlyCents / 100;
191 const dollars = wholeDollars;
Prices keep themselves current with what g1t pays192 return (
193 <main className="mx-auto max-w-4xl px-4 py-12">
194 <p className="text-sm font-medium text-accent">Pricing</p>
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look195 <h1 className="mt-2 text-3xl font-semibold tracking-tight sm:text-4xl">One plan, and usage at cost plus 20%</h1>
Prices keep themselves current with what g1t pays196 <p className="mt-3 max-w-2xl text-muted">
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look197 The forge is free for everyone. Work that runs on g1t's machines is metered at what it costs g1t, plus 20%. The
Site, sudo, API and docs: tax, card fees and free workspace limits198 numbers on this page are the live price book g1t charges from. Prices exclude tax, which is added where it applies.
Prices keep themselves current with what g1t pays199 </p>
Billing accounts, terms and enterprises; g1t is no longer free200 {free && (
201 <div className="mt-5 rounded-xl border border-accent/30 bg-accent/5 px-4 py-3 text-sm">
202 <span className="font-medium">Free while g1t is being built out.</span>{" "}
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look203 <span className="text-muted">Usage is recorded at these prices but not charged for now. The plan is charged.</span>
Billing accounts, terms and enterprises; g1t is no longer free204 </div>
205 )}
Prices keep themselves current with what g1t pays206
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look207 <section className="mt-10 rounded-xl border border-accent/40 bg-surface p-6">
208 <div className="flex flex-wrap items-baseline justify-between gap-3">
209 <h2 className="text-xl font-semibold tracking-tight">{plan.title}</h2>
210 <p>
211 <span className="text-3xl font-semibold tabular-nums">${price}</span>{" "}
212 <span className="text-sm text-muted">a month per workspace</span>
Site, sudo, API and docs: tax, card fees and free workspace limits213 <span className="block text-right text-xs text-faint">
214 {plan.cardFeeCents ? `+ $${(plan.cardFeeCents / 100).toFixed(2)} card processing fee, plus tax where it applies` : "Plus tax where it applies"}
215 </span>
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look216 </p>
217 </div>
218 <ul className="mt-4 space-y-1.5 text-sm text-muted">
219 {plan.includes.map((line) => (
220 <li key={line} className="flex gap-2">
221 <span aria-hidden className="text-accent">
222 ✓
223 </span>
224 {line}
225 </li>
226 ))}
227 </ul>
228 <p className="mt-3 text-xs text-faint">{plan.overage}</p>
229 <div className="mt-5 grid gap-5 border-t border-line pt-5 text-sm sm:grid-cols-2">
230 <div>
231 <p className="font-medium">Where the ${price} goes</p>
232 <p className="mt-1 text-muted">
233 $10 comes back to you as usage: agents, sandboxes, builds and deployments at cost plus 20%, used before
234 anything else. The other $10 pays for running g1t, the free forge for everyone, and the people building it.
235 </p>
236 </div>
237 <div>
status.g1t.sh with incident management, invites that land you in the workspace, settings as pages, usage without quotas238 <p className="font-medium">No quotas</p>
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look239 <p className="mt-1 text-muted">
status.g1t.sh with incident management, invites that land you in the workspace, settings as pages, usage without quotas240 No count of projects, previews, builds, requests or git operations ever stops a workspace on the plan. Past
241 the $10, usage is charged at cost plus 20%, and only your spend limit stops it. Unused included usage does
242 not roll over.
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look243 </p>
244 </div>
245 </div>
246 <p className="mt-5 text-sm text-muted">An owner starts the plan from the workspace's Billing page.</p>
247 </section>
248
Teams and CODEOWNERS, labels and milestones, dependency updates, the security suite, and a clearer top bar249 {securityPlan && (
250 <section id="security" className="mt-6 rounded-xl border border-line bg-surface p-6">
251 <div className="flex flex-wrap items-baseline justify-between gap-3">
252 <h2 className="text-xl font-semibold tracking-tight">{securityPlan.title}</h2>
253 <p>
254 <span className="text-3xl font-semibold tabular-nums">${(securityPlan.monthlyCents / 100).toFixed(securityPlan.monthlyCents % 100 ? 2 : 0)}</span>{" "}
255 <span className="text-sm text-muted">a month per workspace</span>
Site, sudo, API and docs: tax, card fees and free workspace limits256 <span className="block text-right text-xs text-faint">
257 {securityPlan.cardFeeCents
258 ? `+ $${(securityPlan.cardFeeCents / 100).toFixed(2)} card processing fee, plus tax where it applies`
259 : "Plus tax where it applies"}
260 </span>
Teams and CODEOWNERS, labels and milestones, dependency updates, the security suite, and a clearer top bar261 </p>
262 </div>
263 <p className="mt-2 text-sm text-muted">
264 An activation, with or without the plan: the security suite's paid parts for a workspace's private repositories.
265 </p>
266 <ul className="mt-4 space-y-1.5 text-sm text-muted">
267 {securityPlan.includes.map((line) => (
268 <li key={line} className="flex gap-2">
269 <span aria-hidden className="text-accent">
270 ✓
271 </span>
272 {line}
273 </li>
274 ))}
275 </ul>
276 <p className="mt-3 text-xs text-faint">{securityPlan.overage}</p>
277 </section>
278 )}
279
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look280 <h2 className="mt-14 text-xl font-semibold tracking-tight">Free and the plan, side by side</h2>
Teams and CODEOWNERS, labels and milestones, dependency updates, the security suite, and a clearer top bar281 <p className="mt-1 text-sm text-muted">
282 Secret scanning, push protection, vulnerability alerts and security updates are free everywhere, on every plan.
283 </p>
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look284 {/* On a phone, one row at a time with both answers under it; a table that wide would scroll. */}
285 <ul className="mt-4 divide-y divide-line rounded-xl border border-line text-sm sm:hidden">
286 {rows(tier).map((row) => (
287 <li key={row.what} className="px-4 py-3">
288 <p className="font-medium">{row.what}</p>
289 {row.note && <p className="text-xs text-faint">{row.note}</p>}
290 <dl className="mt-2 grid grid-cols-[4.5rem_1fr] gap-x-3 gap-y-1.5">
291 <dt className="text-xs leading-5 text-faint">Free</dt>
292 <dd className="text-muted">{row.free}</dd>
293 <dt className="text-xs leading-5 text-faint">{plan.title}</dt>
294 <dd className="text-muted">{row.plan}</dd>
295 </dl>
296 </li>
297 ))}
298 </ul>
299 <div className="mt-4 hidden overflow-x-auto rounded-xl border border-line sm:block">
300 <table className="w-full min-w-[36rem] text-left text-sm">
301 <thead className="border-b border-line text-xs text-muted">
302 <tr>
303 <th className="px-4 py-2.5 font-medium">
304 <span className="sr-only">What</span>
305 </th>
306 <th className="px-4 py-2.5 font-medium">Free</th>
307 <th className="px-4 py-2.5 font-medium">
308 {plan.title}, ${price} a month
309 </th>
310 </tr>
311 </thead>
312 <tbody className="divide-y divide-line">
313 {rows(tier).map((row) => (
314 <tr key={row.what} className="align-top">
315 <td className="px-4 py-3">
316 <p className="font-medium">{row.what}</p>
317 {row.note && <p className="text-xs text-faint">{row.note}</p>}
318 </td>
319 <td className="px-4 py-3 text-muted">{row.free}</td>
320 <td className="px-4 py-3 text-muted">{row.plan}</td>
321 </tr>
322 ))}
323 </tbody>
324 </table>
325 </div>
326 <p className="mt-3 text-sm text-muted">
327 Git operations cost g1t money too: Cloudflare charges g1t $0.15 per 1,000. {count(tier.gitOperationsIncluded)} a
status.g1t.sh with incident management, invites that land you in the workspace, settings as pages, usage without quotas328 month is far more than an active workspace uses; an agent run takes two to four.
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look329 </p>
330
331 <h2 className="mt-14 text-xl font-semibold tracking-tight">No card, no compute</h2>
332 <div className="mt-3 max-w-3xl space-y-3 text-sm text-muted">
333 <p>
334 Agents, checks, workflows, the merge queue, deployments and semantic search run on g1t's machines. They need
335 the plan, or a card check.
336 </p>
337 <p>
338 The reason: compute costs g1t real money from the first second, and free compute draws people who use it to
339 mine cryptocurrency. A card check is the smallest gate that stops that, with one trial per card.
340 </p>
341 <p>
342 A card check is never charged. Stripe saves and verifies the card, with 3-D Secure where your bank asks for it.
343 Nothing is charged until an owner starts the plan, and then the same card is used, without asking for it again.
344 The trial needs a credit or debit card; prepaid cards can still pay for the plan.
345 </p>
346 </div>
347
348 <div className="mt-5 grid gap-4 sm:grid-cols-2">
349 <section className="rounded-xl border border-line bg-surface p-5">
350 <h3 className="font-medium">The trial</h3>
351 <p className="mt-1.5 text-sm text-muted">
352 {dollars(tier.trialWorkspaceMicros)} of usage, once per workspace and once per card, after a card check with a credit or
353 debit card. It comes from a{" "}
354 {dollars(tier.trialMonthlyPoolMicros)} pool each month for everyone; when a month's pool is given out, new
355 trials wait until the 1st. The trial does not cover deployments and never turns into a charge. If the last
356 run on a trial goes past it, g1t covers the difference.
357 </p>
358 </section>
359 <section className="rounded-xl border border-line bg-surface p-5">
360 <h3 className="font-medium">The open-source pool</h3>
361 <p className="mt-1.5 text-sm text-muted">
362 Checks, workflows and the merge queue on public repositories, after a card check:{" "}
363 {dollars(tier.ossPoolMicros)} a month in all, up to {dollars(tier.ossRepoMicros)} a month per repository.
364 Agents do not run from the pool. When the pool or a repository's share is used up, the work waits for the
365 month to turn, or the workspace pays as usual.
366 </p>
367 </section>
368 </div>
369
370 <h2 className="mt-14 text-xl font-semibold tracking-tight">Limits, and how to raise them</h2>
371 <p className="mt-1 max-w-3xl text-sm text-muted">
372 g1t lets usage run ahead of payment only so far. Limits keep a mistake small, for you and for g1t.
373 </p>
374 <ul className="mt-4 grid gap-3 text-sm sm:grid-cols-2">
375 <li className="rounded-xl border border-line bg-surface p-4">
376 <p className="font-medium">{dollars(tier.paidStartCeilingMicros)} in the first month</p>
377 <p className="mt-1 text-muted">
378 A workspace on the plan can use up to {dollars(tier.paidStartCeilingMicros)} in its first month. After that,
379 the limit grows with payments that clear.
380 </p>
381 </li>
382 <li className="rounded-xl border border-line bg-surface p-4">
383 <p className="font-medium">Your own spend limit</p>
384 <p className="mt-1 text-muted">
385 Owners set a monthly spend limit anywhere up to the highest limit the workspace has had, with no approval.
386 Once, you can raise it yourself to twice that.
387 </p>
388 </li>
389 <li className="rounded-xl border border-line bg-surface p-4">
390 <p className="font-medium">Prepay to raise it now</p>
391 <p className="mt-1 text-muted">
392 Prepaying from $25 raises what you can use by the same amount, at once. From $1,000 you can also pay by bank
393 transfer.
394 </p>
395 </li>
396 <li className="rounded-xl border border-line bg-surface p-4">
397 <p className="font-medium">Raise my limit</p>
398 <p className="mt-1 text-muted">
399 Need more? Ask from Billing with the amount, why, and what you expect to spend. You get an answer within one
400 business day, in the app and by email.
401 </p>
402 </li>
403 </ul>
404
405 <h2 className="mt-14 text-xl font-semibold tracking-tight">When usage runs high</h2>
406 <ul className="mt-4 grid gap-3 text-sm sm:grid-cols-2">
407 <li className="rounded-xl border border-line bg-surface p-4">
408 <p className="font-medium">A spike pauses new work</p>
409 <p className="mt-1 text-muted">
410 When an hour's spend is five times your usual hour, and at least $5, new compute waits for an owner to choose
411 Keep going or Stop. Runs already going finish.
412 </p>
413 </li>
414 <li className="rounded-xl border border-line bg-surface p-4">
415 <p className="font-medium">Caps per run and per issue</p>
416 <p className="mt-1 text-muted">
417 One agent run stops at $2 and the agents on one issue at $10 in all, so a run stuck in a loop stops on its own.
418 Owners change both on Billing.
419 </p>
420 </li>
421 <li className="rounded-xl border border-line bg-surface p-4">
422 <p className="font-medium">Alerts at 50, 75, 90 and 100%</p>
423 <p className="mt-1 text-muted">
424 Of the plan's included usage, your spend limit and g1t's limit: in the app and by email.
425 </p>
426 </li>
427 <li className="rounded-xl border border-line bg-surface p-4">
428 <p className="font-medium">Spent more than you meant to? Tell us</p>
429 <p className="mt-1 text-muted">
430 Tell us from Billing what happened. Once in 12 months, g1t can credit back usage you did not mean, always
431 including its 20% on it. Larger credits, or a second one within 12 months, are reviewed by a person.
432 </p>
433 </li>
434 </ul>
435 <p className="mt-3 text-sm text-muted">
436 No card is charged less than {dollars(tier.minChargeMicros)} when a month closes, so a payment's fee is never most
437 of it. Smaller amounts carry over to the next invoice. Charges at a limit always go through.
438 </p>
439
440 <div className="mt-14 grid gap-4 sm:grid-cols-2">
Prices keep themselves current with what g1t pays441 {HOW.map((item) => (
442 <section key={item.title} className="rounded-xl border border-line bg-surface p-5">
443 <h2 className="font-medium">{item.title}</h2>
444 <p className="mt-1.5 text-sm text-muted">{item.body}</p>
445 </section>
446 ))}
447 </div>
448
449 <h2 className="mt-14 text-xl font-semibold tracking-tight">Usage</h2>
450 <p className="mt-1 text-sm text-muted">
451 {checked ? (
452 <>
453 Last checked against Cloudflare's bill <TimeAgo at={checked} />.
454 </>
455 ) : (
456 "Starting from Cloudflare's published prices; checked against its bill daily."
457 )}
458 </p>
459 <div className="mt-4 overflow-x-auto rounded-xl border border-line">
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look460 <table className="w-full text-left text-sm sm:min-w-[36rem]">
Prices keep themselves current with what g1t pays461 <thead className="border-b border-line text-xs text-muted">
462 <tr>
463 <th className="px-4 py-2.5 font-medium">What</th>
464 <th className="px-4 py-2.5 font-medium">Costs g1t</th>
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look465 {/* The markup is in what you pay; on a phone the column gives way. */}
466 <th className="hidden px-4 py-2.5 font-medium sm:table-cell">Markup</th>
Prices keep themselves current with what g1t pays467 <th className="px-4 py-2.5 font-medium">You pay</th>
468 </tr>
469 </thead>
470 <tbody className="divide-y divide-line">
471 <tr>
472 <td className="px-4 py-3">
Usage, Billing settings and prepaid AI credit; fixes from the UX audit473 <p className="font-medium">Agent models</p>
474 <p className="text-xs text-faint">g1t's hosted models for agent runs, paid from AI credit</p>
Prices keep themselves current with what g1t pays475 </td>
476 <td className="px-4 py-3 text-muted">What the provider charges, per request</td>
Usage, Billing settings and prepaid AI credit; fixes from the UX audit477 <td className="hidden px-4 py-3 tabular-nums sm:table-cell">{book?.modelMarginPercent ?? 0}%</td>
478 <td className="px-4 py-3 text-muted">{book?.modelMarginPercent ? `Cost + ${book.modelMarginPercent}%` : "The provider's price"}</td>
Prices keep themselves current with what g1t pays479 </tr>
Usage, Billing settings and prepaid AI credit; fixes from the UX audit480 {(() => {
481 const rate = book?.prices.find((p) => p.meter === "agent_tokens");
482 const gateway = book?.prices.find((p) => p.meter === "gateway_models");
483 const feePercent = book?.prices.find((p) => p.meter === "card_fee_percent");
484 const feeFixed = book?.prices.find((p) => p.meter === "card_fee_fixed");
485 const coming = book?.changes.find((c) => c.meter === "agent_tokens" && c.effectiveAt);
486 return (
487 <>
488 <tr>
489 <td className="px-4 py-3">
490 <p className="font-medium">g1t agent rate</p>
491 <p className="text-xs text-faint">Context, memory, routing and orchestration, on every token an agent run uses</p>
492 </td>
493 <td className="px-4 py-3 text-muted">A flat rate</td>
494 <td className="hidden px-4 py-3 tabular-nums sm:table-cell">—</td>
495 <td className="px-4 py-3 font-mono text-xs tabular-nums">
496 {rate && rate.priceMicros > 0 ? `${money(rate.priceMicros)} per million tokens` : coming ? `${money(coming.newCostMicros)} per million tokens from ${coming.effectiveAt!.slice(0, 10)}` : "$0.25 per million tokens"}
497 </td>
498 </tr>
499 <tr>
500 <td className="px-4 py-3">
501 <p className="font-medium">
502 AI Gateway <span className="ml-1 rounded bg-accent/15 px-1.5 py-0.5 text-xs text-accent">Free during beta</span>
503 </p>
504 <p className="text-xs text-faint">Your own apps calling models through g1t; your own key is free on the plan</p>
505 </td>
506 <td className="px-4 py-3 text-muted">What the provider charges</td>
507 <td className="hidden px-4 py-3 tabular-nums sm:table-cell">{gateway?.markupPercent ?? 0}%</td>
508 <td className="px-4 py-3 text-muted">{gateway?.markupPercent ? `Cost + ${gateway.markupPercent}%` : "The provider's price"}</td>
509 </tr>
510 {feePercent && feeFixed && (
511 <tr>
512 <td className="px-4 py-3">
513 <p className="font-medium">Card processing fee</p>
Site, sudo, API and docs: tax, card fees and free workspace limits514 <p className="text-xs text-faint">
515 On every card payment, as its own line shown before you pay; never on bank transfers or invoiced billing
516 </p>
Usage, Billing settings and prepaid AI credit; fixes from the UX audit517 </td>
518 <td className="px-4 py-3 text-muted">Stripe's fee</td>
519 <td className="hidden px-4 py-3 tabular-nums sm:table-cell">—</td>
520 <td className="px-4 py-3 font-mono text-xs tabular-nums">
521 {(feePercent.priceMicros / 10_000).toFixed(1)}% + {money(feeFixed.priceMicros)}
522 </td>
523 </tr>
524 )}
525 </>
526 );
527 })()}
status.g1t.sh with incident management, invites that land you in the workspace, settings as pages, usage without quotas528 <tr>
529 <td className="px-4 py-3">
530 <p className="font-medium">Projects, previews and apps</p>
Git storage hardened, pages in tens of milliseconds, honest security alerts, and costs reconciled daily531 <p className="text-xs text-faint">Having them. An app's requests and CPU time are charged below.</p>
status.g1t.sh with incident management, invites that land you in the workspace, settings as pages, usage without quotas532 </td>
533 <td className="px-4 py-3 text-muted">Next to nothing</td>
534 <td className="hidden px-4 py-3 tabular-nums sm:table-cell">—</td>
535 <td className="px-4 py-3 text-muted">Not charged</td>
536 </tr>
Usage, Billing settings and prepaid AI credit; fixes from the UX audit537 {(book?.prices ?? []).filter((price) => !SHOWN_APART.has(price.meter)).map((price) => (
Prices keep themselves current with what g1t pays538 <tr key={price.meter}>
539 <td className="px-4 py-3">
540 <p className="font-medium">{price.title}</p>
541 <p className="text-xs text-faint">
Git storage hardened, pages in tens of milliseconds, honest security alerts, and costs reconciled daily542 {price.meter === "actions_cache" ? "On the plan only. A free workspace is never charged for it. " : ""}
Prices keep themselves current with what g1t pays543 {price.source === "cloudflare" ? "Measured from Cloudflare's bill" : "Cloudflare's published price"}
544 </p>
545 </td>
546 <td className="px-4 py-3 font-mono text-xs tabular-nums text-muted">{perUnit(price, price.costMicros)}</td>
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look547 <td className="hidden px-4 py-3 tabular-nums sm:table-cell">{price.markupPercent}%</td>
Prices keep themselves current with what g1t pays548 <td className="px-4 py-3 font-mono text-xs tabular-nums">{perUnit(price, price.priceMicros)}</td>
549 </tr>
550 ))}
Team plan, an open-source pool, monthly trials and honest metering; the sidebar for everyone; a workspace that stays put551 </tbody>
552 </table>
553 </div>
554
555 <h2 className="mt-14 text-xl font-semibold tracking-tight">Enterprise</h2>
556 <p className="mt-1 text-sm text-muted">
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look557 For organizations with several workspaces: one invoice and one limit. The prices are the ones on this page.
Team plan, an open-source pool, monthly trials and honest metering; the sidebar for everyone; a workspace that stays put558 </p>
Prices keep themselves current with what g1t pays559 <section className="mt-4 rounded-xl border border-line bg-surface p-5">
Team plan, an open-source pool, monthly trials and honest metering; the sidebar for everyone; a workspace that stays put560 <ul className="grid gap-3 text-sm sm:grid-cols-2">
561 <li>
562 <p className="font-medium">Consolidated invoicing</p>
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look563 <p className="text-muted">One monthly invoice for every workspace, paid by card or bank transfer.</p>
Team plan, an open-source pool, monthly trials and honest metering; the sidebar for everyone; a workspace that stays put564 </li>
565 <li>
566 <p className="font-medium">Custom terms</p>
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look567 <p className="text-muted">One limit across every workspace, invoice terms and a billing contact, set with you.</p>
Team plan, an open-source pool, monthly trials and honest metering; the sidebar for everyone; a workspace that stays put568 </li>
569 <li>
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look570 <p className="font-medium">Security on every plan</p>
571 <p className="text-muted">
Audit logs are kept by plan: a week on free, 90 days on the plan, and what staff set for an account in sudo572 The audit log with export, {tier.planAuditRetentionDays} days or longer by arrangement, and secret push
573 protection, for every workspace.
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look574 </p>
Team plan, an open-source pool, monthly trials and honest metering; the sidebar for everyone; a workspace that stays put575 </li>
576 <li>
577 <p className="font-medium">
578 Single sign-on <span className="ml-1 rounded bg-raised px-1.5 py-0.5 text-xs text-muted">Coming</span>
579 </p>
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look580 <p className="text-muted">Through your identity provider, on every plan once it is built. Not available yet.</p>
Team plan, an open-source pool, monthly trials and honest metering; the sidebar for everyone; a workspace that stays put581 </li>
582 </ul>
583 <a
584 href={ENTERPRISE_MAIL}
585 className="mt-5 inline-flex items-center gap-1.5 rounded-md border border-line px-3 py-1.5 text-sm hover:border-line-strong"
586 >
587 Write to us about enterprise
588 <ArrowUpRight size={14} />
589 </a>
Prices keep themselves current with what g1t pays590 </section>
591
592 <h2 className="mt-14 text-xl font-semibold tracking-tight">Price changes</h2>
593 {book && book.changes.length > 0 ? (
594 <ul className="mt-4 divide-y divide-line rounded-xl border border-line">
595 {book.changes.map((change) => {
596 const title = book.prices.find((p) => p.meter === change.meter)?.title ?? change.meter;
Prices are what g1t pays plus 20%, from the first second597 // What you pay moved: the cost, the markup, or both.
598 const before = change.oldCostMicros * (100 + (change.oldMarkupPercent ?? change.markupPercent));
599 const after = change.newCostMicros * (100 + change.markupPercent);
600 const up = after > before;
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look601 const fresh = after === before || before === 0;
Prices keep themselves current with what g1t pays602 return (
603 <li key={`${change.meter}-${change.createdAt}`} className="px-4 py-3 text-sm">
604 <p>
605 <span className="font-medium">{title}</span>{" "}
Team plan, an open-source pool, monthly trials and honest metering; the sidebar for everyone; a workspace that stays put606 {fresh ? (
607 <span className="text-muted">new</span>
608 ) : (
609 <span className={up ? "text-warn" : "text-accent"}>
610 {up ? "up" : "down"} {Math.abs((after / before - 1) * 100).toFixed(1)}%
611 </span>
612 )}
Prices keep themselves current with what g1t pays613 </p>
614 <p className="mt-0.5 text-xs text-faint">
Git storage hardened, pages in tens of milliseconds, honest security alerts, and costs reconciled daily615 {change.effectiveAt ? (
616 <>
617 {change.reason} · <span className="text-fg-soft">takes effect {change.effectiveAt.slice(0, 10)}</span>
618 </>
619 ) : (
620 <>
621 {change.reason} · <TimeAgo at={change.createdAt} />
622 </>
623 )}
Prices keep themselves current with what g1t pays624 </p>
625 </li>
626 );
627 })}
628 </ul>
629 ) : (
Prices are what g1t pays plus 20%, from the first second630 <p className="mt-2 text-sm text-muted">None yet. When a price moves, it is listed here with why.</p>
Prices keep themselves current with what g1t pays631 )}
632
633 <a
634 href="https://docs.g1t.sh/guides/usage-and-billing/"
635 className="mt-12 inline-flex items-center gap-1.5 text-sm text-accent hover:underline"
636 >
637 How usage and billing work
638 <ArrowUpRight size={14} />
639 </a>
640 </main>
641 );
642}