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
430 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.

Navigation: the workspace's own page with tabs, pins and recent in the sidebar1/**
Merge branch 'worktree-agent-ad7c6d88d93adc817'2 * A workspace's pages and where the sidebar finds them. `g1t.sh/<workspace>`
3 * is the workspace's own page, its header and overview; Projects, Packages,
4 * Teams, People, Insights and Settings are pages of their own under `-/`,
5 * each reached from the sidebar and each with its own heading. The sidebar
6 * is always the current workspace's.
Navigation: the workspace's own page with tabs, pins and recent in the sidebar7 */
8
Merge branch 'worktree-agent-ad7c6d88d93adc817'9/** The workspace's pages a person moves between, and which the sidebar lists. */
10export type WorkspacePageKey = "overview" | "projects" | "packages" | "teams" | "people" | "insights";
Navigation: the workspace's own page with tabs, pins and recent in the sidebar11
Merge branch 'worktree-agent-ad7c6d88d93adc817'12/** Those pages under `-/`: the overview is the workspace's own address. */
13export const WORKSPACE_PAGES = ["projects", "packages", "teams", "people", "insights"] as const;
Navigation: the workspace's own page with tabs, pins and recent in the sidebar14
Merge branch 'worktree-agent-ad7c6d88d93adc817'15/**
16 * Which of those pages a path is, under `/<workspace>`: null for the
Agents mode: an overview of every agent's work and spend, and each agent's sessions, memory, routines, spend, activity and versions17 * workspace's other pages (settings, Usage and the rest), for
Merge branch 'worktree-agent-ad7c6d88d93adc817'18 * one package's or one team's page, and for anything else.
19 */
20export function workspacePage(pathname: string, slug: string): WorkspacePageKey | null {
21 const parts = pagePath(pathname).split("/").filter(Boolean);
22 if (parts[0]?.toLowerCase() !== slug.toLowerCase()) return null;
23 if (parts.length === 1) return "overview";
24 if (parts[1] !== "-" || parts.length !== 3) return null;
25 return (WORKSPACE_PAGES as readonly string[]).includes(parts[2]!) ? (parts[2] as WorkspacePageKey) : null;
26}
Navigation: the workspace's own page with tabs, pins and recent in the sidebar27
The Runners page shows the machines a workspace's agents and workflow jobs run on, in Workspace under Compute: g1t's cloud beside your own runners, what each is running now with a link to it, what's waiting, this month's machine time and its cost (your own runners' free), where agent work and workflow jobs run, adding a runner, and groups; runner_activity in Actions says what runs where, work handed to your runners keeps its agent run, and the self-hosted runners guide says how.28/**
Workspace is the workspace's settings, in one place. Its sidebar is grouped, General, Access, Money, Compute, Code, Agents, Chat, Artifacts, Security and Integrations, every page one click away with no settings inside settings, the groups folding and the owner-only pages hidden from members; what is not here yet is marked Soon with a hint. Members is a list with search and filters for role, two-factor and team, and Invite opens a dialog: who, by username, name or email, their role and a note that goes into the invitation; nothing is filled in inline any more. Invitations is its own page with All, Pending, Accepted, Declined, Expired and Revoked filters that say how many, and each row's menu can copy the link, send it again or revoke it; identity learned to send an invitation again and to carry the note. Permissions gathers every rule about who may do what, by part: Code's base permission and member privileges, who creates teams, who creates channels, and, marked Soon with what applies today, forking private repositories, adding agents to conversations, messaging agents directly, creating spaces and default sharing, creating workspace agents and raising budgets, deploying to production and publishing packages. General lost what moved. The permissions guide is new, and the workspaces, people and teams, access, chat, teams, authentication and billing guides say where things are now.29 * Workspace mode's pages, in the groups its sidebar lists them under: the
30 * workspace's settings area, every page one click away. `owner` marks the
Workspace settings promise only what exists: the Soon rows Deployments, Project defaults, Spaces and sharing and Applications are gone from Workspace mode's sidebar, with the Artifacts group they left empty, and the sidebar no longer draws Soon rows at all. None had a plan behind it. Permissions loses its five locked Soon settings (forking private repositories, who can create spaces, default sharing, who can deploy to production, who can publish packages), so every setting on it saves. The permissions and workspaces guides say the same. Checked: the site's typecheck, its tests and a production build, the deploy tool's tests and the docs build.31 * pages only owners open; the sidebar shows members the rest.
Workspace is the workspace's settings, in one place. Its sidebar is grouped, General, Access, Money, Compute, Code, Agents, Chat, Artifacts, Security and Integrations, every page one click away with no settings inside settings, the groups folding and the owner-only pages hidden from members; what is not here yet is marked Soon with a hint. Members is a list with search and filters for role, two-factor and team, and Invite opens a dialog: who, by username, name or email, their role and a note that goes into the invitation; nothing is filled in inline any more. Invitations is its own page with All, Pending, Accepted, Declined, Expired and Revoked filters that say how many, and each row's menu can copy the link, send it again or revoke it; identity learned to send an invitation again and to carry the note. Permissions gathers every rule about who may do what, by part: Code's base permission and member privileges, who creates teams, who creates channels, and, marked Soon with what applies today, forking private repositories, adding agents to conversations, messaging agents directly, creating spaces and default sharing, creating workspace agents and raising budgets, deploying to production and publishing packages. General lost what moved. The permissions guide is new, and the workspaces, people and teams, access, chat, teams, authentication and billing guides say where things are now.32 * `path` is under `-/`.
The Runners page shows the machines a workspace's agents and workflow jobs run on, in Workspace under Compute: g1t's cloud beside your own runners, what each is running now with a link to it, what's waiting, this month's machine time and its cost (your own runners' free), where agent work and workflow jobs run, adding a runner, and groups; runner_activity in Actions says what runs where, work handed to your runners keeps its agent run, and the self-hosted runners guide says how.33 */
Workspace settings promise only what exists: the Soon rows Deployments, Project defaults, Spaces and sharing and Applications are gone from Workspace mode's sidebar, with the Artifacts group they left empty, and the sidebar no longer draws Soon rows at all. None had a plan behind it. Permissions loses its five locked Soon settings (forking private repositories, who can create spaces, default sharing, who can deploy to production, who can publish packages), so every setting on it saves. The permissions and workspaces guides say the same. Checked: the site's typecheck, its tests and a production build, the deploy tool's tests and the docs build.34export type WorkspaceSettingsPage = { key: string; label: string; path: string; owner?: boolean };
Workspace is the workspace's settings, in one place. Its sidebar is grouped, General, Access, Money, Compute, Code, Agents, Chat, Artifacts, Security and Integrations, every page one click away with no settings inside settings, the groups folding and the owner-only pages hidden from members; what is not here yet is marked Soon with a hint. Members is a list with search and filters for role, two-factor and team, and Invite opens a dialog: who, by username, name or email, their role and a note that goes into the invitation; nothing is filled in inline any more. Invitations is its own page with All, Pending, Accepted, Declined, Expired and Revoked filters that say how many, and each row's menu can copy the link, send it again or revoke it; identity learned to send an invitation again and to carry the note. Permissions gathers every rule about who may do what, by part: Code's base permission and member privileges, who creates teams, who creates channels, and, marked Soon with what applies today, forking private repositories, adding agents to conversations, messaging agents directly, creating spaces and default sharing, creating workspace agents and raising budgets, deploying to production and publishing packages. General lost what moved. The permissions guide is new, and the workspaces, people and teams, access, chat, teams, authentication and billing guides say where things are now.35
36export type WorkspaceSettingsGroup = { key: string; title: string; pages: WorkspaceSettingsPage[] };
Navigation: the workspace's own page with tabs, pins and recent in the sidebar37
Workspace is the workspace's settings, in one place. Its sidebar is grouped, General, Access, Money, Compute, Code, Agents, Chat, Artifacts, Security and Integrations, every page one click away with no settings inside settings, the groups folding and the owner-only pages hidden from members; what is not here yet is marked Soon with a hint. Members is a list with search and filters for role, two-factor and team, and Invite opens a dialog: who, by username, name or email, their role and a note that goes into the invitation; nothing is filled in inline any more. Invitations is its own page with All, Pending, Accepted, Declined, Expired and Revoked filters that say how many, and each row's menu can copy the link, send it again or revoke it; identity learned to send an invitation again and to carry the note. Permissions gathers every rule about who may do what, by part: Code's base permission and member privileges, who creates teams, who creates channels, and, marked Soon with what applies today, forking private repositories, adding agents to conversations, messaging agents directly, creating spaces and default sharing, creating workspace agents and raising budgets, deploying to production and publishing packages. General lost what moved. The permissions guide is new, and the workspaces, people and teams, access, chat, teams, authentication and billing guides say where things are now.38export const WORKSPACE_SETTINGS_GROUPS: readonly WorkspaceSettingsGroup[] = [
39 {
40 key: "general",
41 title: "General",
42 pages: [{ key: "settings", label: "General", path: "settings", owner: true }],
43 },
44 {
45 key: "access",
46 title: "Access",
47 pages: [
48 { key: "members", label: "Members", path: "members" },
49 { key: "invitations", label: "Invitations", path: "members/invitations", owner: true },
50 { key: "permissions", label: "Permissions", path: "permissions", owner: true },
51 { key: "tokens", label: "Access tokens", path: "tokens" },
52 { key: "personal-access-tokens", label: "Personal access tokens", path: "personal-access-tokens", owner: true },
53 ],
54 },
55 {
56 key: "money",
57 title: "Money",
58 pages: [
59 { key: "usage", label: "Usage", path: "usage" },
60 { key: "billing", label: "Billing and plans", path: "billing" },
61 ],
62 },
63 {
64 key: "compute",
65 title: "Compute",
66 pages: [{ key: "runners", label: "Runners", path: "runners", owner: true }],
67 },
68 {
69 key: "code",
70 title: "Code",
71 pages: [
72 { key: "repositories", label: "Repositories", path: "repositories" },
73 { key: "actions", label: "Actions", path: "actions" },
74 { key: "secrets", label: "Secrets and variables", path: "secrets" },
75 { key: "webhooks", label: "Webhooks", path: "webhooks" },
76 ],
77 },
78 {
79 key: "chat",
80 title: "Chat",
81 pages: [
82 { key: "chat-settings", label: "Chat settings", path: "settings/chat" },
83 { key: "emoji", label: "Emoji", path: "emoji" },
84 ],
85 },
86 {
87 key: "security",
88 title: "Security",
89 pages: [
90 { key: "security-settings", label: "Security settings", path: "security/settings" },
91 { key: "guardrails", label: "Guardrails", path: "guardrails" },
92 { key: "rules", label: "Rules", path: "rules" },
93 { key: "audit", label: "Audit log", path: "audit" },
94 ],
95 },
96 {
97 key: "integrations",
98 title: "Integrations",
Workspace settings promise only what exists: the Soon rows Deployments, Project defaults, Spaces and sharing and Applications are gone from Workspace mode's sidebar, with the Artifacts group they left empty, and the sidebar no longer draws Soon rows at all. None had a plan behind it. Permissions loses its five locked Soon settings (forking private repositories, who can create spaces, default sharing, who can deploy to production, who can publish packages), so every setting on it saves. The permissions and workspaces guides say the same. Checked: the site's typecheck, its tests and a production build, the deploy tool's tests and the docs build.99 pages: [{ key: "integrations", label: "Integrations", path: "integrations" }],
Workspace is the workspace's settings, in one place. Its sidebar is grouped, General, Access, Money, Compute, Code, Agents, Chat, Artifacts, Security and Integrations, every page one click away with no settings inside settings, the groups folding and the owner-only pages hidden from members; what is not here yet is marked Soon with a hint. Members is a list with search and filters for role, two-factor and team, and Invite opens a dialog: who, by username, name or email, their role and a note that goes into the invitation; nothing is filled in inline any more. Invitations is its own page with All, Pending, Accepted, Declined, Expired and Revoked filters that say how many, and each row's menu can copy the link, send it again or revoke it; identity learned to send an invitation again and to carry the note. Permissions gathers every rule about who may do what, by part: Code's base permission and member privileges, who creates teams, who creates channels, and, marked Soon with what applies today, forking private repositories, adding agents to conversations, messaging agents directly, creating spaces and default sharing, creating workspace agents and raising budgets, deploying to production and publishing packages. General lost what moved. The permissions guide is new, and the workspaces, people and teams, access, chat, teams, authentication and billing guides say where things are now.100 },
101];
102
103/**
104 * Which of Workspace mode's pages `pathname` is, under the workspace
105 * `slug`, as a group key and a page key; null for the overview and for
106 * anything else. A page's own subpages (one ruleset, a receipt) count as
107 * the page; the deepest match wins, so Invitations is its own page and
108 * not a subpage of Members.
109 */
110export function workspaceSettingsPage(pathname: string, slug: string): { group: string; page: string } | null {
111 const parts = pagePath(pathname).split("/").filter(Boolean);
112 if (parts[0]?.toLowerCase() !== slug.toLowerCase() || parts[1] !== "-") return null;
113 const rest = parts.slice(2).join("/");
114 let found: { group: string; page: string; depth: number } | null = null;
115 for (const group of WORKSPACE_SETTINGS_GROUPS) {
116 for (const page of group.pages) {
117 if (rest === page.path || rest.startsWith(`${page.path}/`)) {
118 const depth = page.path.split("/").length;
119 if (!found || depth > found.depth) found = { group: group.key, page: page.key, depth };
120 }
121 }
122 }
123 return found ? { group: found.group, page: found.page } : null;
124}
125
Merge branch 'worktree-agent-ad7c6d88d93adc817'126/** `?tab=` as people write it, from the tabs the workspace page once had: the page it means. */
Navigation: the workspace's own page with tabs, pins and recent in the sidebar127const TAB_WORDS: Record<string, string> = {
128 overview: "",
129 projects: "-/projects",
130 repositories: "-/projects",
131 repos: "-/projects",
132 packages: "-/packages",
133 people: "-/people",
People and teams are front and centre: one directory of people and agents with presence, local time, titles, teams and what each owns; profiles with manager and reports and the agents they work with; an org chart with each team's agents beside the person who leads it; and teams of any mix, with a lead, a channel, a budget agents keep to and the agents on them. Every agent is told its teams each turn (who leads, who owns what, who's around and who to page), and the team page shows exactly what. Member management is Members and invites; the people and teams guide says how.134 members: "-/members",
Navigation: the workspace's own page with tabs, pins and recent in the sidebar135 teams: "-/teams",
136 insights: "-/insights",
Merge branch 'worktree-agent-ad7c6d88d93adc817'137 settings: "-/settings",
Navigation: the workspace's own page with tabs, pins and recent in the sidebar138};
139
Merge remote-tracking branch 'origin/claude/cool-newton-7nm8r9' into claude/cool-newton-7nm8r9140/** Workspace pages that moved, by their old name under `-/`; a new address may carry a query of its own. */
Navigation: the workspace's own page with tabs, pins and recent in the sidebar141const MOVED: Record<string, string> = {
The front page is Home: where you're needed comes first, however long ago it started, with what's at stake and how long it has waited; then what happened since you were last here, in words, with the agent work that settled, what landed, what deployed, what was decided and what was spent, switchable to the last 24 hours or 7 days; then what's running now. Your last visit is kept with your account, so it's the same on every device; Today's old address leads here. The home guide says how.142 // Home was called Today for a while.
143 today: "-/home",
Navigation: the workspace's own page with tabs, pins and recent in the sidebar144 "soon/teams": "-/teams",
145 "soon/insights": "-/insights",
146};
147
Merge remote-tracking branch 'origin/claude/cool-newton-7nm8r9' into claude/cool-newton-7nm8r9148/** Where the page `rest` (under `-/`) is now, or null when it has not moved. */
149function movedTo(rest: string): string | null {
The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404.150 return MOVED[rest] ?? null;
Merge remote-tracking branch 'origin/claude/cool-newton-7nm8r9' into claude/cool-newton-7nm8r9151}
152
153/** `to` with `search` merged into any query of its own, as a path under the workspace. */
154function withQuery(to: string, search: string): string {
155 const [path = "", own = ""] = to.split("?", 2);
156 const params = new URLSearchParams(search);
157 for (const [key, value] of new URLSearchParams(own)) params.set(key, value);
158 const query = params.toString();
159 return `${path ? `/${path}` : ""}${query ? `?${query}` : ""}`;
160}
161
Billing: credits with a kind and expiry, discounts instead of comped, and safer charging162/** The page a request is for: a click's data request ends in `.data`. */
163export function pagePath(pathname: string): string {
164 return pathname.replace(/\.data$/, "").replace(/\/+$/, "") || "/";
165}
166
Navigation: the workspace's own page with tabs, pins and recent in the sidebar167/**
Merge branch 'worktree-agent-a8385d293d42c913a'168 * The page at `pathname` under the workspace `slug` instead of its first
169 * segment, keeping its query: where an old name or an alias leads. A click
170 * asks for the page's data at `<path>.data?_routes=…`; the address given is
171 * the page's own, which the browser then asks for as usual.
172 */
173export function underWorkspace(pathname: string, search: string, slug: string): string {
174 const params = new URLSearchParams(search);
175 params.delete("_routes");
176 const query = params.toString();
177 const segments = pagePath(pathname).split("/");
178 // segments[0] is the empty string before the leading slash.
179 segments[1] = slug;
180 return `${segments.join("/")}${query ? `?${query}` : ""}`;
181}
182
183/**
Navigation: the workspace's own page with tabs, pins and recent in the sidebar184 * Where an old address of a workspace's pages is now, keeping its query;
185 * null when it has not moved. `/<workspace>?tab=projects` and the like
Merge branch 'worktree-agent-ad7c6d88d93adc817'186 * open that page.
Navigation: the workspace's own page with tabs, pins and recent in the sidebar187 */
188export function workspaceRedirect(pathname: string, search = ""): string | null {
Billing: credits with a kind and expiry, discounts instead of comped, and safer charging189 // A click asks for the page's data at `<path>.data?_routes=…`; the page
190 // is the same one a full load asks for.
191 const params = new URLSearchParams(search);
192 params.delete("_routes");
193 search = params.toString();
194 const parts = pagePath(pathname).split("/").filter(Boolean);
Navigation: the workspace's own page with tabs, pins and recent in the sidebar195 const slug = parts[0];
196 if (!slug) return null;
197 if (parts.length === 1 && params.has("tab")) {
198 const to = TAB_WORDS[(params.get("tab") ?? "").toLowerCase()];
199 if (to === undefined) return null;
200 params.delete("tab");
201 const rest = params.toString();
202 return `/${slug}${to ? `/${to}` : ""}${rest ? `?${rest}` : ""}`;
203 }
204 if (parts[1] !== "-") return null;
Merge remote-tracking branch 'origin/claude/cool-newton-7nm8r9' into claude/cool-newton-7nm8r9205 const to = movedTo(parts.slice(2).join("/"));
206 if (to === null) return null;
207 return `/${slug}${withQuery(to, search)}`;
Navigation: the workspace's own page with tabs, pins and recent in the sidebar208}
Chat and workspace agents: channels, DMs and named agents you talk to209
210/**
The left-hand navigation takes less room and reads at a glance. The dock becomes a rail: a 56-pixel column of icons with the g1t mark on top, the current app marked by a filled square, hover hints naming each with its shortcut, the apps you pinned in a scrolling band, and Apps, People, Workspace and your account at the foot. Each mode's sidebar sits flush against it, 240 pixels wide, opening on Search or jump to and listing its groups under small labels in 36-pixel rows; Ctrl B hides it and the page grows into the room. Every mode's list is built on the shadcn Sidebar now in the kit, so Workspace, Code, People, Notifications, account settings, Chat, Artifacts and Agents all share one frame; the phone keeps its bottom bar and drawer. The workspaces guide describes the rail, the sidebar and the page.211 * The rail's modes. Home is the front page;
The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404.212 * Chat, Code and Artifacts are where work happens; Notifications
Workspace is the workspace's settings, in one place. Its sidebar is grouped, General, Access, Money, Compute, Code, Agents, Chat, Artifacts, Security and Integrations, every page one click away with no settings inside settings, the groups folding and the owner-only pages hidden from members; what is not here yet is marked Soon with a hint. Members is a list with search and filters for role, two-factor and team, and Invite opens a dialog: who, by username, name or email, their role and a note that goes into the invitation; nothing is filled in inline any more. Invitations is its own page with All, Pending, Accepted, Declined, Expired and Revoked filters that say how many, and each row's menu can copy the link, send it again or revoke it; identity learned to send an invitation again and to carry the note. Permissions gathers every rule about who may do what, by part: Code's base permission and member privileges, who creates teams, who creates channels, and, marked Soon with what applies today, forking private repositories, adding agents to conversations, messaging agents directly, creating spaces and default sharing, creating workspace agents and raising budgets, deploying to production and publishing packages. General lost what moved. The permissions guide is new, and the workspaces, people and teams, access, chat, teams, authentication and billing guides say where things are now.213 * spans them; People is who belongs; Workspace is the workspace itself,
214 * its settings area: who has access, money, policies and how each part is
215 * set up; Apps is everything installed that you
g1t is described as the product it is in alpha, and its shell takes the new shape: the README, the docs home and docs/PLAN.md label every feature Live, Preview or Coming; a floating dock with the g1t mark, Today, Chat, Notifications, Agents, Code, Artifacts, your pinned apps and the Apps launcher, with People, Workspace and the account menu (now holding help) at its foot; the workspace's logo and switcher heading a flat sidebar that folds away with Ctrl B, or leading the header's breadcrumbs where there is none; the page in a rounded panel with a full-width header; Today as the front page, with first-time acceptance of agents' pull requests, what needs you and what's at stake, spend today and one item to start with, every number from a service; Notifications in place of the Inbox at /notifications; a bottom bar and More sheet on phones; and sign-in, sign-up, two-factor, reset, invites and choosing a workspace on standalone pages with no app around them.216 * can use. `account` is your own settings, under the avatar. `site` is
Merge branch 'worktree-agent-aefe9db9851cfafd8'217 * g1t's own pages (policies, support, a new workspace): no workspace's, so
218 * no mode is lit and no mode's sidebar sits beside them. `browse` is g1t
219 * beyond your workspaces (Explore, search, a profile, another workspace
220 * and its public projects): the rail lights Explore, and Explore's sidebar
221 * sits beside them (`browsingOf`). Each mode has a sidebar of its own, or
222 * none, and which one is lit follows the address.
Chat and workspace agents: channels, DMs and named agents you talk to223 */
g1t is described as the product it is in alpha, and its shell takes the new shape: the README, the docs home and docs/PLAN.md label every feature Live, Preview or Coming; a floating dock with the g1t mark, Today, Chat, Notifications, Agents, Code, Artifacts, your pinned apps and the Apps launcher, with People, Workspace and the account menu (now holding help) at its foot; the workspace's logo and switcher heading a flat sidebar that folds away with Ctrl B, or leading the header's breadcrumbs where there is none; the page in a rounded panel with a full-width header; Today as the front page, with first-time acceptance of agents' pull requests, what needs you and what's at stake, spend today and one item to start with, every number from a service; Notifications in place of the Inbox at /notifications; a bottom bar and More sheet on phones; and sign-in, sign-up, two-factor, reset, invites and choosing a workspace on standalone pages with no app around them.224export type ModeKey =
The front page is Home: where you're needed comes first, however long ago it started, with what's at stake and how long it has waited; then what happened since you were last here, in words, with the agent work that settled, what landed, what deployed, what was decided and what was spent, switchable to the last 24 hours or 7 days; then what's running now. Your last visit is kept with your account, so it's the same on every device; Today's old address leads here. The home guide says how.225 | "home"
g1t is described as the product it is in alpha, and its shell takes the new shape: the README, the docs home and docs/PLAN.md label every feature Live, Preview or Coming; a floating dock with the g1t mark, Today, Chat, Notifications, Agents, Code, Artifacts, your pinned apps and the Apps launcher, with People, Workspace and the account menu (now holding help) at its foot; the workspace's logo and switcher heading a flat sidebar that folds away with Ctrl B, or leading the header's breadcrumbs where there is none; the page in a rounded panel with a full-width header; Today as the front page, with first-time acceptance of agents' pull requests, what needs you and what's at stake, spend today and one item to start with, every number from a service; Notifications in place of the Inbox at /notifications; a bottom bar and More sheet on phones; and sign-in, sign-up, two-factor, reset, invites and choosing a workspace on standalone pages with no app around them.226 | "chat"
227 | "notifications"
228 | "code"
229 | "artifacts"
230 | "people"
231 | "workspace"
232 | "apps"
233 | "account"
Merge branch 'worktree-agent-aefe9db9851cfafd8'234 | "site"
235 | "browse";
Chat and workspace agents: channels, DMs and named agents you talk to236
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)237/** Workspace pages under `-/`, by the mode they belong to. Anything else of the workspace's is Code's. */
238const PAGE_MODES: Record<string, ModeKey> = {
The front page is Home: where you're needed comes first, however long ago it started, with what's at stake and how long it has waited; then what happened since you were last here, in words, with the agent work that settled, what landed, what deployed, what was decided and what was spent, switchable to the last 24 hours or 7 days; then what's running now. Your last visit is kept with your account, so it's the same on every device; Today's old address leads here. The home guide says how.239 home: "home",
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)240 chat: "chat",
Artifacts is a mode in the rail, the shell and the phone's tab bar in place of Docs: its home lists everything you can open by day or as cards under All, Yours and Shared with you, with search, filters and tiles to start a doc (slides, designs and dashboards say they are coming soon), and its sidebar holds favorites, spaces, Private, Shared, projects' docs and the trash.241 artifacts: "artifacts",
g1t is described as the product it is in alpha, and its shell takes the new shape: the README, the docs home and docs/PLAN.md label every feature Live, Preview or Coming; a floating dock with the g1t mark, Today, Chat, Notifications, Agents, Code, Artifacts, your pinned apps and the Apps launcher, with People, Workspace and the account menu (now holding help) at its foot; the workspace's logo and switcher heading a flat sidebar that folds away with Ctrl B, or leading the header's breadcrumbs where there is none; the page in a rounded panel with a full-width header; Today as the front page, with first-time acceptance of agents' pull requests, what needs you and what's at stake, spend today and one item to start with, every number from a service; Notifications in place of the Inbox at /notifications; a bottom bar and More sheet on phones; and sign-in, sign-up, two-factor, reset, invites and choosing a workspace on standalone pages with no app around them.242 apps: "apps",
243 people: "people",
Workspace is the workspace's settings, in one place. Its sidebar is grouped, General, Access, Money, Compute, Code, Agents, Chat, Artifacts, Security and Integrations, every page one click away with no settings inside settings, the groups folding and the owner-only pages hidden from members; what is not here yet is marked Soon with a hint. Members is a list with search and filters for role, two-factor and team, and Invite opens a dialog: who, by username, name or email, their role and a note that goes into the invitation; nothing is filled in inline any more. Invitations is its own page with All, Pending, Accepted, Declined, Expired and Revoked filters that say how many, and each row's menu can copy the link, send it again or revoke it; identity learned to send an invitation again and to carry the note. Permissions gathers every rule about who may do what, by part: Code's base permission and member privileges, who creates teams, who creates channels, and, marked Soon with what applies today, forking private repositories, adding agents to conversations, messaging agents directly, creating spaces and default sharing, creating workspace agents and raising budgets, deploying to production and publishing packages. General lost what moved. The permissions guide is new, and the workspaces, people and teams, access, chat, teams, authentication and billing guides say where things are now.244 members: "workspace",
245 permissions: "workspace",
g1t is described as the product it is in alpha, and its shell takes the new shape: the README, the docs home and docs/PLAN.md label every feature Live, Preview or Coming; a floating dock with the g1t mark, Today, Chat, Notifications, Agents, Code, Artifacts, your pinned apps and the Apps launcher, with People, Workspace and the account menu (now holding help) at its foot; the workspace's logo and switcher heading a flat sidebar that folds away with Ctrl B, or leading the header's breadcrumbs where there is none; the page in a rounded panel with a full-width header; Today as the front page, with first-time acceptance of agents' pull requests, what needs you and what's at stake, spend today and one item to start with, every number from a service; Notifications in place of the Inbox at /notifications; a bottom bar and More sheet on phones; and sign-in, sign-up, two-factor, reset, invites and choosing a workspace on standalone pages with no app around them.246 teams: "people",
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)247 workspace: "workspace",
248 usage: "workspace",
249 billing: "workspace",
250 integrations: "workspace",
251 guardrails: "workspace",
252 rules: "workspace",
253 audit: "workspace",
254 settings: "workspace",
255 repositories: "workspace",
256 tokens: "workspace",
257 "personal-access-tokens": "workspace",
258 secrets: "workspace",
259 actions: "workspace",
260 runners: "workspace",
261 webhooks: "workspace",
262 emoji: "workspace",
263};
264
Chat controls, public profiles, shadcn selects, and no Docs tab in a project265/** First segments that are g1t's own pages, never a workspace: none is any mode's. */
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)266const SITE_PAGES = new Set(["explore", "search", "support", "policies", "security", "status", "u", "invite", "workspaces"]);
267
268/**
269 * The mode a path is in, for the workspace `slug`. A repository (anyone's)
270 * and a new project are Code's; g1t's own pages (Explore, search, a
Chat controls, public profiles, shadcn selects, and no Docs tab in a project271 * profile) are `site`: public, and no workspace's mode.
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)272 */
Chat and workspace agents: channels, DMs and named agents you talk to273export function modeOf(pathname: string, slug: string | null): ModeKey {
274 const path = pagePath(pathname);
The front page is Home: where you're needed comes first, however long ago it started, with what's at stake and how long it has waited; then what happened since you were last here, in words, with the agent work that settled, what landed, what deployed, what was decided and what was spent, switchable to the last 24 hours or 7 days; then what's running now. Your last visit is kept with your account, so it's the same on every device; Today's old address leads here. The home guide says how.275 if (path === "/") return "home";
g1t is described as the product it is in alpha, and its shell takes the new shape: the README, the docs home and docs/PLAN.md label every feature Live, Preview or Coming; a floating dock with the g1t mark, Today, Chat, Notifications, Agents, Code, Artifacts, your pinned apps and the Apps launcher, with People, Workspace and the account menu (now holding help) at its foot; the workspace's logo and switcher heading a flat sidebar that folds away with Ctrl B, or leading the header's breadcrumbs where there is none; the page in a rounded panel with a full-width header; Today as the front page, with first-time acceptance of agents' pull requests, what needs you and what's at stake, spend today and one item to start with, every number from a service; Notifications in place of the Inbox at /notifications; a bottom bar and More sheet on phones; and sign-in, sign-up, two-factor, reset, invites and choosing a workspace on standalone pages with no app around them.276 if (path === "/notifications" || path.startsWith("/notifications/")) return "notifications";
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)277 if (path === "/settings" || path.startsWith("/settings/")) return "account";
Chat and workspace agents: channels, DMs and named agents you talk to278 const parts = path.split("/").filter(Boolean);
Chat controls, public profiles, shadcn selects, and no Docs tab in a project279 if (SITE_PAGES.has(parts[0] ?? "")) return "site";
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)280 if (slug && parts[0]?.toLowerCase() === slug.toLowerCase()) {
The front page is Home: where you're needed comes first, however long ago it started, with what's at stake and how long it has waited; then what happened since you were last here, in words, with the agent work that settled, what landed, what deployed, what was decided and what was spent, switchable to the last 24 hours or 7 days; then what's running now. Your last visit is kept with your account, so it's the same on every device; Today's old address leads here. The home guide says how.281 if (parts.length === 1) return "home";
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)282 if (parts[1] === "-") {
283 // The workspace's security settings are a policy; its alerts are Code's.
284 if (parts[2] === "security" && parts[3] === "settings") return "workspace";
285 return PAGE_MODES[parts[2] ?? ""] ?? "code";
286 }
Chat and workspace agents: channels, DMs and named agents you talk to287 }
288 return "code";
289}
290
The left-hand navigation takes less room and reads at a glance. The dock becomes a rail: a 56-pixel column of icons with the g1t mark on top, the current app marked by a filled square, hover hints naming each with its shortcut, the apps you pinned in a scrolling band, and Apps, People, Workspace and your account at the foot. Each mode's sidebar sits flush against it, 240 pixels wide, opening on Search or jump to and listing its groups under small labels in 36-pixel rows; Ctrl B hides it and the page grows into the room. Every mode's list is built on the shadcn Sidebar now in the kit, so Workspace, Code, People, Notifications, account settings, Chat, Artifacts and Agents all share one frame; the phone keeps its bottom bar and drawer. The workspaces guide describes the rail, the sidebar and the page.291/** Where each mode's button in the rail goes, in the workspace `slug`. */
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)292export function modeHome(mode: ModeKey, slug: string): string {
Chat and workspace agents: channels, DMs and named agents you talk to293 switch (mode) {
The front page is Home: where you're needed comes first, however long ago it started, with what's at stake and how long it has waited; then what happened since you were last here, in words, with the agent work that settled, what landed, what deployed, what was decided and what was spent, switchable to the last 24 hours or 7 days; then what's running now. Your last visit is kept with your account, so it's the same on every device; Today's old address leads here. The home guide says how.294 case "home":
295 return homePagePath(slug);
g1t is described as the product it is in alpha, and its shell takes the new shape: the README, the docs home and docs/PLAN.md label every feature Live, Preview or Coming; a floating dock with the g1t mark, Today, Chat, Notifications, Agents, Code, Artifacts, your pinned apps and the Apps launcher, with People, Workspace and the account menu (now holding help) at its foot; the workspace's logo and switcher heading a flat sidebar that folds away with Ctrl B, or leading the header's breadcrumbs where there is none; the page in a rounded panel with a full-width header; Today as the front page, with first-time acceptance of agents' pull requests, what needs you and what's at stake, spend today and one item to start with, every number from a service; Notifications in place of the Inbox at /notifications; a bottom bar and More sheet on phones; and sign-in, sign-up, two-factor, reset, invites and choosing a workspace on standalone pages with no app around them.296 case "notifications":
297 return "/notifications";
Chat and workspace agents: channels, DMs and named agents you talk to298 case "chat":
299 return `/${slug}/-/chat`;
Artifacts is a mode in the rail, the shell and the phone's tab bar in place of Docs: its home lists everything you can open by day or as cards under All, Yours and Shared with you, with search, filters and tiles to start a doc (slides, designs and dashboards say they are coming soon), and its sidebar holds favorites, spaces, Private, Shared, projects' docs and the trash.300 case "artifacts":
301 return `/${slug}/-/artifacts`;
Chat and workspace agents: channels, DMs and named agents you talk to302 case "code":
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)303 return `/${slug}/-/overview`;
g1t is described as the product it is in alpha, and its shell takes the new shape: the README, the docs home and docs/PLAN.md label every feature Live, Preview or Coming; a floating dock with the g1t mark, Today, Chat, Notifications, Agents, Code, Artifacts, your pinned apps and the Apps launcher, with People, Workspace and the account menu (now holding help) at its foot; the workspace's logo and switcher heading a flat sidebar that folds away with Ctrl B, or leading the header's breadcrumbs where there is none; the page in a rounded panel with a full-width header; Today as the front page, with first-time acceptance of agents' pull requests, what needs you and what's at stake, spend today and one item to start with, every number from a service; Notifications in place of the Inbox at /notifications; a bottom bar and More sheet on phones; and sign-in, sign-up, two-factor, reset, invites and choosing a workspace on standalone pages with no app around them.304 case "people":
305 return `/${slug}/-/people`;
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)306 case "workspace":
307 return `/${slug}/-/workspace`;
g1t is described as the product it is in alpha, and its shell takes the new shape: the README, the docs home and docs/PLAN.md label every feature Live, Preview or Coming; a floating dock with the g1t mark, Today, Chat, Notifications, Agents, Code, Artifacts, your pinned apps and the Apps launcher, with People, Workspace and the account menu (now holding help) at its foot; the workspace's logo and switcher heading a flat sidebar that folds away with Ctrl B, or leading the header's breadcrumbs where there is none; the page in a rounded panel with a full-width header; Today as the front page, with first-time acceptance of agents' pull requests, what needs you and what's at stake, spend today and one item to start with, every number from a service; Notifications in place of the Inbox at /notifications; a bottom bar and More sheet on phones; and sign-in, sign-up, two-factor, reset, invites and choosing a workspace on standalone pages with no app around them.308 case "apps":
309 return `/${slug}/-/apps`;
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)310 case "account":
311 return "/settings";
Chat controls, public profiles, shadcn selects, and no Docs tab in a project312 case "site":
Merge branch 'worktree-agent-aefe9db9851cfafd8'313 case "browse":
Chat controls, public profiles, shadcn selects, and no Docs tab in a project314 return "/explore";
Chat and workspace agents: channels, DMs and named agents you talk to315 }
316}
317
Merge branch 'worktree-agent-aefe9db9851cfafd8'318/** First segments that are g1t's own pages and never anyone's name (packages/contracts names.ts). */
319const NOT_AN_OWNER = new Set([
320 "-", "api", "mcp", "login", "logout", "register", "new", "settings", "search", "admin", "auth", "integrations",
321 "pulls", "issues", "verify", "confirm-email", "forgot", "reset", "device", "workspaces", "u", "oauth", "assets",
322 "avatars", "docs", "explore", "about", "pricing", "policies", "security", "support", "status", "terms", "privacy",
323 "help", "blog", "invite", "invites", "waitlist", "invitations", "v2", "inbox", "notifications", "download",
324 "downloads", "install",
325]);
326
327/**
328 * Whose g1t a browsed page is: a workspace (its overview, its pages, or
329 * one of its projects, `repo`) or a person (their profile).
330 */
331export type BrowsedOwner = { kind: "workspace"; name: string; repo: string | null } | { kind: "person"; name: string };
332
333/** What the shell knows of the viewer, to tell their own pages from the rest of g1t. */
334export type Viewer = {
335 /** The workspace the shell is about. */
336 slug: string | null;
337 /** Every workspace they belong to, by slug. */
338 memberships: readonly string[];
339 /** Repositories shared with them in workspaces they do not belong to: Code lists them as theirs. */
340 shared?: readonly { namespace: string; name: string }[];
341 /** Their own username: their profile is theirs, not someone's being browsed. */
342 username?: string | null;
343};
344
345/**
346 * Whether `pathname` is g1t beyond the viewer's own workspaces, and whose
347 * (`owner`, null for Explore, search and their own profile). Null for
348 * anything of theirs. A workspace they belong to is never browsed, even
349 * when it is not the one they are in: its pages and projects switch the
350 * shell to it (lib/workspace-choice.ts `workspaceFor`), so they are that
351 * workspace's modes. A project shared with them is Code's, whose sidebar
352 * lists it. Without a workspace there is no rail, and nothing is browsed.
353 */
354export function browsingOf(pathname: string, viewer: Viewer): { owner: BrowsedOwner | null } | null {
355 if (!viewer.slug) return null;
356 const parts = pagePath(pathname).split("/").filter(Boolean);
357 const first = parts[0]?.toLowerCase();
358 if (!first) return null;
359 if (first === "explore" || first === "search") return { owner: null };
360 if (first === "u") {
361 const name = parts[1];
362 if (!name) return null;
363 const own = viewer.username != null && name.toLowerCase() === viewer.username.toLowerCase();
364 return { owner: own ? null : { kind: "person", name } };
365 }
366 // g1t's own pages, and files such as robots.txt.
367 if (NOT_AN_OWNER.has(first) || first.includes(".")) return null;
368 if (first === viewer.slug.toLowerCase() || viewer.memberships.some((slug) => slug.toLowerCase() === first)) return null;
369 const repo = parts[1] && parts[1] !== "-" ? parts[1] : null;
370 if (repo && (viewer.shared ?? []).some((r) => r.namespace.toLowerCase() === first && r.name.toLowerCase() === repo.toLowerCase())) return null;
371 return { owner: { kind: "workspace", name: parts[0]!, repo } };
372}
373
374/** The mode a path is in for this viewer: `browse` beyond their workspaces (`browsingOf`), else `modeOf`'s. */
375export function shellMode(pathname: string, viewer: Viewer): ModeKey {
376 return browsingOf(pathname, viewer) ? "browse" : modeOf(pathname, viewer.slug);
377}
378
The front page is Home: where you're needed comes first, however long ago it started, with what's at stake and how long it has waited; then what happened since you were last here, in words, with the agent work that settled, what landed, what deployed, what was decided and what was spent, switchable to the last 24 hours or 7 days; then what's running now. Your last visit is kept with your account, so it's the same on every device; Today's old address leads here. The home guide says how.379/** A workspace's front page: Home. */
380export function homePagePath(slug: string): string {
381 return `/${slug}/-/home`;
g1t is described as the product it is in alpha, and its shell takes the new shape: the README, the docs home and docs/PLAN.md label every feature Live, Preview or Coming; a floating dock with the g1t mark, Today, Chat, Notifications, Agents, Code, Artifacts, your pinned apps and the Apps launcher, with People, Workspace and the account menu (now holding help) at its foot; the workspace's logo and switcher heading a flat sidebar that folds away with Ctrl B, or leading the header's breadcrumbs where there is none; the page in a rounded panel with a full-width header; Today as the front page, with first-time acceptance of agents' pull requests, what needs you and what's at stake, spend today and one item to start with, every number from a service; Notifications in place of the Inbox at /notifications; a bottom bar and More sheet on phones; and sign-in, sign-up, two-factor, reset, invites and choosing a workspace on standalone pages with no app around them.382}
383
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)384/**
g1t is described as the product it is in alpha, and its shell takes the new shape: the README, the docs home and docs/PLAN.md label every feature Live, Preview or Coming; a floating dock with the g1t mark, Today, Chat, Notifications, Agents, Code, Artifacts, your pinned apps and the Apps launcher, with People, Workspace and the account menu (now holding help) at its foot; the workspace's logo and switcher heading a flat sidebar that folds away with Ctrl B, or leading the header's breadcrumbs where there is none; the page in a rounded panel with a full-width header; Today as the front page, with first-time acceptance of agents' pull requests, what needs you and what's at stake, spend today and one item to start with, every number from a service; Notifications in place of the Inbox at /notifications; a bottom bar and More sheet on phones; and sign-in, sign-up, two-factor, reset, invites and choosing a workspace on standalone pages with no app around them.385 * Where g1t's front door (`/`) and a workspace's own address lead someone
The front page is Home: where you're needed comes first, however long ago it started, with what's at stake and how long it has waited; then what happened since you were last here, in words, with the agent work that settled, what landed, what deployed, what was decided and what was spent, switchable to the last 24 hours or 7 days; then what's running now. Your last visit is kept with your account, so it's the same on every device; Today's old address leads here. The home guide says how.386 * in the workspace `slug`: Home, or Code's Overview when the query asks
The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404.387 * for its panels (a tab or a sort).
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)388 */
389export function homePath(slug: string, search = ""): string {
390 const params = new URLSearchParams(search);
391 params.delete("_routes");
392 params.delete("index");
393 const query = params.toString();
The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404.394 if (params.has("tab") || params.has("sort")) return `/${slug}/-/overview?${query}`;
The front page is Home: where you're needed comes first, however long ago it started, with what's at stake and how long it has waited; then what happened since you were last here, in words, with the agent work that settled, what landed, what deployed, what was decided and what was spent, switchable to the last 24 hours or 7 days; then what's running now. Your last visit is kept with your account, so it's the same on every device; Today's old address leads here. The home guide says how.395 return homePagePath(slug);
Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002)396}
397
Chat and workspace agents: channels, DMs and named agents you talk to398/** The page a member without Code access sees in place of anything of Code's. */
399export function codeAccessPath(slug: string, from?: string): string {
400 return `/${slug}/-/code-access${from ? `?from=${encodeURIComponent(from)}` : ""}`;
401}
402
403/** The workspace pages under `-/` that are Code's: closed to a member without Code access. */
Merge branch 'worktree-agent-a4babc5b5815f6f3a'404const CODE_PAGES = new Set(["overview", "projects", "repositories", "packages", "security", "rules", "runners", "actions", "insights", "soon"]);
Chat and workspace agents: channels, DMs and named agents you talk to405
406/**
407 * Where a member without Code access goes instead of `pathname`, or null
408 * when the page is open to them. `noCode` is the workspaces (by slug) where
g1t is described as the product it is in alpha, and its shell takes the new shape: the README, the docs home and docs/PLAN.md label every feature Live, Preview or Coming; a floating dock with the g1t mark, Today, Chat, Notifications, Agents, Code, Artifacts, your pinned apps and the Apps launcher, with People, Workspace and the account menu (now holding help) at its foot; the workspace's logo and switcher heading a flat sidebar that folds away with Ctrl B, or leading the header's breadcrumbs where there is none; the page in a rounded panel with a full-width header; Today as the front page, with first-time acceptance of agents' pull requests, what needs you and what's at stake, spend today and one item to start with, every number from a service; Notifications in place of the Inbox at /notifications; a bottom bar and More sheet on phones; and sign-in, sign-up, two-factor, reset, invites and choosing a workspace on standalone pages with no app around them.409 * they lack it; `chosen` is the one they are in. g1t's front door (`/`) is
The front page is Home: where you're needed comes first, however long ago it started, with what's at stake and how long it has waited; then what happened since you were last here, in words, with the agent work that settled, what landed, what deployed, what was decided and what was spent, switchable to the last 24 hours or 7 days; then what's running now. Your last visit is kept with your account, so it's the same on every device; Today's old address leads here. The home guide says how.410 * Home in that workspace, and so is the workspace's own address; its
g1t is described as the product it is in alpha, and its shell takes the new shape: the README, the docs home and docs/PLAN.md label every feature Live, Preview or Coming; a floating dock with the g1t mark, Today, Chat, Notifications, Agents, Code, Artifacts, your pinned apps and the Apps launcher, with People, Workspace and the account menu (now holding help) at its foot; the workspace's logo and switcher heading a flat sidebar that folds away with Ctrl B, or leading the header's breadcrumbs where there is none; the page in a rounded panel with a full-width header; Today as the front page, with first-time acceptance of agents' pull requests, what needs you and what's at stake, spend today and one item to start with, every number from a service; Notifications in place of the Inbox at /notifications; a bottom bar and More sheet on phones; and sign-in, sign-up, two-factor, reset, invites and choosing a workspace on standalone pages with no app around them.411 * Code pages and every repository page is the page that says to ask an
412 * owner.
Chat and workspace agents: channels, DMs and named agents you talk to413 */
414export function codeGate(pathname: string, search: string, noCode: readonly string[], chosen: string | null): string | null {
415 if (noCode.length === 0) return null;
416 const path = pagePath(pathname);
417 if (path === "/") {
418 const slug = chosen && noCode.includes(chosen.toLowerCase()) ? chosen.toLowerCase() : null;
The front page is Home: where you're needed comes first, however long ago it started, with what's at stake and how long it has waited; then what happened since you were last here, in words, with the agent work that settled, what landed, what deployed, what was decided and what was spent, switchable to the last 24 hours or 7 days; then what's running now. Your last visit is kept with your account, so it's the same on every device; Today's old address leads here. The home guide says how.419 return slug ? homePagePath(slug) : null;
Chat and workspace agents: channels, DMs and named agents you talk to420 }
421 const parts = path.split("/").filter(Boolean);
422 const slug = parts[0]?.toLowerCase();
423 if (!slug || !noCode.includes(slug)) return null;
424 const from = `${path}${search && search !== "?" ? search : ""}`;
The front page is Home: where you're needed comes first, however long ago it started, with what's at stake and how long it has waited; then what happened since you were last here, in words, with the agent work that settled, what landed, what deployed, what was decided and what was spent, switchable to the last 24 hours or 7 days; then what's running now. Your last visit is kept with your account, so it's the same on every device; Today's old address leads here. The home guide says how.425 // The workspace's own page is Home.
426 if (parts.length === 1) return homePagePath(slug);
Chat and workspace agents: channels, DMs and named agents you talk to427 if (parts[1] === "-") return CODE_PAGES.has(parts[2] ?? "") ? codeAccessPath(slug, from) : null;
428 // A repository, and everything in it.
429 return codeAccessPath(slug, from);
430}

This file's history is long; its oldest lines are credited to the oldest commit read.