Skip to content

Commit

g1t.sh/download is a marketing page: it is drawn with the site's header and footer whoever opens it, never inside the app's rail and sidebar, in the shape of Pricing, with Download in the public header, its phone menu and the footer. The desktop app's check in CI runs on the larger machine the Rust tests use; on the small one the linker ran out of room and died with a bus error on every push since the app arrived.

syntaqxcommitted Parent559ffeeBrowse files
5 files+41−270/5 viewed
+3−1
9999
100100 desktop:
101101 name: Desktop app
102− runs-on: ubuntu-latest
102+ # The larger machine, as the Rust job: linking Tauri on the small one
103+ # ran out of room and the linker died with a bus error.
104+ runs-on: g1t-4core
103105 timeout-minutes: 30
104106 steps:
105107 - uses: actions/checkout@v5
+1−0
7676 links: [
7777 ["Explore", "/explore"],
7878 ["Pricing", "/pricing"],
79+ ["Download", "/download"],
7980 ["Chat", "https://docs.g1t.sh/guides/chat/"],
8081 ["Agents", "https://docs.g1t.sh/guides/agents/"],
8182 ["Working with g1t", "https://docs.g1t.sh/guides/working-with-g1t/"],
+8−1
55 * into one menu. Someone still confirming their address gets their
66 * account's menu in place of signing in.
77 */
8−import { BookOpen, ChevronDown, Compass, CreditCard, LogIn, LogOut, Menu, Plus, Search, Settings } from "lucide-react";
8+import { BookOpen, ChevronDown, Compass, CreditCard, LogIn, LogOut, Menu, MonitorDown, Plus, Search, Settings } from "lucide-react";
99 import { useState } from "react";
1010 import { Form, Link, NavLink, useParams, useSubmit } from "react-router";
1111
106106 />
107107 <nav aria-label="Main" className="hidden items-center gap-0.5 sm:flex">
108108 <HeaderLink to="/explore">Explore</HeaderLink>
109+ <HeaderLink to="/download">Download</HeaderLink>
109110 <HeaderLink to="https://docs.g1t.sh/">Docs</HeaderLink>
110111 </nav>
111112 <div className="ml-auto flex items-center gap-2">
124125 </Link>
125126 </DropdownMenuItem>
126127 <DropdownMenuItem asChild className="min-h-11">
128+ <Link to="/download">
129+ <MonitorDown />
130+ Download
131+ </Link>
132+ </DropdownMenuItem>
133+ <DropdownMenuItem asChild className="min-h-11">
127134 <Link to="https://docs.g1t.sh/">
128135 <BookOpen />
129136 Docs
+5−0
3333 "/integrations/github/setup",
3434 ]);
3535
36+/** Marketing pages: the public header and footer, even for someone signed in. */
37+const MARKETING = new Set(["/download"]);
38+
3639 /** The page's path without a trailing slash or a click's `.data`. */
3740 function framePath(pathname: string): string {
3841 const path = pathname.replace(/\.data$/, "");
4750 export function frameOf(pathname: string, viewer: { signedIn: boolean; workspace: boolean }): Frame {
4851 const path = framePath(pathname);
4952 if (STANDALONE.has(path)) return "standalone";
53+ // Marketing pages are the site's front, whoever reads them: never inside the app's rail and sidebar.
54+ if (MARKETING.has(path)) return "public";
5055 // An invite link, and signing in with GitHub, are the front door.
5156 if (path.startsWith("/invite/") || path === "/auth/github" || path.startsWith("/auth/github/")) return "standalone";
5257 if (path === "/invitations" && viewer.signedIn && !viewer.workspace) return "standalone";
+24−25
66
77 import type { Route } from "./+types/download";
88 import { QrCode } from "../components/qr-code";
9−import { TrustPage } from "../components/trust-page";
109 import { ButtonLink } from "../components/ui";
1110 import { Card } from "../components/ui/card";
1211 import { HOSTED_ADDRESSES } from "../lib/addresses";
144143 const featured = yours.find((d) => d.kind === "installer" || d.kind === "dmg" || d.kind === "appimage") ?? yours[0] ?? null;
145144 const href = (download: DesktopDownload) => `/downloads/desktop/${release!.version}/${download.name}`;
146145
146+ // A marketing page, drawn like Pricing: the site's header and footer,
147+ // never the app's rail (lib/chrome.ts, MARKETING).
147148 return (
148− <TrustPage
149− eyebrow="Desktop app"
150− title="g1t on your desktop"
151− lede={
152− <p>
153− The whole of g1t in a window of its own: chat, agents, artifacts and code, for Windows, macOS and Linux.
154− {release && (
155− <>
156− {" "}
157− Version {release.version}
158− {release.pub_date && (
159− <>
160− , released{" "}
161− {new Date(release.pub_date).toLocaleDateString("en-US", { year: "numeric", month: "long", day: "numeric" })}
162− </>
163− )}
164− .
165− </>
166− )}
167− </p>
168− }
169− >
170− <div className="max-w-3xl">
149+ <main className="mx-auto max-w-4xl px-4 py-12">
150+ <p className="text-sm font-medium text-accent">Desktop and phone apps</p>
151+ <h1 className="mt-2 text-3xl font-semibold tracking-tight text-balance sm:text-4xl">g1t on your desktop, and in your pocket</h1>
152+ <p className="mt-3 max-w-2xl text-muted">
153+ The whole of g1t in a window of its own: chat, agents, artifacts and code, for Windows, macOS and Linux, with notifications
154+ from your system and updates that install themselves.
155+ {release && (
156+ <>
157+ {" "}
158+ Version {release.version}
159+ {release.pub_date && (
160+ <>
161+ , released{" "}
162+ {new Date(release.pub_date).toLocaleDateString("en-US", { year: "numeric", month: "long", day: "numeric" })}
163+ </>
164+ )}
165+ .
166+ </>
167+ )}
168+ </p>
169+ <div className="mt-8">
171170 {!release && (
172171 <Card className="p-5">
173172 <p className="font-medium">The first release is on its way.</p>
253252 )}
254253 <PhoneApp site={site} hosted={hosted} mobile={mobile} android={android} />
255254 </div>
256− </TrustPage>
255+ </main>
257256 );
258257 }
259258