* feat: add Motion Design skill and OD Next task route
* fix(web): rename motion design entry and place it second
* fix(web): reconcile motion design catalog consumers
* feat(web): add motion design templates to Home and Community
Five motion design example templates (3D procedural island, explainer,
product launch, showreel, data story), chosen by community reach, under the
Home motion-design chip and a new Community "Motion design" type.
Each template follows the bundled example layout: an OD-generated
example.html with its runtime libraries under assets/, an HTML preview baked
by the existing preview pipeline, and a SKILL.md that carries example.html
as the reference when the card is picked on the OD Next motion-design route.
Home cards ship curated copy for every UI locale. Motion templates stay off
the Video and HyperFrames chips.
* fix(skills): keep motion-design procedural layers visible in video export
The MP4 exporter seeks timelines with callbacks suppressed
(renderSeek(t, { suppressEvents: true })), so content drawn only from a GSAP
onUpdate callback is missing from exported video. Recommend a per-frame draw
loop that reads the timeline clock, and state that visible content must not
depend on timeline callbacks. The OD Next task asset is re-synced with
scripts/sync-motion-design-skill.ts.
* fix(motion): preserve reference assets and exported animation frames
* feat(skills): integrate curated motion helpers with complete runtime files
* feat(skills): add Huashu, Oil Motion and Motion.Lab adapters
* test: classify animate design guidance in narration guard
* feat(motion): refine five community templates and portable previews
* fix(motion): refine launch transitions and center gallery previews
* fix: allow free-form briefs on automatic motion task route
* feat(motion): add template soundtracks and audio export
* fix(motion): require rendered MP4 alongside editable video source
* test(motion): align strategy activation expectation with package version
* fix: scope motion delivery and make editable sources playable
* fix(motion): bundle source dependencies and valid closing protocol
* feat(motion): rebuild the five templates on the most-viewed community posts
Re-select topics by single-post views in the latest awesome-opus-5.5-video
snapshot and anchor each template to the top eligible post of its genre:
camera-focus explainer, showreel, product launch, procedural island and a
new wordless animated short that replaces the data story.
All five example.html files are hand-authored canvas/Three.js films drawn by
one render(t) from the GSAP master timeline, so preview, scrubbing and MP4
export produce identical frames. Each ships an original procedural
soundtrack, updated SKILL.md and 19-locale copy; Home order follows reach.
* fix(plugins): load bundled fonts in plugin previews
Plugin previews blocked every bundled font: the preview CSP had no font-src,
and relative url() references inside inline <style> blocks kept pointing at
the preview URL instead of the plugin folder. Allow same-origin fonts, map
inline-style url() references through the existing asset route (escapes,
absolute and data: URLs stay untouched), and serve font files with font
MIME types.
* feat(community): make motion template Use match the Home example pick
Community 「做同款」 on a motion design template now binds it as that type's
own example card, carrying the type's project metadata, so the run takes the
same OD Next motion-design route as a pick from Home's motion design list and
delivers the MP4 together with the editable source. Other task types keep
the existing plugin-pinning hand-off.
Community use clicks now record use_source (card | detail_modal) and
use_action (use | use_with_query); the details modal Use is tracked for the
first time. The Home hand-off no longer records a second community_gallery
click for uses Community already tracked.
* fix(plugins): count the five motion templates in the official registry metadata
* fix(media): keep HyperFrames audio filters compatible with FFmpeg 4.1
CI's bundled Linux FFmpeg 4.1 rejects adelay all=1 and amix normalize=0.
Make each track stereo and delay both channels explicitly, skip amix for a
single track, and undo amix averaging with a gain for several tracks.
* fix(motion): keep template previews bakeable on slow CI renderers
CI's software-GL baker skipped the 3D island (preview readiness timeout):
under slow frames GSAP lag smoothing slowed the timeline, so the 8 s
poster frame never arrived within the baker's 15 s wait. Play every
template on the wall clock and move the island poster to 6 s. With
simulated 300 ms frames all five now report ready within 10 s.
* feat(motion): add the kinetic typography template
Template selection now follows the motion design spec's four content types
(brand and product films, kinetic typography, explainer animation, procedural
art). Kinetic typography takes the fifth slot, replacing the animated short.
The new template is a 15-second, 120 BPM type film with an original
soundtrack and 19-locale copy.
* fix(motion): let the project motion player fit template stages
Inside a project the motion source player wraps the composition, fits it and
adds its own controls. The templates also scaled their stage, so editable
sources from Remix and Community use rendered at a fraction of the preview.
Templates now keep their own fit and controls only outside that player.
* feat(motion): restage the 3D island as a midday lagoon
The island moves from golden hour to a bright tropical midday closer to its
anchor post: a shader lagoon coloured by a baked depth map with ripples,
shallow-water shimmer and shore foam, a wide white-sand beach, palms and
instanced bushes, a village with a pier, soft sun shadows and a lower
camera path. The CPU wave mesh is gone, so frames cost no more than before.
Copy is updated in all 19 locales.
* fix(motion): keep each soundtrack inside the composition root
A Community use regenerated the island source tail and dropped the root
<audio> element, so its MP4 had no sound. Templates now place the element
inside the composition root next to the stage.
* docs(motion): state the template selection rule as complete works
* fix(motion): enforce video clocks and bound content verification
* feat(motion): replace the motion templates with remakes of viral posts
The five Motion design templates are now frame-faithful remakes of viral
motion posts, so each preview shows the look users came for: the 15-second
motion designer showreel, a high-energy motion reel (copy set in English), a
one-shape UI motion piece, a pixel-art wizard and a 20-second electric-blue
tech reel. Each ships open-licensed fonts, an original soundtrack, the
creator's published prompt where one exists, and credits its source post.
The explainer, product launch, 3D island and kinetic type templates are
removed. Tests follow the new set; a backward-seek check now covers hidden
WebGL layers.
* feat(motion): feature The Future Is Already Here first and start preview sound with the film
* chore: ensure PR CI
* fix(motion): match The Future Is Already Here controls and reorder the motion templates
* fix(motion): make the one-shape UI preview controls legible
* fix(motion): hide The Future Is Already Here controls inside the project player
* fix(motion): plan suitable sound and synchronize source audio playback
* feat(motion): keep remake soundtracks by default and fade exported audio where it stops
* test(motion): cover audible source controls in Chromium
* fix(test): use explicit ESM imports in audio player regression
* fix(motion): align preview track discovery with video export
* feat(motion): autoplay looping HTML without a player bar
* fix(test): consume the built motion playback contract
* docs(motion): state explicit soundtrack rules for make-same and the music line in replies
* chore(motion): version the audible looping delivery profile
* docs(motion): let template sound rules lead the general policy and freeze the audio contract
* fix(motion): scope autoplay to declared video motion sources
* fix(motion): reject audible MP4s under an explicit silent contract
* docs(motion): drop the routine music note from make-same replies
* test(motion): align delivery regressions with looping source playback
* fix(motion): isolate preview and audio export from legacy HyperFrames
* test(motion): retain the existing desktop legacy audio limitation
* fix(motion): suspend audio when previews leave the active workspace
* feat(motion): replace two motion templates with a product promo and a visual lesson; sign the showreel as Open Design
* feat(motion): give the showreel the Open Design palette and a full-size stacked wordmark
* feat(motion): give the product promo a livelier mascot girl
* refactor(motion): rebuild The Future Is Already Here as readable, editable scene code
* fix(motion): pick gallery cover frames that survive the baker's capture delay
* feat(motion): sharpen the showreel opener, depth, truchet and end card
* feat(motion): make the product promo mascot talk, add a speaking score and the flow pop
* feat(motion): give the visual lesson the original's paper-collage texture
* fix(motion): bundle gallery covers for fresh branch checkouts
* feat(motion): feature and refine Bring Ideas to Life
Adapt the paper story around OpenDesign capabilities, with short rounded hands, clearer timing, continuous paper actions, and a larger audience invitation. Feature it first in Motion and synchronize localized names, metadata, cover, guidance, and regressions.
Keep product promo audio music-only with sparse percussion.
* fix(motion): stabilize artifact cards and capture declared covers
* fix(web): share creation type order with community
* test(motion): exercise audio controls through project UI lifecycle
* fix(motion): scope live cover behavior to actual video sources
* test(motion): use real HEAD responses in cover regressions
---------
Co-authored-by: bone3deep1962-collab <bone3deep1962@gmail.com>
Co-authored-by: William <zhouhaoran@refly.ai>
Co-authored-by: open-design-crew[bot] <4197780+open-design-crew[bot]@users.noreply.github.com>
Co-authored-by: NJUHua <113895241+NJUHua@users.noreply.github.com>
Co-authored-by: Amy <1184569493@qq.com>
17 KiB
Skills Protocol
Parent: spec.md · Siblings: skills-contributing.md · architecture.md · agent-adapters.md · modes.md
Want to ship a skill upstream rather than read the protocol spec? See
skills-contributing.md— quick start, merge bar, PR template, common rejections. This file is the what (frontmatter grammar, discovery rules, mode semantics); that file is the how (clone to merged PR).
A Skill is an atomic functional capability in OD. A design template is a rendering-catalogue entry. Both use Claude Code's SKILL.md convention as their portable instruction format and may add od: metadata, but they have different ownership and APIs: functional skills live in skills/ and /api/skills; rendering templates live in design-templates/ and /api/design-templates.
Compatibility promise: A bundle that contains
SKILL.mdremains readable by agents that support the Agent Skills format. Installation and catalogue placement are separate concerns: the bundled guizang integration is maintained underdesign-templates/guizang-ppt/, while external distribution normally uses the plugin system.
1. Base format (unchanged from Claude Code)
Every skill is a directory containing at minimum a SKILL.md:
<skill-root>/
├── SKILL.md # manifest + workflow instructions
├── assets/ # templates, images, boilerplate the skill writes
│ └── …
└── references/ # knowledge files the skill reads during planning
├── components.md
├── layouts.md
└── …
SKILL.md front-matter (YAML):
---
name: magazine-web-ppt
zh_name: "杂志风网页 PPT"
en_name: "Magazine Web PPT"
description: |
Magazine-style horizontal-swipe web deck.
Trigger keywords: 杂志风 PPT, magazine deck, swipe slides.
zh_description: "杂志风横向翻页网页 PPT。"
en_description: |
Magazine-style horizontal-swipe web deck.
Trigger keywords: 杂志风 PPT, magazine deck, swipe slides.
triggers:
- "magazine deck"
- "杂志风 PPT"
- "horizontal swipe presentation"
---
Body is free-form Markdown that describes the workflow the agent should follow — typically a numbered step list plus principles. This is what guizang-ppt-skill does.
OD reads all of this as-is. No changes required.
2. OD extensions (optional)
Skills can declare additional front-matter fields to unlock OD-specific UI. All fields are optional; absent fields fall back to sensible defaults.
---
name: magazine-web-ppt
description: …
triggers: […]
# --- OD extensions below this line ---
od:
mode: deck # utility | prototype | deck | template | design-system | image | video | audio
surface: web # web | image | video | audio
scenario: marketing # gallery/filter hint
category: presentations # free-form lowercase filter slug
preview:
type: html # registry preview hint
example_prompt: "Create a magazine-style web deck from my content."
example_prompt_i18n:
zh-CN: "用杂志风网页 PPT 模板把我的内容做成横向翻页 deck。"
design_system:
requires: true # compose the complete active design-system context
craft: # universal, brand-agnostic craft references
requires: [typography, color, anti-ai-slop]
critique:
policy: opt-in # required | opt-in | opt-out
---
2.1 What OD uses each field for
| Field | Used by |
|---|---|
zh_name / en_name |
localized picker title; falls back to name |
zh_description / en_description |
localized picker description; falls back to description |
od.mode |
registry classification and creation-surface filtering; functional helpers use utility (or design-system), which is preserved rather than inferred from media keywords in the body |
od.surface |
web/image/video/audio surface filtering; defaults from media mode or to web |
od.platform |
optional desktop/mobile gallery hint |
od.scenario / od.category |
scenario and category filter hints |
od.preview.type |
picking the right iframe renderer |
od.example_prompt |
English fallback starter prompt used by picker CTA |
od.example_prompt_i18n |
localized starter prompt map (for example zh-CN) |
od.design_system.requires |
whether to compose the active design-system package into the prompt |
od.craft.requires |
which brand-agnostic craft/<slug>.md references to inject between design-system context and the skill body |
od.default_for, od.featured |
creation defaults and gallery ordering hints |
od.fidelity, od.speaker_notes, od.animations |
optional fast-create defaults for matching template kinds |
od.critique.policy |
per-skill Critique Theater override (required, opt-in, or opt-out) |
Older bundles may also carry fields such as od.inputs, od.parameters,
od.outputs, or od.capabilities_required. The skill registry preserves the
portable SKILL.md body but does not use those fields to render forms, sliders,
choose output files, or gate an agent. The Agent-Skill-to-plugin adapter can
translate or retain some of that metadata; plugin behavior is specified in
plugins-spec.md, not by this registry protocol.
2.2 If a skill omits od: entirely
Defaults:
mode: inferred from description and body, falling back toprototypesurface: the media mode for image/video/audio entries, otherwisewebpreview.type:htmldesign_system.requires:true; authorfalseexplicitly for bundles that must not receive brand contextexample_prompt: the first sentence ofdescription, capped for the pickerscenario: inferred from description/body, falling back togeneral
The goal: zero-config compatibility for existing Claude Code skills.
3. Skill discovery & precedence
The daemon keeps functional skills and rendering templates in separate registries:
| Registry | Roots, highest priority first | API |
|---|---|---|
| Functional skills | user-managed skills, then bundled skills/ |
/api/skills |
| Design templates | user-managed templates, then bundled design-templates/ |
/api/design-templates |
The user-managed roots derive from the resolved daemon data root; this file
intentionally does not restate a concrete path. A duplicate frontmatter name
in the first root shadows the bundled entry without deleting it. Each listing
request rescans its roots, so local changes appear without a watcher, SIGHUP,
or daemon restart. Chat-time lookup spans both registries so projects saved
against a design-template id continue to compose its instructions.
Runtime resource staging
OpenDesign does not distribute an active bundle by symlinking it into every
agent's global configuration. Before a project run, the daemon makes a real
copy of every active skill/template with side files under the project's
.od-skills/ alias. The prompt preamble advertises that CWD-relative copy and
an absolute fallback. This keeps references and assets reachable across
agents, including filesystems where symlink or cross-device rename semantics
differ. A local library installation may itself be represented by a managed
link, but that storage detail is separate from per-run staging.
4. Registry modes
The daemon normalizes od.mode to one of seven values. These values classify both functional skills and design-template bundles; they are not the same thing as the six New Project tabs described in modes.md.
4.1 prototype
- Purpose: single-screen interactive prototype.
- Preview:
htmlorjsx. - Primary output:
index.htmlorPrototype.jsx. - Typical workflow: clarify brief → resolve design tokens → write component tree → write file.
- Example templates: interface and responsive-flow bundles under
design-templates/.
4.2 deck
- Purpose: multi-slide presentation.
- Preview:
html(single-file deck with in-page navigation). - Primary output:
index.html. - Secondary output:
slides.json(for PPTX export). - Typical workflow: clarify topic + slide count → pick theme → populate slides from layout catalog → self-check against quality rubric.
- Reference implementation: the bundled
design-templates/guizang-ppt/integration.
4.3 template
- Purpose: start from a pre-built artifact; agent only personalizes content, doesn't design from scratch.
- Preview: inherits from the template bundle (
htmltypically). - Primary output: a populated copy of the template.
- Typical workflow: copy
assets/template/to artifact dir → replace content placeholders → optionally tweak tokens to match design system. - Why separate from
prototype: it starts from a pre-built shape rather than a blank artifact.
4.4 design-system
- Purpose: classify a functional workflow that creates, extracts, audits, or transforms design-system material.
- Output: defined by the skill. A portable workflow may emit only
DESIGN.md; current OpenDesign import/create flows build a package withmanifest.json,DESIGN.md,tokens.css, and optional rich resources. - Schema: no fixed nine headings. Repository packages require substantive
coverage and keep prose synchronized with the token contract; see
design-systems/README.md.
4.5 image, video, and audio
- Purpose: classify media-generation instruction bundles for the Media creation surface.
- Surface: defaults to the matching media kind unless
od.surfaceoverrides it. - Inputs: provider/model controls and media-specific metadata are owned by the Media UI and shared contracts.
- Design system: media bundles normally opt out because prompt templates, rather than interface tokens, drive these provider-backed generations.
5. The DESIGN.md as skill context
Any bundle may declare whether it consumes the active design system. Interface, deck, and template bundles commonly opt in; media bundles commonly opt out. When enabled, the daemon composes the available package material directly into the system prompt, in this order:
- package-specific
USAGE.mdguidance (or the default usage contract); - the complete
DESIGN.mdbody; - import-mode guidance, when declared;
tokens.css;- a compact component manifest, or
components.htmlwhen no manifest can be produced; - a manifest-derived index of rich files that the agent may pull on demand;
- craft references; then
- the active skill/template body.
Design systems are not copied into the run CWD, section-pruned through
od.design_system.sections, or substituted through a
{{ design_system }} variable. Missing rich files preserve compatibility with
legacy DESIGN.md-only folders. The historical nine-heading upstream sample
remains useful as an interoperability example at
docs/examples/DESIGN.sample.md, but it is not
the current repository package schema.
5.5 Craft references (craft/)
Some craft knowledge is universal — true regardless of brand. ALL CAPS always needs ≥0.06em letter-spacing; var(--accent) should appear at most 2 times per screen; #6366f1 is always the AI-default tell. These rules don't belong in any one DESIGN.md because they apply across every brand.
OD ships these as a separate packaged resource tree:
craft/
├── README.md
├── accessibility-baseline.md
├── animation-discipline.md
├── anti-ai-slop.md
├── color.md
├── form-validation.md
├── laws-of-ux.md
├── rtl-and-bidi.md
├── state-coverage.md
├── typography.md
├── typography-hierarchy.md
└── typography-hierarchy-editorial.md
A skill opts in by listing the slugs it needs:
od:
craft:
requires: [typography, color, anti-ai-slop]
Resolution at compose time:
apps/daemon/src/skills.tsreadsod.craft.requiresfrom front-matter and surfaces it on the skill record.apps/daemon/src/craft.tsreads each<slug>.mdfromCRAFT_DIR. Runtime loading remains tolerant of absent files for compatibility.apps/daemon/src/prompts/system.tsinjects the concatenated craft body between the active DESIGN.md and the skill body. Brand tokens in DESIGN.md win on conflict; craft rules cover everything DESIGN.md does not override.
Repository authoring is stricter than runtime loading: pnpm lint:craft and
pnpm guard reject invalid or unresolved references unless the slug is
explicitly listed in craft/FUTURE_SECTIONS.md. See
craft/README.md for the canonical list.
The split keeps DESIGN.md authors free of universal-craft duplication and keeps craft authors free of brand-specific drift.
6. Skill inspection and distribution
od skills list
# → id and display label for entries returned by /api/skills
od skills show <id>
# → the daemon's JSON representation of one skill
od skill install github:owner/repo
od skill install https://example.com/my-skill.tar.gz
# → installs one public skill bundle through POST /api/skills/install
Remote skill import accepts the same source grammar as Plugin URL import:
github:owner/repo or a public HTTPS .tar.gz / .tgz archive containing one
top-level SKILL.md. Downloads are size-capped and reject private-network
targets, path traversal, symbolic/hard links, malformed manifests, and
duplicate skill ids. An intentional replacement is explicit: uninstall the
existing user skill first, then install the new bundle. od skills remains the
compatibility alias for list/show/install/uninstall. Repository-owned
functional skills and rendering templates still live under skills/ and
design-templates/ respectively. Do not document a concrete daemon-managed
install path here; the root AGENTS.md Daemon data directory contract is
the only path authority.
7. Worked example — running the bundled guizang deck template
The upstream-inspired bundle ships at
design-templates/guizang-ppt/ with its
license preserved and OpenDesign metadata applied:
- The daemon lists it through
/api/design-templates, independently of the functional/api/skillsregistry. - The user opens the Deck creation tab and selects the guizang template from the rendering catalogue.
- OpenDesign stores the selected template id as the project's primary
skillId. The daemon's combined skill-like resolver loads that template'sSKILL.mdand resources; it does not also inject the Deck tab's default functional skill. - The agent follows the template workflow, writes the deck files into the project workspace, and performs its checklist before final handoff.
- File writes stream into the UI,
index.htmlbecomes previewable, and the deck export surfaces consume the produced project files.
The protocol intentionally does not define the workspace's concrete path; read
the root AGENTS.md Daemon data directory contract before changing or
documenting artifact storage.
8. Writing a rendering template — minimal example
design-templates/saas-landing/
├── SKILL.md
└── assets/
└── base.html
---
name: saas-landing
description: |
Produce a single-page SaaS landing with hero, features, social proof, pricing, CTA.
Trigger: "saas landing", "marketing page", "product landing".
triggers:
- "saas landing"
- "marketing page"
od:
mode: prototype
surface: web
scenario: marketing
preview:
type: html
design_system:
requires: true
craft:
requires: [typography, color, anti-ai-slop, accessibility-baseline]
---
# Workflow
1. Apply the active design-system context supplied above this skill.
2. Copy `.od-skills/saas-landing/assets/base.html` to `index.html` in the project workspace.
3. Fill sections: hero, features (3–6), social proof, pricing, CTA, footer.
4. Inline all CSS. Use system font stack as fallback if DESIGN.md typography fails to load.
5. Write `index.html`. Done.
9. Testing skills
There is no od skills test command and no runtime contract for a
tests/basic.prompt tree. Repository-owned entries are checked by the root
guard, localized-content coverage, registry tests, and any focused tests for
their assets or prompt behavior. Run at least pnpm guard and
pnpm typecheck, plus the package-scoped checks appropriate to the files
changed. Plugin bundles have their own validation and doctor surfaces.
10. Open questions
- Skill provenance. URL-imported functional skills do not yet persist their source after installation; richer provenance, integrity pinning, and trust UI should reuse the plugin model instead of growing a second incompatible one.
- Skill composition. Can a prototype-mode instruction bundle invoke a deck-mode bundle for a sub-artifact? The current registries treat them as leaf-level inputs; composition requires an explicit orchestration contract.
- Richer skill inputs. Typed apply-time inputs and deferred parameters now belong to the plugin manifest contract. A future skill-native form should reuse that contract rather than reviving a second slider schema.