scroll-craft
A skill a coding agent loads before it designs anything, carrying a full written standard — eight mutually exclusive page grammars, a required signature move, a feeling curve, one engineered peak, floors for type, spacing, colour and depth — plus a frozen scroll engine and a headless pass that checks the finished page at every scroll position.

What it is
A skill a coding agent loads before it designs a page, assembled by one person and carrying a whole written standard with it: eight mutually exclusive page grammars, a required signature move, a feeling curve that has to exist before any act does, one engineered peak, floors for typography, spacing, colour and depth, and a fingerprint registry that rejects a new build unless it differs from the pages already made on at least four of six dimensions. Beside the rules sit a scroll engine that is never edited per project and seven scripts — a doctor, an encoder, a local server, a workspace manager and a headless verification pass among them — that walk the finished page at every scroll position. It ships as a Claude Code plugin, and as a folder any agent with file access can read.
Who built itNate Herk, on the GitHub account nateherkai. The material holds no biography — no employer, location or other project — so the record is the repository itself: 16 commits in forty days, every one of them his, and a contributor list with one name on it. Twelve of the sixteen commits carry a co-author trailer naming a Claude model rather than a person — Opus 5 on seven, Opus 4.8 on two, and Opus 5.5, Fable 5 and Fable 5.1 once each. The repository has 2,877 stars, 418 forks and 23 watchers, and the README’s showcase of three builds includes a portfolio page under his own name.
How it is put together
The parts · 6A skill rather than a program: the deliverable is a written standard, a frozen engine and a set of checks, and the building is done by whatever agent loads it. The shape follows from two commitments. The engine is the mechanism and is never edited per project — theme it with six colour tokens and two fonts, write your own semantic HTML, drive anything bespoke off the --sc-p custom property it publishes — because a runtime that builds the page from a config object is, in the README’s words, “exactly why every site built on one looks the same”. And repetition is treated as the thing to measure, so a workspace keeps your builds beside a fingerprint registry, FINGERPRINTS.md, that a new page has to clear against your own earlier ones. Everything else in the tree is one of three things: references that state the standard in prose, scripts that measure the result, or packaging that lets the same folder be read by Codex, Claude Code and anything else with file access.
- SKILL.md and the plugin shell
- The procedure the agent follows — brief, grammar, score, build, verify — at 24,993 bytes, the largest single document in the skill. Around it sits the packaging that makes the folder installable as a Claude Code plugin:
plugins/nateherk-design/.claude-plugin/plugin.json(494 bytes) and a marketplace file at.claude-plugin/marketplace.json(600 bytes). - references/
- Twelve files, 173,291 bytes, holding the standard itself:
devices.md(26,648) for the nine scroll devices and the cue contract,verify.md(24,189) for the harness and what it cannot tell you,uniqueness.md(23,527) for the eight grammars and the fingerprint gate,taste.md(14,874) for the design floor,feel.md(13,181) for the feeling curve and the engineered peak,assets.md(13,194),approved-collection.md(11,650),worldflight.md(16,155) andworlds.md(8,046) for continuous-world mode and art direction,hero-depth.md(6,260),template.html(6,418) as a starting skeleton rather than a layout, anddevice-diag.html(9,149) for real-device diagnosis. - engine/
- Two files and the rule that matters most:
scrollcraft.jsat 62,176 bytes andscrollcraft.cssat 19,769, described in the tree as the mechanism, never edited per project. It is themed through six colour tokens and two fonts, and exposes--sc-pas the hook for bespoke behaviour. - scripts/
- Seven files, 71,783 bytes, and the verification half of the product:
shoot.mjs(33,472) for the headless scroll-and-contrast pass,worldflight-assert.mjs(13,115) to assert the continuous-world mode,kie.mjs(7,780) for optional asset generation,doctor.mjs(7,281) to catch the three misleading setup faults before anything else,workspace.mjs(3,707) to resolve and seed the workspace,encode.sh(3,222) to encode clips so they scrub rather than play, andserve.mjs(3,206) to serve a build locally. - templates/FINGERPRINTS.md and the workspace
- The empty registry a new workspace is seeded from, 2,387 bytes. Your builds and that registry live in one resolved directory —
SCROLLCRAFT_HOME, else the nearest.scrollcraft.jsonwalking upwards, else<project root>/scrollcraft— with pages in<workspace>/builds/<name>/. The README states that the registry starts empty and that this is correct: the gate exists to stop you repeating yourself, so the first build has nothing to clear. - EXAMPLES.md and CHANGELOG.md
- Two documents larger than the skill file, both kept as evidence rather than as specification:
EXAMPLES.mdat 37,262 bytes is the author’s own twelve-row fingerprint table, included so a reader can see what a filled registry looks like and which shapes tend to collide, and described as illustration rather than constraint;CHANGELOG.mdat 35,142 bytes records what broke on each build and the rule that came out of it. Neither was read for this record; both are known by name and size only.
Choices, and what they beat
Freeze the engine and theme it with tokens over a runtime that assembles the page from a config object
The README gives the reason as an observation about output rather than a preference: “A runtime that builds the page from a config object is exactly why every site built on one looks the same.” The engine is therefore never edited per project — six colour tokens, two fonts, your own semantic HTML, and
--sc-pfor anything bespoke.Gate a new build against the author’s own earlier pages over judging each page on its own
A build has to differ from every page already made on at least four of six dimensions — grammar, nav, hero, act shape, close, signature move — and “fail it and you change the plan, not the record”. The registry starts empty on purpose, and the twelve-row
EXAMPLES.mdis offered as an illustration of a filled one rather than as a rule.Eight grammars that forbid each other over one flexible page skeleton with variations
The eight shapes — filmic one-shot, chaptered editorial, live surface, continuous world, typographic poster, gallery, split stage, rhythmic cutlist — are defined so that “each one forbids what the others require, so two builds cannot quietly converge”. It is a mechanism against convergence rather than a style guide.
Machine checks plus a contact sheet over trusting the build’s own account of itself
The harness walks every scroll position and waits for the video playhead to settle before grading dead scroll, faded cues, per-line composited contrast and clips that never decoded — then writes a contact sheet, because “a machine can prove a page works and cannot tell you it means anything”. The judgement is handed back to a human rather than automated.
Working from your own footage as a first-class route over requiring generated assets
KIE_AI_API_KEYis optional and the README says why: “Building from your own photos and footage needs no key and no spend, and it is a first-class route.” The limitation is stated with it — a ten-leg continuous-world flight is a real spend.
Read fromREADME.md (12,764 characters, fetched in full from the raw file on the default branch on 2026-10-01), the complete 34-file tree with sizes, the sizes of plugins/nateherk-design/.claude-plugin/plugin.json (494 bytes) and .claude-plugin/marketplace.json (600), and the bodies of the nine issues and pull requests. SKILL.md (24,993 bytes), CHANGELOG.md (35,142), EXAMPLES.md (37,262), the twelve files under references/ (173,291 bytes together), engine/ (81,945) and scripts/ (71,783) are known only by name and size; their contents were not read.
Build log
5 stages- 01
Sixteen commits in forty days, and a version line kept in a changelog
The repository was created on 2026-08-22T15:25:08Z and its first commit landed nine minutes later, titled
Initial commit: scrollcraft as a Claude Code plugin. The last one, dated 2026-09-30T13:31:41Z, isSecurity and Windows fixes, engine teardown (0.3.1). That is the entire history: sixteen commits in forty days, eight in August and eight in September, all authored by the same person under the same linked account, with him as the only contributor listed. Twelve of the sixteen carry a co-author trailer naming a model rather than a person — Claude Opus 5 on seven, Opus 4.8 on two, and one each for Opus 5.5, Fable 5 and Fable 5.1. Around it sit 2,877 stars, 418 forks, 23 watchers and five open reports, on a 10,220 KB JavaScript repository under MIT. What is absent is as telling: no GitHub releases at all, and one tag,nateherk-design--v0.2.0. The version line lives elsewhere. The README announces 0.3.0 as a milestone but points anyone wanting the history atCHANGELOG.md— 35,142 bytes, larger than the skill file itself — describing it as recording “what broke on each build and the rule that came out of it, rather than a feature list”. - 02
The standard was read off ten sites that had already shipped
Version 0.3.0 is called “the approved ten-site standard”, and it is the process behind ten sites built first: AI Automation Society, PERKFORM, Glaido, Herkules Advisory, Serein, FORME, Pelagic, NOEMA, OFFGRID and Afterhours. Three of them are shown with screenshots kept in the repository — a dark editorial community landing, a high-key portfolio for the author himself, and PERKFORM, a protein-coffee page built as a filmic one-shot — and the claim attached to them is that these are not themes but “different page grammars, different navigation models, different endings”, with the same skill and the same engine behind all three. What the pass added is a checklist rather than a look: independent depth planes with contact anchors and separate opening, midpoint and exit states; authentic brand assets and verified product details used before any imagery is generated; a deliberate choice between photographic compositing and real 3D; navigation, information order, useful controls and an ending authored per site; and phones art-directed separately with the actual scroll frames, fallbacks and packages verified. It is carried by
references/approved-collection.md(11,650 bytes) andreferences/hero-depth.md(6,260). Two limits are stated: client assets and private form data are not bundled, and the ten-site rebuild was done with Codex rather than the Claude Code plugin. - 03
Numbers instead of adjectives, and a gate aimed at your own last build
The standard is written as measurable constraints rather than taste. Typography: two families maximum, tracking that tightens as size grows, a 45 to 75 character measure, line height inverse to measure, light-on-dark compensated on three axes. Spacing: a 4px base, more space above a heading than below it, fluid section padding. Colour: six roles and one accent, secondary text tinted rather than flat grey, no pure black, with a documented escape for hard light-and-dark cuts. Depth: five separate tools — offset shadows, edge light, scale-and-blur as distance, overlap and grain. Structure: eight deliberately incompatible grammars — filmic one-shot, chaptered editorial, live surface, continuous world, typographic poster, gallery, split stage and rhythmic cutlist — of which the README says each one “forbids what the others require, so two builds cannot quietly converge”. Every build also owes one bespoke signature move, and “a recoloured spotlight does not count”. Enforcement is a fingerprint gate: a new build must differ from every page already made on at least four of six dimensions — grammar, nav, hero, act shape, close, signature move — and “fail it and you change the plan, not the record”. A refuse list carries the negative baseline: identical feature-card grids,
01 / 06counters, scroll cues, gradient text, invented statistics, fake dashboards, AI-purple gradients and the cream-and-brass artisan palette. - 04
A frozen engine, a headless walk, and a contact sheet
Under the prose sits one hard rule: the engine is the mechanism and is never edited per project. Themed with six colour tokens and two fonts, with your own semantic HTML written against it, and anything bespoke driven off the
--sc-pcustom property the engine publishes — because, the README argues, a runtime that builds the page from a config object is “exactly why every site built on one looks the same”. The engine is two files,scrollcraft.jsat 62,176 bytes andscrollcraft.cssat 19,769. The checking half isscripts/, seven files and 71,783 bytes, of whichshoot.mjsat 33,472 bytes is the largest script. A headless browser walks the finished page at every scroll position and waits for the video playhead to settle before reporting four named faults: dead scroll, cues that never reach full opacity, contrast measured on the composited page line by line at the brightest frame that ever passes under it with the direction picked per line, and “legs stuck on a poster” — a clip that silently never decoded. It then writes a contact sheet, because “a machine can prove a page works and cannot tell you it means anything”.doctor.mjs(7,281 bytes) exists because three setup faults otherwise surface as misleading errors later: a stripped ffmpeg reporting a missing filter as a syntax error in your own command, a missing WebP muxer as a bad filename, andplaywright-coreresolving from the wrong directory. - 05
Nine reports from strangers, and the three that became 0.3.1
Nine issues and pull requests sit on the repository, filed by nine different accounts, and not one of those names appears in the contributor list, which holds a single entry. The earliest is a documentation-versus-runtime drift: the engine reads
data-sc-kineticonly from the element that also carriesdata-sc-cue(engine/scrollcraft.js:373and:869), whilereferences/template.html:58-59and thescrubexample inreferences/devices.md:30-31put the attribute on a child, so the mode was silently ignored. Four others are packaging and platform work: installation through theskillsCLI, support for agents beyond Codex and Claude Code, a skill description cut from 1,175 to 414 characters to fit a loader limit, and Chromium crashing whenshoot.mjsruns as root on Linux. The final commit,Security and Windows fixes, engine teardown (0.3.1), names the three that remained. The teardown report came from someone vendoring the engine into a Phoenix LiveView app:mount()registers five gesture listeners onwindowpluspointermove, a scroll read loop andfocusin, all anonymous and none of them removed, so a host that swaps the DOM without a page load accumulates listeners and two animation-frame loops; a follow-up added thatdocumentElementkeeps--sc-seg,--sc-segpand--sc-canvasafter teardown. A Windows report found the Edge fallback looking inProgram Files\Microsoft\Edge, where the stable channel never lands on x64, in three scripts at once. The last one, againstscripts/serve.mjs, listed three faults: the server binding every interface, the path check missing its separator, and a malformed URL killing the process insidedecodeURIComponent.
Adjacent records
All records →No. 088
sepia
A portable de-AI writing skill: four operations over one canonical rules file, narrative architecture repaired before word choice on fiction, a thin rule file matched to the venue on professional prose, and every rule labelled as measured, consulted or the project’s own inference.
No. 072
video-shotcraft
An agent skill that turns Claude Code or Codex into a motion-design studio: 157 shot recipe cards carrying the real easing and timing values, 214 motion previews, a validated 36.2-second template film, 149 sound effects filed by scene, and a browser workbench that reopens the delivered film for editing.
No. 060
makerskills
Twenty-one agent skills for running a one-person business — decide, unstuck, maker-council, deep-research, second-brain, company-brain, domain, jab-hook, pm, personal-cfo and the rest — each one a Markdown workflow document rather than a program, installed into Claude Code, Codex, Cursor or any host that reads the Agent Skill format, with every piece of personal state kept in a config directory the repository never touches.