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.

152 linesCodeBlameRaw
1/**
2 * Who makes g1t, how to reach them, and the policies that govern it: the
3 * one place the footer, the policy pages, /security, /support and
4 * security.txt read these from.
5 */
6import { type SimpleIcon, siX } from "simple-icons";
7
8/** The company behind g1t. */
9export const COMPANY = {
10 name: "Flagon, Inc.",
11 url: "https://www.flagon.io",
12 /** Who founded it, for search engines' structured data only (structured-data.ts). */
13 founder: "Chase Pierce",
14};
15
16/** g1t's own accounts elsewhere, drawn as their marks in the footer. */
17export const SOCIAL: { label: string; url: string; icon: SimpleIcon }[] = [{ label: "X", url: "https://x.com/g1t_sh", icon: siX }];
18
19/**
20 * Flagon's other launched products, which the footer's maker line names
21 * ("…, the people behind X and Y"). None yet: add each here when it ships.
22 */
23export const MAKER_PRODUCTS: { name: string; url: string }[] = [];
24
25/** "X", "X and Y", "X, Y and Z". */
26export function listed(names: string[]): string {
27 if (names.length <= 1) return names.join("");
28 return `${names.slice(0, -1).join(", ")} and ${names[names.length - 1]}`;
29}
30
31/** The year in UTC, so a page rendered near midnight on 31 December agrees everywhere. */
32export function copyrightYear(now: Date = new Date()): number {
33 return now.getUTCFullYear();
34}
35
36/** The footer's legal line. */
37export function copyright(now: Date = new Date()): string {
38 return `© ${copyrightYear(now)} ${COMPANY.name} All rights reserved.`;
39}
40
41/**
42 * Where people reach g1t. Each must be a real, watched mailbox. For now
43 * every topic goes to support@g1t.sh, an alias for support@flagon.io.
44 */
45export const CONTACT = {
46 support: "support@g1t.sh",
47 security: "support@g1t.sh",
48 privacy: "support@g1t.sh",
49 billing: "support@g1t.sh",
50 abuse: "support@g1t.sh",
51 legal: "support@g1t.sh",
52};
53
54export type Policy = {
55 slug: string;
56 title: string;
57 summary: string;
58};
59
60/** The policies, in the order the index lists them. Each is `/policies/<slug>`. */
61export const POLICIES: Policy[] = [
62 {
63 slug: "terms",
64 title: "Terms of Service",
65 summary: "The agreement between you and Flagon, Inc. when you use g1t: accounts, your content, agents, paying, and ending.",
66 },
67 {
68 slug: "privacy",
69 title: "Privacy Policy",
70 summary: "What g1t collects, why, where it goes, how long it is kept, and how to see, export or delete it.",
71 },
72 {
73 slug: "acceptable-use",
74 title: "Acceptable Use Policy",
75 summary: "What g1t may not be used for, from mining cryptocurrency to abuse, and what happens when it is.",
76 },
77 {
78 slug: "refunds",
79 title: "Refunds and Cancellation",
80 summary: "Ending the plan, accidental overages and goodwill credits, and when money goes back to your card.",
81 },
82 {
83 slug: "subprocessors",
84 title: "Subprocessors",
85 summary: "The companies that process data for g1t, what each does, and the services you choose to connect.",
86 },
87];
88
89/**
90 * Publication approved on 2026-10-14. Set true only when intentionally
91 * presenting the policies as drafts (components/policies-draft.tsx).
92 */
93export const POLICIES_DRAFT = false;
94
95/** When any policy last changed, `YYYY-MM-DD`. */
96export const POLICIES_UPDATED = "2026-10-14";
97
98/** Every change to the policies, newest first. */
99export const POLICY_HISTORY: { date: string; change: string }[] = [
100 {
101 date: "2026-10-14",
102 change:
103 "Removed the draft banner. Standardized contact addresses on support@g1t.sh and named Delaware in the governing-law clause. Clarified automatic renewal, consumer cancellation and refund rights, and consent for changes where required. Privacy Policy: clarified analytics consent and the limits of credential redaction; removed unverified assurances about provider contracts and transfer arrangements. Privacy Policy and Subprocessors: Cloudflare Turnstile protects email sign-up. Privacy Policy: distinguished ordinary closure from personal-data erasure requests, shared content review, and minimal deletion records. Terms, Privacy Policy and this page: changes take effect when posted on this page, without emailed notice or a fixed 30-day notice period.",
104 },
105 {
106 date: "2026-10-13",
107 change:
108 "Terms of Service and Privacy Policy: g1t no longer runs agents of its own. Section 6 of the terms covers the coding agents you connect and Ask g1t, which answers with your workspace's own AI provider; agents are no longer billed compute. Subprocessors: your workspace's AI provider listed among the integrations you choose. Terms and Refunds, for paid plans: the g1t plan is $21 a month with $10 of usage included and no card fee on anything; how the plan and usage are billed, taxes, failed payments, disputes, price-change notice and spend limits; card, billing address, tax IDs, invoices and cancelling are managed on Stripe's billing page; deleting a workspace or account is self-serve. Privacy Policy: audit log kept 7 days on Free and 90 on the plan; push devices, observability data and search embeddings disclosed. Subprocessors: Expo (phone notifications) and Google (Google Workspace mail) added; Stripe also works out tax.",
109 },
110 {
111 date: "2026-10-09",
112 change:
113 "Privacy Policy: g1t.sh uses HeyCatch for site analytics, with names removed outside the public pages, and one analytics cookie, set in the EU, EEA, UK and Switzerland only after you allow it. Subprocessors: HeyCatch, Inc. added.",
114 },
115 {
116 date: "2026-10-06",
117 change:
118 "Privacy Policy: request logs are kept 7 days, and database history 30 days. Subprocessors: GitHub listed among the integrations you choose, in place of Slack, which g1t does not connect to.",
119 },
120 {
121 date: "2026-10-05",
122 change:
123 "First published: Terms of Service, Privacy Policy, Acceptable Use Policy, Refunds and Cancellation, and Subprocessors.",
124 },
125];
126
127/** `2026-10-05` as "October 5, 2026". */
128export function longDate(day: string): string {
129 const [year, month, date] = day.split("-").map(Number);
130 const months = [
131 "January", "February", "March", "April", "May", "June",
132 "July", "August", "September", "October", "November", "December",
133 ];
134 return `${months[month - 1]} ${date}, ${year}`;
135}
136
137/**
138 * security.txt (RFC 9116). `Expires` is required and should be less than a
139 * year away, so it is always computed: 180 days from now.
140 */
141export function securityTxt(now: Date = new Date(), site = "https://g1t.sh"): string {
142 const expires = new Date(now.getTime() + 180 * 24 * 60 * 60 * 1000);
143 expires.setUTCHours(0, 0, 0, 0);
144 return [
145 `Contact: mailto:${CONTACT.security}`,
146 `Expires: ${expires.toISOString().replace(".000Z", "Z")}`,
147 "Preferred-Languages: en",
148 `Policy: ${site}/security#responsible-disclosure`,
149 `Canonical: ${site}/.well-known/security.txt`,
150 "",
151 ].join("\n");
152}