How to work in Prototemplate, Kevin's hub and wiki for General Translation work.
pnpm skills:install prototemplate --project <dir>Run it from a Prototemplate checkout. It links skills/prototemplate into the project’s .claude/skills and .agents/skills; --copy vendors the folder instead, and --dry-run prints each step first.
General Translation (GT) is a localization platform for developers. Prototemplate is Kevin Liu's hub for his GT work and the wiki of how he does it: a Next.js 16 site kept at github.com/Kevin-Liu-01/Prototemplate and served at www.prototemplate.com. It serves the brand book, the design canon, the brand deck, the design lab, the marks, the films, the graphics and the curated GT skills as live pages. On 2026-10-05 Kevin said he should be able to "use it anywhere and build on top of it", so that it "acts as a wiki / repository of how i do work at GT".
Paths are relative to a Prototemplate checkout ($PROTOTEMPLATE; git clone https://github.com/Kevin-Liu-01/Prototemplate, then pnpm install, pnpm run doctor and pnpm dev). AGENTS.md at the root is the agent entry point and docs/handbook/ holds the working handbook. The references hold the detail: references/hub.md (every route and document, the repository map), references/shell.md (the shell's props and data shapes), references/chrome.md (the book page and the chrome rules), references/registries.md, references/adding.md (the checklists file by file), references/porting.md, references/build-scripts.md, references/skills.md (the skills contract) and references/sources.md. pnpm lint:registries reports the registries a change has missed.
The routes are / (the design lab), /brand, /docs and /docs/<slug>, /deck, /skills and /skills/<slug>, /handbook, /marks, /blog, /graphics, /motion, /compare, /present, /directions/<slug>, /archive/<slug>, /d/<slug> (the directions, self-contained) and /d/production/... (the shipped site page for page, with the dashboard's sign-in and onboarding states). The canon documents are AGENTS.md, docs/handbook/, BRAND.md, DESIGN.md, ARCHITECTURE.md, docs/SHIP-LOOP.md, docs/GRAPHICS.md, docs/ARTIFACT-PICTURES.md, docs/LIBRARIES.md and deck/DECK-GRAMMAR.md; motion/MOTION.md is kept by the Videos session and untracked. references/hub.md gives each route's contents and source files.
main is the primary repository, and canon is edited there first. Files move from gt-cloud's older apps/redesign copy one at a time, and no rsync --delete ever runs toward Prototemplate, because it would erase the routes that exist only here (docs/SHIP-LOOP.md section 7).package.json and the registries, and fix the prose in the change that finds the drift.Prototemplate is the living reference of GT work only while every deliverable reaches it.
/d/production rebuilds each gt-cloud page one to one, renders it natively and never links out to generaltranslation.com. After gt-cloud PRs merge, diff main and port their fixes here (references/porting.md). Remove mirror pages Kevin calls wrong, and bring in the pages he built.gt-ship section 8)./brand and BRAND.md and leave the business facts alone. The brand agency questionnaire's confidential answers stay off the site.references/hub.md draws the map: src/app/ (one folder per route), src/app/d/ (the directions, with d/toolchain as the source the forks import), src/components/{viewer,shared,shell,plate}, src/lib/ (registries, generated data, engines), scripts/{lib,lint,check,build,skills,media}, deck/, graphics/, content/, motion/ (untracked, the Videos session's), skills/<slug>/ (the canonical copy of each skill), public/ and docs/.
next.config.ts sets typescript.ignoreBuildErrors: true, so pnpm build never type-checks. tsc is a gate of its own.next.config.ts also holds the /deck rewrite, the cache headers for public files, the permanent redirects and outputFileTracingExcludes for the prerendered routes that read files through computed paths. A route that turns dynamic must stop reading an excluded path.tsconfig.json includes **/*.ts, so a .ts file under skills/ would be type-checked. Skill helpers are .mjs, .py, .sh or .js.src/app/d/** holds self-contained explorations with their own type and colors, and the shell's rules do not reach it. The type lint skips the files its ALLOW_FILES list names.ViewerShell (src/components/viewer/ViewerShell.tsx) frames every route except /deck, /present, /blog and the /d/ pages. Kevin made the deck's viewer the frame for the whole site on 2026-09-08 ("i really love our deck's navigation and basic interface"). The shell owns the state and draws the chrome: the sidebar, the 52px toolbar, the stage, the index panel, the search, the help card, the toast, the progress line and the one hover preview. The route renders the stage content as children. references/shell.md explains every prop and data shape, and references/chrome.md holds the detail of the rules below.
/deck loads it as a document (src/lib/document-routes.ts), since a router navigation would fetch the whole deck twice.BookHead draws the title from PAGE_NAMES, a lead of one to three lines, the panel (Updated from the generated src/lib/updated.ts, then three facts), then the one hatch band, and sections open with a .pt-book-sec divider. The server page calls requireUpdated('<route>'), and a new route needs its paths in scripts/build/updated.mjs. pnpm lint:heads and pnpm lint:heads:live hold the structure (Kevin, 2026-10-06: "standardize our presentation more").html[data-theme], dark when unset, stamped before first paint. Dark mode is a token remap, and no shell stylesheet reads prefers-color-scheme.src/components/viewer/tokens.css is the one token file.useMountEffect and dependency work in useLayoutWork; pnpm lint:practices fails a new bare useEffect and any GSAP import under src/components/viewer. Shell code mirrors state into refs for listeners and animates transform and opacity only. Every .pt-* class is global, so grep a name before using it.gt-components lists each shell component with its role.
A page, a document or a skill appears in several hand-kept lists, and a change updates every list that names it in the same commit: src/lib/surfaces.ts, src/lib/search-index.ts (with DOC_HEADINGS, HANDBOOK_HEADINGS and DECK_SLIDES), the DOCS and HANDBOOK registries, src/lib/page-names.ts, scripts/build/updated.mjs, src/app/docs/links.ts, src/lib/directions.ts, src/lib/archive.ts, src/app/sitemap.ts, public/llms.txt, the metadata in src/app/layout.tsx, and siteRoutes() in scripts/lib/site-pages.mjs. references/registries.md gives what each holds and who reads it.
src/lib/skills.ts and src/lib/motion.ts are generated. Edit their sources and rerun pnpm build:skills or pnpm build:motion.pnpm lint:registries checks the headings, the route lists, the first-slug regexes and the skill contract. It exits 1 on a hard failure and prints the softer gaps as notes.Chrome is everything the shell draws around content. The rules are DESIGN.md sections 2, 15 and 16 and the values in tokens.css; references/chrome.md holds each rule in full, gt-aesthetic the taste behind them and gt-lints the lints that enforce them.
--pt-text, --pt-ff-text, --pt-ff-display, --pt-d1 to --pt-d3). Weights stop at 500. A stylesheet declares no family, feature list or display size of its own, and pnpm lint:type holds it (Kevin, 2026-10-05: "the CORRECT RASMUS INTER").--pt-radius-shell; controls 6px, a flush inner part 5px, chips 4px and cards 6px. pnpm lint:radius holds it, and Present's 8px is the one named exception.tokens.css only; pnpm lint:shell refuses literals in src/components/viewer and src/components/shell.src/components/viewer/icons.tsx at 16px in currentColor. The theme button's ◐ and ◑ are the one exception. No Lucide, no other glyph icons, no icon font..pt-scroll is the only scrollbar.--pt-hair), row (--pt-hair-soft) and frame (--pt-edge). --pt-ink colors a border only in a state. Where two bordered parts touch, the junction table in DESIGN.md section 2 names the one owner (Kevin, 2026-09-08: "verify no double borders ... this is key to our identity").ShellSection.under; the current page is always marked with aria-current="page". Full titles wrap to two lines with no ellipsis.references/adding.md gives each list file by file, along with directions, shipped pages, films and stills.
page.tsx and viewer, a row in PAGES or KNOWLEDGE of surfaces.ts, PAGE_ICON in Sidebar.tsx and search-index.ts, PAGE_KEYWORDS, under on its sections, a sitemap line, lines in llms.txt and the README, a row in siteRoutes() of scripts/lib/site-pages.mjs tagged with the tools that walk it, then pnpm capture:pages --only <id> and pnpm build:thumbs.DOCS entry, its h2s in DOC_HEADINGS, lines in llms.txt and the README's "Read first" table, and a docs-<slug> capture. Its links resolve through src/app/docs/links.ts.docs/handbook/<slug>.md, a HANDBOOK entry in src/app/handbook/registry.ts, its h2s in HANDBOOK_HEADINGS, its row in docs/handbook/README.md and AGENTS.md's handbook list, a line in llms.txt, and a handbook-<slug> capture.PAGE_NAMES entry, BookHead with three facts, requireUpdated from the server page, an entry in scripts/build/updated.mjs, its route in lint/heads.mjs' live list, then pnpm build:updated.skills/<slug>/SKILL.md written to the contract in section 10, then pnpm build:skills, then the installer's dry run and its run.references/porting.md: one root class, stylesheets as rescoped mirrors, every addition in one compatibility sheet, sections through one transform, and the copy recorded in scripts/lint/copies.json.pnpm lint:registries and the gates in section 9.references/build-scripts.md gives each command with what it reads and writes, and docs/TOOLS.md lists every script.
src/lib/skills.ts, src/lib/motion.ts, public/brand-deck.html, public/deck-assets, public/shots, public/marks), so the site builds without motion/ or any other checkout. Generated files change only through their scripts.build:motion only reads motion/. It throws before writing when a brief's or a script's shape changes or a web copy differs from the pinned cut, and it lists a newer cut as in review until Kevin approves it (--pin <slug>).scripts/build/skills.mjs reads only skills/, so it runs in any clone. Its header comment lists the contract it checks.playwright-core (pnpm exec playwright-core install chromium), read CHROME_PATH first, and take their base URL from PT_BASE (default http://localhost:3005).On Kevin's machine $PROTOTEMPLATE is one working tree that several Claude sessions use at once, and each session keeps to its lane. A fresh clone elsewhere has no other sessions, but the staging rules below still apply. Kevin, 2026-10-03: "the videos one should be making them, and this one is just for prototemplate work".
motion/, which is untracked. The onboarding and dashboard session works in deck/, src/components/plate, src/app/craft and public/brand/mood, and it pushes main from its own worktree. The Prototemplate session does the site work. A request that belongs to another lane goes to that session by name (ListAgents, then SendMessage).git status --short before and after the work, and stage only the change's own paths. Never run git add -A or git add .: on 2026-10-01 commit b56e64c swept 229 files of motion/ onto origin/main.git checkout <commit> -- <file> on a path another session may hold edits in, and never rewrite shared main without Kevin..next. Next 16 refuses a second next dev for the same checkout (.next/dev/lock). A lane or worktree runs its own server on its own port.next dev can leave .next/dev/prerender-manifest.json half written, and every route then answers 500 ("Unexpected non-whitespace character after JSON"). After a large fast-forward (47 commits on 2026-10-09) the server answered nothing. Restart it: stop its next dev --port 3005 processes by PID, delete .next/dev (it had grown to 64 GB), start the prototemplate-dev launch entry, and tell the sessions that use it. A cold image-optimizer request on a loaded server can hang for 900 seconds or more; that is server state, so retry once the load drops.git merge --ff-only origin/main; the untracked motion/ folder is unaffected.gt-ship section 8 gives the commit steps: the fetch of origin/main, the conflict-marker sweep and the pathspec commit.gt-lints explains each gate, and gt-ship section 8 holds the build commands, the push and the deploy checks.
pnpm exec tsc --noEmit, which takes 3 to 5 minutes.pnpm lint:all, which runs pnpm lint:static (every static lint and test, lint:registries, lint:public, lint:copies, lint:tools and test:skill-scripts among them) and then the browser audits against the dev server at PT_BASE (default 3005: lint:lines:shell, lint:type:live, lint:radius:live, lint:heads:live); package.json holds the exact chain. It takes about 25 minutes. Run the browser gates one at a time, because a parallel capture made lint:lines:shell fail on 2026-10-01.pnpm check:pages --preset quick --pages <ids> on the touched routes (phones, a tablet, laptops, desktops and the ultrawide), with zero defects and every interaction passing.pnpm build in a scratch worktree, gated with && and never piped.Kevin reviews on http://localhost:3005 first. New explorations and redesign rounds stay uncommitted or on a branch until he says to land them ("I should be reviewing them locally", 2026-09-14). When he says to land, push the committed HEAD he reviewed (git push origin HEAD:main). The working tree holds other sessions' edits, so never commit it whole. Every push builds on two Vercel projects: the General Translation team project serves www.prototemplate.com, and Kevin's personal project serves prototemplate.vercel.app.
The curated GT skills live in skills/<slug>/, one canonical copy each, chosen by use (Kevin, 2026-10-05: "we only need to show and store the ones weve actually been using and updating ... dont just smash a bunch of thigns in there"). skills/README.md, written by pnpm build:skills, lists them by area. references/skills.md holds the full contract, the install and the other skill homes; pnpm build:skills checks it.
name (the folder's slug), description (what it covers, then "Use when", at most 1024 characters), and string metadata: title (the h1, no leading "The"), areas (from the fixed set; the first files it on /skills), updated, origin: prototemplate and owner (P, V or O, the session lane that keeps it and reviews every diff to it).## Sources last as a short pointer to references/sources.md, where every added line cites its memory note, transcript or inventory row and its date. The body stays under 24,000 bytes: detail moves to references/, and trimming moves a rule and never deletes it. Every skill is written to gt-voice, holds no keys, email addresses, personal details, company numbers or machine paths, and names paths relative to a named checkout..md, .mjs, .json, .py, .sh, .txt or .js, served raw. A script is self-contained, with a header that gives its purpose, usage, Requires: and Last real run: (a date and session, or none (kept for: <trigger>)), and an offline test that pnpm test:skill-scripts runs.pnpm skills:usage counts loads; thirty days after distribution a skill with no loads and a script still at none are cut unless Kevin keeps them by name.pnpm skills:install links or copies the set into a project (--project <dir>, dry run first); this repository's .claude/skills and .agents/skills hold relative links. It never runs against Kevin's home folder without asking him. A new slug is checked against the wiki's runtime list and gt-cloud's .agents/skills first, so an install never shadows another skill.pnpm lint:registries exits 0 or fails only on findings that predate the change.under, no page shows its sections as a separate group, and aria-current="page" sits only on the current row and the page row the reader is inside.build/updated.mjs, and lint:heads and lint:updated pass.tokens.css, borders in the three roles with one owner per junction, and Heroicons 20 solid from icons.tsx.motion/ and the other lanes' paths are untouched.lint:all, check:pages --preset quick on the touched routes, both themes at 1440 and 390, and the scratch worktree build all pass.references/sources.md, and a header and offline test for each script.GT skills: gt-components (each shell component), gt-aesthetic (the taste behind the chrome), gt-lints (every gate), gt-ship (landing and deploys), gt-deck (the deck the shell came from), gt-graphics, gt-dither, gt-motion and gt-films (what /graphics and /motion show), and gt-voice (every word on the site and in the skills). Wiki skills: agent-browser (the visual check in both themes and at phone width).
references/sources.md lists the Prototemplate files, gt-cloud branches, memory notes and Kevin's dated directives behind each section, and cites every line added on 2026-10-10.
The folder skills/prototemplate as agents fetch it. Each file opens raw.
SKILL.mdreferences/adding.mdreferences/build-scripts.mdreferences/chrome.mdreferences/hub.mdreferences/porting.mdreferences/registries.mdreferences/shell.mdreferences/skills.mdreferences/sources.md