1实现原理 · 为什么它能做到
这是一条「模板即成品」的路线:一条固定 1920×1080 @60fps、10.35 秒的构图,运动被锁死(关键帧首尾相叠、零死帧),agent 只填数据 token 后渲染——时间轴**不允许改**,改动面只有数据。
One fixed 1920×1080 @ 60fps, 10.35s composition. The motion is locked and doctrine-verified (overlapped keyframes end to end, zero dead frames): do NOT edit the timeline — fill the data tokens and render.
三步流程且第二步之后没有构图工作:① 采数据(name/handle/joined/followers/following/posts/一行 bio/400×400 头像)② node build.mjs 从模板生成项目 ③ npx hyperframes render 出 MP4(若宿主对渲染有门禁,先问用户)。
1. **Gather profile data** — name, handle, joined month/year, followers, following, posts, one bio line, and the 400×400 avatar.
渲染前置条件写得很直白:Node 18+ 与 npx 拉取的 HyperFrames CLI(@latest 会漂移,要 byte-identical 重渲就 pin 版本);WebGL 点阵地面建议 macOS 硬件 GPU 渲染;签名用 macOS 系统字体 Snell Roundhand(src: local(...)),Linux 退化到通用 cursive——仍可用,只是没那么好看。
macOS GPU render for the WebGL dot ground: `export PRODUCER_BROWSER_GPU_MODE=hardware`.
数据注入是「不可信输入」处理:build.mjs 有必填列表,handle 必须匹配 ^[A-Za-z0-9_]{1,15}$,joined 必须形如 "JAN 2026" 并派生出 ISS MM/YYYY,计数只接受纯非负整数(显式拒绝符号/小数/指数/NaN/逗号,因为它们会落进构图的 <script>),文本字段去控制字符并限长,所有字符串 HTML 转义后再替换 {{TOKEN}},最后还检查有没有残留 token。
// counters land inside the composition's <script>: accept ONLY plain … // non-negative integers (no signs, fractions, exponents, NaN, commas)
写盘有边界:--out 建好 assets/ 与 renders/ 后取 realpath,此后每个路径都必须解析在 out 实路径内(safePath),并且一开始就拒绝符号链接目标;模板相对脚本自身解析、--out 相对工作目录解析;头像文件不存在直接报错。
// after mkdir, every path we touch must resolve inside the real out dir
模板内部结构固定:数据 token 落在文本节点(NAME_BIG / NAME_SIG / HANDLE_UPPER / JOINED / ISS / FOLLOWERS_FMT / BIO_UPPER),计数走脚本上下文里按数值上跳;#root 写死 data-composition-id="x-license"、data-duration="10.35"、data-fps="60",时间线注册在 window.__timelines["x-license"];背面 fine print 拿 follower 数当「出生日期」调侃,长名靠加宽签名遮罩处理。
<div id="root" data-composition-id="x-license" data-start="0" data-duration="10.35" data-width="1920" data-height="1080" data-fps="60">
两条纪律与一条出身声明:数据必须真实(从活档案抓,禁止编造计数与 bio),bio 压成大写 ≤ ~65 字符并以 · 分隔,显示名异常也原样保留(例如 `|||`);品牌方面,卡面复刻 X 的标志与视觉语言属 parody/fan 内容、发布与否由用户自行判断,点阵地面是基于 Originkit Dot Matrix 观感的确定性 GLSL/WebGL 重写(不重分发其源码),simplex 噪声是标准 Ashima 实现(MIT),GSAP 从 jsDelivr 加载不 vendor。
- Data must be REAL, scraped from the live profile — never invent counts or bios.
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| network | x.com/<handle>:登出档案页(agent 用浏览器工具读显示名/Joined/Following/Followers;纯 HTTP fetch 只得 JS 壳) |
| network | pbs.twimg.com:头像图片下载(profile_images 的 _400x400 变体) |
| api | api.fxtwitter.com/<handle>:取 post 数(免费、无凭证的第三方 API) |
| cli | HyperFrames CLI(经 npx,文档写 @latest;要 byte-identical 重渲需自行 pin 版本) |
| network | cdn.jsdelivr.net:构图在 preview/render 时加载 GSAP 3.14.2(文档明说渲染并非完全离线) |
| cli | curl(取数示例:下载头像、拉 fxtwitter JSON)与 macOS 系统字体 Snell Roundhand(src: local(...),Linux 退化为 cursive) |
4风险提醒 风险提醒:黄色 · 留意使用
- 采集的是第三方公开资料 — 读 x.com 登出页 + pbs.twimg.com 头像 + fxtwitter 的 post 数;虽然是用户指定的单个档案、无凭证、无绕过检测,但仍依赖站点与第三方 API 的可接受使用边界与可用性。
- 头像与 bio 是外部内容 — 头像直接拷进项目、bio 会被压缩改写成大写展示;内容准确性与合法性由使用者判断,skill 不做核验。
- CLI 版本可变 — 文档用 npx hyperframes@latest;跨时间重渲可能不一致(文档自己建议 pin 版本以获得 byte-identical 结果)。
- 平台前提 — WebGL 点阵地面在弱 GPU / 无硬件加速环境下可能表现不佳;Linux 上签名退化为通用 cursive。
- 品牌相似度 — 卡面复刻 X 的标志与视觉语言(parody/fan 定位);对外的商标与平台政策风险由发布者承担。
- 长显示名要人看 — 文档提示显示名超过 ~14 字符时应查一次快照(签名遮罩会加宽,但仍可能出现版面异常)。
5第二遍独立确认
- [ok] 『do NOT edit the timeline』是否与模板事实一致 — #root 上写死 data-duration="10.35"、data-fps="60"、data-composition-id="x-license",时间线注册在 window.__timelines["x-license"];build.mjs 只做 token 替换,不触碰任何时间属性。模板确实锁死,agent 的改动面只有数据。
- [ok] 模板 token 与 build.mjs 的 fill 键是否一一对应 — fill 提供 NAME_BIG、NAME_SIG、HANDLE_UPPER、JOINED、ISS、FOLLOWERS、FOLLOWING、POSTS、FOLLOWERS_FMT、BIO_UPPER;模板中出现的 {{…}} 均在其中(FOLLOWERS_FMT 用于背面 fine print),且替换后有 unfilled token 检查兜底。
- [ok] 『profile 数据是不可信输入』的处理是否真存在 — cleanText(去控制字符 + 限长)、cleanCount(只收纯非负整数,显式拒绝符号/小数/指数/NaN/逗号)、handle 正则 ^[A-Za-z0-9_]{1,15}$、joined 走 MONTHS 枚举、esc() 逐字符转义、refuseSymlink() + safePath() 限定写入在 out 实路径内——逐条在源码可验。
- [ok] 端点是否都可预期、是否真的无凭证 — SKILL.md 的 Network and side effects 列表与 references/profile-data.md、模板引用一一对应;无 API key、无 cookie 读取、无 telemetry;fxtwitter 免认证且文档给了降级路径(不可用时问用户)。
- [ok] 『Rendering is NOT fully offline』是否属实 — 模板 <head> 第 6 行就有 jsDelivr 的 [email protected] 引用,preview/render 时构图会去取——与文档声明一致,不是夸大也不隐瞒。
- [unlocatable] 10.35s 与 flip ~6.5s / leap ~9.9s 的时刻声明 — 这些时刻来自文档叙述与模板属性,本次只读侦查未渲染核对;且文档用的是 @latest 的 CLI(版本未固定),故这些时刻只对该 pin commit 的模板有效,不作为已核事实。
6结论
6e227bb6839e972c…ba7a0bb6d3