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.
| Merge site-audit: SEO routes, analytics with consent first in Europe, security page, founder and X account, docs header; the tour opens on the pull request and leads with Code, on the real shell, with Agents and Docs working today | 1 | /** |
| 2 | * Schema.org JSON-LD for the pages that say what g1t is and what it costs, | |
| 3 | * so search engines and AI assistants read it without parsing the prose. | |
| 4 | * Each is a `script:ld+json` meta descriptor, added after `page(…)`. | |
| 5 | */ | |
| 6 | import type { MetaDescriptor } from "react-router"; | |
| 7 | ||
| 8 | import { COMPANY, SOCIAL } from "./legal"; | |
| 9 | import { DESCRIPTION, SITE } from "./meta"; | |
| 10 | ||
| 11 | export function organization(): MetaDescriptor { | |
| 12 | return { | |
| 13 | "script:ld+json": { | |
| 14 | "@context": "https://schema.org", | |
| 15 | "@type": "Organization", | |
| 16 | name: COMPANY.name, | |
| 17 | url: COMPANY.url, | |
| 18 | founder: { "@type": "Person", name: COMPANY.founder }, | |
| 19 | brand: { "@type": "Brand", name: "g1t", url: SITE, sameAs: SOCIAL.map((account) => account.url) }, | |
| 20 | }, | |
| 21 | }; | |
| 22 | } | |
| 23 | ||
| 24 | /** g1t as an application, with the plan's monthly price per workspace. */ | |
| 25 | export function application(monthlyDollars: number): MetaDescriptor { | |
| 26 | return { | |
| 27 | "script:ld+json": { | |
| 28 | "@context": "https://schema.org", | |
| 29 | "@type": "SoftwareApplication", | |
| 30 | name: "g1t", | |
| 31 | url: SITE, | |
| 32 | applicationCategory: "DeveloperApplication", | |
| 33 | operatingSystem: "Web", | |
| 34 | description: DESCRIPTION, | |
| 35 | publisher: { "@type": "Organization", name: COMPANY.name, url: COMPANY.url }, | |
| 36 | license: "https://opensource.org/licenses/MIT", | |
| 37 | offers: [ | |
| 38 | { | |
| 39 | "@type": "Offer", | |
| 40 | name: "Free", | |
| 41 | price: "0", | |
| 42 | priceCurrency: "USD", | |
| 43 | description: "Chat and the forge, with no card.", | |
| 44 | }, | |
| 45 | { | |
| 46 | "@type": "Offer", | |
| 47 | name: "The g1t plan", | |
| 48 | price: String(monthlyDollars), | |
| 49 | priceCurrency: "USD", | |
| 50 | description: "A month per workspace, never per seat, with $10 of usage included.", | |
| 51 | priceSpecification: { | |
| 52 | "@type": "UnitPriceSpecification", | |
| 53 | price: String(monthlyDollars), | |
| 54 | priceCurrency: "USD", | |
| 55 | unitText: "month per workspace", | |
| 56 | }, | |
| 57 | }, | |
| 58 | ], | |
| 59 | }, | |
| 60 | }; | |
| 61 | } | |
| 62 | ||
| 63 | export function faqPage(questions: { q: string; a: string }[]): MetaDescriptor { | |
| 64 | return { | |
| 65 | "script:ld+json": { | |
| 66 | "@context": "https://schema.org", | |
| 67 | "@type": "FAQPage", | |
| 68 | mainEntity: questions.map((item) => ({ | |
| 69 | "@type": "Question", | |
| 70 | name: item.q, | |
| 71 | acceptedAnswer: { "@type": "Answer", text: item.a }, | |
| 72 | })), | |
| 73 | }, | |
| 74 | }; | |
| 75 | } |
This file's history is long; its oldest lines are credited to the oldest commit read.