Skip to content

Where people and agents ship software together. The open-source git platform for the whole job: issues, agents, checks and deploys to the edge.

g1t.sh

Commit

Merge branch 'worktree-agent-aa1f74337a33b5f8b'

syntaqxcommitted Parents1c2db21897880eBrowse files
16 files+109−160/16 viewed
+1−1
4141 integrations: [
4242 starlight({
4343 title: 'g1t docs',
44− description: 'Guides and reference for g1t, where a team and its coding agents talk, build and ship.',
44+ description: 'Guides and reference for g1t, the code platform for your team and its coding agents.',
4545 components: {
4646 Footer: './src/components/Footer.astro',
4747 Head: './src/components/Head.astro',
+4−0
1+User-agent: *
2+Allow: /
3+
4+Sitemap: https://docs.g1t.sh/sitemap-index.xml
+1−1
11 {
22 "name": "g1t docs",
33 "short_name": "g1t",
4− "description": "How to use g1t: chat, agents, docs and code in one workspace.",
4+ "description": "How to use g1t, the code platform for your team and its coding agents.",
55 "start_url": "/",
66 "scope": "/",
77 "display": "minimal-ui",
+30−0
4545 if (current && tabs && current.offsetLeft + current.offsetWidth > tabs.clientWidth) {
4646 tabs.scrollLeft = current.offsetLeft - (tabs.clientWidth - current.offsetWidth) / 2;
4747 }
48+ // The row fades out at an edge with more tabs past it, so a cut-off
49+ // tab reads as "scroll for more" rather than as a clipped word.
50+ const bar = document.querySelector<HTMLElement>('.g1t-tabs');
51+ if (bar) {
52+ const edges = () => {
53+ const end = bar.scrollWidth - bar.clientWidth;
54+ bar.toggleAttribute('data-more-start', bar.scrollLeft > 1);
55+ bar.toggleAttribute('data-more-end', bar.scrollLeft < end - 1);
56+ };
57+ edges();
58+ bar.addEventListener('scroll', edges, { passive: true });
59+ addEventListener('resize', edges);
60+ }
4861 </script>
4962
5063 <style>
144157 .g1t-tabs::-webkit-scrollbar {
145158 display: none;
146159 }
160+ .g1t-tabs[data-more-start],
161+ .g1t-tabs[data-more-end] {
162+ --fade: 2.5rem;
163+ mask-image: linear-gradient(
164+ to right,
165+ transparent,
166+ #000 var(--fade-start, 0px),
167+ #000 calc(100% - var(--fade-end, 0px)),
168+ transparent
169+ );
170+ }
171+ .g1t-tabs[data-more-start] {
172+ --fade-start: var(--fade);
173+ }
174+ .g1t-tabs[data-more-end] {
175+ --fade-end: var(--fade);
176+ }
147177 .g1t-tabs a {
148178 display: flex;
149179 flex-shrink: 0;
+9−1
99
1010 const { entry, id } = Astro.locals.starlightRoute;
1111 const { title, description } = entry.data;
12−const section = NAV.get(Astro.locals.starlightRoute)?.section;
12+const nav = NAV.get(Astro.locals.starlightRoute)?.section;
13+// No eyebrow that only repeats the title, as on Chat's page in Chat.
14+const section = nav && nav.toLowerCase() !== title.toLowerCase() ? nav : undefined;
1315 const markdown = `/${id === '' || id === 'index' ? 'index' : id}.md`;
1416 const absolute = new URL(markdown, Astro.site).href;
1517 const ask = encodeURIComponent(`Read ${absolute} so I can ask questions about it.`);
250252 font-size: 2rem;
251253 overflow-wrap: anywhere;
252254 }
255+ /* The lead a step above the body, not a headline of its own. */
256+ .g1t-description {
257+ margin-top: 0.75rem;
258+ font-size: 1.0625rem;
259+ line-height: 1.5;
260+ }
253261 .g1t-copy {
254262 height: 2.5rem;
255263 margin-top: 0;
+16−2
5454 return slug.startsWith('reference/') ? TABS[TABS.length - 1] : tabForGroup(group.label ?? '');
5555 }
5656
57+/**
58+ * A tab's groups in the tab's own order (`groups` in tabs.ts), so a tab
59+ * opens on, and its sidebar starts with, the group it is named for: Code
60+ * on Landing changes, not on Security, which comes first in the sidebar.
61+ * The API reference tab names no groups and keeps the sidebar's order.
62+ */
63+function inTabOrder(groups: Entry[], tab: Tab): Entry[] {
64+ const rank = (group: Entry) => {
65+ const index = tab.groups.indexOf(group.label ?? '');
66+ return index === -1 ? tab.groups.length : index;
67+ };
68+ return groups.filter((group) => tabOf(group) === tab).sort((a, b) => rank(a) - rank(b));
69+}
70+
5771 /** Whether the current page is in these entries, at any depth. */
5872 function holdsCurrent(entries: Entry[]): boolean {
5973 return entries.some((entry) => entry.isCurrent || holdsCurrent(entry.entries ?? []));
7488 const tab = holder ? tabOf(holder) : TABS[0];
7589 // A tab opens on the first page of its first group; the first tab, on the home page.
7690 const tabs = TABS.map((each) => {
77− const group = each === TABS[0] ? undefined : groups.find((entry) => tabOf(entry) === each);
91+ const group = each === TABS[0] ? undefined : inTabOrder(groups, each)[0];
7892 const slug = group ? firstSlug(group.entries ?? []) : undefined;
7993 return { label: each.label, href: slug === undefined ? '/' : `/${slug}/`, current: each === tab };
8094 });
8195 NAV.set(route, { tabs, section: section ?? (route.id === '' ? undefined : tab.label) });
82− route.sidebar = route.sidebar.filter((entry) => entry.type === 'group' && tabOf(entry as Entry) === tab);
96+ route.sidebar = inTabOrder(groups, tab) as typeof route.sidebar;
8397
8498 const { title, description } = route.entry.data;
8599 const card = new URL('/docs', OG);
+24−0
280280 display: block;
281281 overflow-x: auto;
282282 }
283+ /* A shadow at an edge with more columns past it, so a cut-off column
284+ reads as "scroll for more". The covers scroll with the table and hide
285+ the shadows at its ends. */
286+ .sl-markdown-content table:not(:has(.status)) {
287+ --cover: var(--g1t-bg);
288+ /* On the dark page a shadow is a faint light, as a dark one would not show. */
289+ --shade: rgb(255 255 255 / 0.12);
290+ background:
291+ linear-gradient(to right, var(--cover) 30%, transparent) left / 2.5rem 100% no-repeat local,
292+ linear-gradient(to left, var(--cover) 30%, transparent) right / 2.5rem 100% no-repeat local,
293+ radial-gradient(farthest-side at 0 50%, var(--shade), transparent) left / 0.875rem 100% no-repeat scroll,
294+ radial-gradient(farthest-side at 100% 50%, var(--shade), transparent) right / 0.875rem 100% no-repeat scroll;
295+ }
296+ :root[data-theme='light'] .sl-markdown-content table:not(:has(.status)) {
297+ --shade: rgb(24 24 27 / 0.16);
298+ }
283299 }
284300 /*
285301 * There, a name, route or value in a table is never broken, not even at a
345361
346362 /* --- On this page --------------------------------------------------------- */
347363
364+/* On a phone the list drops over the page: give it an edge and a shadow, so
365+ where it stops is clear rather than its last row running into the text. */
366+mobile-starlight-toc .dropdown {
367+ border-color: var(--g1t-line);
368+ border-bottom-color: var(--g1t-line-strong);
369+ box-shadow: var(--g1t-docs-menu-shadow);
370+}
371+
348372 .right-sidebar-panel {
349373 padding-top: 2.75rem;
350374 }
+1−1
6666 // 45 minutes, then every 6 hours). Empty sends none.
6767 "STATUS_ALERT_EMAIL": "hey@flagon.io",
6868 "STATUS_FROM": "g1t status <noreply@g1t.sh>",
69− "OG_IMAGE": "https://og.g1t.sh/image?path=%2Fstatus&v=2"
69+ "OG_IMAGE": "https://og.g1t.sh/image?path=%2Fstatus&v=3"
7070 },
7171 // Asking for a subscription sends an email: limited per client address
7272 // and per email address (src/index.ts). Ids and limits: RATE_LIMITS in
+6−3
7878 {
7979 title: "Product",
8080 links: [
81− ["Explore", "/explore"],
82− ["Pricing", "/pricing"],
83− ["Download", "/download"],
81+ // Code first, as on the landing page: then Chat, then the agents.
82+ ["Pull requests", "https://docs.g1t.sh/guides/pull-requests/"],
83+ ["Deployments", "https://docs.g1t.sh/guides/deployments/"],
8484 ["Chat", "https://docs.g1t.sh/guides/chat/"],
8585 ["Bring your own agent", "https://docs.g1t.sh/guides/bring-your-own-agent/"],
8686 ["Integrations", "https://docs.g1t.sh/guides/integrations/"],
87+ ["Explore", "/explore"],
88+ ["Pricing", "/pricing"],
89+ ["Download", "/download"],
8790 ],
8891 },
8992 {
+2−1
1818 ...page(args, {
1919 title: "g1t · Where your team's code lands",
2020 description:
21− "Repositories, pull requests, required checks, a merge queue and deployments, with chat for your team. Connect the coding agents you already use through MCP and the API. Chat is free on every plan, never per seat.",
21+ // At most 200 characters, or a preview cuts it short (lib/meta.ts).
22+ "Repositories, pull requests, required checks, a merge queue and deployments, for your team and the coding agents you bring over MCP and the API. Chat is free on every plan. Never per seat.",
2223 }),
2324 organization(),
2425 application(20),
+10−1
66 import { search } from "../lib/services.server";
77
88 /** Pages anyone can read, signed in or not. */
9−const PAGES = ["/", "/pricing", "/explore", "/support", "/security", "/policies", "/policies/privacy"];
9+const PAGES = [
10+ "/",
11+ "/pricing",
12+ "/download",
13+ "/explore",
14+ "/support",
15+ "/security",
16+ "/policies",
17+ ...["terms", "privacy", "acceptable-use", "refunds", "subprocessors"].map((policy) => `/policies/${policy}`),
18+];
1019
1120 /** How many of Explore's pages to list; each holds one page of projects. */
1221 const EXPLORE_PAGES = 10;
+1−1
11 {
22 "name": "g1t",
33 "short_name": "g1t",
4− "description": "Your team and its agents, working in one place.",
4+ "description": "The code platform for your team and its coding agents.",
55 "start_url": "/",
66 "scope": "/",
77 "display": "standalone",
+1−1
11 {
22 "name": "g1t",
33 "short_name": "g1t",
4− "description": "Your team and its agents, working in one place.",
4+ "description": "The code platform for your team and its coding agents.",
55 "start_url": "/",
66 "scope": "/",
77 "display": "standalone",
+1−1
99 * site that has already fetched a card. Without a bump, a redeployed og
1010 * keeps serving the cards it drew before.
1111 */
12−export const OG_RENDER_VERSION = "2";
12+export const OG_RENDER_VERSION = "3";
1313
1414 /**
1515 * A card's `v` parameter: the render version, then, when the page has one,
+1−1
1313 const PAD = 80;
1414
1515 /** The launch line: what g1t is, on the brand card and under every page card. */
16−export const TAGLINE = "Where people and agents ship software together.";
16+export const TAGLINE = "The code platform for your team and its agents.";
1717
1818 /** An element as satori reads it. */
1919 export type Node = { type: string; props: Record<string, unknown> & { style?: Style; children?: Child } };
+1−1
187187 address: "g1t.sh/register",
188188 eyebrow: "Get started",
189189 title: "Build and ship software, with the agents you already use.",
190− description: "Create an account on g1t, where people and agents ship software together.",
190+ description: "Create an account, then bring your code and the coding agents you already use.",
191191 },
192192 };
193193

Comments

Sign in to comment.