The General Translation identity as rules.
node scripts/install-skills.mjs gt-brand --project <dir>Run it from a Prototemplate checkout. It links skills/gt-brand into the project’s .claude/skills and .agents/skills; --copy vendors the folder instead, and --dry-run prints each step first.
General Translation (GT) builds open-source i18n libraries (gt and the framework packages such as gt-next) and a closed translation platform with an AI agent, Locadex. Its identity is written in Prototemplate's BRAND.md and DESIGN.md and drawn in the brand deck (deck/parts/head.html and deck/slides/). This skill states those documents as rules for anything that carries the GT brand. Type gets the most room, because the one face is the real rsms InterVariable and nearly every type defect Kevin has flagged came from settings layered on that face.
Paths are relative to a Prototemplate checkout ($PROTOTEMPLATE) unless they name $GT_CLOUD, a gt-cloud checkout at origin/main. A long-lived gt-cloud checkout can sit on an old branch without the files named here, so read gt-cloud facts from origin/main or a fresh worktree. motion/ in Prototemplate is the films session's local folder and stays untracked, so its files exist only in Kevin's checkout (gt-films).
Two files hold the detail:
references/type.md: the font file and how to verify it, the bindings on every surface, the tokens, optical size, features, the full tracking table, the ladders, per-script stacks, the type lint and the gotchas.references/marks.md: the current mark and its files, the GT word inline in text, the speed set and how to regenerate it, the Locadex mark, the dithered shimmer and third-party logos.The name General Translation was chosen for three reasons, in this order. The first is ambition: like General Motors or General Electric, the name states the intent to be the leading company in the category. The second is generality: general AI models understand context and follow direction better than specialised translation models. The third is distinction: most other localization companies have names that begin with L.
| name | what it is | how it is written |
|---|---|---|
| General Translation | the company; General Translation, Inc. in legal text | in full on first mention and in headings |
| GT | the short form and the mark | in the deck, a standalone GT in rendered copy is the mark at cap height (references/marks.md) |
gt | the open-source library and CLI; users run npx gt translate | lowercase, in code form |
gt-next, gt-react, gt-vue, gt-node, gt-python | the framework packages | in their exact form |
| Locadex | the AI agent product | its own mark |
| generaltranslation.com | the domain | in body copy |
| prototemplate.com | the design lab and the brand handoff site | in body copy |
| glyphfield.com | the companion tooling site: the shader library and the animation studio | a separate site from prototemplate.com |
gt and the packages). The mark, the colors, the type, the layout system, the voice, the site structure and the product names, Locadex included, are open in that project (deck slide 93). The rules in this skill are the working system until the project hands off its replacement.The thesis is "every product in every language": native-level speed and quality from the first day. The positioning is the Vercel model applied to localization. GT builds the open-source libraries (gt and the framework packages) and the closed platform (context-aware translation APIs, versioning, editing, integrations and Locadex) as one stack. Because GT owns the whole stack, it can deliver consistent translation quality across a company's apps, docs and websites, integrated in an afternoon. The open source carries a community register and the platform an enterprise register, in one family.
The identity has to carry five values:
The voice is measured, declarative and precise. BRAND.md section 3 gives the pair:
Deck slide 12 states the five rules: one claim per sentence; a number or a mechanism where a marketing adjective would go; no hedging; no exclamation marks and no em dashes; sentence case everywhere and Title Case only on buttons. The full writing rules are in gt-voice.
For product surfaces, Kevin judges the result against the brand deck (Kevin, 2026-09-25, on the first dashboard pass: "it does not feel like our style and is too busy"). BRAND.md section 8 still calls the Dossier (/d/singularity-dossier) the completed reference application of the identity. On 2026-10-06 Kevin asked why the Dossier was the reference for the brand, since the brand has "evolved so much more since then"; the section waits for his decision, and no page presents the Dossier as the brand's current reference (gt-aesthetic references/verdicts.md).
Four absolute colors and one accent. The four are declared once in src/app/globals.css (--color-ink and the rest) and mirrored by the shell (src/components/viewer/tokens.css) and the deck (deck/parts/head.html). The accent is declared per page root (for example --tc-accent in a direction's styles.css, --sl-accent and --aw-accent on the gallery), and the deck shows it only as a labelled swatch (deck/DECK-GRAMMAR.md).
| token | value | role |
|---|---|---|
| ink | #070707 | text and marks on paper; the dark ground |
| raised ink | #101010 | the one dark artifact surface: code, config and diffs, in white at 87% |
| titanium | #8a8f98 | captions, counters and quiet labels |
| paper | #ffffff | the light ground |
| accent | #2f5ce0 on paper, #86a8ff on ink | one spectral accent per page |
#3a3d44, and draw the rest as alphas of ink: hairlines at 18% and 9%, a plate at 3.5%, and a frame line at 62% for pictures only. Pages read these semantic tokens and never the raw values.[data-theme='dark'] paper becomes #070707, ink becomes #f2f2f0, ink-2 becomes #b9bcc3, and the hairline alphas rise to 22% and 10% so a 1px seam survives between two ink surfaces.#86a8ff: #2f5ce0 sits at 3.58:1 on #070707. New work takes these two values. Deck slide 26 records two other blues in use (#3b82f6 in the docs, #2563eb on the blog) as drift to resolve.#12a37a done or passing, #f0a020 open or in review, #e5484d excluded or rejected, #2f5ce0 GT itself. The four are the same in both of the deck's themes, so these icon hues are separate from the accent's lift. Text and lines stay monochrome. The shell's site icons use the same amber on ink and darken it to #c47d00 on paper, where #f0a020 sits at 2.15:1 (--pt-site-signal).#6e737c (4.77:1) in $GT_CLOUD/apps/dashboard/src/app/brand-tokens.css. Check titanium text at 13px in the light theme before shipping it.The color rules have four documented exceptions:
motion/MOTION.md, Round 4 direction; gt-films)..credits-card in $GT_CLOUD/apps/dashboard/src/app/brand-tokens.css is a payment-card object with a literal dark fill, a 14px radius and, on paper, a shadow. Its own comment names it the one such surface on the plate pages; it is no precedent for another surface.Inter is the one typeface for display, interface and text. The build is the rsms.me Inter 4.1 variable family, roman and italic, self-hosted. Detail and measurements are in references/type.md.
The face.
public/fonts/InterVariable.woff2 (sha1 f55b18fd) and public/fonts/InterVariable-Italic.woff2 (sha1 a5f0513e). Their family name is "Inter Variable", version string 4.001, with axes opsz 14 to 32 and wght 100 to 900.next/font/google, no fontsource package, no CDN copy, no local() source.'Inter', 'InterVariable' or 'Inter Display' as a family. A bare name matches whatever Inter the reader has installed. The deck is the one place a family is named 'Inter': its @font-face carries the roman as a data URI, which cannot fail to load, so it always hides an installed Inter (references/type.md).The binding.
ptInter in src/lib/fonts.ts, on --font-inter.inter therefore shares its name with an installed Inter. If the woff2 fails to load, that installed Inter renders (desktop Inter 3, for example, which has no opsz axis), and the metric-matched fallback never engages.inter on --font-sans, and its built CSS reads "inter", "inter Fallback", so it carries the same exposure.The stack is var(--font-inter), system-ui, sans-serif (the shell's --pt-text). next/font's fallback face is already a metric-matched local Arial, so 'Helvetica Neue', Arial after the variable add nothing.
Weights. 400 for running text and long-form reading. 500 for labels, headings, display text, b and strong. Nothing above 500 and nothing below 400. The browser's bolder turns b and strong into 700, so a base rule sets them to 500.
Optical size. font-optical-sizing: auto and never font-variation-settings. The browser sets opsz to the font size in px, clamped to 14 to 32. Text at 14px and under gets the Text design, text from 32px gets the Display design, and sizes between them get the intermediate instances. Pinning opsz or wght through font-variation-settings breaks that mapping.
Features. Two lists, applied only through tokens:
'liga' 1, 'calt' 1, 'cv11' 1, 'ss01' 1 for h1, h2 and display sentences (the deck's .big). cv11 is the single-storey a and ss01 the open digits.'liga' 1, 'calt' 1 for everything else, labels and numerals included.calt off under any letter-spacing, which loses Inter's arrows and its colon and hyphen fitting. Naming 'liga' 1, 'calt' 1 restores them. rsms.me's own CSS carries the same fix.font-feature-settings replaces the inherited list, so one stray rule changes the letterforms of a whole subtree. Tabular figures come from font-variant-numeric: tabular-nums and never from 'tnum' in the feature list.Tracking. Tracking tightens with size and weight, and weight 400 text is never tracked.
| role | tracking | where it is set |
|---|---|---|
| page titles, section titles and slide headings, 32px and up, weight 500 | -0.025em | deck head.html:62; shell --pt-d1-track, --pt-d2-track; dashboard .typo-page-heading (30px) |
| figures and 24px headings | -0.02em | deck .page .pn b, .spec .w; shell --pt-d3-track |
| display quotes at 27 to 34px, weight 500 | -0.015em | deck .say .q (34px), slide 12's .ex .q (27px), the .ladder specimen rows |
| labels at weight 500, 13 to 20px | -0.01em | deck .rows b, .book-toc a; shell --pt-track-label |
| group labels at weight 500, 12 to 12.5px | -0.005em | deck .sec-label; shell --pt-track-group |
| running text at weight 400 | 0 | everywhere |
| 13px captions | +0.01em in gt-cloud (.typo-caption); 0 in the Prototemplate shell | |
| 13px counters | +0.02em in the deck (.counter); 0 in the Prototemplate shell |
The Prototemplate shell tracks nothing positive, and its type lint fails any positive value on Inter. rsms.me no longer serves Inter 3's Dynamic Metrics page (rsms.me/inter/dynmetrics answers "This page used to exist, but is no longer"). In Inter 4 the opsz axis narrows spacing with size by itself, about -0.039em a character from 32px as measured on 2026-10-05. The deck's -0.025em on display sizes is a house choice on top of the Display design, and nothing goes tighter.
Measure and wrapping. Body text runs 60 to 70 characters a line: --pt-measure: 32em for body and --pt-measure-lead: 30em for leads. Set new measures in em and never in ch: Inter's zero is about 0.63em wide, so 62ch comes to 83 to 86 characters. The deck's ch measures (.max, .max-p, the book head) belong to the deck's owner. Headings h1 to h3 take text-wrap: balance.
The ladders.
.big 72, h2 44, lead 26, p 22 at 1.5, .rows 20, caption 15. Text under 15px on the sheet is a defect.--tcm-*).Monospace is an instrument voice. It sets code, tokens, terminals, file paths, hex values and locale codes, and nothing else: no headline, body or marketing line is ever set in mono. Prototemplate uses the system mono stack (--pt-mono) and gt-cloud uses Geist Mono (--font-mono).
Scripts.
--cjk, --arabic and --indic, and the shell's --pt-text-hant, --pt-text-hans, --pt-text-ja and --pt-text-he.:lang() selector or a class) with no Inter variable in front, the way the deck's .lang .ar does.Exceptions. Each is named here so no sweep removes it:
proto and Space Grotesk 500 for template, loaded by src/lib/brand-fonts.ts (DESIGN.md section 15)./ (DESIGN.md section 4). They belong to the Prototemplate chrome and appear on no GT surface./d/ direction routes, which are self-contained explorations with their own type./present), whose intro lockup sets Sora and Instrument Sans (src/app/present/fonts.ts) and whose type beats show other faces beside Inter on purpose..ptb-display on /brand.Enforcement.
node scripts/lint-type.mjs fails a literal family, a bare Inter, a feature list outside the tokens, any font-variation-settings, a weight above 500, heading metrics outside the display tokens, positive tracking and mono on a non-code selector, and ratchets literal sizes, tracking and line heights per file. An exception is written /* lint-type: allow <reason> */, and an empty reason fails. pnpm build runs its static mode first, pnpm lint:type:live reads the faces, features, tracking, optical size and weights Chrome renders on the dev server's pages at 1440 and 390, and pnpm test:type runs its tests. gt-lints owns the rule table and the wiring.inter-only, mono-is-not-voice, no-thin-font and typed-text-var in $GT_CLOUD/tooling/oxlint-plugins/gt-ui.ts. Prototemplate's pnpm lint:code runs a copy of that plugin taken on 2026-09-28 (scripts/oxlint-plugins/gt-ui.ts), with thirteen of its rules switched on in .oxlintrc.json; no-thin-font is not among them.Detail, files and procedures are in references/marks.md.
REFERENCE_MARK in src/lib/marks.ts, the same path as the deck's #gt-mark symbol. The masters are public/brand/no-bg-gt-logo-light.png and no-bg-gt-logo-dark.png (the white mark). The gt-logo-*.svg files beside them wrap an embedded PNG, so new work draws the outline.public/brand/locadex-mark.svg; LocadexMark in gt-cloud's packages/ui) and appears only where it has a function./marks and on deck slides 17 to 23. scripts/build-speed-marks.mjs generates every file from geometry and font outlines (pnpm build:marks). Regenerate them; never redraw one by hand or edit an SVG under public/marks.DitheredMark, the 4 by 4 Bayer band swept through the mark's alpha mask). A mark is never a gif and never carries a filter glow; gt-ui no-gif-mark refuses gifs.@thesvg/react package (84 MB unpacked) is never added. In gt-cloud they live in packages/ui/src/components/icons/*Logo.tsx on the shared BrandMark root.The brand's recurring subject is writing systems. Each device below has an owner file and a skill:
/craft with the other devices below (BRAND.md section 7).src/components/shared/EverySentence.tsx breaks a headline into glyphs and reassembles it as the same sentence in the next language, with the same number of particles. Its moving type law is DESIGN.md section 8: one shaped text node with lang and dir, width from a hidden probe, and the host page's clock (gt-motion).LocaleTag in Prototemplate, LocaleFlag in gt-cloud, held there by no-raw-locale-flags). A flag is a data chip next to a locale code and never decoration or an emoji.gt-dither). Pictures of writing (the Rosetta Stone, the Blue Marble) follow the artifact picture standard in docs/ARTIFACT-PICTURES.md.src/components/shared/diagrams/DoubledLine.tsx, --thread-gauge: 1.5px, --thread-gap: 3px; gt-diagrams).The basement brand questionnaire was finalised on 2026-08-11. Its avoid list, BRAND.md section 9 and deck slide 39 together:
| avoided | the rule that holds it |
|---|---|
| monospace as the brand voice in headlines, body or marketing; small mono labels in diagrams and product UI are tolerated and avoided where possible | gt-ui mono-is-not-voice; lint-type |
| smooth scrolling, scroll hijacking and inertia libraries; native scroll everywhere | gt-ui no-smooth-scroll |
| robot and sparkle iconography for AI, including lucide's Bot | review |
| flag soup; flags appear only as SVG chips beside a locale code, never as emoji | gt-ui no-raw-locale-flags |
| iridescent AI gradients (outside the horizon ring) and glassmorphism | review |
| eyebrow labels that have not earned their place; functional tags and labels are fine | gt-ui no-eyebrow |
| em dashes in rendered text (Kevin, 2026-08-11: zero on the site) | gt-ui no-em-dash |
| exclamation marks | review |
| a trailing period on a heading | gt-ui no-heading-period |
| a second typeface, a weight above 500 or under 400 | gt-ui inter-only, no-thin-font; lint-type |
| a gif as a mark or a demo frame | gt-ui no-gif-mark |
| shadows on any surface | review; the dashboard's plate pages remove them in brand-tokens.css, which keeps one for the credits card (section 3) |
The direction behind the list is International Style discipline with Art Deco's forward stance: Swiss grids, blueprints, boxes, square corners, water and the ocean as the recurring theme, and bespoke material textures. The references are in BRAND.md section 9.
prototemplate.com, the deck, the public Prototemplate repository, generaltranslation.com, the docs, the blog, the films and every social post are public.
/brand leaves the questionnaire's sensitive facts out by design (Kevin, 2026-08-06), and every new surface keeps them out.Any logo, picture, font, model or shader GT did not make follows references/third-party.md.
LocaleFlag), then a customer's own brand page in true ink and the theme's variant, then thesvg.org for other marks, CC0 or licensed scans for pictures, and real recordings for product media. Keep searching until the real asset is found, and never redraw an approximation by hand.LICENSE).Run it on any surface that carries the brand, in both themes, at 1440 and at 390 wide.
references/type.md has the CDP check). In Prototemplate, pnpm lint:type and pnpm lint:type:live pass.b and strong compute 500.font-variation-settings, and no feature list written outside the two tokens.#86a8ff on ink. Small titanium text in the light theme clears 4.5:1, darkened the way gt-cloud's plate pages darken it.gt-voice.references/third-party.md).General skills in Kevin's wiki that this one depends on: design-engineering-polish, create-graphics, agent-browser. GT skills in this set: gt-voice (copy), gt-aesthetic (taste and polish), gt-deck (the brand deck), gt-lints (the line law, the picture standard, the type lint, gt-ui), gt-dither, gt-diagrams, gt-isometric, gt-motion, gt-films, gt-graphics, gt-components, gt-website and gt-landing-pages.
deck/parts/head.html (tokens, the type rules at lines 55 to 69, the GT word at 74 to 78, the book head at 279 to 293, semantic icon hues at 113 to 125) and deck/DECK-GRAMMAR.md (type, color, speed marks, defects).src/lib/fonts.ts, src/lib/brand-fonts.ts, src/components/viewer/tokens.css (type tokens and base rules), src/app/globals.css, deck/fonts/deck-fonts.css, scripts/build-deck.mjs.src/app/present/presenter.css (the mark inverted on paper), src/lib/marks.ts, scripts/build-speed-marks.mjs, src/app/d/toolchain/diagrams/DitheredMark.tsx, src/app/d/toolchain/components/LocaleTag.tsx, src/components/shared/EverySentence.tsx, src/components/shared/diagrams/DoubledLine.tsx.motion/MOTION.md, local and untracked (the films' material palettes and one accent per film).scripts/lint-type.mjs, scripts/oxlint-plugins/gt-ui.ts and .oxlintrc.json; src/app/present/fonts.ts; src/app/system-ledger.css and src/app/anatomy-wall.css (the gallery's accents).apps/landing/src/lib/fonts.ts, apps/landing/src/lib/fonts-prose.ts, apps/dashboard/src/app/brand-tokens.css, tooling/oxlint-plugins/gt-ui.ts, packages/ui/src/components/icons/BrandMark.tsx, packages/ui/src/components/ui/LocaleFlag.tsx.font-feature-settings: 'liga' 1, 'calt' 1; /* fix for Chrome */) and rsms.me/inter/dynmetrics (removed), read 2026-10-05; the font file read with fontkit./d/singularity-dossier) is the completed reference; sensitive questionnaire facts stay off the public site. Kevin, 2026-10-06: the brand has evolved past the Dossier, and BRAND.md section 8 waits for his decision.LICENSE, public/media/README.md, public/fonts/google/README.md.The folder skills/gt-brand as agents fetch it. Each file opens raw.
SKILL.mdreferences/marks.mdreferences/third-party.mdreferences/type.md