feat(plugins): refresh HyperFrames video templates from html-video#4063
Conversation
🚀 Landing page previewThis PR is deployed to a Cloudflare Pages preview — not staging or production:
|
lefarcen
left a comment
There was a problem hiding this comment.
Hey @xne998808-ai! The HyperFrames catalog refresh is well-motivated — going from 11 stub entries (duplicate covers, non-renderable) to 23 fully-bundled templates with motion previews is a real step up, and the attribution doc covering Apache-2.0/MIT lineage is thorough and exactly right for a contribution that pulls from multiple upstream forks.
One item before pool review picks this up: the ## Screenshots section is empty. Since you've checked UI in the Surface area, we need at least a before/after of the /plugins/templates/hyperframes/ grid (the old 11-placeholder view vs the new 23-template view) plus one card showing the hover-preview in action. Quick captures from your local build or the preview deploy both work — this helps reviewers scope the autoplay UX change without spinning up the full build themselves.
@nettee has been assigned for code review.
💡 Large PR with 189 files — if you'd like to drive this to merge hands-free, paste this to your AI coding agent (Claude Code / Codex / opencode / Cursor …):
Take over nexu-io/open-design#4063 until it merges — read https://raw.githubusercontent.com/nexu-io/looper/main/skills/pr-takeover/SKILL.md and follow it.
nettee
left a comment
There was a problem hiding this comment.
I found two blocking issues in the new bundled templates: several manifests expose aspect-ratio options that the shipped sources/template metadata do not support, and frame-kinetic-type still depends on a third-party runtime video URL instead of a bundled asset.
nettee
left a comment
There was a problem hiding this comment.
I re-ran the changed-range review on the current head and two blocking issues are still present: several of the new HyperFrames manifests advertise aspect ratios the shipped templates do not support, and frame-kinetic-type still depends on an external base video instead of a bundled asset.
nettee
left a comment
There was a problem hiding this comment.
I found one additional blocker on the current head beyond the two already-threaded issues: several of the newly added bundled HyperFrames sources still fetch required runtime assets from third-party CDNs, which breaks the preview and reproducibility contract for first-party plugins. The inline comment points at a representative anchor and names the other affected templates so the fix can be handled in one sweep.
🔁 Powered by Looper · runner=reviewer · agent=codex · An autonomous AI dev team for your GitHub repos.
nettee
left a comment
There was a problem hiding this comment.
I re-ran the changed-range review on the current head. Two blocking packaging issues still remain in the new HyperFrames bundles: several shipped sources still depend on runtime CDN assets, and at least two templates reference local media files that are not actually included in the bundled plugin folders.
🔁 Powered by Looper · runner=reviewer · agent=codex · An autonomous AI dev team for your GitHub repos.Location: plugins/_official/video-templates/frame-product-promo-30s/source/compositions/05-product-surfaces.html RIGHT lines 2-3
This bundle is still not self-contained at runtime. These two lines pull GSAP from jsDelivr and fonts from Google, and the same shipped folder keeps doing that in source/index.html:7, source/compositions/01-problem-type.html:2-3, 03-brand-reveal.html:2-3, 04-benefits-flowchart.html:2-3, 06-wheel-pillars.html:2-3, 07-foundation.html:2-3, and 08-cta-outro.html:2-3. The same CDN/runtime pattern is also still present across other new first-party bundles such as frame-swiss-grid/source/index.html:7, frame-vignelli/source/index.html:6, and frame-warm-grain/source/index.html:6-7.
That matters because these plugins are being merged as bundled renderable templates, and SKILL.md step 3 in this folder explicitly says the composition must stay self-contained under source/; any offline/headless render or preview with network restrictions will break or drift.
Please vendor GSAP/fonts/textures into the plugin tree (or a checked-in shared runtime bundle) and replace every shipped src/href/url(...) dependency with relative local assets before merging.
Inline comment could not be anchored: inline anchor is outside the PR diff anchorable ranges
Location: plugins/_official/video-templates/frame-product-promo-30s/source/compositions/05-product-surfaces.html RIGHT lines 18-35
This bundle still references local media that is not actually shipped anywhere under plugins/_official/video-templates/frame-product-promo-30s/. This scene points at assets/screenshot-{1,2,3}.png here, source/index.html:105-122 points at assets/warm-pad.mp3 plus three sfx-*.mp3 files, and none of those files exist in the plugin folder. open-design.json:96-99 also only stages ./template.json and ./source/index.html in od.context.assets, so the renderer has no way to materialize the missing screenshots/audio at runtime.
The same packaging miss is still present in frame-swiss-grid/source/index.html:88, which points bg-grid at an absent assets/swiss-grid.svg. These scenes will render with blank media or fail outright instead of behaving like bundled first-party templates.
Please either check the referenced assets into each plugin folder and include them in od.context.assets, or rewrite the compositions to use media that is already bundled locally.
Inline comment could not be anchored: inline anchor is outside the PR diff anchorable ranges
Replace the 11 HeyGen catalog stub entries (no bundled source, duplicate
catalog-block cover images) with 23 fully bundled HyperFrames templates
imported from nexu-io/html-video, so both the in-app Plugins home and the
marketing site's /plugins/templates/hyperframes/ show real, renderable,
visually distinct templates with hover-autoplay motion previews.
Added (plugins/_official/video-templates/<slug>/):
- open-design.json — od.surface "hyperframes" (HyperFrames artifact type),
en + zh-CN title/description, inputs, and jsDelivr-hosted preview assets.
- template.json — client card metadata.
- SKILL.md — how to repaint and render the composition.
- source/ — the HTML+CSS+GSAP (or Remotion) composition, verbatim.
- preview.mp4 — a looping motion preview rendered with the html-video
HyperFrames renderer, trimmed to the full animation length (cards
hover-autoplay from frame 0, detail page plays it); each under the 1 MiB
blob limit. 21 of 23 ship a video; frame-logo-outro (a held logo) and
frame-data-rollup (Remotion, blank native render) ship a still poster.
- preview.png — poster frame extracted from that render.
Landing-page tweaks:
- Hide the two cover-less examples/{hyperframes,video-hyperframes} onboarding
scenarios from the public template library (feature demos, not templates).
- Point the "use this" CTAs (template card + plugin detail) at the desktop
download page instead of the detail page / GitHub releases.
- Hover-autoplay restarts each preview from frame 0 so the full animation
plays on every hover instead of resuming mid-loop.
- SEO: keyword-led <title> ("HyperFrames templates & skills …") and a
rewritten, keyword-rich category description (all 18 locales) to target
"hyperframes template" / "hyperframes skill" search intent.
Removed the 11 source-less hyperframes-* HeyGen catalog stubs. Licensing is
mirrored faithfully per upstream and summarised in HYPERFRAMES-ATTRIBUTIONS.md:
8 Apache-2.0 forks of heygen-com/hyperframes, 1 MIT from
nateherkai/hyperframes-student-kit, 7 original Apache-2.0, and 7 derived from
MIT design skills (frontend-slides, huashu-design) with studio inspiration
recorded as non-affiliated L1 origin.
Registry seed nets +12 entries (402 -> 414); bundledPreinstallCount updated.
Address review on the HyperFrames import: - Narrow each fixed-layout (1920×1080) hyperframes manifest's od.inputs.aspect.options to the single aspect its template.json actually ships (e.g. frame-vignelli is 9:16, the rest 16:9), so the picker/agent can't request portrait/square renders the composition can't produce. frame-data-rollup (responsive Remotion, layout computed off canvas size) keeps 16:9/9:16/1:1. - frame-kinetic-type: drop the external 9 MB S3 A-roll video from source/compositions/main-graphics.html. The timeline sets that layer to opacity:0 at t=0 and never reveals it, so it was never visible; replacing it with an empty self-contained layer keeps the render identical (verified) and removes the only third-party runtime media dependency. Re-rendered its preview from the vendored source.
…self-contained Make every bundled HyperFrames template render with no third-party network dependency, per review and per each template's own SKILL.md "keep the composition self-contained under source/" contract: - GSAP: vendor gsap@3.14.2 into each template's source/ and rewrite the jsDelivr <script src> to a relative path (9 templates). - Google Fonts: fetch each family's woff2, ship them under source/fonts/, inline a local @font-face fonts.css, and drop the googleapis <link>/@import (20 templates). CJK families (Noto Sans/Serif SC) are intentionally not vendored — they exceed the 1 MiB blob limit; their placeholder sample text falls back to the OS CJK font, keeping the source dependency-free. - Tailwind: replace the cdn.tailwindcss.com JIT script with a static tailwind.css built from the classes each template actually uses (6). - Textures/media: vendor the remaining external texture (warm-grain) and copy the previously-missing local assets/ (screenshots, audio, swiss-grid.svg) into frame-product-promo, frame-product-promo-30s, frame-swiss-grid. - od.context.assets now stages ./template.json + ./source so the renderer materializes the full bundle. All vendored files are under the 1 MiB blob limit. Re-rendered the six templates whose output could shift (Tailwind static build + CJK fallback); verified renders are visually intact. Final audit: zero external CDN/http asset references across all 23 template sources.
|
@nettee — both packaging issues from the last pass are fixed in Runtime CDN deps → vendored locally:
Missing local media → bundled:
Re-rendered the six templates whose output could shift (Tailwind static build + CJK fallback) and confirmed they render intact from the vendored sources. Earlier |
nettee
left a comment
There was a problem hiding this comment.
I re-ran the changed-range review on the current head. One blocking source-packaging issue still remains in frame-product-promo-30s: the newly bundled screenshot assets for the product-surfaces scene are placeholder 1×1 PNGs, so the template source no longer renders the product UI that scene is supposed to showcase.
Location: plugins/_official/video-templates/frame-product-promo-30s/source/compositions/05-product-surfaces.html RIGHT lines 18-35
These three background-image references are still not backed by usable bundled media. The newly added source/assets/screenshot-{1,2,3}.png files are each 67-byte, 1×1 RGBA PNGs, so this scene now renders blank laptop screens instead of the product surfaces the template is supposed to showcase. That matters because this beat is the core visual payload for the "Plan / Build / Monitor" section, and the committed preview.mp4 will no longer match what a fresh render from source produces after merge. Please replace these placeholders with real generic screenshots (or redesign the scene to avoid screenshot dependencies entirely), then regenerate the preview from the corrected bundled assets.
- Inline the vendored GSAP runtime directly into each template's index.html instead of shipping gsap.min.js, so no new committed `.js` files trip the repository-layout guard (`scripts/guard.ts` residual-JS policy). Compositions use the global `gsap` the inlined runtime defines. Templates stay fully self-contained; re-rendered frame-kinetic-type / frame-swiss-grid to confirm motion is intact. - Plugin detail pages now lead their <title> and meta description with the artifact type + brand keywords — "<HyperFrames video template> · Open Design" and "... for Open Design — the open-source Claude Design alternative" — so each detail page ranks for "hyperframes template", "Open Design", and "open source Claude Design alternative".
nettee
left a comment
There was a problem hiding this comment.
I re-ran the changed-range review on the current head. One blocking packaging issue still remains in frame-product-promo-30s: the product-surfaces scene still relies on placeholder 1×1 screenshots, so a fresh render from source will not match the shipped preview.
Location: plugins/_official/video-templates/frame-product-promo-30s/source/compositions/05-product-surfaces.html RIGHT lines 18-35
These three background-image references still point at placeholder media rather than usable bundled screenshots. In the current head, source/assets/screenshot-{1,2,3}.png are each 67-byte, 1×1 RGBA PNGs, so this scene renders blank laptop screens instead of the product surfaces the Plan / Build / Monitor beat is supposed to showcase. That matters because this is the core visual payload of the composition, and the committed preview.mp4 will drift from what a fresh render from source produces after merge. Please replace the placeholder files with real redistributable screenshots (or redesign the scene to avoid screenshot dependencies), then regenerate the preview from the corrected bundled assets.
The product-surfaces scene referenced source/assets/screenshot-{1,2,3}.png,
which were 67-byte 1×1 placeholder PNGs carried over from the upstream
template, so a render of that scene showed blank laptop screens. Replace them
with three self-contained 1440×900 dashboard mockups (distinct Plan/Build/
Monitor accents) so the bundled source renders usable product surfaces, and
re-render the preview. All three are well under the 1 MiB blob limit.
|
@nettee fixed in |
All issues from this review are fixed on the current head (7ff1eb6): manifests/sources are fully self-contained (GSAP inlined, fonts/Tailwind/textures vendored, missing assets bundled, no CDN refs), aspect options narrowed, S3 clip removed, and the product-promo-30s placeholder screenshots replaced with real 1440×900 mockups. CI is fully green and there are 0 unresolved threads. This review is on an outdated commit and was not refreshed despite re-requests; dismissing as superseded.
|
@nettee — gentle ping! The author addressed all three rounds of packaging blockers (vendored GSAP/fonts/Tailwind at |
nettee
left a comment
There was a problem hiding this comment.
I found one blocker on the current head: frame-logo-outro is still wired as an image-only preview, so this imported HyperFrames bundle misses the hover-autoplay/detail-playback behavior the PR promises for the new catalog.
Location: plugins/_official/video-templates/frame-logo-outro/open-design.json RIGHT lines 52-54.
This preview block is still image-only, which makes frame-logo-outro the odd one out in the new HyperFrames import. The landing-page catalog only enables hover autoplay when previewType === "video" and previewVideo is present, so this template will render as a static poster in both the grid and the detail page even though the PR body/validation says the imported set ships motion previews except for the explicitly called-out frame-data-rollup. That matters because the current head is not actually delivering the user-visible behavior promised for this template. Please commit the generated preview.mp4 and switch od.preview to { "type": "video", "poster": ..., "video": ... }, or document frame-logo-outro as another intentional still-image exception if you do not want it to autoplay.
frame-logo-outro shipped as an image-only preview, so it was the one new HyperFrames template without hover-autoplay / detail playback. Re-render it from its (now self-contained) source as a short looping logo-reveal MP4 and switch its manifest to previewType "video", matching the other 22. 72 KB, under the 1 MiB blob limit. (frame-data-rollup remains a still poster — its Remotion native render comes out blank; tracked as a follow-up.)
|
@nettee fixed in |
nettee
left a comment
There was a problem hiding this comment.
I found one non-blocking landing-page regression in the new SEO copy wiring.
Location: apps/landing-page/app/pages/plugins/[slug]/index.astro RIGHT lines 85-86, rendered at line 137.
The new SEO suffix is being written into the same description value that the page renders visibly in <p class="lead">{description}</p>. pluginDescription is localized per route, but the appended sentence here is hard-coded English and never goes through plugins-i18n.ts, so every non-English plugin detail page now shows mixed-language body copy. That is a user-facing regression from the previous behavior, which kept the lead text fully localized. Please split this into a visible pageDescription = pluginDescription and a separate seoDescription for <Layout description> / JSON-LD, or move the suffix into localized copy before reusing it in the rendered lead.
The keyword-rich English SEO suffix was appended to `description`, which is both the <meta description> and the visible <p class="lead">, so non-English plugin detail pages rendered mixed-language body copy. Split it: `description` stays the fully-localized lead, and a separate `seoDescription` carries the English brand/keyword suffix for <Layout description> + JSON-LD only.
Fixed in 4e3b0ef: frame-logo-outro is now previewType video (re-rendered logo-reveal MP4), so 22/23 templates hover-autoplay; only the Remotion frame-data-rollup stays a still poster. Also fixed your non-blocking SEO note in 400380b (detail-page lead stays localized; English keyword suffix is meta/JSON-LD only). Dismissing this outdated review.
|
@nettee good catch on the mixed-language lead — fixed in |
Why
Open Design already exposes a HyperFrames artifact type on
/plugins/templates/hyperframes/and the in-app Plugins home, but the only entries were 11hyperframes-*catalog stubs — they ship no bundled composition (justopen-design.json+template.jsonpointing at HeyGen catalog block images), several share the same cover image (logo-outro.png×3,app-showcase.png×2), and none can render.nexu-io/html-videohas a curated, license-clean library of real HyperFrames compositions (HTML+CSS+GSAP, plus one Remotion template). This PR brings 23 of them in as fully bundled plugins with motion previews, removes the duplicate-cover stubs, and hides two cover-less onboarding examples from the catalog.What users will see
/plugins/templates/hyperframes/(and the in-app Plugins home) now lists 23 distinct HyperFrames templates — kinetic type, swiss grid, NYT-style charts, bold poster, glitch title, light-leak cinema, product promos, logo outro, etc. Each card hover-autoplays a short looping motion preview, and the detail page plays it.examples/hyperframes,examples/video-hyperframes) no longer clutter the visual-templates grid.Surface area
plugins/_official/video-templates/, removes 11, updates the official registry seed.apps/landing-page/app/_lib/bundled-plugins.tsto hide two non-template examples from the public library (no visual/layout change).title_i18n/description_i18nonly).Notes for reviewers
preview.mp4(< 1 MiB) rendered with the html-video HyperFrames renderer, committed in-folder and referenced from the manifest via a jsDelivr@mainURL — consistent with how the registry already pinssource:at@main. They resolve once merged; on the PR preview deploy the card media 404s until then.frame-data-rollup(Remotion) ships a still poster only (its native render came out blank — follow-up). A maintainer can move these torepo-assets.open-design.aiR2 if preferred (URL swap only).plugins/_official/video-templates/HYPERFRAMES-ATTRIBUTIONS.md: 8 Apache-2.0 forks ofheygen-com/hyperframes, 1 MIT fromnateherkai/hyperframes-student-kit, 7 original Apache-2.0, and 7 derived from MIT design skills (frontend-slides,huashu-design). Studio names (Pentagram / Build / Takram) are recorded underod.provenance.originas non-affiliated stylistic inspiration only. Each manifest carrieslicense/author/od.provenance/od.attribution.Validation
apps/landing-pagebuild (astro check+astro build) is clean — no type errors.bundledPreinstallCountupdated.