{
  "$comment": "One record per project. This file is the source of truth for what the site says it offers: scripts/build_projects.py validates every record (files exist, package bytes and hashes match their sidecars, every id the homepage and Studio name is here) and generates each detail page. Public metadata only — nothing here is a secret or a paid payload. Fields follow the project contract in docs/plans/2026-09-09-plate-scene-product-master-plan.md W1.",
  "contractVersion": 1,
  "release": {
    "toolkit": "1.2.5",
    "wheel": "downloads/plate_toolkit-1.2.5-py3-none-any.whl",
    "wheelBytes": 22863221,
    "wheelSha256": "6919b42e023399821631fe3c195539b1b5ad058dcbc2c943f8af830f1b1da697",
    "priceUsd": 49.5,
    "updates": "Plate Pro v1 updates, included with the one-time licence"
  },
  "featured": [
    "sillage",
    "meniscus",
    "perihelion",
    "meridian",
    "gazette",
    "murmur",
    "observatory",
    "riot-grain",
    "patchbay",
    "atelier-rook",
    "hollow-lane",
    "lookout",
    "kiln-studio",
    "ideas",
    "meet-plate",
    "creatures",
    "latent",
    "issen",
    "margin",
    "keel",
    "quarry",
    "daybay",
    "halden-ceramics",
    "cinder-product"
  ],
  "featuredComment": "The visible collection, in display order: the ids the library grid, the homepage counts and Studio's purchase panel all read. Kept here rather than inline in one page's script so every surface counts the same items; tests/web-studio/featured-collection.test.cjs fails if a surface drifts from it. The catalogue holds more records than this (legacy toolkit templates and lab downloads that remain entitlements but are not part of the displayed v1 collection); adding an id here is what puts a project in front of a customer.",
  "projects": [
    {
      "id": "ideas",
      "version": "1.2.4",
      "title": "Ideas in motion",
      "summary": "A 22-second film that carries real images from full-frame views into a collection and a depth orbit, features three of them, and resolves to a brand and a destination. Your brand, your screenshots, your message.",
      "category": "motion",
      "scope": "video",
      "scopeLabel": "22-second film · 1920x1080 · 60 fps",
      "tier": "pro",
      "availability": "available",
      "quality": "featured",
      "detail": true,
      "poster": "assets/motion/ideas-poster.jpg",
      "preview": {
        "type": "video",
        "src": "assets/motion/ideas-loop.mp4",
        "poster": "assets/motion/ideas-poster.jpg",
        "sound": true
      },
      "demo": "motion.html",
      "example": {
        "source": "examples/motion-ideas/after.html"
      },
      "deliverables": [
        "The editable project: film.json, src/projects.json and motion-plan.json are the three files you change",
        "Two guided recipes (workflow, components) plus the original film, each a complete tested choreography",
        "MOTION-GUIDE.md, the operator guide: field limits, exact beat timings, effect settings, checks and repairs",
        "The effects runtime, the Inter Tight font, the demonstration media and its licence receipts",
        "An MP4 export you render on your computer with npm run render"
      ],
      "adaptations": [
        "Brand, destination URL, every line of copy, the accent colour and the logo",
        "4 to 16 of your own images, with optional short video clips and an end-frame poster each",
        "Which four images take the hero and the three category moments",
        "Which story: workflow (one asset to a finished composition), components (a collection and its details), or the original film",
        "Music kept, replaced or removed; the included excerpt needs its credit if it stays"
      ],
      "notSupported": [
        "Other durations or aspect ratios without authoring a new layout and timeline — the recipes are 22 s at 16:9",
        "Turning photographs into 3D, or generating imagery; you supply the media",
        "Hosted rendering or posting; nothing leaves your computer",
        "An on-screen brand longer than 12 characters; the film's brand field is short by design, the URL and copy lines are separate"
      ],
      "requirements": [
        "Plate Pro 1.2.4 or later, activated on the computer that renders",
        "Claude Code, Codex or Cursor with your own model plan, with Plate's MCP server connected (python -m plate_toolkit config <client>); plate_template and plate_create_project are MCP tools, not CLI commands",
        "Node.js 22+, npm and FFmpeg. The first render downloads the pinned HyperFrames 0.8.31 renderer and its own headless browser and fonts: about 600 MB into your home cache (~/.cache/hyperframes), once, over your connection. Measured 2026-09-14 on a clean install: 541 MB browser plus 67 MB fonts. Later renders reuse it."
      ],
      "package": {
        "kind": "wheel-template",
        "template": "ideas",
        "tool": "plate_create_project",
        "url": "downloads/plate_toolkit-1.2.5-py3-none-any.whl",
        "bytes": 22863221,
        "sha256": "6919b42e023399821631fe3c195539b1b5ad058dcbc2c943f8af830f1b1da697",
        "version": "1.2.5",
        "files": 41
      },
      "formats": [
        {
          "aspect": "16:9",
          "width": 1920,
          "height": 1080,
          "fps": 60,
          "seconds": 22,
          "presets": [
            "workflow",
            "components",
            "ideas"
          ]
        }
      ],
      "attribution": [
        {
          "what": "Music in the sample film",
          "source": "Neon by Scott Buckley",
          "licence": "CC BY 4.0",
          "url": "https://www.scottbuckley.com.au/library/neon/",
          "keep": "Credit required if the excerpt stays in your export"
        },
        {
          "what": "Inter Tight",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "keep": "Keep assets/InterTight-OFL.txt"
        },
        {
          "what": "GSAP",
          "source": "greensock.com",
          "licence": "Standard 'no charge' licence",
          "keep": "See assets/ASSETS.md"
        },
        {
          "what": "Demonstration images",
          "source": "Plate's own projects",
          "licence": "Demo material — replace with yours"
        }
      ],
      "adapted": {
        "title": "Harbor — a shift-scheduling tool for small clinics",
        "brief": "A fictional software product with six authored demo screens. Workflow recipe. Every number and name in it is invented.",
        "video": "projects/ideas/harbor.mp4",
        "poster": "projects/ideas/harbor-poster.jpg",
        "stills": [
          "projects/ideas/harbor-01.jpg",
          "projects/ideas/harbor-02.jpg",
          "projects/ideas/harbor-03.jpg"
        ],
        "interventions": "projects/ideas/harbor-interventions.md"
      },
      "verification": {
        "build": "1.2.4",
        "date": "2026-09-09",
        "what": "Installer downloaded from production and hash-checked; installed into a clean venv; project created with plate_create_project; workflow recipe run; adapted with a fresh fictional brief and rendered; one revision rendered again."
      },
      "updates": "Included in Plate Pro v1 updates",
      "focal": {
        "card": "50% 50%",
        "detail": "50% 50%"
      }
    },
    {
      "id": "issen",
      "version": "1.0.0",
      "title": "Issen",
      "summary": "A 36-second anime short drawn entirely in code: two swordsmen at sunset, a petal falls between them, and when it lands they draw. A full fight in impact frames, a sky that splits along the cut, and a title brushed stroke by stroke and then cut in two. Every frame is a canvas drawn from time, with an original synthesised score. No images, no footage, no image model. Put your name on the end card and move the whole film into your colours from one file.",
      "category": "motion",
      "scope": "video",
      "scopeLabel": "36-second film · 1920×1080 · 24 fps · scored",
      "tier": "pro",
      "availability": "available",
      "quality": "featured",
      "detail": false,
      "poster": "assets/motion/issen-poster.jpg",
      "preview": {
        "type": "video",
        "src": "assets/motion/issen-loop.mp4",
        "poster": "assets/motion/issen-poster.jpg",
        "sound": true
      },
      "deliverables": [
        "film.html and film.js: the complete film, one canvas redrawn from time on every frame, so any render is exactly repeatable",
        "project.json: the end-card copy, the brushed title glyphs as stroke data, every sky, ground and background colour, both fighters' colours and an optional whole-frame grade",
        "render.mjs and check.mjs: render the film, a slice of it, or a contact sheet of single frames",
        "score.mjs: the original score, synthesised from scratch (flute, taiko, steel, impacts, wind, heartbeat)",
        "build.sh: one command, render, score and poster",
        "PROMPTS.md with ready jobs for a coding agent (put your name on it, recolour, the fighters' colours, a new title, a client cut, the limits), EDITING.md, LICENSES.md"
      ],
      "adaptations": [
        "The end card: your name, a tagline and a credit line",
        "The whole palette: sky, clouds, sun, ground, grass, petals and every per-shot background, from one file",
        "Each fighter's colour: headband, light trails, rim light and iris",
        "A whole-frame grade (hue, saturation, brightness, contrast) for a fast change of time of day",
        "The brushed title, by writing new strokes in project.json",
        "The music, by editing score.mjs, or removed"
      ],
      "notSupported": [
        "New characters, a new weapon or a different fight: the shot list and the choreography are the film, and changing them is new animation in film.js",
        "A title longer than 12 brush strokes without changing the title timing",
        "Other durations or aspect ratios without re-timing the shots",
        "Hosted rendering; 2 to 3 minutes of render on the desktop it was built on, all on your own computer"
      ],
      "requirements": [
        "Plate Pro, activated on the computer that renders",
        "Node.js 18+ with puppeteer-core and a Chromium or Chrome, and FFmpeg. Set CHROME= and FFMPEG= if they are not on your PATH. Nothing is downloaded at build time and nothing leaves your computer."
      ],
      "package": {
        "kind": "pack",
        "slug": "issen",
        "version": "1.0.0",
        "sha256": "b081f3051456ab3043a27f4f63edc1ce798e04a835fa2006ea4c532596abe109",
        "bytes": 74830,
        "url": "api/pack?slug=issen"
      },
      "contentFile": "project.json",
      "formats": [
        {
          "aspect": "16:9",
          "width": 1920,
          "height": 1080,
          "fps": 24,
          "seconds": 36.5
        }
      ],
      "attribution": [
        {
          "what": "Geist",
          "source": "Vercel",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/vercel/geist-font",
          "keep": "Keep fonts/OFL-Geist.txt"
        },
        {
          "what": "The music",
          "source": "Synthesised by the project's own score.mjs",
          "licence": "Original, part of the pack",
          "keep": "Nothing to credit"
        }
      ],
      "verification": {
        "build": "1.0.0",
        "date": "2026-09-27",
        "what": "Archive extracted into an empty folder and its sha256 matched this record. ./build.sh ran unedited from the extracted copy on one Windows desktop: 876 frames, 141 s end to end. Against the original render of the film, every frame up to 34.4 s measured 46 dB PSNR or better, and 23 stills across the film were pixel-identical to the original source. The end card differs on purpose: its three small lines moved from Yu Gothic, a Windows-only system font, to the bundled Geist. score.mjs produced a score byte-identical to the original's, -13.6 LUFS integrated. Motion at 24 fps: 7.35 mean change, 4.8% near-still, 9.7% burst, the same as the original. Rebuilt separately as a different brand (Kestrel Pictures, blue hour) by editing project.json only. Not yet built on macOS or Linux."
      },
      "updates": "Included in Plate Pro v1 updates",
      "focal": {
        "card": "50% 50%",
        "detail": "50% 50%"
      }
    },
    {
      "id": "latent",
      "version": "1.0.0",
      "title": "Latent",
      "summary": "A 32-second launch film for an invented pocket film camera with no screen. The camera is built in 3D in code, the viewfinder shoots through twelve real travel photographs, and the next morning every print develops out of the dark, brightest tones first. Hook lines, callouts pinned to the 3D object, a push through the lens into the viewfinder, a shutter iris, a burst to 36 frames, a notification, a darkroom develop, and the mark. Swap in your product and your photos.",
      "category": "motion",
      "scope": "video",
      "scopeLabel": "32-second film · 1080p · 60 fps with motion blur · scored",
      "tier": "pro",
      "availability": "available",
      "quality": "featured",
      "detail": false,
      "poster": "assets/motion/latent-poster.jpg",
      "preview": {
        "type": "video",
        "src": "assets/motion/latent-loop.mp4",
        "poster": "assets/motion/latent-poster.jpg",
        "sound": true
      },
      "deliverables": [
        "index.html and src/film.js: the whole film on one canvas, redrawn from time on every frame, so any render is exactly repeatable",
        "src/camera3d.js: the product, a camera built in three.js from primitives, with studio lighting, a live frame counter and screen projection for callouts",
        "The darkroom develop effect: any photo comes up out of the dark, highlights first, colour last",
        "Twelve CC0 travel photographs with their credits",
        "tools/render.mjs: a deterministic renderer that renders 120 fps and blends to 60 for real motion blur",
        "tools/score.mjs: the original score, synthesised from scratch on the film's beat grid, with a shutter and film-advance sound on every frame",
        "PROMPTS.md with ready jobs for a coding agent, EDITING.md, LICENSES.md"
      ],
      "adaptations": [
        "Your product: rebuild the 3D object from the same primitives and rename it",
        "Your photographs in the viewfinder and the develop grid",
        "The callouts, the hook lines and the end line",
        "The colourway of the object and the paper",
        "A vertical 9:16 version",
        "A shorter cut, with the score following it"
      ],
      "notSupported": [
        "Importing a 3D model file: the object is built from primitives in code",
        "Narration: the film is scored, not spoken",
        "Hosted rendering; you render on your own computer"
      ],
      "requirements": [
        "Plate Pro, activated on the computer that renders",
        "Node.js 18+, FFmpeg and a Chrome with WebGL; `npm install` downloads puppeteer and its own Chrome once. Nothing about your film leaves your computer."
      ],
      "package": {
        "kind": "pack",
        "slug": "latent",
        "version": "1.0.0",
        "sha256": "784541d2b46d0bdf5be1d276d1310ec7cad50484207f1125621815cd4999fc2f",
        "bytes": 4746995,
        "url": "api/pack?slug=latent"
      },
      "contentFile": "index.html",
      "formats": [
        {
          "aspect": "16:9",
          "width": 1920,
          "height": 1080,
          "fps": 60,
          "seconds": 32
        }
      ],
      "attribution": [
        {
          "what": "Geist",
          "source": "Vercel",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/vercel/geist-font",
          "keep": "Keep assets/fonts/OFL-Geist.txt"
        },
        {
          "what": "Instrument Serif",
          "source": "The Instrument Serif Project Authors",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/Instrument/instrument-serif",
          "keep": "Keep assets/fonts/OFL-InstrumentSerif.txt"
        },
        {
          "what": "Fragment Mono",
          "source": "The Fragment-Mono Project Authors",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/weiweihuanghuang/fragment-mono",
          "keep": "Keep assets/fonts/OFL-FragmentMono.txt"
        },
        {
          "what": "three.js",
          "source": "three.js authors",
          "licence": "MIT",
          "url": "https://threejs.org",
          "keep": "Keep src/THREE-LICENSE.txt"
        },
        {
          "what": "Twelve travel photographs",
          "source": "StockSnap photographers, listed in LICENSES.md",
          "licence": "CC0 1.0",
          "url": "https://stocksnap.io",
          "keep": "No attribution required; credits kept in LICENSES.md"
        }
      ],
      "verification": {
        "build": "1.0.0",
        "date": "",
        "what": "NOT YET VERIFIED: extract into an empty folder, match the hash, run lint and check from the copy, then fill this in"
      },
      "updates": "Included in Plate Pro v1 updates"
    },
    {
      "id": "creatures",
      "version": "1.0.0",
      "title": "Creatures",
      "summary": "A 17-second film drawn entirely in JavaScript: 24,000 dots become a man running, a galloping horse, an eagle and a whale, each one pouring into the next. The animals are real 3D rigs with a run cycle, a gallop, a wingbeat and a swimming spine, lit like a halftone print, with an original score. No footage, no 3D software, no image of an animal. Change the animals, the colours, the timing and the end card.",
      "category": "motion",
      "scope": "video",
      "scopeLabel": "17-second film · renders 1080p or 4K · 60 fps · scored",
      "tier": "pro",
      "availability": "available",
      "quality": "featured",
      "detail": false,
      "poster": "assets/motion/creatures-poster.jpg",
      "preview": {
        "type": "video",
        "src": "assets/motion/creatures-loop.mp4",
        "poster": "assets/motion/creatures-poster.jpg",
        "sound": true
      },
      "deliverables": [
        "index.html and src/film.js — the complete film: one canvas redrawn from time on every frame, so any render is exactly repeatable",
        "Four creature rigs (runner, horse, eagle, whale) built from capsules and ellipsoids, each with its own gait written as a function of time",
        "The halftone light, the 3D camera, the wind field and the twelve ground inversions, each a short named section of film.js",
        "tools/score.mjs — the original score, synthesised from scratch, with a sound for each animal",
        "tools/measure.py and tools/burst.py — measure motion and rhythm so you can prove a new cut still moves",
        "PROMPTS.md with ready jobs for a coding agent (swap an animal, recolour, loop, vertical), EDITING.md, LICENSES.md"
      ],
      "adaptations": [
        "Any animal replaced with your own rig: a deer, a big cat, a dog, a fish",
        "The order of the animals and every beat time",
        "The paper, ink and seed colours",
        "The number of dots and the direction of the light",
        "The end card: your mark and your name",
        "The music, by editing its entry in tools/score.mjs, or removed"
      ],
      "notSupported": [
        "Photographic animals, fur or feather detail: the creatures are dot sculptures of simple shapes",
        "Narration: the film is scored, not spoken",
        "Hosted rendering; you render on your own computer with HyperFrames"
      ],
      "requirements": [
        "Plate Pro, activated on the computer that renders",
        "Node.js 18+ and FFmpeg; `npx hyperframes` downloads its own Chromium once. Nothing about your film leaves your computer."
      ],
      "package": {
        "kind": "pack",
        "slug": "creatures",
        "version": "1.0.0",
        "sha256": "6dce7a1a248c5585d619d8c5013d2596e0aeabcf9bf2968639837c083a6b8ad2",
        "bytes": 87623,
        "url": "api/pack?slug=creatures"
      },
      "contentFile": "index.html",
      "formats": [
        {
          "aspect": "16:9",
          "width": 1920,
          "height": 1080,
          "fps": 60,
          "seconds": 17
        },
        {
          "aspect": "16:9",
          "width": 3840,
          "height": 2160,
          "fps": 60,
          "seconds": 17
        }
      ],
      "attribution": [
        {
          "what": "Geist",
          "source": "Vercel",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/vercel/geist-font",
          "keep": "Keep assets/fonts/OFL-Geist.txt"
        },
        {
          "what": "GSAP",
          "source": "gsap.com",
          "licence": "Standard \"no charge\" licence",
          "url": "https://gsap.com/licensing/",
          "keep": "Keep the licence header in assets/gsap.min.js"
        }
      ],
      "verification": {
        "build": "1.0.0",
        "date": "2026-09-22",
        "what": "Archive extracted into an empty folder; sha256 matched against the pack registry; hyperframes lint and check run from the extracted copy (0 errors, 4/4 contrast checks); tools/score.mjs run from the extracted copy produced a byte-identical score to the one on the film; the film rendered at 1080p and at 4K from the project and measured at 24 fps: 13.3 mean change, 12.9% near-still, 8.2% burst."
      },
      "updates": "Included in Plate Pro v1 updates"
    },
    {
      "id": "meet-plate",
      "version": "1.0.0",
      "title": "Meet Plate",
      "summary": "A 15-second kinetic-type film that introduces Plate: nine lines of copy that blur and stretch in with a chromatic fringe over a breathing field, three of Plate’s own creations running as framed loops, the same loops the library plays — the Meniscus site, the DayBay game started by a drawn cursor and played, the Ideas in Motion film — a word list, a serif wordmark ending and an original cinematic score built from a drone, swells and impacts on the beats. The copy, the cards, the palette, the ending and the music are yours to edit.",
      "category": "motion",
      "scope": "video",
      "scopeLabel": "16-second film · 1920×1080 · 60 fps · scored",
      "tier": "pro",
      "availability": "available",
      "quality": "featured",
      "detail": false,
      "poster": "assets/motion/meet-plate-poster.jpg",
      "preview": {
        "type": "video",
        "src": "assets/motion/meet-plate-loop.mp4",
        "poster": "assets/motion/meet-plate-poster.jpg",
        "sound": true
      },
      "deliverables": [
        "index.html — the complete film: one paused GSAP timeline built from a CONFIG object at the top of the file",
        "CONFIG — the only thing you edit for a new film: the copy lines and their roles, the three cards, the palette, the word list, the ending wordmark and tagline, the duration",
        "assets/ — Inter, Fraunces and Geist as WOFF2 with their OFL-1.1 texts, the three footage clips and the game’s menu still, GSAP vendored locally",
        "tools/measure.py — the motion gate: mean per-frame change and near-still frames at 24 fps, so you can prove a new cut still moves",
        "PROMPTS.md: six ready-made prompts — rebrand, new copy, swap the three cards, recolour, cut a 9:16 version, and what the film will not do",
        "README.md with the tested character limits per copy slot, EDITING.md with preview and render, LICENSES.md with the provenance"
      ],
      "adaptations": [
        "The nine copy lines and their roles, in CONFIG",
        "The three cards: any three short 1920×1080 clips (or stills), which side each enters from, which one gets the cursor click and what the click reveals",
        "The palette in four values: light field, ink field, accent and type",
        "The word-list items, the ending wordmark and its tagline",
        "The cadence, by editing the beat times in CONFIG; the engine keeps the entrances and the field",
        "The music, by editing this film’s entry in tools/score.mjs, or removed entirely"
      ],
      "notSupported": [
        "Narration: the film is scored, not spoken; add a voice in your editor if you need one",
        "A hero line over 22 characters at the hero size without changing the size in the engine",
        "Hosted rendering; you render on your own computer with HyperFrames",
        "A 3D product with real reflections: the cards are screen footage, not renders"
      ],
      "requirements": [
        "Plate Pro, activated on the computer that renders",
        "Node.js 18+ and FFmpeg; `npx hyperframes` downloads its own Chromium once. Nothing about your film leaves your computer."
      ],
      "package": {
        "kind": "pack",
        "slug": "meet-plate",
        "version": "1.0.0",
        "sha256": "273e13ee74919fb342fdb942dcda6db7a2c5263c513b6289cdcfa84ef92caf59",
        "bytes": 9208858,
        "url": "api/pack?slug=meet-plate"
      },
      "contentFile": "index.html",
      "formats": [
        {
          "aspect": "16:9",
          "width": 1920,
          "height": 1080,
          "fps": 60,
          "seconds": 16
        }
      ],
      "attribution": [
        {
          "what": "Inter",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/rsms/inter",
          "keep": "Keep assets/fonts/OFL.txt"
        },
        {
          "what": "Fraunces",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/undercasetype/Fraunces",
          "keep": "Keep assets/fonts/OFL-Fraunces.txt"
        },
        {
          "what": "Geist",
          "source": "Vercel",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/vercel/geist-font",
          "keep": "Keep assets/fonts/OFL-Geist.txt"
        },
        {
          "what": "GSAP",
          "source": "gsap.com",
          "licence": "Standard \"no charge\" licence",
          "url": "https://gsap.com/licensing/",
          "keep": "Keep the licence header in assets/gsap.min.js"
        }
      ],
      "verification": {
        "build": "1.0.0",
        "date": "2026-09-17",
        "what": "Archive extracted into an empty folder; bytes and sha256 matched against the pack registry and the catalogue; hyperframes lint and check run from the extracted copy with only the bundled fonts, footage, stills and GSAP present (0 errors); the scored master measured at 24 fps with the bundled tools/measure.py: 6.38 mean change, 0.0% near-still frames; the footage inside each card measured separately across its hold: 0.98 / 3.75 / 6.42 mean change."
      },
      "updates": "Included in Plate Pro v1 updates"
    },
    {
      "id": "margin",
      "version": "1.0.0",
      "title": "Margin",
      "summary": "A 21-second film for an invented type foundry, where every movement is a real variable-font axis. Optical size and weight interpolate, so the letterforms genuinely redraw — contrast opens, serifs sharpen, spacing changes — instead of being scaled. One glyph carries the whole film and becomes the wordmark. Your name, your palette, your copy.",
      "category": "motion",
      "scope": "video",
      "scopeLabel": "21-second film · 1920×1080 · 60 fps · scored",
      "tier": "pro",
      "availability": "available",
      "quality": "featured",
      "detail": false,
      "poster": "assets/motion/margin-poster.jpg",
      "preview": {
        "type": "video",
        "src": "assets/motion/margin-loop.mp4",
        "poster": "assets/motion/margin-poster.jpg",
        "sound": true
      },
      "deliverables": [
        "film.html — the complete film in one file: no framework, no build step, every value a pure function of time",
        "project.json — the only file you edit to rebrand: name, the glyph split, three palette colours, the waterfall line, the quote, the release facts and the closing lines",
        "render.mjs (full render and encode) and check.mjs (single frames to a contact sheet while you edit)",
        "score.mjs — an original synthesis engine with the scores for all four films in the series as worked examples",
        "Fraunces and Fragment Mono as WOFF2 with their OFL-1.1 licence texts",
        "PROMPTS.md: six ready-made prompts for the jobs people actually want — rebrand, recolour, write the copy, re-score, cut a client version, and list what the project will not do",
        "README.md with the tested character limits, EDITING.md with the build, LICENSES.md with the provenance"
      ],
      "adaptations": [
        "Foundry name, and which of its letters the film follows — project.json `split`",
        "The whole palette in three values: field, type and the one live accent colour",
        "The waterfall sentence, the three-line pull quote, the four release facts, the closing line and the attribution",
        "The beat table and axis journey, by editing film.html — they are commented in seconds",
        "The music, by editing this film's entry in score.mjs, or removed entirely"
      ],
      "notSupported": [
        "A static typeface: the film is about an optical-size axis, so swapping Fraunces for a face without one removes the subject",
        "A wordmark over 8 characters at 158 px, or quote lines over 22 characters at 104 px, without changing the sizes in film.html",
        "Other durations or aspect ratios without re-timing the beat table and re-laying the waterfall",
        "Hosted rendering; you render on your own computer"
      ],
      "requirements": [
        "Plate Pro, activated on the computer that renders",
        "Node.js 18+ with puppeteer-core and a Chromium, and FFmpeg. Set CHROME= and FFMPEG= if they are not on your PATH. Nothing is downloaded at build time and nothing leaves your computer."
      ],
      "package": {
        "kind": "pack",
        "slug": "margin",
        "version": "1.0.0",
        "sha256": "77831950dbd38949ebf89d837d06cad5448a19e653f8a9123acca477f4269cb7",
        "bytes": 120652,
        "url": "api/pack?slug=margin"
      },
      "contentFile": "project.json",
      "formats": [
        {
          "aspect": "16:9",
          "width": 1920,
          "height": 1080,
          "fps": 60,
          "seconds": 21
        }
      ],
      "attribution": [
        {
          "what": "Fraunces",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/undercasetype/Fraunces",
          "keep": "Keep fonts/OFL-Fraunces.txt"
        },
        {
          "what": "Fragment Mono",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/weiweihuanghuang/fragment-mono",
          "keep": "Keep fonts/OFL-FragmentMono.txt"
        },
        {
          "what": "The music",
          "source": "Synthesised by the project's own score.mjs",
          "licence": "Original — part of the pack",
          "keep": "Nothing to credit"
        }
      ],
      "verification": {
        "build": "1.0.0",
        "date": "2026-09-15",
        "what": "Archive extracted into an empty folder; bytes and sha256 matched against the pack registry; check.mjs run from the extracted copy with only the bundled fonts present, and the frames inspected."
      },
      "updates": "Included in Plate Pro v1 updates",
      "focal": {
        "card": "50% 50%",
        "detail": "50% 50%"
      }
    },
    {
      "id": "keel",
      "version": "1.0.0",
      "title": "KEEL",
      "summary": "A 21-second product film rendered in Blender. An authored bottle turns far enough to read its volume, its surface resolves from chalk into a finished shell, the cap lifts on its own pivot and seats with a contact response, and a real label band — geometry rebuilt every frame, not a texture fade — wraps onto the curve while the camera follows it. It ends by running the shell through its colourways. Your product name, your label, your colours.",
      "category": "motion",
      "scope": "video",
      "scopeLabel": "21-second film · 1920×1080 · 60 fps · scored",
      "tier": "pro",
      "availability": "available",
      "quality": "featured",
      "detail": false,
      "poster": "assets/motion/keel-poster.jpg",
      "preview": {
        "type": "video",
        "src": "assets/motion/keel-loop.mp4",
        "poster": "assets/motion/keel-poster.jpg",
        "sound": true
      },
      "deliverables": [
        "bottle.py — the complete Blender scene: the lathe profile, the cap on its own pivot, the per-frame label geometry, the lighting and the camera, all authored in the file",
        "label.html and type.html — the printed label artwork and the typography pass, each drawn to canvas and captured",
        "project.json — name, six lines of label print, the label palette, four lines of on-screen copy, the typography palette and the three material colours",
        "build.sh — one command: label, 1260 frames, type pass, composite, master, preview and poster",
        "score.mjs — an original synthesis engine with the scores for all four films in the series as worked examples",
        "The CC0 studio HDRI, Geist and Fragment Mono with their licence texts",
        "PROMPTS.md: six ready-made prompts for the jobs people actually want — rebrand, recolour, write the copy, re-score, cut a client version, and list what the project will not do",
        "README.md with the tested character limits, EDITING.md with the build, LICENSES.md, and REUSE-TEST.md — the record of rebuilding this project as a different brand"
      ],
      "adaptations": [
        "Product name and every line of label print — the name, the subtitle and the four side lines that wrap away from camera",
        "The whole label palette, and the typography palette",
        "Both headline lines, the spec line and the closing line",
        "The three material colours: the unfinished state, the resolved shell and the cap metal",
        "The colourways the shell runs through at the end, and when each one switches",
        "The bottle profile, the cap choreography and the camera keys, by editing bottle.py — every value is commented",
        "The music, by editing this film's entry in score.mjs, or removed entirely"
      ],
      "notSupported": [
        "A product name over 6 characters at the shipped label size: it already reaches the edge of the visible curve — the tested limits are in README.md",
        "Turning the bottle into a different object: the profile, the cap pivot, the wrap timing and the camera are the film, and a new object is new geometry and new choreography",
        "Other durations or aspect ratios without re-timing the scene",
        "Hosted rendering; about eleven minutes of render on a normal desktop, all on your own computer"
      ],
      "requirements": [
        "Plate Pro, activated on the computer that renders",
        "Blender 4.5 or later, for the 3D render. Set BLENDER= if it is not on your PATH.",
        "Node.js 18+ with puppeteer-core and a Chromium, and FFmpeg. Set CHROME= and FFMPEG= if they are not on your PATH. Nothing is downloaded at build time and nothing leaves your computer."
      ],
      "package": {
        "kind": "pack",
        "slug": "keel",
        "version": "1.0.0",
        "sha256": "e327a332e739c9837ade42379f1ad2ecdbf67d641a9ff8836b4569875400572e",
        "bytes": 1274544,
        "url": "api/pack?slug=keel"
      },
      "contentFile": "project.json",
      "formats": [
        {
          "aspect": "16:9",
          "width": 1920,
          "height": 1080,
          "fps": 60,
          "seconds": 21
        }
      ],
      "attribution": [
        {
          "what": "Geist",
          "source": "Vercel",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/vercel/geist-font",
          "keep": "Keep fonts/OFL-Geist.txt"
        },
        {
          "what": "Fragment Mono",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/weiweihuanghuang/fragment-mono",
          "keep": "Keep fonts/OFL-FragmentMono.txt"
        },
        {
          "what": "studio_small_09_1k.hdr",
          "source": "Poly Haven",
          "licence": "CC0 1.1",
          "url": "https://polyhaven.com/a/studio_small_09",
          "keep": "No attribution required"
        },
        {
          "what": "The music",
          "source": "Synthesised by the project's own score.mjs",
          "licence": "Original — part of the pack",
          "keep": "Nothing to credit"
        }
      ],
      "verification": {
        "build": "1.0.0",
        "date": "2026-09-15",
        "what": "Archive extracted into an empty folder; bytes and sha256 matched against the pack registry; the project was separately rebuilt as a different brand with a different body colour, cap metal and label (REUSE-TEST.md), which found the real ceiling on the product name."
      },
      "updates": "Included in Plate Pro v1 updates",
      "focal": {
        "card": "50% 50%",
        "detail": "50% 50%"
      }
    },
    {
      "id": "quarry",
      "version": "1.0.0",
      "title": "Quarry",
      "summary": "A 15.6-second design-sheet film for an invented footwear brand, where every stroke is drawn in JavaScript with real pen pressure, a two-pass chromatic fringe and a per-frame boil, so the line breathes the way a hand-drawn line does. Six callouts, a dimension, a spec block, an exploded view and three colourways, all on graph paper, in about thirty events.",
      "category": "motion",
      "scope": "video",
      "scopeLabel": "15.6-second film · 1920×1080 · 60 fps · scored",
      "tier": "pro",
      "availability": "available",
      "quality": "featured",
      "detail": false,
      "poster": "assets/motion/quarry-poster.jpg",
      "preview": {
        "type": "video",
        "src": "assets/motion/quarry-loop.mp4",
        "poster": "assets/motion/quarry-poster.jpg",
        "sound": true
      },
      "deliverables": [
        "ink.js — the pen renderer: pressure across the stroke, a deterministic per-frame boil, a chromatic two-pass fringe, clipped hatching and paper",
        "product.js — the object itself as bezier paths, with a draw order and a per-stroke weight",
        "film.html — the sheet: the beat table, the six callouts, the spec block, the explode groups and the colourways, each a named constant",
        "render.mjs (full render and encode) and check.mjs (single frames to a contact sheet while you edit)",
        "score.mjs — an original synthesis engine with the scores for all four films in the series as worked examples",
        "Geist and Fragment Mono as WOFF2 with their OFL-1.1 licence texts",
        "PROMPTS.md: six ready-made prompts for the jobs people actually want — rebrand, recolour, write the copy, re-score, cut a client version, and list what the project will not do",
        "README.md with the tested limits, EDITING.md with the build, LICENSES.md with the provenance"
      ],
      "adaptations": [
        "Brand name, the title block, and the closing lines",
        "All six callouts: anchor point, label position, label and sub-label",
        "The five-row spec block, and the dimension and its value",
        "The three colourways: fill colour and name",
        "The two ink colours of the chromatic fringe, and the paper",
        "The beat table, in seconds, and the explode groups and their offsets",
        "The object itself, by authoring new bezier paths in product.js — the pen renderer will draw whatever you give it",
        "The music, by editing this film's entry in score.mjs, or removed entirely"
      ],
      "notSupported": [
        "Drawing a different object as a setting: new artwork means new paths in product.js, which is real authoring work even though the renderer is reusable",
        "Callout labels over ~14 characters, or colourway names over ~8 on the chip — the tested limits are in README.md",
        "Photographic or 3D output: this renderer draws lines, deliberately",
        "Hosted rendering; you render on your own computer"
      ],
      "requirements": [
        "Plate Pro, activated on the computer that renders",
        "Node.js 18+ with puppeteer-core and a Chromium, and FFmpeg. Set CHROME= and FFMPEG= if they are not on your PATH. Nothing is downloaded at build time and nothing leaves your computer."
      ],
      "package": {
        "kind": "pack",
        "slug": "quarry",
        "version": "1.0.0",
        "sha256": "9105ca3b28c5cca6cdafb1bbd6713dc1e7c52903c6877a51bd5b7aab6eb38f20",
        "bytes": 86943,
        "url": "api/pack?slug=quarry"
      },
      "contentFile": "film.html (its content lives in the named constants at the top: NOTES, SPEC, WASHES, T and G)",
      "formats": [
        {
          "aspect": "16:9",
          "width": 1920,
          "height": 1080,
          "fps": 60,
          "seconds": 15.6
        }
      ],
      "attribution": [
        {
          "what": "Geist",
          "source": "Vercel",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/vercel/geist-font",
          "keep": "Keep fonts/OFL-Geist.txt"
        },
        {
          "what": "Fragment Mono",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/weiweihuanghuang/fragment-mono",
          "keep": "Keep fonts/OFL-FragmentMono.txt"
        },
        {
          "what": "The music",
          "source": "Synthesised by the project's own score.mjs",
          "licence": "Original — part of the pack",
          "keep": "Nothing to credit"
        }
      ],
      "verification": {
        "build": "1.0.0",
        "date": "2026-09-15",
        "what": "Archive extracted into an empty folder; bytes and sha256 matched against the pack registry; the film re-rendered from the extracted copy and the encoded master inspected."
      },
      "updates": "Included in Plate Pro v1 updates",
      "focal": {
        "card": "50% 50%",
        "detail": "50% 50%"
      }
    },
    {
      "id": "meniscus",
      "version": "1.0.2",
      "title": "Meniscus",
      "summary": "A fragrance house whose whole page sits under a live fluid. The typography is rendered inside the simulation rather than on top of it, so the liquid refracts the headlines as it runs over them. Five sections, five different states of the same surface: free under the pointer, weighted so it pools and finds a level, sheared into three strata, drifting while a choice is made, and finally setting flat. Choosing one of the three fragrances regrades the plate, the highlights and the dispersion together. Every word, the colourways and the section order are data-driven from content.js; the solver, the five regimes and the composite are fixed code.",
      "category": "web",
      "scope": "site",
      "scopeLabel": "Complete single-page website",
      "tier": "pro",
      "availability": "available",
      "quality": "featured",
      "detail": false,
      "poster": "assets/previews/meniscus.webp",
      "preview": {
        "type": "video",
        "src": "assets/previews/meniscus.mp4",
        "poster": "assets/previews/meniscus.webp",
        "sound": false
      },
      "demo": "examples/meniscus/",
      "deliverables": [
        "The complete source: index.html, meniscus.css, meniscus.js and content.js, with no build step and no dependencies",
        "content.js: every line of copy, the three fragrances with their colourways, the section order and the motion budget in one file",
        "EDITING.md: why the plate must stay grayscale, what each field does, the five fluid regimes, and how to build a different site on the same engine",
        "A WebGL2 fluid solver written for this project - advection, vorticity confinement, a Jacobi pressure solve and a refraction composite - with no third-party library",
        "Geist as WOFF2 with its OFL-1.1 licence file",
        "README.md with the run command, and LICENSES.md"
      ],
      "adaptations": [
        "All copy: headlines, eyebrows, ledes, specification rows, note groups and the ending - content.js",
        "The three fragrances: names, notes, descriptions, and the plate/specular/dispersion grade each one applies - content.js fragrances block",
        "Section order and which fluid regime each section owns, chosen from stir, pool, bands, select and settle - content.js sections array",
        "The contact address the ending's mail draft is addressed to - content.js house block",
        "The motion budget: grid resolutions, pressure iterations and refraction strength - content.js engine block",
        "A different subject entirely on the same engine, content.js only - see EDITING.md section 4"
      ],
      "notSupported": [
        "The solver, the composite and the five regimes (baked into meniscus.js); a sixth regime needs a new term in the FORCE shader",
        "A coloured plate - the dispersion is the only colour in the frame and a coloured plate turns it to mud; colourways are a temperature grade, not a hue",
        "Hiding the DOM headline with display:none, clip-path or an off-screen position - the engine measures that element to place the typography inside the liquid",
        "Section layouts beyond the five built (opening, specification, three groups, a chooser and an ending) - a new shape needs new HTML and CSS",
        "A real order, payment or stock backend - the only action builds a mailto draft",
        "Software rendering: without a GPU the context is lost and the visitor gets the still document instead"
      ],
      "requirements": [
        "An evergreen browser with WebGL2 and EXT_color_buffer_float on real GPU hardware; without them the page renders as a complete still document",
        "Any static file server, e.g. python -m http.server 8080; file:// works except that some browsers refuse the local @font-face",
        "Keyboard, touch, reduced-motion and no-JavaScript paths all supported; no network request is made at runtime"
      ],
      "package": {
        "kind": "pack",
        "slug": "meniscus",
        "version": "1.0.2",
        "url": "api/pack?slug=meniscus",
        "bytes": 56923,
        "sha256": "08992462d7efa4fced543e0b6deb77c3464a3f28f264e2c0248f38fe76b0e02e",
        "files": 9
      },
      "attribution": [
        {
          "what": "Geist",
          "source": "Vercel, Google Fonts",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/vercel/geist-font",
          "keep": "Keep fonts/OFL-Geist.txt"
        },
        {
          "what": "Stable Fluids solver method",
          "source": "Jos Stam, SIGGRAPH 1999",
          "licence": "Published algorithm, not licensed code",
          "url": "https://pages.cs.wisc.edu/~chaol/data/cs777/stam-stable_fluids.pdf",
          "keep": "Nothing required; the credit in LICENSES.md is kept as a courtesy"
        }
      ],
      "verification": {
        "build": "1.0.2",
        "date": "2026-09-29",
        "what": "Built on 1.0.1. In 1.0.2 the section labels render inside the liquid (they were painted in the transparent colour of their DOM twin) and the pool section's level label comes from content.js. Headless Chromium on D3D11 at 1600x900: the live surface draws all section labels, a changed level label reaches the page, zero console and page errors. Archive extracted into an empty folder and compared byte for byte with its source. The dial and spectrum still pass over copy while scrolling (fixed separately). Software rendering is not supported and falls back to the still document."
      },
      "updates": "Included in Plate Pro v1 updates; the archive is re-hashed whenever its bytes change",
      "adapted": {
        "title": "MORROW, a fictional tea studio",
        "brief": "A fresh Claude Code session (Opus 5.5) was given this project's library instructions and a brief for an invented loose-leaf tea studio: three blends, a specification, aroma, preparation and ritual, and a contact ending. It verified the archive, edited content.js and the page title, ran the site and checked desktop, phone, keyboard, reduced motion and the no-WebGL fallback. About six minutes, no human help during the run; a person placed the downloaded ZIP in its folder first.",
        "video": "projects/meniscus/morrow.mp4",
        "poster": "projects/meniscus/morrow-open.jpg",
        "stills": [
          "projects/meniscus/morrow-open.jpg",
          "projects/meniscus/morrow-chooser.jpg",
          "projects/meniscus/morrow-end.jpg"
        ],
        "notes": "MORROW is invented; nothing on it is a real business or claim. The run used 1.0.1; the one engine line it changed (the section labels) is the fix now in 1.0.2. The recording shows the pack as delivered, the adaptation with all three blends chosen, and the phone. The full record, including a comparison with a from-scratch build of the same brief, is kept with the experiment notes."
      },
      "focal": {
        "card": "50% 46%",
        "detail": "50% 46%"
      }
    },
    {
      "id": "perihelion",
      "version": "1.0.1",
      "title": "Perihelion",
      "summary": "A planetarium studio site that is one live-rendered flight: scroll moves a probe along an authored path through a ringed gas giant, a terminator crossing, a nebula volume and a lensed black-hole disc, drawn by one WebGL2 shader. Five chapter holds, a HUD computed from the position, a docking manifest, a mailto booking, a generated flight-log download and an engraved plaque.",
      "category": "web",
      "scope": "site",
      "scopeLabel": "Complete single-page website",
      "tier": "pro",
      "availability": "available",
      "quality": "featured",
      "detail": false,
      "poster": "assets/previews/perihelion.webp",
      "preview": {
        "type": "video",
        "src": "assets/previews/perihelion.mp4",
        "poster": "assets/previews/perihelion.webp",
        "sound": false
      },
      "demo": "experiments/preview-2026-09-12/singularity/",
      "deliverables": [
        "The complete source: index.html, style.css, main.js, space.js (the WebGL2 shader) and content.js, with no build step and no dependencies",
        "content.js: every word, colour token, font, chapter, manifest row, booking and plaque entry in one file",
        "EDITING.md: what each field does, what phones hide, and where phone-visible copy belongs",
        "Michroma and Manrope as WOFF2 with their OFL-1.1 licence files",
        "Five still plates rendered by the site's own shader, shown when WebGL2 is unavailable or motion is reduced",
        "README.md with the run command, and LICENSES.md"
      ],
      "adaptations": [
        "Studio name, tagline, mark (inline SVG), edition line and year — content.js identity",
        "Six colour tokens (bg, ink, accent, hot, magenta, teal) — content.js colors; all HUD, cards, arcs, plaque, reticle, favicon follow",
        "Two fonts (display, text): family, WOFF2 file, weight/range, fallback — content.js fonts",
        "Page title, description, lang, robots — content.js meta",
        "Every HUD label and unit; the accessible names of the regions — content.js hud",
        "The names of the four bodies (reticle labels, HUD target) — content.js bodies",
        "The five chapters: anchor id, nav label, HUD name, code, coords, title, lede, body, tags, plaque map label",
        "The ending copy; the manifest (six fixed columns, any number of rows, five status colours, optional price per row shown as its own column and always on phones)",
        "The booking action: email, subject, prefilled body, labels; the download: filename and labels",
        "The plaque: title, entries, diagram labels, scale text, end line; the flight-log strings"
      ],
      "notSupported": [
        "Adding, removing or reordering chapters (five holds on a baked flight path)",
        "Changing what is rendered — planet, rings, nebula, black hole, disc colours, stars, sun (GLSL in space.js)",
        "Changing the flight path, hold positions, exposure/velocity profiles (main.js KEYS/SC)",
        "A light theme (the glass and the render assume a dark ground)",
        "Layout, type sizes, breakpoints, HUD geometry (style.css)",
        "Video, photographs, textures or a CMS; server-rendered copy for SEO (copy mounts from content.js at load)"
      ],
      "requirements": [
        "Static HTTP hosting (no server code, no build); does not run from file://",
        "WebGL2 for the live flight (Chrome/Edge 56+, Firefox 51+, Safari 15+, iOS 15+); still plates without it",
        "A GPU that renders the scene at 0.66x canvas under 14 ms, else the site drops to 0.5x on its own",
        "Verified: Chromium 1440x900 and 390x844, RTX 3070 via ANGLE D3D11; Safari/Firefox paths written, not run"
      ],
      "package": {
        "kind": "pack",
        "slug": "perihelion",
        "version": "1.0.1",
        "url": "api/pack?slug=perihelion",
        "bytes": 1059145,
        "sha256": "a66a771b0590a7d037f8697fe31582c76a63c500bdb4ee0393be30d750c8ea73",
        "files": 17
      },
      "attribution": [
        {
          "what": "Michroma",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/google/fonts/tree/main/ofl/michroma",
          "keep": "Keep assets/fonts/OFL-Michroma.txt"
        },
        {
          "what": "Manrope",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/google/fonts/tree/main/ofl/manrope",
          "keep": "Keep assets/fonts/OFL-Manrope.txt"
        },
        {
          "what": "Still plates",
          "source": "Rendered by the site's own shader",
          "licence": "Part of the pack; no third-party art",
          "keep": "Nothing to credit"
        }
      ],
      "verification": {
        "build": "2026.09.27",
        "date": "2026-09-27",
        "what": "Masthead contrast fix over 1.0.0 (2026.09.13b). On the way into chapter 01 the sun sat directly behind the studio name and tagline; they now get a soft local shade and halo only while the sun is there, and the still-plates layout gets the horizon's glass masthead. Headed Chrome 153 on an RTX 3070 (ANGLE D3D11) with real mouse-wheel input, contrast measured from rendered pixels, each glyph pixel against the pixel behind it (10th percentile): at the chapter 01 hold the name went from 1.05:1 to 11.96:1 at 1920x1080 and from 1.13:1 to 12.74:1 at 1440x900, the tagline from 1.01:1 to 8.55:1 and 8.47:1; at 390x844 the sun never sits behind the name (14.8:1, unchanged). Whole-page wheel sweeps, name under 3:1: 16 of 90 steps before, 0 after at 1920x1080; 13 of 78 before, 1 after at 1440x900 (a chapter card passing under the masthead, 2.82:1 and the same in 1.0.0); 0 of 97 at 390x844 both; reduced motion 11 of 45 and 16 of 55 before, 0 after at 1920x1080 and 390x844. Rendered at fixed time, every chapter stop other than 01 matches 1.0.0 within run-to-run noise, and all six at 390x844 are pixel-identical; at 01 only the masthead corner changes. Zero page errors, zero failed requests and zero console messages in every run. Archive sha256 checked, extracted, and the extracted copy measured at the 1920x1080 chapter stops with the same result. Not rerun from 1.0.0: the keyboard path, no-WebGL still plates, context loss and restore, adaptive resolution and the missing-plate case; Safari and Firefox not run."
      },
      "updates": "Included in Plate Pro v1 updates; the archive is re-hashed whenever its bytes change",
      "focal": {
        "card": "50% 45%",
        "detail": "50% 50%"
      }
    },
    {
      "id": "meridian",
      "version": "1.0.2",
      "title": "Meridian",
      "summary": "An expedition outfitter's site told as a 48-second film that scrolling advances: four Poly Haven worlds sampled live by a raw-WebGL camera, whip pans and blink cuts between chapters, two shots per crossing, film slates with the facts, a route drawn across every world and completed as a map. A leads slate, a kit slate, a departure board with per-departure ask links and an itinerary download, credits and an end card; reduced motion and no-WebGL get the same film as still plates, and phones recompose.",
      "category": "web",
      "scope": "site",
      "scopeLabel": "Complete single-page website",
      "tier": "pro",
      "availability": "available",
      "quality": "featured",
      "detail": false,
      "poster": "assets/previews/meridian.webp",
      "preview": {
        "type": "video",
        "src": "assets/previews/meridian.mp4",
        "poster": "assets/previews/meridian.webp",
        "sound": false
      },
      "demo": "experiments/preview-2026-09-12/expedition/",
      "deliverables": [
        "The complete source: index.html, style.css, main.js, film.js, render.js (the raw-WebGL sampler) and content.js, with no build step and no dependencies",
        "content.js: identity, colours, every chapter, camera path, slate, departure, itinerary line and credit in one file",
        "EDITING.md: what each field does and the four head lines to regenerate or edit by hand",
        "Four Poly Haven worlds baked as 1k/2k/4k equirect plates, five reduced-motion stills and five phone crops",
        "tools/bake.py to bake a new world from any Poly Haven HDRI, and tools/apply-content.mjs to write the identity into the head",
        "Bebas Neue and Barlow Semi Condensed as WOFF2 with their OFL-1.1 licence files",
        "README.md with the run command, and LICENSES.md"
      ],
      "adaptations": [
        "Name, legal name, season, colours (ink, bone, flare), favicon glyph, opening copy, end-card text — content.js identity",
        "Any number of crossings in any order; one world removed or reordered; a crossing with one or two shots — content.js chapters",
        "Camera paths per shot (yaw/pitch/fov keys, ease, span) and the lens printed in the HUD",
        "Foreground per chapter: ridge silhouette (with baked profile), rope, guy lines, or none",
        "Slate copy, spec cells, kit lines, facts (km, days, seats, price), itinerary lines",
        "Departures (date, seats, status, meeting point, optional price), currency and locale, deposit note, contact address and mailto template",
        "Leads slate and kit slate content; credits heading, source line and extra lines (terms, privacy, imprint)",
        "Swapping or adding a world: bake a Poly Haven HDRI with tools/bake.py (ladder, still, silhouette), add a worlds entry, point a chapter at it",
        "Scroll length (film.lengthVh); overlay timing per chapter via an optional overlays override",
        "Itinerary trailer line (itinerary.trailer, empty for none); per-world flat fallback tone (worlds.<w>.tone)",
        "Static <head> (title, description, theme colour, favicon) regenerated from content.js with node tools/apply-content.mjs, or by editing the four documented lines"
      ],
      "notSupported": [
        "A real booking flow, seat inventory or inbox behind ASK FOR A SEAT (it is a mailto)",
        "Sound (silent by design)",
        "Changing the typefaces without editing style.css (identity lock)",
        "More than one opening or more than one last-frame chapter",
        "Non-equirect plates (the sampler expects 2:1 equirect webp)",
        "Verified on Safari or a phone GPU in this release (supported by construction; run on real hardware before launch)"
      ],
      "requirements": [
        "Serve: Any static HTTP server (ES modules + fetch; file:// will not work)",
        "Browser: WebGL 2 or WebGL 1; without WebGL or with prefers-reduced-motion the still-plate page is served",
        "Tools: Python 3.9+, numpy, opencv-python, Pillow — only to bake new plates",
        "Network: None at runtime; zero external requests"
      ],
      "package": {
        "kind": "pack",
        "slug": "meridian",
        "version": "1.0.2",
        "url": "api/pack?slug=meridian",
        "bytes": 6763228,
        "sha256": "1405133f07edda038f2ad084d7861d92a1910d7f827cfdc315ba5c2416a240cf"
      },
      "attribution": [
        {
          "what": "Rogland Sunset, Kiara 1 Dawn and Rogland Clear Night HDRIs",
          "source": "Greg Zaal, Poly Haven",
          "licence": "CC0 1.0",
          "url": "https://polyhaven.com/hdris",
          "keep": "Nothing required; the credit line in LICENSES.md is kept as a courtesy"
        },
        {
          "what": "Lago d'Isola HDRI",
          "source": "Andreas Mischok, Poly Haven",
          "licence": "CC0 1.0",
          "url": "https://polyhaven.com/a/lago_disola",
          "keep": "Nothing required; the credit line in LICENSES.md is kept as a courtesy"
        },
        {
          "what": "Bebas Neue",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "keep": "Keep its OFL text in assets/fonts"
        },
        {
          "what": "Barlow Semi Condensed",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "keep": "Keep its OFL text in assets/fonts"
        }
      ],
      "verification": {
        "build": "2026.09.14b",
        "date": "2026-09-14",
        "what": "Long-name identity fix. Rebuilt from the same source the public preview serves; only main.js and style.css differ from 2026.09.13b. The opening, HUD and end card were measured with the customer's own brand in place at 1280, 1440, 390 and 320 CSS px, in film and reduced-motion states: MERIDIAN unchanged (title box equals content at every width), NORTHLINE EXPEDITIONS no longer cut off (was 1997px of text in a 1280px box, and 404px in 390px), and a 31-character unbroken brand fits on one line everywhere. Text bounds were compared, not document overflow: the opening hides its own overflow, so a cropped name leaves scrollWidth equal to clientWidth. Narrow departures table corrected in 1.0.2: caption retains table-caption layout and crossing names wrap; at 320 and 390 CSS px all six actions fit and reduced-motion document overflow is zero."
      },
      "updates": "Included in Plate Pro v1 updates; the archive is re-hashed whenever its bytes change",
      "focal": {
        "card": "50% 50%",
        "detail": "50% 45%"
      }
    },
    {
      "id": "murmur",
      "version": "1.0.0",
      "title": "Murmur",
      "summary": "A voice-and-hearing research lab whose site is a murmuration: 409,600 WebGL2 points form the wordmark, a synthesised voice, its spectrogram, an ear and the lab's mark across four scroll chapters. A secondary publications page, an ending, and a stills fallback where WebGL2 is unavailable.",
      "category": "web",
      "scope": "site",
      "scopeLabel": "Complete single-page website",
      "tier": "pro",
      "availability": "available",
      "quality": "featured",
      "detail": false,
      "poster": "assets/previews/murmur.webp",
      "preview": {
        "type": "video",
        "src": "assets/previews/murmur.mp4",
        "poster": "assets/previews/murmur.webp",
        "sound": false
      },
      "demo": "experiments/preview-2026-09-12/murmur/",
      "deliverables": [
        "The complete source: index.html, publications.html, style.css, murmur.js (the WebGL2 flock) and content.js, with no build step and no dependencies",
        "content.js: name, wordmark, chapter words, colours, fonts, voice parameters, ear paths, every line of copy, the publish list, contact and download in one file",
        "EDITING.md: what each field does, and how to regenerate the poster and stills from the page itself (index.html?stills) after an identity change",
        "Eight still plates rendered from the page, shown where WebGL2 is unavailable",
        "Manrope and Fragment Mono as WOFF2 with their OFL-1.1 licence files",
        "README.md with the run command, and LICENSES.md"
      ],
      "adaptations": [
        "name, title, description",
        "the wordmark the flock forms (desktop and phone) and its weight",
        "the two chapter words",
        "three colours (ground, points/text, accent)",
        "fonts (family names + @font-face + files)",
        "the synthesised voice (f0, vibrato, three formants)",
        "the ear SVG paths and cochlea spiral",
        "header mark SVG and the particle mark’s gap and dot",
        "all copy, rows, labels, readout labels, colophon legend",
        "publish list (any length) and the publications page",
        "contact address, mailto subject and body",
        "download filename and text",
        "regenerating the poster and stills from the page itself (index.html?stills)"
      ],
      "notSupported": [
        "changing the chapter sequence or the eight formed targets",
        "a particle mark that is not a ring + dot",
        "more than three colours or two fonts without editing style.css",
        "spectrogram range/size, wave window, Greenwood constants",
        "point-count tiers, flow field, camera keys, dock positions",
        "Automatic stills: after an identity change the stills must be regenerated with the built-in index.html?stills tool, or the fallback shows the old identity"
      ],
      "requirements": [
        "Serve: any static HTTP host; python -m http.server 8080 from inside the folder",
        "Browser: JavaScript; WebGL2 with EXT_color_buffer_float (Chrome 56+, Edge 79+, Firefox 51+, Safari 15+); otherwise the stills fallback; the live flock needs WebGL2",
        "GPU: any; frame time is probed and the flock steps down 409 600 → 204 304 → 102 400 points (phones 123 904 → 65 536)",
        "Build: none; zero external requests at runtime"
      ],
      "package": {
        "kind": "pack",
        "slug": "murmur",
        "version": "1.0.0",
        "url": "api/pack?slug=murmur",
        "bytes": 612012,
        "sha256": "9f32fbcd63f26f26677e94daab495ddc45a1312d54ae633fab3f8fcc012145a4",
        "files": 20
      },
      "attribution": [
        {
          "what": "Manrope",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "keep": "Keep fonts/OFL-Manrope.txt"
        },
        {
          "what": "Fragment Mono",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "keep": "Keep fonts/OFL-FragmentMono.txt"
        },
        {
          "what": "Stills, ear, marks and voice",
          "source": "Rendered and synthesised by the site itself",
          "licence": "Part of the pack; no third-party art, photographs, recordings or libraries",
          "keep": "Nothing to credit"
        }
      ],
      "verification": {
        "build": "2026.09.13b",
        "date": "2026-09-13",
        "what": "Archive hashed against deploy/cloudflare/packs.json; first load is 7 same-origin requests and 188 kB with zero external requests; the four chapters, the publications page and the ending captured at 1440x900 in headless Chromium; stills fallback exercised without WebGL2. Evidence: the pack's proof/capture-report.json."
      },
      "updates": "Included in Plate Pro v1 updates; the archive is re-hashed whenever its bytes change",
      "focal": {
        "card": "50% 50%",
        "detail": "50% 50%"
      }
    },
    {
      "id": "observatory",
      "version": "1.0.0",
      "title": "The Observatory",
      "summary": "An atmospheric-data studio's website that is one authored night: scrolling advances an hour from 18:36 to 06:00, driving a live WebGL2 shader sky, three instrument panels and a case study, all read from one keyframed model. A tonight panel with a real generated JSON download, a mailto booking and a calibration-plate colophon close the page.",
      "category": "web",
      "scope": "site",
      "scopeLabel": "Complete single-page website",
      "tier": "pro",
      "availability": "available",
      "quality": "featured",
      "detail": false,
      "poster": "assets/previews/observatory.webp",
      "preview": {
        "type": "video",
        "src": "assets/previews/observatory.mp4",
        "poster": "assets/previews/observatory.webp",
        "sound": false
      },
      "demo": "experiments/preview-2026-09-12/observatory/",
      "deliverables": [
        "The complete source: index.html, style.css, main.js, field.js (the WebGL2 shader) and content.js, with no build step and no dependencies",
        "content.js: identity, colour tokens, every line of copy, the three instrument panels, the case log and the tonight panel in one file",
        "EDITING.md: what each field does and what the fallback plates show",
        "Four still plates rendered from the site's own shader, shown when WebGL2 is unavailable or motion is reduced",
        "Space Grotesk and JetBrains Mono as WOFF2 with their OFL-1.1 licence files",
        "README.md with the run command, and LICENSES.md"
      ],
      "adaptations": [
        "Page title, meta description, language and search-indexing — content.js meta",
        "Studio name, sub-line, station line, edition stamp, favicon mark — content.js identity",
        "Four colour tokens (ink, phosphor, signal, white), which also recolour the WebGL field itself, not only the DOM — content.js colors",
        "Two font families, weights and fallbacks — content.js fonts",
        "Every line of copy: opening kicker/title/lede/actions, the four strip labels and units, the 'what we measure' heading and delivered-as list",
        "The three instrument panels: title, tag, live sub-line wording, six-row spec table, status row, drives note (exactly three panels)",
        "The case: heading, lede, night label, recipients, the eight-entry event log's time/text (not its hour position), totals, timeline track labels",
        "The tonight panel's copy and field labels, the download button label/unit/filename prefix, the booking button label/email/subject/body",
        "The calibration-plate colophon's every label and note"
      ],
      "notSupported": [
        "The night model: the hour keyframes and the scroll-to-hour map with its two pinned holds — mechanism, not content",
        "The field itself: the WebGL2 shader's noise, aurora, isobars, horizon and dawn grade (only its two colour uniforms read content.js)",
        "The chapter count (fixed at four) and the case log's entry count (fixed at eight) and each entry's hour position",
        "Layout, type scale, the bezel/tick/switch chrome, breakpoints, the pinned-scroll mechanics",
        "The still-plate images themselves (re-capture is a packaging step, not a content edit)",
        "A real backend: the download is a client-generated JSON of the model, not live station telemetry; ‘Book a station’ opens a mail client, not a form"
      ],
      "requirements": [
        "Static HTTP hosting (module script and fonts do not load from file://); does not run from file://",
        "WebGL2 for the live field (Chrome/Edge 56+, Firefox 51+, Safari 15+, iOS 15+); falls back to one of four still plates without it",
        "Verified in headless Chromium on Windows (RTX 3070, ANGLE D3D11) at 1440x900 and 390x844; Safari/Firefox paths written, not run there",
        "Zero external requests; all fonts and images are self-hosted in the package"
      ],
      "package": {
        "kind": "pack",
        "slug": "observatory",
        "version": "1.0.0",
        "url": "api/pack?slug=observatory",
        "bytes": 830159,
        "sha256": "e8985e54e946847533a6623d07747581c8810e98e00cd5ce87100fa4ffd4f872",
        "files": 17
      },
      "attribution": [
        {
          "what": "Space Grotesk",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/google/fonts/tree/main/ofl/spacegrotesk",
          "keep": "Keep assets/fonts/OFL-SpaceGrotesk.txt"
        },
        {
          "what": "JetBrains Mono",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/google/fonts/tree/main/ofl/jetbrainsmono",
          "keep": "Keep assets/fonts/OFL-JetBrainsMono.txt"
        },
        {
          "what": "The field and still plates",
          "source": "Rendered by the site's own WebGL2 shader",
          "licence": "Part of the pack; no third-party art",
          "keep": "Nothing to credit"
        }
      ],
      "verification": {
        "build": "2026.09.13b",
        "date": "2026-09-13",
        "what": "Archive hashed against deploy/cloudflare/packs.json; headless Chromium at 1440x900 and 390x844 with zero console errors, zero page errors, zero failed requests and zero external requests; the full authored night (18:36 to 06:00) traversed by scroll with the WebGL2 field, the three instruments, the case timeline and the tonight panel exercised; the download and mailto actions checked; no-WebGL, reduced-motion and phone recomposition also captured."
      },
      "updates": "Included in Plate Pro v1 updates; the archive is re-hashed whenever its bytes change",
      "focal": {
        "card": "40% 42%",
        "detail": "46% 40%"
      }
    },
    {
      "id": "gazette",
      "version": "1.0.0",
      "title": "The Gazette",
      "summary": "A fictional weekly culture paper's website, played as a single issue: a sticky cover slides beneath a pushing contents spread, a pinned feature turns like a real four-page fold, and the back cover is the issue's own ending. Cover lines, headlines, listings, prices and the colophon are data-driven from content.js; the page-turn mechanics and section grid are fixed code, and the subscription form only produces a mailto draft or a downloadable text slip.",
      "category": "web",
      "scope": "site",
      "scopeLabel": "Complete single-page website",
      "tier": "pro",
      "availability": "available",
      "quality": "featured",
      "detail": false,
      "poster": "assets/previews/gazette.webp",
      "preview": {
        "type": "video",
        "src": "assets/previews/gazette.mp4",
        "poster": "assets/previews/gazette.webp",
        "sound": false
      },
      "demo": "experiments/preview-2026-09-12/gazette/",
      "deliverables": [
        "The complete source: index.html, gazette.css, gazette.js and content.js, with no build step and no dependencies",
        "content.js: every headline, standfirst, byline, body paragraph, contents entry, listing, colophon line, crossword clue, price and identity token in one file",
        "EDITING.md: what each field does and what the page-turn mechanics assume",
        "Four Poly Haven CC0 material scans baked into the page's plates and banners",
        "Fraunces and Libre Franklin as WOFF2 (roman and italic) with their OFL-1.1 licence files",
        "README.md with the run command, and LICENSES.md"
      ],
      "adaptations": [
        "All copy: headlines, standfirsts, bylines, body paragraphs, contents list, listings, colophon, crossword clues, subscription prices/terms, contact details — content.js",
        "Identity: masthead name/prefix, issue number and date, prices, page count, ISSN — content.js identity block",
        "Colour tokens (paper/ink/accent) and the type-credit names printed in the colophon — content.js identity.colors / identity.fonts",
        "The subscription-slip filename and mailto address — content.js downloads block",
        "Adding a differently-branded issue that reuses the same mechanism, content.js only — see the release's worked adaptation example"
      ],
      "notSupported": [
        "The page-turn mechanics, cover-push formula, copy-fit loop and pointer instruments (baked into gazette.js/gazette.css)",
        "The section grid and page anchors (#letters, #tram, #portfolio, etc.) — new chapters need new HTML/CSS, not just content.js",
        "Swapping the two type families for different font files (only their credited names in the colophon are data-driven)",
        "A real subscription or payment backend — the form only builds a mailto draft or a local text download",
        "Any server-side rendering, build step or package manager — this is a static, dependency-free site",
        "Portfolio and the Books/Film/Music reviews exist as listed contents entries with page numbers; only the cover, contents, one pinned feature, The Margin column, The Week listings and the back cover are built as pages"
      ],
      "requirements": [
        "Any evergreen browser with JavaScript enabled; no network access needed or used at runtime",
        "Any static file server, e.g. python -m http.server 8080 (or any free port); opening index.html directly via file:// works in most browsers but some restrict local @font-face/background-image loads",
        "Keyboard: native page scroll plus two focusable turn buttons for the pinned feature; reduced motion and phone layouts fully supported"
      ],
      "package": {
        "kind": "pack",
        "slug": "gazette",
        "version": "1.0.0",
        "url": "api/pack?slug=gazette",
        "bytes": 890858,
        "sha256": "1b491e444cbed3b8ef238ebba98ec393548344623eaa4a067b1d941f37c7a8ba",
        "files": 17
      },
      "attribution": [
        {
          "what": "Fraunces",
          "source": "Undercase Type, Google Fonts",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/google/fonts/tree/main/ofl/fraunces",
          "keep": "Keep fonts/OFL-Fraunces.txt"
        },
        {
          "what": "Libre Franklin",
          "source": "Impallari Type, Google Fonts",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/google/fonts/tree/main/ofl/librefranklin",
          "keep": "Keep fonts/OFL-LibreFranklin.txt"
        },
        {
          "what": "Rust Coarse 01 texture",
          "source": "Dimitrios Savva & Rico Cilliers, Poly Haven",
          "licence": "CC0 1.0",
          "url": "https://polyhaven.com/a/rust_coarse_01",
          "keep": "Nothing required; the credit line in LICENSES.md is kept as a courtesy"
        },
        {
          "what": "Book Pattern texture",
          "source": "Rob Tuytel, Poly Haven",
          "licence": "CC0 1.0",
          "url": "https://polyhaven.com/a/book_pattern",
          "keep": "Nothing required; the credit line in LICENSES.md is kept as a courtesy"
        },
        {
          "what": "Rough Linen texture",
          "source": "colormass & Rico Cilliers, Poly Haven",
          "licence": "CC0 1.0",
          "url": "https://polyhaven.com/a/rough_linen",
          "keep": "Nothing required; the credit line in LICENSES.md is kept as a courtesy"
        },
        {
          "what": "Marble 01 texture",
          "source": "Rob Tuytel, Poly Haven",
          "licence": "CC0 1.0",
          "url": "https://polyhaven.com/a/marble_01",
          "keep": "Nothing required; the credit line in LICENSES.md is kept as a courtesy"
        }
      ],
      "verification": {
        "build": "2026.09.13b",
        "date": "2026-09-13",
        "what": "Archive hashed against deploy/cloudflare/packs.json; headless Chromium at 1440x900, 1920x1080 and 390x844 across five page loads with zero console errors, zero page errors, zero failed requests and zero external requests; the cover push, the pinned four-page turn, the loupe and READ pointer instruments, the generated subscription-slip download and the reduced-motion static document all exercised."
      },
      "updates": "Included in Plate Pro v1 updates; the archive is re-hashed whenever its bytes change",
      "focal": {
        "card": "50% 22%",
        "detail": "50% 28%"
      }
    },
    {
      "id": "riot-grain",
      "version": "1.0.0",
      "title": "Riot Grain",
      "summary": "A record label's release site drawn entirely by code: canvas letter bodies fall and settle under a hand-written Verlet physics solver, a pointer shove scatters and resettles them, and the tracklist, marquee, countdown and pre-order locker are all assembled from the same content file. No photographs, video, generated imagery or third-party art anywhere on the page.",
      "category": "web",
      "scope": "site",
      "scopeLabel": "Complete single-page website",
      "tier": "pro",
      "availability": "available",
      "quality": "featured",
      "detail": false,
      "poster": "assets/previews/riot-grain.webp",
      "preview": {
        "type": "video",
        "src": "assets/previews/riot-grain.mp4",
        "poster": "assets/previews/riot-grain.webp",
        "sound": false
      },
      "demo": "experiments/preview-2026-09-12/riot/",
      "deliverables": [
        "The complete source: index.html, style.css, main.js, render.js, verlet.js and content.js, with no build step, no dependencies and no libraries (the Verlet solver and easings are hand-written)",
        "content.js: label identity, three colour tokens, catalogue number, artist, release title, tracklist, night info, back catalogue, prices and every line of copy in one file",
        "EDITING.md: what each field does, the tracklist row bounds and the title-length limit the letter physics assumes",
        "Anton and DM Mono as WOFF2, re-subset to Latin + Latin Extended-A and each font's own currency glyphs, with their OFL-1.1 licence files",
        "README.md with the run command, and LICENSES.md, which lists the exact glyph coverage per font"
      ],
      "adaptations": [
        "Label name, city, contact address, domain — content.js label",
        "Three colour tokens: ground, type, accent — content.js palette",
        "Catalogue number, artist, release title of 6–16 characters; the letter physics rebuilds for any title",
        "Tracklist with durations, 4–8 rows; side and total times, marquee, foot tape, J-card and reservation text are derived",
        "Release date for the live countdown and its written forms",
        "Night info: launch night rows, line-up, the record, the pressing, house rules, label paragraph",
        "Back catalogue spines (in-stock items become enquiry mailto links)",
        "Prices, pre-order mail subject and body, reservation and J-card text, download file names",
        "Credits sheet items and sticker shapes (from the five shapes in the sheet), end tape, nav labels",
        "Page title and meta description"
      ],
      "notSupported": [
        "Photographs, video or any imagery; the identity is type, tape and stickers",
        "More than one line of title letters, or titles over 16 characters (a 16-character title lands small on a 390px phone)",
        "A fourth colour, a light/dark toggle, or gradients",
        "Different fonts without replacing the woff2 files and the @font-face rules",
        "Payment, forms, analytics or any server side: pre-order is a mailto, reservation is a generated .txt",
        "Changing chapter order or count, or the number of tape strips, flying stickers and credit stickers, without editing render.js",
        "A shekel sign (₪) rendered in Anton or DM Mono — neither shipped font draws it, so a price or line using ₪ falls back to the reader's system font; DM Mono is also missing ₩ and ₹ and 21 Latin Extended-A letters (Esperanto/Sami/Greenlandic) its own source font never drew"
      ],
      "requirements": [
        "Any static file server (the page uses ES modules; file:// will not run it)",
        "Chrome/Edge 111+, Firefox 113+, Safari 16.4+",
        "JavaScript enabled; a browser without canvas 2D or with reduced motion gets the still poster version"
      ],
      "package": {
        "kind": "pack",
        "slug": "riot-grain",
        "version": "1.0.0",
        "url": "api/pack?slug=riot-grain",
        "bytes": 93683,
        "sha256": "ccfce421cd5ca036a023e489df1b04fd5c254ff1414aa9e29c99807930f067fe",
        "files": 14
      },
      "attribution": [
        {
          "what": "Anton",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/google/fonts/tree/main/ofl/anton",
          "keep": "Keep fonts/OFL-Anton.txt"
        },
        {
          "what": "DM Mono",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/google/fonts/tree/main/ofl/dmmono",
          "keep": "Keep fonts/OFL-DMMono.txt"
        },
        {
          "what": "Letters, stickers and tracklist",
          "source": "Drawn and physically simulated by the site's own code",
          "licence": "Part of the pack; no third-party art, photographs or libraries",
          "keep": "Nothing to credit"
        }
      ],
      "verification": {
        "build": "2026.09.13b",
        "date": "2026-09-13",
        "what": "Archive hashed against deploy/cloudflare/packs.json (the 2026.09.13b fix pass); headless Chromium with zero console errors, zero page errors, zero failed requests and zero external requests on desktop, phone, reduced motion and two demo-content pages; the re-subset glyph coverage, the phone title-fall gap and tap recovery, the canvas tracklist baseline and the hero-sleep threshold each verified directly against the shipped extraction (clean-check pass: true)."
      },
      "updates": "Included in Plate Pro v1 updates; the archive is re-hashed whenever its bytes change",
      "focal": {
        "card": "50% 58%",
        "detail": "48% 50%"
      }
    },
    {
      "id": "patchbay",
      "version": "1.0.0",
      "title": "Patchbay",
      "summary": "A desktop synthesiser's front panel, rebuilt as a website: two oscillators, a filter, an envelope and a delay run on the Web Audio API behind a real 17-key playable keyboard, with an owner's manual and an engraved serial plate. Ordering one opens a mailto; there is no store behind the price shown.",
      "category": "web",
      "scope": "site",
      "scopeLabel": "Complete single-page website",
      "tier": "pro",
      "availability": "available",
      "quality": "featured",
      "detail": false,
      "poster": "assets/previews/patchbay.webp",
      "preview": {
        "type": "video",
        "src": "assets/previews/patchbay.mp4",
        "poster": "assets/previews/patchbay.webp",
        "sound": false
      },
      "demo": "experiments/preview-2026-09-12/patchbay/",
      "deliverables": [
        "The complete source: index.html, patchbay.css, patchbay.js and content.js, with no build step and no dependencies",
        "content.js: identity, 16 colour tokens, front-panel copy, the 8 module header strips, per-module body copy, every socket tooltip, the owner's manual, order/pricing text and the 18 synth defaults the panel opens with",
        "EDITING.md: what each field does",
        "Barlow, Archivo Black and Share Tech Mono as WOFF2 with their OFL-1.1 licence files",
        "README.md with the run command, and LICENSES.md"
      ],
      "adaptations": [
        "Identity: maker, brandShort, model, revision, assembledIn, city, power — content.js identity",
        "16 colour tokens (panel, LCD, the one LED/cable accent, CV cable) — content.js colors",
        "Front-panel copy: eyebrow, logo, standfirst, keyboard hint, out-note, small labels",
        "The 8 module header strips: number, name, sub-label, HP width",
        "Per-module body copy across the 6 modules (HTML paragraphs)",
        "Every socket tooltip",
        "The owner's manual, Section 7: title, 4 sections of label/value rows, dimensioned-drawing labels, footer, fine print",
        "Price, order note, contact email, and the mailto subject/body templates",
        "The WRITE button label and downloaded file extension",
        "The engraved serial plate",
        "The 18 synth defaults (waveform, filter, envelope, delay, LFO, master, monitor) the panel opens with",
        "Page head: title, meta description, theme-color, favicon, noscript text"
      ],
      "notSupported": [
        "The hardware itself: panel, knobs, cables and the serial plate are CSS and SVG shapes, not product photography",
        "The filter is two cascaded biquad stages, not a modelled analog ladder filter",
        "Ordering one is a mailto: link with a prefilled subject and body; there is no server-side order flow, payment or stock/lead-time check behind the price shown",
        "A light or cream panel palette (the CSS assumes a dark ground) without a CSS edit",
        "Swapping a font family without also replacing its file, @font-face src and preload link",
        "The audio engine, the scroll-to-routing mechanism, the drag-plug/CV-patch logic and all knob/socket/panel geometry (patchbay.js / patchbay.css)",
        "The 17-key layout and its computer-key mapping",
        "A 5th manual section or a different manual column layout",
        "Patch loading, a patch library, Web MIDI input, velocity, or a self-oscillating AudioWorklet filter"
      ],
      "requirements": [
        "Any current Chrome/Edge/Firefox/Safari with the Web Audio API (a webkitAudioContext fallback is included); without it the panel still renders and the display says so",
        "Static HTTP host; run locally with python -m http.server 8080 (or any free port) from inside the folder",
        "No external requests at runtime; all fonts and assets are self-hosted in the folder"
      ],
      "package": {
        "kind": "pack",
        "slug": "patchbay",
        "version": "1.0.0",
        "url": "api/pack?slug=patchbay",
        "bytes": 208218,
        "sha256": "2362b9ca97a38916e40838da9d531554f22120d3726e3090ca9c641008325f9b",
        "files": 16
      },
      "attribution": [
        {
          "what": "Barlow",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/google/fonts/tree/main/ofl/barlow",
          "keep": "Keep fonts/OFL-Barlow.txt"
        },
        {
          "what": "Archivo Black",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/google/fonts/tree/main/ofl/archivoblack",
          "keep": "Keep fonts/OFL-ArchivoBlack.txt"
        },
        {
          "what": "Share Tech Mono",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/google/fonts/tree/main/ofl/sharetechmono",
          "keep": "Keep fonts/OFL-ShareTechMono.txt"
        },
        {
          "what": "Panel, knobs, cables and the serial plate",
          "source": "Drawn with CSS and SVG by the site's own code",
          "licence": "Part of the pack; no third-party art or product photography",
          "keep": "Nothing to credit"
        }
      ],
      "verification": {
        "build": "1.0.0",
        "date": "2026-09-12",
        "what": "Archive bytes and sha256 matched against deploy/cloudflare/packs.json and the source archive in packs/; release/RELEASE.json's supported/unsupported fields checked against content.js field by field."
      },
      "updates": "Included in Plate Pro v1 updates; the archive is re-hashed whenever its bytes change",
      "focal": {
        "card": "50% 32%",
        "detail": "50% 45%"
      }
    },
    {
      "id": "atelier-rook",
      "version": "1.0.1",
      "title": "Atelier Rook",
      "summary": "A small architecture studio's site drawn as its own seven-sheet drawing set: a fixed board of three layers (site plan, section, structure/light study over it, floor plan) redraws itself as you scroll, ending on the practice and a contact sheet with a mailto and a downloadable issue register.",
      "category": "web",
      "scope": "site",
      "scopeLabel": "Complete single-page website",
      "tier": "free",
      "availability": "available",
      "quality": "featured",
      "detail": false,
      "poster": "assets/previews/atelier-rook.webp",
      "preview": {
        "type": "video",
        "src": "assets/previews/atelier-rook.mp4",
        "poster": "assets/previews/atelier-rook.webp",
        "sound": false
      },
      "demo": "experiments/preview-2026-09-12/atelier/",
      "page": "experiments/preview-2026-09-12/atelier/",
      "deliverables": [
        "The complete source: index.html, style.css, main.js and content.js, plus tools/build.mjs, which bakes content.js into the drawings",
        "content.js: studio identity, five colour tokens, every sheet's headings/paragraphs/notes and tables, and the two Contact-sheet actions",
        "EDITING.md: what each field does, how to re-run the build, and how to hand-replace a drawing's SVG",
        "Archivo Narrow and Public Sans as WOFF2 with their OFL-1.1 licence files",
        "README.md with the run and rebuild commands, and LICENSES.md"
      ],
      "adaptations": [
        "Studio identity: name, mark, legal name, address, town — content.js identity",
        "Set number, project name and address, date, revision, drawn/checked initials",
        "Five colour tokens (paper, paperDeep, ink, verm, vermInk) — recolours the drawings' pens too",
        "Page title, meta description, language, the no-script banner text",
        "Every sheet's headings, paragraphs and numbered notes — content.js board/plan/practice/contact",
        "All tables: the room schedule, the stage table, the drawing register, the revision table",
        "The Contact sheet's address, phone, email, partners, office and insurance text",
        "The two Contact-sheet actions: the mailto label/address/subject/body, and the issue-register button label and the text baked into its downloaded .txt file",
        "The end stamp text",
        "Any drawing's SVG, by hand-replacing it in build.mjs (see EDITING.md); new artwork is baked in the same way as the originals"
      ],
      "notSupported": [
        "The drawings are baked authored SVG: text drawn inside a drawing (dimension values, level marks, room names on the plan, the site plan's house label, the key plan's street names and studio pin) is not a content.js field — a customer swaps in their own SVG per the EDITING guide",
        "Without JavaScript, the board's three layers (site plan, section, structure/light study) stack onto one drawing instead of animating between them",
        "The seven-sheet count and the three-layer board are fixed by the mechanism, not by content.js",
        "Swapping a typeface file without also editing style.css's @font-face rules and LICENSES.md",
        "A real form/email backend in place of the mailto: link",
        "A print stylesheet",
        "Additional houses, sheets or a works register"
      ],
      "requirements": [
        "Any static file server (e.g. python -m http.server) or upload as-is to static hosting; module-free plain scripts so most file:// setups also work",
        "Node.js 18+ to run tools/build.mjs after changing content.js (no packages, no network)",
        "Any current browser; renders complete with JavaScript disabled, with the limitation above"
      ],
      "package": {
        "kind": "zip",
        "slug": "atelier-rook",
        "url": "api/pack?slug=atelier-rook",
        "version": "1.0.1",
        "bytes": 119218,
        "sha256": "9486c55617cff1b85164f57d7a06f88768b9a093d228654d1a41444fabda0a8e"
      },
      "attribution": [
        {
          "what": "Archivo Narrow",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/google/fonts/tree/main/ofl/archivonarrow",
          "keep": "Keep fonts/OFL-ArchivoNarrow.txt"
        },
        {
          "what": "Public Sans",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/google/fonts/tree/main/ofl/publicsans",
          "keep": "Keep fonts/OFL-PublicSans.txt"
        },
        {
          "what": "The seven drawings",
          "source": "Authored SVG, baked by the site's own build script",
          "licence": "Part of the pack; no third-party art",
          "keep": "Nothing to credit"
        }
      ],
      "verification": {
        "build": "1.0.0",
        "date": "2026-09-12",
        "what": "Archive extracted into an empty folder; bytes and sha256 matched against the .sha256 sidecar in site/downloads; the seven sheets, the mailto action and the issue-register download inspected against README.md and EDITING.md."
      },
      "updates": "Free; the archive is re-hashed whenever its bytes change",
      "focal": {
        "card": "38% 42%",
        "detail": "42% 46%"
      }
    },
    {
      "id": "hollow-lane",
      "version": "1.0.1",
      "title": "Hollow Lane Nursery",
      "summary": "A plant nursery's single-page site built around one canvas-drawn campion that grows through six stages as you scroll, alongside three sales benches of fifteen authored plant drawings, a sketch map and an order list you fill from the benches and take as a mailto or a .txt download.",
      "category": "web",
      "scope": "site",
      "scopeLabel": "Complete single-page website",
      "tier": "free",
      "availability": "available",
      "quality": "featured",
      "detail": false,
      "poster": "assets/previews/hollow-lane.webp",
      "preview": {
        "type": "video",
        "src": "assets/previews/hollow-lane.mp4",
        "poster": "assets/previews/hollow-lane.webp",
        "sound": false
      },
      "demo": "experiments/preview-2026-09-12/nursery/",
      "page": "experiments/preview-2026-09-12/nursery/",
      "deliverables": [
        "The complete source: index.html, style.css, main.js, plant.js and content.js, plus catalogue.js, the 15 authored plant drawings",
        "content.js: nursery identity, colour palette, currency, the featured plant's six growth-stage texts, the three benches, opening hours/map/contact and the order-list download",
        "EDITING.md: what each field does and how the benches reference catalogue.js",
        "EB Garamond and Alegreya Sans as WOFF2 with their OFL-1.1 licence files",
        "README.md with the run command, and LICENSES.md"
      ],
      "adaptations": [
        "Nursery name, tagline, opening copy and quick facts — content.js identity",
        "Full colour palette — page chrome and the drawn plants together — content.js colors",
        "Currency symbol and decimal places — content.js currency",
        "The featured plant's name, binomial, packet copy and all six growth-stage texts — content.js featured",
        "The three benches' plant lists, prices, facts and notes, and which of the 15 authored drawings each uses — content.js benches",
        "Opening hours, the sketch map's words, the colophon, contact address and mail templates — content.js ending, contact",
        "The downloaded order-list filename and its text — content.js download",
        "Page title, meta description, theme-color and favicon, applied automatically from content.js"
      ],
      "notSupported": [
        "The catalogue holds eighteen entries drawn from a fixed set of fifteen authored plant drawings; a sixteenth species needs a code edit to catalogue.js, not a content.js change",
        "Orders are a local list with a .txt download and a mailto: link — no payment, checkout, account or server",
        "The campion's growth-by-scroll mechanic and canvas drawing engine (plant.js)",
        "The 15 authored plant drawings themselves",
        "The packet, plant-label and stamp shapes, the paper grain, and the sketch map's roads/river/landmarks (style.css, inline SVG)",
        "Layout, type sizes, spacing and breakpoints (style.css)",
        "Bench ids and their layout density (set per-section in index.html)",
        "The <noscript> fallback text (mirrors content.js by hand — see EDITING.md)"
      ],
      "requirements": [
        "Any modern browser with Canvas 2D (Chrome/Edge, Firefox, Safari 14+, iOS Safari, Android Chrome); no WebGL dependency",
        "Any static file host or local HTTP server: python -m http.server 8080 (fonts do not load reliably from file://)",
        "Every interactive control is a native <a> or <button>, reachable with Tab and operable with Enter/Space, in document order, with a visible focus outline",
        "Free with a Google sign-in to download"
      ],
      "package": {
        "kind": "zip",
        "slug": "hollow-lane",
        "url": "api/pack?slug=hollow-lane",
        "version": "1.0.1",
        "bytes": 393596,
        "sha256": "66c58ff074af625a5211917a61e7bc504b82efc5f244ec8125dd0078ce5393eb"
      },
      "attribution": [
        {
          "what": "EB Garamond",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/google/fonts/tree/main/ofl/ebgaramond",
          "keep": "Keep fonts/OFL-EBGaramond.txt"
        },
        {
          "what": "Alegreya Sans",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/google/fonts/tree/main/ofl/alegreyasans",
          "keep": "Keep fonts/OFL-AlegreyaSans.txt"
        },
        {
          "what": "The fifteen plant drawings",
          "source": "Authored SVG and canvas drawings, original to the site",
          "licence": "Part of the pack; no third-party art",
          "keep": "Nothing to credit"
        }
      ],
      "verification": {
        "build": "1.0.1",
        "date": "2026-09-23",
        "what": "Archive extracted into an empty folder; bytes and sha256 matched against the .sha256 sidecar in site/downloads; the featured plant's six growth stages, the three benches and the order list's mailto/.txt actions inspected against README.md and EDITING.md."
      },
      "updates": "Free; the archive is re-hashed whenever its bytes change",
      "focal": {
        "card": "64% 32%",
        "detail": "58% 42%"
      }
    },
    {
      "id": "halden-ceramics",
      "version": "2026-09-10",
      "title": "Halden",
      "summary": "A product experience for a collection of real objects: four photoscanned pieces on one lit stage, a glaze you choose that repaints the piece, the thumbnails, the spec and every price in one beat, a word behind each piece that it stands in front of, a ground colour per piece, and drag to turn.",
      "category": "product",
      "scope": "page",
      "scopeLabel": "Interactive product experience · four real scans, three glazes",
      "tier": "pro",
      "availability": "preview-only",
      "quality": "featured",
      "detail": false,
      "poster": "examples/halden-ceramics/poster.webp",
      "preview": {
        "type": "image",
        "src": "examples/halden-ceramics/poster.webp"
      },
      "demo": "examples/halden-ceramics/",
      "deliverables": [
        "index.html, site.css, site.js, scene.js: the page and the stage",
        "models/: four CC0 photoscans with receipts",
        "stills/: one image per piece for the first paint and for browsers without WebGL",
        "vendor/: the glTF loader, vendored and hash-verified; the renderer, typefaces and HDR resolve to the Cinder page (see vendor/MANIFEST.md)",
        "HALDEN-GUIDE.md: what a model has to be, the config, what was measured, how to capture it deterministically",
        "LICENSES.md",
        "GLAZE-CONTRACT.md: the glaze record, why a tint is enough on these scans, and what it cannot do",
        "the film: videos/halden-2026-09-10, wide and portrait"
      ],
      "adaptations": [
        "The glazes: tint, gloss, reflection, surcharge and copy per finish (GLAZE-CONTRACT.md)",
        "The pieces: any glTF scans or authored models in metres",
        "One ground, ink and word colour per piece",
        "Every word, price and detail row"
      ],
      "notSupported": [
        "Primitives or untextured models; the page is built for real objects",
        "Models heavier than a few megabytes without preparing them first",
        "A glaze matter than the piece was fired; roughness multiplies the fired map, so a finish can only be taken glossier",
        "A glaze on a browser without WebGL; the still and the fallback are the default finish only",
        "A real checkout; the button opens a summary that says nothing is charged"
      ],
      "requirements": [
        "Any static server",
        "WebGL for the stage; without it the page shows the still",
        "Plate Pro, when this ships in the next release"
      ],
      "package": {
        "kind": "wheel-template",
        "template": "halden-ceramics",
        "tool": "plate_create_project",
        "url": "downloads/plate_toolkit-1.2.5-py3-none-any.whl",
        "bytes": 22863221,
        "sha256": "6919b42e023399821631fe3c195539b1b5ad058dcbc2c943f8af830f1b1da697",
        "version": "next",
        "note": "Not in 1.2.5. Listed preview-only until the release that carries it."
      },
      "attribution": [
        {
          "what": "Ceramic Vase 01–04",
          "source": "James Ray Cock, Poly Haven",
          "licence": "CC0 1.0",
          "keep": "Nothing required; RECEIPTS.json keeps the provenance"
        },
        {
          "what": "Studio Small 09 HDR",
          "source": "Sergej Majboroda, Poly Haven",
          "licence": "CC0 1.0",
          "keep": "Nothing required"
        },
        {
          "what": "three.js r128",
          "source": "three.js authors",
          "licence": "MIT",
          "keep": "The licence text if you self-host"
        }
      ],
      "verification": {
        "build": "2026-09-09",
        "date": "2026-09-09",
        "what": "Desktop and phone renders; all four scans load, thumbnails render from the models, switching changes ground, word, copy, specs, price and title together; drag turns the piece; arrows and keyboard work; the dialog states the demonstration; no console errors."
      },
      "updates": "Will be included in Plate Pro v1 updates when released",
      "focal": {
        "card": "50% 60%",
        "detail": "46% 58%"
      }
    },
    {
      "id": "nokka-tableware",
      "version": "2026-09-10",
      "title": "Nokka",
      "summary": "The same product experience run as a second brand from one file: three pieces instead of four, a pale palette with dark ink instead of saturated grounds, and a different glaze family. Every shared file resolves to the Halden example unchanged.",
      "category": "product",
      "scope": "page",
      "scopeLabel": "Brand adaptation · one config file over the Halden stage",
      "tier": "pro",
      "availability": "preview-only",
      "quality": "library",
      "detail": false,
      "poster": "examples/halden-ceramics/poster.webp",
      "preview": {
        "type": "image",
        "src": "examples/halden-ceramics/poster.webp"
      },
      "demo": "examples/nokka-tableware/",
      "deliverables": [
        "index.html: the whole adaptation — brand, three pieces, three glazes, palette and copy",
        "LICENSES.md: what it reuses and from where"
      ],
      "adaptations": [
        "Everything in the Halden glaze and piece records"
      ],
      "notSupported": [
        "Its own assets; it reuses three of Halden's four scans",
        "Standing alone; every shared file resolves to ../halden-ceramics/ and ../cinder-product/"
      ],
      "requirements": [
        "Any static server",
        "The halden-ceramics and cinder-product folders beside it; every shared file resolves there",
        "WebGL for the stage; without it the page shows the still and hides the glaze control",
        "Plate Pro, when this ships in the next release"
      ],
      "attribution": "Three of Halden's four Poly Haven scans (CC0, James Ray Cock); no asset of its own. See LICENSES.md.",
      "package": {
        "kind": "wheel-template",
        "template": "halden-ceramics",
        "tool": "plate_create_project",
        "url": "downloads/plate_toolkit-1.2.5-py3-none-any.whl",
        "bytes": 22863221,
        "sha256": "6919b42e023399821631fe3c195539b1b5ad058dcbc2c943f8af830f1b1da697",
        "version": "next",
        "note": "Not in 1.2.5. Listed preview-only until the release that carries it."
      },
      "updates": "Will be included in Plate Pro v1 updates when released",
      "verification": "Captured 2026-09-10 at 1440x900 and 390x844 in three glazes and three pieces; evidence in .qa/halden-checkpoint-3-20260910/nokka/."
    },
    {
      "id": "kiln-studio",
      "version": "2026-09-10",
      "title": "Kiln",
      "summary": "A complete single-page site for a small studio: the offer, three sessions as a ruled list, a four-step process that shows the form you chose in the hero at each stage of its making, a work grid whose pieces open at their own URL, the room with every form drawn on one shelf at its real size, and a booking request that summarises on the page. No photography; the pictures are drawn per pixel, and the subject runs through the whole page. No runtime downloads beyond two fonts.",
      "category": "web",
      "scope": "site",
      "scopeLabel": "Complete single-page website",
      "tier": "pro",
      "availability": "preview-only",
      "quality": "featured",
      "detail": false,
      "poster": "examples/kiln-studio/poster.webp",
      "preview": {
        "type": "image",
        "src": "examples/kiln-studio/poster.webp"
      },
      "demo": "examples/kiln-studio/",
      "deliverables": [
        "index.html, site.css, site.js and vessel.js: the whole site in four files",
        "SITE-GUIDE.md: each section's role, what to change in order, the stages, the destination, the shelf, the film command",
        "LICENSES.md: two OFL typefaces; everything else original",
        "turned/: the furniture-workshop adaptation with five forms, four commissions, two typographic steps and three stages, on the same stylesheet"
      ],
      "adaptations": [
        "Every word, every price, the facts repeated across hero, sessions, pieces, room and colophon",
        "Sessions, steps, forms and pieces in any number; steps with or without a stage picture",
        "The material and its stages (clay or oak), the forms and the shelf, from a config block",
        "What each piece says when opened, and which session it books",
        "The booking form's endpoint, once you have one"
      ],
      "notSupported": [
        "A different layout; add a band, do not rewrite the grid",
        "A working booking backend; the form is a labelled demonstration"
      ],
      "requirements": [
        "Any static server",
        "Plate Pro, when this ships in the next release"
      ],
      "package": {
        "kind": "wheel-template",
        "template": "kiln-studio",
        "tool": "plate_create_project",
        "url": "downloads/plate_toolkit-1.2.5-py3-none-any.whl",
        "bytes": 22863221,
        "sha256": "6919b42e023399821631fe3c195539b1b5ad058dcbc2c943f8af830f1b1da697",
        "version": "next",
        "note": "Not in 1.2.5. Listed preview-only until the release that carries it."
      },
      "attribution": [
        {
          "what": "Fraunces, DM Sans",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "keep": "The OFL texts if you self-host"
        }
      ],
      "adapted": {
        "title": "Turned — a furniture workshop in Porto",
        "demo": "examples/kiln-studio/turned/"
      },
      "verification": {
        "build": "2026-09-10",
        "date": "2026-09-10",
        "what": "Desktop (1440x900), phone (390x844) and reduced-motion full-page renders of both pages in headless Chrome; every hero form re-draws the process stages and names itself in the lead; a piece opens from the grid, from a pasted #work/<id> link and with the keyboard, focus lands on it and Escape returns to #work; Turned renders five pieces, a five-column process with two typographic steps, and a five-form shelf from the same stylesheet; two 20-second films recorded frame by frame. Preview-only until a release carries it."
      },
      "updates": "Will be included in Plate Pro v1 updates when released",
      "focal": {
        "card": "50% 52%",
        "detail": "50% 52%"
      }
    },
    {
      "id": "cinder-product",
      "version": "2026-09-10",
      "title": "Cinder",
      "summary": "A product page for one physical object: the form on a lit stage that you can drag to turn, with finish, size and view controls; one coordinated transition per selection, in which the object turns away and comes back as the new choice while the ground, the copy, the price and the specification move with it; the numbers that matter; three finishes shown as real renders; a readable specification; a close view of the cap; and a purchase button that says it is a demonstration. The object is described once in a config; the renderer, the stills, the copy and the specification all read it.",
      "category": "product",
      "scope": "page",
      "scopeLabel": "Interactive product page · finish, size, view and drag",
      "tier": "pro",
      "availability": "preview-only",
      "quality": "featured",
      "detail": false,
      "poster": "examples/cinder-product/poster.webp",
      "preview": {
        "type": "image",
        "src": "examples/cinder-product/poster.webp"
      },
      "demo": "examples/cinder-product/",
      "deliverables": [
        "index.html, site.css, site.js and product.js: the page and the renderer (three.js r128 from a CDN)",
        "assets/studio.hdr (CC0); stills/ with one render per finish and size, one close view per finish, and poster.webp, all rendered from the same config",
        "PRODUCT-GUIDE.md: the model contract, what to change in order, the study views, the stills and film commands, what was measured",
        "LICENSES.md: the HDR, three.js and the two typefaces",
        "oriel/: a stoneware carafe with a cork stopper, as the worked adaptation"
      ],
      "adaptations": [
        "The product's profile, its cap or stopper, an optional bare-metal seam, its materials, its sizes in millimetres",
        "Finishes with their own coat, printed mark, grooves, ground colour and accent",
        "Every word, price and specification row; the detail view caption",
        "The palette, from six CSS variables"
      ],
      "notSupported": [
        "Products that are not a surface of revolution (handles, spouts, boxes): keep the page, drop the 3D view, use photographs",
        "Dropping in an arbitrary 3D model",
        "Transparent materials such as glass; the renderer draws opaque coats, glazes and metals",
        "A real checkout; the button opens a summary that says so"
      ],
      "requirements": [
        "Any static server",
        "WebGL for the interactive view; without it the page shows the still",
        "Plate Pro, when this ships in the next release"
      ],
      "package": {
        "kind": "wheel-template",
        "template": "cinder-product",
        "tool": "plate_create_project",
        "url": "downloads/plate_toolkit-1.2.5-py3-none-any.whl",
        "bytes": 22863221,
        "sha256": "6919b42e023399821631fe3c195539b1b5ad058dcbc2c943f8af830f1b1da697",
        "version": "next",
        "note": "Not in 1.2.5. The toolkit now carries the template id cinder-product and its copy plan passes; listed preview-only until the release that ships it."
      },
      "attribution": [
        {
          "what": "Studio Small 09 HDR",
          "source": "Sergej Majboroda, Poly Haven",
          "licence": "CC0 1.0",
          "keep": "Nothing required; LICENSES.md keeps the provenance"
        },
        {
          "what": "three.js r128",
          "source": "three.js authors",
          "licence": "MIT",
          "keep": "The licence text if you self-host the library"
        },
        {
          "what": "Inter Tight, Instrument Serif",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "keep": "The OFL texts if you self-host"
        }
      ],
      "adapted": {
        "title": "Oriel — a stoneware carafe, three glazes, two sizes",
        "demo": "examples/cinder-product/oriel/"
      },
      "verification": {
        "build": "2026-09-10",
        "date": "2026-09-10",
        "what": "Desktop (1600x900), phone (390x844), reduced-motion and WebGL-off renders of both pages on an RTX 3070 through headless Chrome. Three object studies (silhouette, neutral, final) at one camera. Rapid A>B>C selection and a live click burst both end with the stage, pressed controls, caption, price and specification on the last choice. Every view and finish; the size change keeps the label on the body. Drag turns the object and the slider follows. Two 18-second films (wide and portrait) recorded from the page's own capture clock. Package copy plan from the toolkit resolves 32 files with no missing dependency; a third brief (Wick, a squat stoneware candle with a wooden lid) was made from the installed package in a clean folder with config and copy changes only, plus one framing value; recorded in docs/CINDER-CHECKPOINT-1-2026-09-10.md."
      },
      "updates": "Will be included in Plate Pro v1 updates when released",
      "focal": {
        "card": "50% 62%",
        "detail": "50% 55%"
      }
    },
    {
      "id": "daybay",
      "version": "2026-09-09b",
      "title": "Daybay",
      "summary": "A body-camera firefight in a sunlit concrete bay. Three opponents, four weapons, a live sun over a baked bounce, layered positioned sound. Runs in a browser tab.",
      "category": "game",
      "scope": "game",
      "scopeLabel": "Playable browser game · keyboard and mouse",
      "tier": "free",
      "availability": "available",
      "quality": "featured",
      "detail": false,
      "poster": "labs/daybay/poster-library.webp",
      "preview": {
        "type": "video",
        "src": "assets/showcase/daybay-firefight.mp4",
        "poster": "labs/daybay/poster-library.webp",
        "sound": true
      },
      "demo": "labs/daybay/",
      "page": "labs/#daybay",
      "deliverables": [
        "The whole game as it runs on the site, with labs/shared",
        "README.md, ADAPT.md, LICENSES.md and a Node plan checker"
      ],
      "adaptations": [
        "Arena layout (with a documented lighting limitation)",
        "Opponent numbers and behaviour",
        "Weapon table and starting weapon",
        "Room acoustics and shot recordings",
        "Sun and sky"
      ],
      "requirements": [
        "Desktop browser with WebGL 2",
        "Python 3 or any static server to run locally",
        "Node.js only for the plan checker"
      ],
      "package": {
        "kind": "zip",
        "slug": "daybay",
        "url": "api/pack?slug=daybay",
        "bytes": 91854270,
        "sha256": "e6b33ef411fdc4b2b0f055cbef158fdc7ca38ba73689f21095e0b6f1a267d949",
        "version": "2026-09-09b",
        "files": 238
      },
      "attribution": [
        {
          "what": "Meshes, textures and recordings",
          "source": "OpenGameArt, Poly Haven, Kenney and named CC0 authors; one CC BY 3.0 credit (Vincent Sevedge)",
          "licence": "CC0 / MIT / CC BY 3.0",
          "keep": "Every assets/*/LICENSE.md and the Sevedge line in LICENSES.md"
        }
      ],
      "verification": {
        "build": "daybay d58320a+ 2026-09-09 10:38Z",
        "date": "2026-09-09",
        "what": "Archive extracted into an empty folder and played by its README alone; one adaptation from ADAPT.md played through. docs/DAYBAY-LAB-RELEASE-2026-09-09.md"
      },
      "updates": "Free; the archive is re-hashed whenever its bytes change",
      "focal": {
        "card": "50% 58%",
        "detail": "52% 60%"
      }
    },
    {
      "id": "lookout",
      "version": "2026-09-07",
      "title": "Lookout",
      "summary": "A one-room stay above a dam whose page scrolls through a real day: seven registered photographs of one hill, crossfaded as the camera turns to follow the sun.",
      "category": "web",
      "scope": "site",
      "scopeLabel": "Complete single-page website",
      "tier": "free",
      "availability": "available",
      "quality": "featured",
      "detail": false,
      "poster": "labs/lookout/poster.webp",
      "preview": {
        "type": "image",
        "src": "labs/lookout/poster.webp"
      },
      "demo": "labs/lookout/",
      "page": "labs/#lookout",
      "deliverables": [
        "Source, the seven graded photographs and the grading script",
        "README with the seven beats and their camera values"
      ],
      "adaptations": [
        "Every beat's copy, facts and its one interaction",
        "Names, prices, dates and the booking form's labels",
        "Camera poses within the shipped crop bounds (choreography.js)"
      ],
      "requirements": [
        "Any static server",
        "Desktop or phone browser with WebGL; stills are the fallback"
      ],
      "package": {
        "kind": "zip",
        "slug": "lookout",
        "url": "api/pack?slug=lookout",
        "bytes": 21384892,
        "sha256": "7ecb2a7b33edecf039647c9cb72615a9134e1defb8a23d959a0b1e4501677d84",
        "version": "2026-09-07"
      },
      "attribution": [
        {
          "what": "Photographs",
          "source": "Qwantani, Poly Haven",
          "licence": "CC0",
          "keep": "assets/qwantani/LICENSE.md"
        }
      ],
      "verification": {
        "build": "2026-09-07",
        "date": "2026-09-07",
        "what": "Packaged and served; see the lab page"
      },
      "updates": "Free",
      "focal": {
        "card": "50% 44%",
        "detail": "60% 48%"
      },
      "notSupported": [
        "A new photograph set: the grading pipeline needs the 16k HDR sources and per-frame registration, which are not included",
        "Reframes outside the shipped crop bounds without regrading"
      ]
    },
    {
      "id": "afterlight",
      "version": "2026-09-06",
      "title": "Afterlight",
      "summary": "A quiet room, a shutter, the rain outside. Explore the light and find the reveal.",
      "category": "web",
      "scope": "interactive",
      "scopeLabel": "Interactive scene",
      "tier": "free",
      "availability": "available",
      "quality": "library",
      "detail": false,
      "poster": "labs/afterlight/poster.webp",
      "preview": {
        "type": "image",
        "src": "labs/afterlight/poster.webp"
      },
      "demo": "labs/afterlight/",
      "page": "labs/#afterlight",
      "deliverables": [
        "Source and the shared runtime"
      ],
      "adaptations": [
        "Setting, atmosphere, materials and lighting",
        "Keyboard and touch controls preserved"
      ],
      "requirements": [
        "Any static server",
        "WebGL 2"
      ],
      "package": {
        "kind": "zip",
        "slug": "afterlight",
        "url": "api/pack?slug=afterlight",
        "bytes": 738708,
        "sha256": "ebd23f921ea3c7a3fa9f9800bdb02ec4ded88764afe891f07d25fff2754a30dc",
        "version": "2026-09-06"
      },
      "attribution": [
        {
          "what": "three.js, Inter",
          "source": "vendored",
          "licence": "MIT, OFL",
          "keep": "labs/shared/LICENSES.md"
        }
      ],
      "verification": {
        "build": "2026-09-06",
        "date": "2026-09-06",
        "what": "Packaged and served"
      },
      "updates": "Free"
    },
    {
      "id": "softlight",
      "version": "2026-09-06",
      "title": "Softlight",
      "summary": "Press. Pull. Let it settle. A small study in light and touch.",
      "category": "product",
      "scope": "interactive",
      "scopeLabel": "Interactive material study",
      "tier": "free",
      "availability": "available",
      "quality": "library",
      "detail": false,
      "poster": "labs/softlight/poster.webp",
      "preview": {
        "type": "image",
        "src": "labs/softlight/poster.webp"
      },
      "demo": "labs/softlight/",
      "page": "labs/#softlight",
      "deliverables": [
        "Source and the shared runtime"
      ],
      "adaptations": [
        "Object silhouette, material, contact and lighting"
      ],
      "requirements": [
        "Any static server",
        "WebGL 2"
      ],
      "package": {
        "kind": "zip",
        "slug": "softlight",
        "url": "api/pack?slug=softlight",
        "bytes": 1758672,
        "sha256": "36f858cb5deaf221a4f9cb0989fdaa6e120889e53a88dfc1bdeb056597c2c116",
        "version": "2026-09-06"
      },
      "attribution": [
        {
          "what": "three.js, Inter, studio.hdr",
          "source": "vendored, Poly Haven",
          "licence": "MIT, OFL, CC0",
          "keep": "labs/shared/LICENSES.md"
        }
      ],
      "verification": {
        "build": "2026-09-06",
        "date": "2026-09-06",
        "what": "Packaged and served"
      },
      "updates": "Free"
    },
    {
      "id": "kiln",
      "version": "1.2.4",
      "title": "Kiln (single screen)",
      "summary": "An editorial pottery-studio site: shaded ceramic materials, shape selection and a booking summary.",
      "category": "web",
      "scope": "page",
      "scopeLabel": "Single screen · the 1.2.4 implementation",
      "tier": "pro",
      "availability": "available",
      "quality": "legacy",
      "detail": false,
      "poster": "examples/web-kiln/after.webp",
      "preview": {
        "type": "video",
        "src": "assets/previews/kiln.mp4",
        "poster": "examples/web-kiln/after.webp",
        "sound": false
      },
      "demo": "examples/web-kiln/after.html",
      "deliverables": [
        "Complete HTML implementation with assets and licences"
      ],
      "adaptations": [
        "Content, materials, palette and sections; the layout is a starting point"
      ],
      "requirements": [
        "Plate Pro",
        "Any static server"
      ],
      "package": {
        "kind": "wheel-template",
        "template": "kiln",
        "tool": "plate_create_project",
        "url": "downloads/plate_toolkit-1.2.5-py3-none-any.whl",
        "bytes": 22863221,
        "sha256": "6919b42e023399821631fe3c195539b1b5ad058dcbc2c943f8af830f1b1da697",
        "version": "1.2.5"
      },
      "attribution": [],
      "verification": {
        "build": "1.2.4",
        "date": "2026-09-05",
        "what": "Shipped implementation; before/after captures on the site"
      },
      "updates": "Included in Plate Pro v1 updates"
    },
    {
      "id": "relay",
      "version": "1.2.4",
      "title": "Relay pricing",
      "summary": "A pricing matrix with aligned comparisons and working plan selection.",
      "category": "web",
      "scope": "section",
      "scopeLabel": "Pricing section, not a complete site",
      "tier": "pro",
      "availability": "available",
      "quality": "legacy",
      "detail": false,
      "poster": "examples/web-pricing/after.webp",
      "preview": {
        "type": "video",
        "src": "assets/previews/relay.mp4",
        "poster": "examples/web-pricing/after.webp",
        "sound": false
      },
      "demo": "examples/web-pricing/after.html",
      "deliverables": [
        "HTML implementation of the section"
      ],
      "adaptations": [
        "Plans, prices, features and copy"
      ],
      "requirements": [
        "Plate Pro"
      ],
      "package": {
        "kind": "wheel-template",
        "template": "relay",
        "tool": "plate_create_project",
        "url": "downloads/plate_toolkit-1.2.5-py3-none-any.whl",
        "bytes": 22863221,
        "sha256": "6919b42e023399821631fe3c195539b1b5ad058dcbc2c943f8af830f1b1da697",
        "version": "1.2.5"
      },
      "attribution": [],
      "verification": {
        "build": "1.2.4",
        "date": "2026-09-05",
        "what": "Shipped implementation"
      },
      "updates": "Included in Plate Pro v1 updates"
    },
    {
      "id": "ledger",
      "version": "1.2.4",
      "title": "Ledger",
      "summary": "A software story with an interactive four-stage workflow diagram.",
      "category": "web",
      "scope": "page",
      "scopeLabel": "Product page",
      "tier": "pro",
      "availability": "available",
      "quality": "legacy",
      "detail": false,
      "poster": "examples/web-ledger/after.webp",
      "preview": {
        "type": "video",
        "src": "assets/previews/ledger.mp4",
        "poster": "examples/web-ledger/after.webp",
        "sound": false
      },
      "demo": "examples/web-ledger/after.html",
      "deliverables": [
        "HTML implementation"
      ],
      "adaptations": [
        "Stages, copy and palette"
      ],
      "requirements": [
        "Plate Pro"
      ],
      "package": {
        "kind": "wheel-template",
        "template": "ledger",
        "tool": "plate_create_project",
        "url": "downloads/plate_toolkit-1.2.5-py3-none-any.whl",
        "bytes": 22863221,
        "sha256": "6919b42e023399821631fe3c195539b1b5ad058dcbc2c943f8af830f1b1da697",
        "version": "1.2.5"
      },
      "attribution": [],
      "verification": {
        "build": "1.2.4",
        "date": "2026-09-05",
        "what": "Shipped implementation"
      },
      "updates": "Included in Plate Pro v1 updates"
    },
    {
      "id": "cinder",
      "version": "1.2.4",
      "title": "Cinder (single view)",
      "summary": "A product story with studio lighting, richer materials and interactive bottle rotation.",
      "category": "product",
      "scope": "page",
      "scopeLabel": "One finish, one size · the 1.2.4 implementation",
      "tier": "pro",
      "availability": "available",
      "quality": "legacy",
      "detail": false,
      "poster": "examples/3d-bottle/after.webp",
      "preview": {
        "type": "video",
        "src": "assets/previews/cinder.mp4",
        "poster": "examples/3d-bottle/after.webp",
        "sound": false
      },
      "demo": "examples/3d-bottle/after.html",
      "deliverables": [
        "HTML implementation, HDR and the bottle still"
      ],
      "adaptations": [
        "Product, copy, materials and lighting; a different model needs measured camera and material work"
      ],
      "requirements": [
        "Plate Pro",
        "WebGL 2"
      ],
      "package": {
        "kind": "wheel-template",
        "template": "cinder",
        "tool": "plate_create_project",
        "url": "downloads/plate_toolkit-1.2.5-py3-none-any.whl",
        "bytes": 22863221,
        "sha256": "6919b42e023399821631fe3c195539b1b5ad058dcbc2c943f8af830f1b1da697",
        "version": "1.2.5"
      },
      "attribution": [
        {
          "what": "studio.hdr",
          "source": "Poly Haven",
          "licence": "CC0"
        }
      ],
      "verification": {
        "build": "1.2.4",
        "date": "2026-09-05",
        "what": "Shipped implementation"
      },
      "updates": "Included in Plate Pro v1 updates"
    },
    {
      "id": "northwind",
      "version": "1.2.4",
      "title": "Northwind metrics",
      "summary": "An analytics workspace with grouped measures, filtering and a clear comparison view.",
      "category": "data",
      "scope": "page",
      "scopeLabel": "Interactive dashboard",
      "tier": "pro",
      "availability": "available",
      "quality": "legacy",
      "detail": false,
      "poster": "examples/dash-metrics/after.webp",
      "preview": {
        "type": "video",
        "src": "assets/previews/northwind.mp4",
        "poster": "examples/dash-metrics/after.webp",
        "sound": false
      },
      "demo": "examples/dash-metrics/after.html",
      "deliverables": [
        "HTML implementation"
      ],
      "adaptations": [
        "Measures, groups and copy"
      ],
      "requirements": [
        "Plate Pro"
      ],
      "package": {
        "kind": "wheel-template",
        "template": "northwind",
        "tool": "plate_create_project",
        "url": "downloads/plate_toolkit-1.2.5-py3-none-any.whl",
        "bytes": 22863221,
        "sha256": "6919b42e023399821631fe3c195539b1b5ad058dcbc2c943f8af830f1b1da697",
        "version": "1.2.5"
      },
      "attribution": [],
      "verification": {
        "build": "1.2.4",
        "date": "2026-09-05",
        "what": "Shipped implementation"
      },
      "updates": "Included in Plate Pro v1 updates"
    },
    {
      "id": "shots",
      "version": "1.2.4",
      "title": "Ten shots, one goal",
      "summary": "An interactive shot map and data story with selectable chances and a comparative view.",
      "category": "data",
      "scope": "page",
      "scopeLabel": "Data story",
      "tier": "pro",
      "availability": "available",
      "quality": "legacy",
      "detail": false,
      "poster": "examples/viz-xg/after.webp",
      "preview": {
        "type": "video",
        "src": "assets/previews/shots.mp4",
        "poster": "examples/viz-xg/after.webp",
        "sound": false
      },
      "demo": "examples/viz-xg/after.html",
      "deliverables": [
        "HTML implementation"
      ],
      "adaptations": [
        "Dataset, copy and palette"
      ],
      "requirements": [
        "Plate Pro"
      ],
      "package": {
        "kind": "wheel-template",
        "template": "shots",
        "tool": "plate_create_project",
        "url": "downloads/plate_toolkit-1.2.5-py3-none-any.whl",
        "bytes": 22863221,
        "sha256": "6919b42e023399821631fe3c195539b1b5ad058dcbc2c943f8af830f1b1da697",
        "version": "1.2.5"
      },
      "attribution": [],
      "verification": {
        "build": "1.2.4",
        "date": "2026-09-05",
        "what": "Shipped implementation"
      },
      "updates": "Included in Plate Pro v1 updates"
    },
    {
      "id": "nightpitch",
      "version": "1.2.4",
      "title": "Night Pitch",
      "summary": "A top-down wave arena on a floodlit pitch with the stadium kit. Keyboard or touch.",
      "category": "game",
      "scope": "game",
      "scopeLabel": "Playable browser game",
      "tier": "pro",
      "availability": "available",
      "quality": "legacy",
      "detail": false,
      "poster": "examples/game-arena/after.webp",
      "preview": {
        "type": "image",
        "src": "examples/game-arena/after.webp"
      },
      "demo": "examples/game-arena/after.html",
      "deliverables": [
        "HTML implementation and the stadium kit"
      ],
      "adaptations": [
        "Arena, waves, scoring and copy"
      ],
      "requirements": [
        "Plate Pro",
        "WebGL 2"
      ],
      "package": {
        "kind": "wheel-template",
        "template": "nightpitch",
        "tool": "plate_create_project",
        "url": "downloads/plate_toolkit-1.2.5-py3-none-any.whl",
        "bytes": 22863221,
        "sha256": "6919b42e023399821631fe3c195539b1b5ad058dcbc2c943f8af830f1b1da697",
        "version": "1.2.5"
      },
      "attribution": [
        {
          "what": "Stadium kit textures and model",
          "source": "Poly Haven and named CC0 sources",
          "licence": "CC0",
          "keep": "kit/LICENSES.md"
        }
      ],
      "verification": {
        "build": "1.2.4",
        "date": "2026-09-05",
        "what": "Shipped implementation"
      },
      "updates": "Included in Plate Pro v1 updates"
    },
    {
      "id": "overpass",
      "version": "1.2.4",
      "title": "Overpass Rail",
      "summary": "A one-button runner with a parallax night city, layered traffic and hold-to-jump height.",
      "category": "game",
      "scope": "game",
      "scopeLabel": "Playable browser game",
      "tier": "pro",
      "availability": "available",
      "quality": "legacy",
      "detail": false,
      "poster": "examples/game-runner/after.webp",
      "preview": {
        "type": "video",
        "src": "assets/previews/overpass.mp4",
        "poster": "examples/game-runner/after.webp",
        "sound": false
      },
      "demo": "examples/game-runner/after.html",
      "deliverables": [
        "HTML implementation"
      ],
      "adaptations": [
        "City, obstacles, scoring and copy"
      ],
      "requirements": [
        "Plate Pro"
      ],
      "package": {
        "kind": "wheel-template",
        "template": "overpass",
        "tool": "plate_create_project",
        "url": "downloads/plate_toolkit-1.2.5-py3-none-any.whl",
        "bytes": 22863221,
        "sha256": "6919b42e023399821631fe3c195539b1b5ad058dcbc2c943f8af830f1b1da697",
        "version": "1.2.5"
      },
      "attribution": [],
      "verification": {
        "build": "1.2.4",
        "date": "2026-09-05",
        "what": "Shipped implementation"
      },
      "updates": "Included in Plate Pro v1 updates"
    },
    {
      "id": "standup",
      "version": "1.2.4",
      "title": "The Stand-up",
      "summary": "An animated episode title card on a ruled plan grid with timed reveals and a marker sweep.",
      "category": "motion",
      "scope": "video",
      "scopeLabel": "Animated title card",
      "tier": "pro",
      "availability": "available",
      "quality": "legacy",
      "detail": false,
      "poster": "examples/motion-intro/after.webp",
      "preview": {
        "type": "video",
        "src": "assets/previews/standup.mp4",
        "poster": "examples/motion-intro/after.webp",
        "sound": false
      },
      "demo": "examples/motion-intro/after.html",
      "deliverables": [
        "HTML implementation"
      ],
      "adaptations": [
        "Title, copy, timing and palette"
      ],
      "requirements": [
        "Plate Pro"
      ],
      "package": {
        "kind": "wheel-template",
        "template": "standup",
        "tool": "plate_create_project",
        "url": "downloads/plate_toolkit-1.2.5-py3-none-any.whl",
        "bytes": 22863221,
        "sha256": "6919b42e023399821631fe3c195539b1b5ad058dcbc2c943f8af830f1b1da697",
        "version": "1.2.5"
      },
      "attribution": [],
      "verification": {
        "build": "1.2.4",
        "date": "2026-09-05",
        "what": "Shipped implementation"
      },
      "updates": "Included in Plate Pro v1 updates"
    },
    {
      "id": "sillage",
      "version": "2026-09-20",
      "title": "Sillage",
      "summary": "A fragrance site with no scroll: one fixed frame, a photographed bottle you press, and live air over the top of it. Drag and the air keeps what you draw; ask it for one of six things and the mist settles into a halved bergamot, an iris, an hourglass for the eight hours. Draw all six and it signs the air with the wordmark.",
      "category": "web",
      "scope": "site",
      "scopeLabel": "Complete single-screen website",
      "tier": "free",
      "availability": "available",
      "quality": "featured",
      "detail": false,
      "poster": "assets/previews/sillage.webp",
      "preview": {
        "type": "video",
        "src": "assets/previews/sillage.mp4",
        "poster": "assets/previews/sillage.webp",
        "sound": false
      },
      "demo": "labs/sillage/",
      "page": "labs/#sillage",
      "deliverables": [
        "The complete source: the single frame, the fluid simulation, the seven drawings and the campaign photograph",
        "README with the controls, the file map and how to swap the photograph or the drawings"
      ],
      "adaptations": [
        "Every word on the page, and the six subjects in the SUBJECTS array: name, kind, line, measured value, accent colour and the words that drift out of the cloud",
        "The seven drawings, authored as plain Canvas 2D path commands in the SHAPES array",
        "The campaign photograph, with the two nozzle fractions in positionBottle() moved to match it"
      ],
      "requirements": [
        "Any static server",
        "Desktop or phone browser with WebGL2; a Canvas 2D particle fallback draws the same shapes"
      ],
      "package": {
        "kind": "zip",
        "slug": "sillage",
        "url": "api/pack?slug=sillage",
        "bytes": 1924574,
        "sha256": "ed8c7e2582fc04e6aef4afac9f54749360866433a6845f44079091e1be0212ae",
        "version": "2026-09-20"
      },
      "attribution": [
        {
          "what": "Fraunces",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/google/fonts/tree/main/ofl/fraunces",
          "keep": "Keep assets/OFL-Fraunces.txt"
        },
        {
          "what": "Geist",
          "source": "Google Fonts",
          "licence": "SIL OFL 1.1",
          "url": "https://github.com/google/fonts/tree/main/ofl/geist",
          "keep": "Keep assets/OFL-Geist.txt"
        },
        {
          "what": "The campaign photograph",
          "source": "Generated for this concept; fictional model and fictional fragrance",
          "licence": "Part of the pack; no third-party photograph was used",
          "keep": "assets/campaign.png, described in ASSETS.md"
        },
        {
          "what": "The seven drawings",
          "source": "Authored Canvas 2D path commands in mist.js",
          "licence": "Part of the pack; no traced or third-party art",
          "keep": "Nothing to credit"
        }
      ],
      "verification": {
        "build": "2026-09-20",
        "date": "2026-09-20",
        "what": "Driven headlessly over the GPU at 1440x900 and 390x844: the spray, pointer drawing, all six drawings and the signed ending, with no console or page errors. Reduced-motion and WebGL2-disabled runs exercised separately; the Canvas fallback draws the same shapes. Archive extracted into an empty folder and its bytes and sha256 matched against the .sha256 sidecar."
      },
      "updates": "Free; the archive is re-hashed whenever its bytes change",
      "focal": {
        "card": "62% 40%",
        "detail": "58% 42%"
      },
      "notSupported": [
        "Replacing the photograph with one that has no empty half: the air needs somewhere to draw, and the nozzle has to point into it",
        "A scroll: the site is one fixed frame by design and has no second screen to scroll to"
      ]
    }
  ]
}
