
这是什么
一个编码 agent 在动手设计页面前先读的技能,由一个人做出来,并且自带一整套写下来的标准:八种互斥的页面语法、一次必须原创的标志性交互、一条必须在任何段落存在之前就先写出来的情绪曲线、一个被工程化的最高点,以及排版、间距、色彩、纵深四条底线;还有一份指纹台账,新建的页面若不能在六个维度里至少四个上与已做过的页面拉开距离,就会被挡回来。规则旁边是一个从不按项目改写的滚动引擎,以及七个脚本——体检、编码、本地服务、工作区管理与一趟无头验证都在里面——它们会走遍成品页面的每一个滚动位置。它以 Claude Code 插件的形式发布,同时也是一个任何有文件权限的 agent 都能直接读的目录。
谁做的Nate Herk,GitHub 账号是 nateherkai。材料里没有他的任何生平——没有雇主、地点,也没有别的项目——所以这条记录只能由仓库本身构成:四十天里 16 次提交,每一次都是他署名的,贡献者列表上只有一个名字。16 次里有 12 次带着一条共同作者尾注,写的不是人而是模型——Opus 5 七次、Opus 4.8 两次,Opus 5.5、Fable 5 与 Fable 5.1 各一次。仓库有 2,877 个星、418 个 fork、23 个 watcher,而 README 展示的三个成品里,有一个是以他自己的名字命名的作品集页面。
它是怎么搭起来的
组成 · 6这是一个技能而不是一个程序:交付物是一份写下来的标准、一个被冻结的引擎和一组检查,真正的构建由加载它的 agent 完成。形状来自两个承诺。其一,引擎是机制,从不按项目改写——用六个色彩 token 和两个字族做主题化,自己写语义化 HTML,任何定制都走它发布的 --sc-p 自定义属性——README 的理由是:一个从配置对象生成页面的运行时,「exactly why every site built on one looks the same」。其二,重复被当成需要测量的失败,于是工作区把构建产物和一份指纹台账 FINGERPRINTS.md 放在一起,新页面必须先通过它、和自己的旧页面对比过才算数。树里剩下的东西只有三类:用散文陈述标准的参考文档、测量结果的脚本,以及让同一个目录能被 Codex、Claude Code 和任何有文件权限的 agent 读到的打包件。
- SKILL.md 与插件外壳
- agent 要照做的流程——brief、grammar、score、build、verify——24,993 字节,是技能里最大的单份文档。周围是让它能作为 Claude Code 插件安装的打包件:
plugins/nateherk-design/.claude-plugin/plugin.json(494 字节)与.claude-plugin/marketplace.json(600 字节)。 - references/
- 十二个文件、173,291 字节,标准本身就在这里:
devices.md(26,648)讲九种滚动设备与 cue 契约,verify.md(24,189)讲巡检工具与它答不了的问题,uniqueness.md(23,527)讲八种语法与指纹闸门,taste.md(14,874)讲设计底线,feel.md(13,181)讲情绪曲线与被工程化的最高点,assets.md(13,194)、approved-collection.md(11,650)、worldflight.md(16,155)与worlds.md(8,046)分别讲素材、十站流程、连续世界模式与美术指导,hero-depth.md(6,260),template.html(6,418)是起手骨架而不是版式,device-diag.html(9,149)用于真机诊断。 - engine/
- 两个文件,以及那条最重要的规则:
scrollcraft.js62,176 字节、scrollcraft.css19,769 字节,树里的说明是「机制,从不按项目改写」。它通过六个色彩 token 与两个字族做主题化,并把--sc-p作为定制行为的接口。 - scripts/
- 七个文件、71,783 字节,是这套产品的验证那一半:
shoot.mjs(33,472)做无头滚动与对比度巡检,worldflight-assert.mjs(13,115)断言连续世界模式,kie.mjs(7,780)负责可选的素材生成,doctor.mjs(7,281)在一切之前抓出三种会伪装成别的问题的配置毛病,workspace.mjs(3,707)解析并初始化工作区,encode.sh(3,222)把片子编码成可被滚动擦洗而不是直接播放,serve.mjs(3,206)在本地把构建产物服务起来。 - templates/FINGERPRINTS.md 与工作区
- 新工作区从这份空台账开始,2,387 字节。构建产物与台账放在同一个被解析出来的目录里——
SCROLLCRAFT_HOME,否则向上找最近的.scrollcraft.json,再否则<项目根>/scrollcraft——页面落在<workspace>/builds/<name>/。README 特意说明台账一开始是空的,而且这是对的:这道闸门是为了拦住你重复自己,所以第一次构建没有什么需要清空。 - EXAMPLES.md 与 CHANGELOG.md
- 两份比技能文件还大的文档,都当证据而不是规范保留:
EXAMPLES.md37,262 字节,是作者自己的十二行指纹表,放出来是为了让人看到填满的台账长什么样、哪些形状容易撞车,README 把它定性为示例而非约束;CHANGELOG.md35,142 字节,记的是每次构建坏了什么、由此得出哪条规则。这两份都没有为本记录读过,只知道名字和体积。
取舍,以及它替代了什么
冻结引擎,只让它接受 token 主题化 替代 一个从配置对象拼出页面的运行时
README 给的理由是对产出的一句观察,而不是偏好:「A runtime that builds the page from a config object is exactly why every site built on one looks the same.」所以引擎从不按项目改写——六个色彩 token、两个字族、自己写语义化 HTML,定制一律走
--sc-p。让新页面和作者自己的旧页面过闸 替代 每一页单独评判
新页面必须在语法、导航、首屏、幕形、收尾、标志性交互这六个维度里至少四个上,和已经做过的每一页都不同,而且「fail it and you change the plan, not the record」。台账一开始是空的,而那份十二行的
EXAMPLES.md只是填满后的样子,不是规则。八种互相禁止的页面语法 替代 一套灵活骨架加若干变体
八种形态——电影感一次性长页、分章社论、活界面、连续世界、字体海报、画廊、分屏舞台、节奏化剪辑单——被定义成「each one forbids what the others require, so two builds cannot quietly converge」。这是一台防收敛的机器,而不是一本风格指南。
机器检查加一张接触印相 替代 相信构建过程自己对结果的陈述
巡检会走遍每一个滚动位置,并等视频播放头稳定下来,才去评空滚、永不显形的提示文字、按行在合成页面上测出的对比度,以及从未解码的片子;之后写一张接触印相,因为「a machine can prove a page works and cannot tell you it means anything」。判断被交回给人,而不是自动化掉。
把「用自己拍的素材」当成一等路线 替代 要求必须生成素材
KIE_AI_API_KEY是可选的,README 写了原因:「Building from your own photos and footage needs no key and no spend, and it is a first-class route.」限制也一并写明——一次十段的连续世界飞行是真花钱。
依据README.md(12,764 字符,2026-10-01 从默认分支的原始文件取到全文)、完整的 34 个文件树及其体积、plugins/nateherk-design/.claude-plugin/plugin.json(494 字节)与 .claude-plugin/marketplace.json(600 字节)的体积,以及九个 issue 与 pull request 的正文。SKILL.md(24,993 字节)、CHANGELOG.md(35,142)、EXAMPLES.md(37,262)、references/ 下十二个文件(合计 173,291 字节)、engine/(81,945)与 scripts/(71,783)都只有名字和体积,内容未读。
制作过程
5 个阶段- 01
四十天十六次提交,版本史写在 changelog 里
仓库建于 2026-08-22T15:25:08Z,第一次提交在九分钟之后落地,信息是
Initial commit: scrollcraft as a Claude Code plugin;最后一次是 2026-09-30T13:31:41Z,信息是Security and Windows fixes, engine teardown (0.3.1)。这就是全部历史:四十天里 16 次提交,八月八次、九月八次,全部由同一个人、同一个关联账号署名,贡献者列表上只有他一个。16 次里有 12 次带着共同作者尾注,写的是模型而不是人——Claude Opus 5 七次、Opus 4.8 两次,Opus 5.5、Fable 5、Fable 5.1 各一次。周围是 2,877 个星、418 个 fork、23 个 watcher 和五个未关闭的报告,仓库 10,220 KB,语言一栏写着 JavaScript,许可证 MIT。缺的那部分同样说明问题:一个 GitHub release 都没有,标签只有一个,叫nateherk-design--v0.2.0。版本线不在那儿。README 把 0.3.0 当成一个里程碑来讲,但想知道历史的人会被指去CHANGELOG.md——35,142 字节,比技能文件本身还大——并被告知它记的是「what broke on each build and the rule that came out of it, rather than a feature list」。 - 02
标准是从十个已经上线的站点里读出来的
0.3.0 被称作「the approved ten-site standard」,内容是先做出来的十个站点背后的流程:AI Automation Society、PERKFORM、Glaido、Herkules Advisory、Serein、FORME、Pelagic、NOEMA、OFFGRID 与 Afterhours。README 里链了一段五十秒的走查视频,另有三张截图存在仓库里——AI Automation Society 是一个 45 万人社区的深色社论式首页,一个亮调的、给作者本人做的作品集页面,以及 PERKFORM 这个蛋白咖啡品牌的一次性电影感长页。README 对它们的说法是:这不是三套主题,而是「different page grammars, different navigation models, different endings」,三者背后是同一个技能、同一个引擎。这一版加进去的不是外观,而是一张清单:各自独立的纵深平面与接触锚点,开场、中点、退场三种状态分开设计;先用真实品牌资产与核实过的产品细节,再决定要不要生成图像;在照片合成与真 3D 渲染之间明确选一种;导航、信息顺序、有用的控件和结尾逐站单独写;手机端单独做美术指导,并核验真实的滚动帧、回退与打包;遇到明确的创意授权就不再多问一轮。承载它的参考文档是
references/approved-collection.md(11,650 字节),旁边是references/hero-depth.md(6,260 字节)。两条边界被明确写出来:客户素材与私有表单数据不打进仓库,而这次十站重建用的是 Codex,不是 Claude Code 插件。 - 03
用数字代替形容词,还有一道对着自己上一版作品的闸门
README 开篇先点名 AI 网站通常的两种失败——规矩但记不住,或者动效花哨却配着 2.1:1 的正文对比度、标题在手机上折成六行——然后把这套标准写成可量化的约束,而不是品味。排版:最多两个字族,字号越大字距越紧,行宽 45 到 75 字符,行高与行宽成反比,浅字压深底要在三个轴上做补偿。间距:4px 基准,标题上方的留白多于下方,区块内边距用流体值,免得手机继承桌面端的空旷。色彩:六个角色加一个强调色,次级文字用带色偏的灰而不是平灰,不用纯黑,并且为那些在明暗底之间硬切的页面留了一条写明了的例外。纵深:五种各管一段的工具——偏移投影、边缘光、以缩放加模糊表达距离、叠压、颗粒。结构:八种刻意互不相容的页面语法——电影感一次性长页、分章社论、活界面、连续世界、字体海报、画廊、分屏舞台、节奏化剪辑单——README 说它们「each one forbids what the others require, so two builds cannot quietly converge」。每次构建还欠一次原创的标志性交互,而「a recoloured spotlight does not count」。执行靠一道指纹闸门:新页面必须在语法、导航、首屏、幕形、收尾、标志性交互这六个维度里至少四个上,和已经做过的每一页都不一样,而且「fail it and you change the plan, not the record」。一份拒绝清单则承担了反向基准:一模一样的特性卡片网格、
01 / 06计数、滚动提示、渐变文字、破折号、编造的统计数字、假仪表盘、AI 紫渐变,以及每个手作品牌都会用的奶油色配电镀黄铜。 - 04
一个不许改的引擎、一趟无头巡检,和一张接触印相
散文之下只有一条硬规则:引擎是机制,从不按项目改写。它用六个色彩 token 和两个字族做主题化,页面由使用者自己写语义化 HTML,任何定制都走引擎发布的
--sc-p自定义属性——README 给的理由是:一个从配置对象生成页面的运行时,「exactly why every site built on one looks the same」。引擎本身是两个文件,scrollcraft.js62,176 字节、scrollcraft.css19,769 字节。负责检查的另一半是scripts/,七个文件、71,783 字节,其中shoot.mjs33,472 字节,是整个仓库里仅次于技能文件的第二大文件,worldflight-assert.mjs13,115 字节排第三。一个无头浏览器会走遍成品的每一个滚动位置,等视频播放头稳定下来之后再报出四类有名字的毛病:空滚(滚了但屏幕上什么都没变)、永远到不了全不透明的提示文字、按行在合成后的页面上量出的对比度(取那一行上方经过的最亮一帧,逐行决定方向,明底深字与深底浅字都能正确评级),以及「腿卡在海报上」——一段静默地从未解码的片子,看起来和暂停的电影一模一样。之后它写一张接触印相,因为「a machine can prove a page works and cannot tell you it means anything」。开工前先体检:doctor.mjs(7,281 字节)存在的原因,是三种常见毛病否则都会在更晚的时候伪装成别的错误——被裁剪过的 ffmpeg 会把缺失的滤镜报成你自己命令里的语法错误,缺 WebP 封装器会报成一个坏文件名,playwright-core会从错误的目录被解析到。构建产物与台账放在同一个被解析出来的工作区里:SCROLLCRAFT_HOME,否则向上找最近的.scrollcraft.json,再否则<项目根>/scrollcraft。 - 05
九个陌生人报的问题,和进了 0.3.1 的那三个
仓库上有九个 issue 与 pull request,由九个不同账号提交,而这九个名字没有一个出现在贡献者列表里——那张表只有一个条目。最早的一条是文档与运行时的漂移:引擎只从同时带
data-sc-cue的那个元素上读data-sc-kinetic(engine/scrollcraft.js:373与:869),而references/template.html:58-59与references/devices.md:30-31里的scrub示例都把属性放在子元素上,于是那个模式被静默忽略。另外四条是打包与平台:通过skills命令行安装、支持 Codex 与 Claude Code 之外的 agent、把技能描述从 1,175 字符砍到 414 字符以躲开某个加载器超过 1,024 就报警的门槛,以及在 Linux 上以 root 跑shoot.mjs时 Chromium 直接崩溃。最后一次提交的信息写着Security and Windows fixes, engine teardown (0.3.1),点的正是剩下的那三件。拆解泄漏那一条来自一个把引擎搬进 Phoenix LiveView 应用的人:mount()在window上注册了touchstart、touchend、pointerdown、click与scroll,另有pointermove、一个滚动读取循环和focusin,全部是匿名处理函数、没有任何地方注销,于是在一个会换掉 DOM 却不重新加载页面的宿主里,监听器和两个动画帧循环只增不减;同一位报告者补充说,即便拆解之后documentElement上仍留着--sc-seg、--sc-segp与--sc-canvas。一条 Windows 报告发现 Edge 回退路径找的是Program Files\Microsoft\Edge,而 x64 上稳定版从不装在那里,而且是三个脚本同时写错。最后一条针对scripts/serve.mjs,带复现命令列了三个毛病:服务监听所有网卡,于是同一个 Wi-Fi 上的人都能读构建目录;路径检查少了一个分隔符,服务一个构建目录时把隔壁那个也一起服务了;一个畸形 URL 会在decodeURIComponent里把进程打死。修法提示和验收标准都是这位报告者自己写好的。
相关档案
全部档案 →第 088 号
sepia
一个可移植的去 AI 味写作技能:一套规则文件配四个操作,小说先修叙事结构再谈用词,专业文稿按场合套一份薄薄的规则文件,而每条规则都标着它是被测出来的、被咨询过的,还是这个项目自己的推断。
第 072 号
video-shotcraft
一个把 Claude Code 或 Codex 变成动态设计工作室的 agent 技能:157 张写着真实缓动与时间参数的镜头配方卡、214 段动效预览、一支验证过的 36.2 秒模板片、149 个按场景归档的音效,以及一个把交付后的成片重新打开供人修改的浏览器工作台。
第 060 号
makerskills
二十一个给个人经营者用的 agent 技能——decide、unstuck、maker-council、deep-research、second-brain、company-brain、domain、jab-hook、pm、personal-cfo 等等——每一个都是一份用 Markdown 写的工作流文档,而不是一个程序;装进 Claude Code、Codex、Cursor 或任何认 Agent Skill 格式的环境就能用,而所有个人数据都放在仓库碰不到的一个配置目录里。