[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M719XS9SEC99FDQ8VNVBG6YV":3,"skill-same:01M719XS9SEC99FDQ8VNVBG6YV":73},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":52,"repositoryHtmlUrl":53,"repositoryHomepageUrl":54,"ownerHtmlUrl":55,"ownerBlogUrl":56,"ownerDescription":57,"updatedAt":58,"install":59,"resources":72},"01M719XS9SEC99FDQ8VNVBG6YV","video",null,"Author a video as a single Markdown file (`video:` front matter) — scenes separated by horizontal rules, every block animating in on its own, video components (lockup, swap, typewriter, scramble, counter, stats, chart, code, terminal, browser\u002Fwindow\u002Fphone, cursor, lower-third, captions, quote, steps, checklist, grid\u002Fcard, cta, logo, media), scene transitions and camera moves, and a synthesized voice-over (`--- {narration}` parts, `narration:` voice, `neko voiceover`) — preview it in the browser and render it to MP4 with `neko render` (Playwright + ffmpeg). Also covers the `[!video]` component that embeds the rendered file in a page. Use when asked for a video, an animated explainer, a product or release teaser, a changelog video, a motion graphic, a narrated walkthrough, or an MP4 from docs content.","curiosity-ai\u002Fneko","curiosity-ai","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F26607183?v=4","01M719T89H2VGM26V263FNZPC8","Curiosity","01M719T8APP8YJ44A9DZ6C41JB",2,"MIT","https:\u002F\u002Fgithub.com\u002Fcuriosity-ai\u002Fneko\u002Fblob\u002Fmain\u002F.template\u002F.claude\u002Fskills\u002Fvideo\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"Video","walkthrough","when","window","render","card","chart","preview","voiceover","logo","markdown","terminal","Captions","Media","product","changelog","browser","code","component","components","2026-11-10 10:12:30",false,"---\nname: video\ndescription: Author a video as a single Markdown file (`video:` front matter) — scenes separated by horizontal rules, every block animating in on its own, video components (lockup, swap, typewriter, scramble, counter, stats, chart, code, terminal, browser\u002Fwindow\u002Fphone, cursor, lower-third, captions, quote, steps, checklist, grid\u002Fcard, cta, logo, media), scene transitions and camera moves, and a synthesized voice-over (`--- {narration}` parts, `narration:` voice, `neko voiceover`) — preview it in the browser and render it to MP4 with `neko render` (Playwright + ffmpeg). Also covers the `[!video]` component that embeds the rendered file in a page. Use when asked for a video, an animated explainer, a product or release teaser, a changelog video, a motion graphic, a narrated walkthrough, or an MP4 from docs content.\n---\n\n# Video mode\n\nA Neko video is **one Markdown file**. Front matter marks it as a video; a\nhorizontal rule (`---`) starts each **scene**. Every block in a scene animates in\nby itself, in the order it is written; components cover what Markdown can't\n(numbers counting up, charts growing, code typing, a cursor clicking). The page\nis a preview player; `neko render` films it to MP4.\n\n## The marker\n\n```yaml\n---\ntitle: October release\nvideo:\n  theme: curiosity     # neko (default, dark) or curiosity (the Curiosity brand)\n  size: 1920x1080      # 720p, 1080p, 4k, vertical (1080x1920), square; or ratio: 9:16\n  fps: 30\n  transition: push     # into every scene that names none (neko: fade, curiosity: push)\n  music: assets\u002Fbed.mp3   # optional; musicVolume: 0.35\n---\n```\n\nOther keys: `transitionDuration` (0.6), `hold` (1.6 s still after the last element; a\nscene whose `duration` would cut its content short is lengthened to last arrival + `hold`),\n`pace` (`brisk`\u002F`normal`\u002F`calm` or a number), `accent` (neko: cyan, violet, amber,\nrose, leaf), `eyebrow`, `logo`\u002F`logoText`, `grain`, `vignette`, `foot`, `autoplay`,\n`loop`, `back`\u002F`backText`, and (curiosity) `intro: squares|tiles` — the website's\nfirst-load animation over the first scene.\n\n## Scenes\n\n```markdown\n--- {layout=\"cover\" art=\"field\" eyebrow=\"Neko · Video mode\"}\n\n# Write *Markdown.* Get *video.*\n\nOne file. Scenes split by a rule.\n\n--- {layout=\"split\" ground=\"ink\" transition=\"zoom\" duration=\"5\"}\n\n## A scene is *Markdown*\n\n- Headings rise word by word\n- Paragraphs rise\n- List items stagger in\n```\n\nA `---` needs a blank line before it. A rule before the first scene carries the\nfirst scene's options. Rules inside fenced code are ignored.\n\nScene options (on the rule):\n\n| Key | Values |\n| --- | --- |\n| `duration` | seconds; omit and Neko sizes the scene (last arrival + `hold`) |\n| `transition` | `cut`, `fade`, `fade-through`, `push`, `push-up`, `zoom`, `zoom-out`, `wipe`, `iris`, `blur` |\n| `transition-duration` | seconds of overlap with the previous scene |\n| `layout` | `title`, `center`, `split`, `full`, `bottom`, `top`, `bleed`; curiosity also `cover`, `section`, `panel`, `statement`, `number`, `closing` |\n| `ground` | `paper`, `stone`, `ink`, `slate`, `deep` (neko also `accent`) |\n| `art` \u002F `background` | `field`, `bars`, `squares`, `stair`, `glyph` (+ `glyph=\"graph\"`, `seed`), or `grid`, `dots`, `glow`, `aurora` |\n| `camera` | `push`, `pull`, `pan-left`, `pan-right`, `rise` |\n| `eyebrow`, `align=\"center\"`, `accent`, `pace`, `hold`, `wash`, `id`, `class` | |\n| `voice` | audio file for the scene (`voice-at`, `voice-volume`) |\n\n`*emphasis*` in an `#`\u002F`##` heading is the accent colour (the second tone), not\nitalic. `==text==` sweeps a highlight under the words.\n\n## Timing — leave it to Neko first\n\nNeko schedules every element on one cursor in document order (the timeline\ncompiler, at build time). Only reach for attributes when a beat needs it:\n\n```markdown\n# The headline {enter=\"slam\"}\n\nA line that waits. {at=\"2.4\"}\n\n{enter=\"left\" dur=\"0.8\"}\nA paragraph that slides in.\n\n- An item that only fades {enter=\"fade\"}\n\n![Screenshot](shot.png){enter=\"kenburns\"}\n```\n\n| Attribute | Meaning |\n| --- | --- |\n| `enter` | motion: `rise`, `words`, `letters`, `fade`, `up`, `drop`, `left`, `right`, `pop`, `zoom`, `settle`, `blur`, `slam`, `wipe`, `wipe-up`, `grow`, `grow-x`, `draw`, `type`, `scramble`, `sweep`, `kenburns`, `none` |\n| `at` | seconds (`2.4`), relative to the cursor (`+0.5`), or `with` (same time as the previous element) |\n| `dur`, `delay`, `gap`, `stagger` | duration, extra wait, cursor hold, word\u002Fletter spacing |\n| `ease` | `power1`–`power4`, `expo`, `sine` + `.in`\u002F`.out`\u002F`.inOut`, `back.out(1.6)`, `linear` |\n| `exit` + `until` | leave early: `fade`, `up`, `down`, `left`, `right`, `blur`, `shrink` at `until` seconds |\n\nContainers take the same attributes on their fence: `::: card {enter=\"pop\" at=\"1\"}`.\n\n## Components\n\nNest with longer outer fences (`:::::` around `:::`), and use `::::` around a\n`code` block whose code contains `:::`.\n\n```markdown\n::: lockup {kicker=\"Kicker\" label=\"Label under the rule\"}\n# Title *card*\n:::\n\n::: swap {prefix=\"Neko builds\" words=\"docs|decks|video\" suffix=\".\" hold=\"0.9\"}\n:::\n\n::: typewriter\nneko render video.md\n:::\n\n::: scramble\nDECODED LINE\n:::\n\n::: callout\n30 fps.\n:::\n\n::: counter {value=\"$1,250\" label=\"Label\"}\nOptional line.\n:::\n\n::::: stats {count=\"3\"}\n::: stat {value=\"98%\" label=\"Uptime\"}\n:::\n::: stat {value=\"3x\" label=\"Faster\"}\n:::\n:::::\n\n::: chart {type=\"bar\" title=\"Title\" unit=\"s\" caption=\"Source\"}\n- Mon: 12\n- Tue: 18 *\n:::\n```\n\n`chart` types: `bar` (default), `hbar`, `line`, `donut`. Data is `- Label: value`\nbullets or a two-column table; `*` after a value calls it out in the accent.\n\n````markdown\n:::: code {file=\"Program.cs\" speed=\"0.025\"}\n```csharp\napp.Run();\n```\n::::\n\n::: terminal {title=\"zsh\"}\n```bash\n$ neko render video.md\n✓ Wrote video.mp4\n```\n:::\n\n::: browser {url=\"example.com\"}\n![Screenshot](\u002Fassets\u002Fshot.png)\n:::\n\n::: phone\n![Screenshot](\u002Fassets\u002Fshot.png)\n:::\n\n::: cursor {from=\"105%,95%\" to=\"52%,58%\" label=\"Click\" at=\"1.5\"}\n:::\n\n::: cursor {on=\"screen\" from=\"104%,96%\" to=\"63.6%,12.9%\" label=\"XML\" at=\"1.2\"}\n:::\n\n::: lower-third {name=\"Ada Lovelace\" role=\"Engineer\" at=\"0.8\" until=\"4.5\"}\n:::\n\n::: captions {style=\"pill\"}\n0.5-2.4 First caption line, timed on the scene clock\n2.5-4.4 and the second.\n:::\n\n::: quote {author=\"Name\" role=\"Role\"}\nThe quote, read in word by word.\n:::\n\n::: steps\n1. **Write** the scenes.\n2. **Render** the MP4.\n:::\n\n::: checklist\n- Ticked as it arrives\n:::\n\n::::: grid {count=\"3\"}\n::: card {title=\"Title\" icon=\"bolt\"}\nText.\n:::\n:::::\n\n::: cta {button=\"Get started\" url=\"example.com\"}\n# The call to *action*\n:::\n\n::: logo {src=\"logo.svg\" text=\"Brand\" tagline=\"Tagline\"}\n:::\n\n::: media {src=\"assets\u002Fclip.webm\" start=\"0\"}\n:::\n````\n\nA screenshot in `browser`\u002F`window`\u002F`phone` arrives with its frame and never animates\non its own (no `kenburns` inside a frame: it grows the picture inside fixed chrome);\na frame holding one screenshot takes its proportions, so nothing is cropped. Put\ndark screenshots on `ground=\"ink\"`: in curiosity the chrome follows the ground. Move\nthe whole scene with `camera` instead.\n\nAlso: `window {title}`, `cols`\u002F`col`, `box`, `stack`, `reveal {enter at}`, `logos`\n(a row of images). Captions styles: `rail`, `pill`, `highlight`. `media` clips\nare muted and seeked frame by frame; prefer WebM.\n\n## Curiosity brand components\n\nIn `theme: curiosity` headlines rise word by word out of a mask, counters ease\nout with no pulse and nothing blurs. Scene `art=` also takes the website's live\ndrawings: `field`, `squares`, the dash mosaics `wave|rows|chart|chart-grid|mountain|band|dither`\n(with `scheme=\"signal|ink|deep|stone|paper\"`) and the story tiles\n`step-grid|join-grid|lattice|dot-chart`. Brand components:\n\n````markdown\n::: tile {art=\"mountain\" label=\"Mountain\" height=\"300px\"}\n:::\n\n::: pixel-window {art=\"mountain\"}\n:::\n\n::: glyphs {names=\"value-connected|value-resolved|value-traceable\" labels=\"Connected|Resolved|Traceable\"}\n:::\n\n::: glyph {name=\"k..*k...kkk.....\" size=\"160px\" label=\"Custom\"}\n:::\n\n::: sudo {clip=\"workIdle\" class=\"corner\"}\n:::\n\n::: mark {cube=\"true\" size=\"300px\"}\n:::\n\n::: wordmark {tagline=\"One line under the name.\"}\n:::\n````\n\n`steps {class=\"stair\"}` draws steps as a widening staircase; `stats {class=\"cards\"}`\nstaggers the stats as paper, deep-blue and slate cards. Still glyphs build once and\nhold (`loop=\"true\"` repeats them). Keep Sudo in a corner: a detail, never the subject.\n\n## Voice-over\n\nNarration is written as text in the same file and spoken by Voxwerk (Qwen3-TTS\nVoiceDesign, pure C#). It is a **separate track on the video's clock**: it never\nmoves the animation, and its lines never overlap each other.\n\n```yaml\nvideo:\n  narration:\n    voice: \"A warm, clear female narrator in her thirties, calm and friendly.\"  # a description…\n    # voice: en-gb-rupert-vale   # …or a Voxwerk catalog id (`neko voices --search calm`):\n    #                            # cloned from its reference sample, one speaker throughout\n    #                            # (a description is re-designed per sentence and drifts)\n    language: english            # optional; seed: 7, gap: 0.5, pause: 0.25, volume: 1, wpm: 150\n    voices:                      # optional named voices for lines\n      guest: \"An elderly man with a slow, raspy, gentle voice.\"\n```\n\n```markdown\n--- {id=\"opening\" layout=\"title\"}\n\n# Say it *in Markdown*\n\n--- {id=\"results\"}\n\n## Revenue *doubled*\n\nUp from 12 to 26 in one quarter. {#bars}\n\n--- {narration}\n\n# Headings are labels, not spoken. Each paragraph or list item is one line.\n\n{at=\"opening+0.6\"}\nEvery Neko video can carry a voice-over.\n\nRevenue doubled in the second quarter. {at=\"#bars\" voice=\"guest\"}\n\nAnd this line simply follows the one before.\n```\n\n- `--- {narration}` (or `{voiceover}`) marks a part as narration, not a scene;\n  put parts anywhere (after each scene, or one at the end). The rule may carry\n  defaults: `--- {narration voice=\"guest\" at=\"scene-4\"}`.\n- Line attributes (a `{…}` at the end of the line or on its own line before it):\n  `at`, `voice`, `language`, `seed`, `pause` (between its sentences), `gap`\n  (after the line before), `volume`.\n- `at`: `12.5` \u002F `1:04.2` (video time), `+0.8` (after the line before ends),\n  `scene-3` or a scene `id` (when its transition in is over), `#id` (when that\n  element enters: `{#id}` on any block, list item or heading), plus an offset:\n  `scene-3+1.2`, `#bars-0.3`. No `at` → follows the line before after `gap`.\n- A line anchored while the previous is still speaking **waits** (and is reported\n  as *shifted*). If the voice-over outlasts the last scene, that scene holds.\n- **Scenes fit their narration**: a scene with no `duration` lasts until every line\n  anchored to it (or to an element in it) has been spoken, plus `tail` (0.8 s,\n  a `narration:` option), before the next transition. So in a narrated video,\n  anchor each line to its scene (`at=\"scene-id+0.4\"`) and leave `duration` out;\n  `fit: false` turns this off.\n\nWorkflow — always preview before synthesizing:\n\n```bash\nneko voiceover videos\u002Flaunch.md --preview   # timing sheet: scenes, animation, sentences (~ = estimated)\nneko voiceover videos\u002Flaunch.md             # synthesize missing sentences → assets\u002Fvoiceover\u002Flaunch\u002F*.ogg\nneko render videos\u002Flaunch.md                # mixes the takes (synthesizes anything missing first)\n```\n\nIn the browser preview, **Timing** (or \u003Ckbd>T\u003C\u002Fkbd>, `#timing`) shows the lanes;\nthe current sentence shows as a subtitle (\u003Ckbd>C\u003C\u002Fkbd>). Align by anchoring every\nline to its scene and letting Neko fit the scenes, then moving anchors or shortening\nlines until nothing is *shifted* or *runs into scene N*. Commit the `.ogg` takes with the page; they are keyed by\nvoice + text, so editing one sentence re-speaks only that one. The first\nsynthesis downloads a ~4.5 GB model; it runs about 5× slower than real time on CPU.\n\n## Rendering\n\n```bash\nneko render videos\u002Flaunch.md                    # → videos\u002Flaunch.mp4\nneko render videos\u002Flaunch.md -o out.mp4 -q high # draft | standard | high\nneko render videos\u002Flaunch.md --still 3.5        # one PNG (poster, checking a frame)\nneko render videos\u002F -o out\u002F --from 4 --to 9 --workers 4 --format webm\nneko render videos\u002Flaunch.md --preview          # the timing sheet only; --no-voiceover skips synthesis\n```\n\nffmpeg is found via `--ffmpeg`, `NEKO_FFMPEG`, the PATH, or downloaded once to\n`~\u002F.neko\u002Fffmpeg`. Chromium comes from Playwright (installed on first use) or\n`--browser`.\n\nEmbed the result in a normal page:\n\n```markdown\n[!video src=\"\u002Fassets\u002Fvideos\u002Flaunch.mp4\" poster=\"\u002Fassets\u002Fvideos\u002Flaunch.png\" link=\"\u002Fvideos\u002Flaunch\" title=\"Launch\"]\n```\n\n## Tips\n\n- One idea per scene; 3–6 s per scene; 2–3 transition types per film.\n- Prefer letting Neko time things; check with `--still` at a few moments.\n- Holds are still: give a long scene a `camera` move or a later beat rather than idle motion.\n- Keep one direction of travel (`push` always moves left); use `zoom` for \"deeper\", `zoom-out` for the payoff.\n- Video pages never appear in the sidebar or search; link them or embed their render.\n- With a voice-over, write the script first, anchor each line to its scene, leave\n  `duration` out so scenes fit their lines, and check `neko voiceover --preview`;\n  keep lines to one or two sentences per scene.\n- **Let the last state be read.** An animation that ends as the scene leaves is\n  never seen (a swap's last word, a chart's last bar). Neko holds every scene at\n  least a second after its last arrival; give a scene that needs reading more\n  (`hold=\"2.5\"`), and use `{delay=\"1\"}` on an element to pause *before* it.\n- **A swap needs room**: its words take `hold` × words seconds; a short line of\n  narration over it does not make the scene long enough by itself.\n- **Click on something.** On a screenshot, write the cursor with `on=\"screen\"` and\n  aim it in the picture's own coordinates (pixel ÷ image size), at the control the\n  narration names; start it after the frame settles (`at` ≥ 1). Check the landing\n  point with `neko render --still`.\n- **Stats in the curiosity theme**: `::: stats {class=\"cards\" count=\"4\"}` steps any\n  number of cards down a 180 px stair; keep values short enough for the column.\n","# Video mode\n\nA Neko video is **one Markdown file**. Front matter marks it as a video; a\nhorizontal rule (`---`) starts each **scene**. Every block in a scene animates in\nby itself, in the order it is written; components cover what Markdown can't\n(numbers counting up, charts growing, code typing, a cursor clicking). The page\nis a preview player; `neko render` films it to MP4.\n\n## The marker\n\n```yaml\n---\ntitle: October release\nvideo:\n  theme: curiosity     # neko (default, dark) or curiosity (the Curiosity brand)\n  size: 1920x1080      # 720p, 1080p, 4k, vertical (1080x1920), square; or ratio: 9:16\n  fps: 30\n  transition: push     # into every scene that names none (neko: fade, curiosity: push)\n  music: assets\u002Fbed.mp3   # optional; musicVolume: 0.35\n---\n```\n\nOther keys: `transitionDuration` (0.6), `hold` (1.6 s still after the last element; a\nscene whose `duration` would cut its content short is lengthened to last arrival + `hold`),\n`pace` (`brisk`\u002F`normal`\u002F`calm` or a number), `accent` (neko: cyan, violet, amber,\nrose, leaf), `eyebrow`, `logo`\u002F`logoText`, `grain`, `vignette`, `foot`, `autoplay`,\n`loop`, `back`\u002F`backText`, and (curiosity) `intro: squares|tiles` — the website's\nfirst-load animation over the first scene.\n\n## Scenes\n\n```markdown\n--- {layout=\"cover\" art=\"field\" eyebrow=\"Neko · Video mode\"}\n\n# Write *Markdown.* Get *video.*\n\nOne file. Scenes split by a rule.\n\n--- {layout=\"split\" ground=\"ink\" transition=\"zoom\" duration=\"5\"}\n\n## A scene is *Markdown*\n\n- Headings rise word by word\n- Paragraphs rise\n- List items stagger in\n```\n\nA `---` needs a blank line before it. A rule before the first scene carries the\nfirst scene's options. Rules inside fenced code are ignored.\n\nScene options (on the rule):\n\n| Key | Values |\n| --- | --- |\n| `duration` | seconds; omit and Neko sizes the scene (last arrival + `hold`) |\n| `transition` | `cut`, `fade`, `fade-through`, `push`, `push-up`, `zoom`, `zoom-out`, `wipe`, `iris`, `blur` |\n| `transition-duration` | seconds of overlap with the previous scene |\n| `layout` | `title`, `center`, `split`, `full`, `bottom`, `top`, `bleed`; curiosity also `cover`, `section`, `panel`, `statement`, `number`, `closing` |\n| `ground` | `paper`, `stone`, `ink`, `slate`, `deep` (neko also `accent`) |\n| `art` \u002F `background` | `field`, `bars`, `squares`, `stair`, `glyph` (+ `glyph=\"graph\"`, `seed`), or `grid`, `dots`, `glow`, `aurora` |\n| `camera` | `push`, `pull`, `pan-left`, `pan-right`, `rise` |\n| `eyebrow`, `align=\"center\"`, `accent`, `pace`, `hold`, `wash`, `id`, `class` | |\n| `voice` | audio file for the scene (`voice-at`, `voice-volume`) |\n\n`*emphasis*` in an `#`\u002F`##` heading is the accent colour (the second tone), not\nitalic. `==text==` sweeps a highlight under the words.\n\n## Timing — leave it to Neko first\n\nNeko schedules every element on one cursor in document order (the timeline\ncompiler, at build time). Only reach for attributes when a beat needs it:\n\n```markdown\n# The headline {enter=\"slam\"}\n\nA line that waits. {at=\"2.4\"}\n\n{enter=\"left\" dur=\"0.8\"}\nA paragraph that slides in.\n\n- An item that only fades {enter=\"fade\"}\n\n![Screenshot](shot.png){enter=\"kenburns\"}\n```\n\n| Attribute | Meaning |\n| --- | --- |\n| `enter` | motion: `rise`, `words`, `letters`, `fade`, `up`, `drop`, `left`, `right`, `pop`, `zoom`, `settle`, `blur`, `slam`, `wipe`, `wipe-up`, `grow`, `grow-x`, `draw`, `type`, `scramble`, `sweep`, `kenburns`, `none` |\n| `at` | seconds (`2.4`), relative to the cursor (`+0.5`), or `with` (same time as the previous element) |\n| `dur`, `delay`, `gap`, `stagger` | duration, extra wait, cursor hold, word\u002Fletter spacing |\n| `ease` | `power1`–`power4`, `expo`, `sine` + `.in`\u002F`.out`\u002F`.inOut`, `back.out(1.6)`, `linear` |\n| `exit` + `until` | leave early: `fade`, `up`, `down`, `left`, `right`, `blur`, `shrink` at `until` seconds |\n\nContainers take the same attributes on their fence: `::: card {enter=\"pop\" at=\"1\"}`.\n\n## Components\n\nNest with longer outer fences (`:::::` around `:::`), and use `::::` around a\n`code` block whose code contains `:::`.\n\n```markdown\n::: lockup {kicker=\"Kicker\" label=\"Label under the rule\"}\n# Title *card*\n:::\n\n::: swap {prefix=\"Neko builds\" words=\"docs|decks|video\" suffix=\".\" hold=\"0.9\"}\n:::\n\n::: typewriter\nneko render video.md\n:::\n\n::: scramble\nDECODED LINE\n:::\n\n::: callout\n30 fps.\n:::\n\n::: counter {value=\"$1,250\" label=\"Label\"}\nOptional line.\n:::\n\n::::: stats {count=\"3\"}\n::: stat {value=\"98%\" label=\"Uptime\"}\n:::\n::: stat {value=\"3x\" label=\"Faster\"}\n:::\n:::::\n\n::: chart {type=\"bar\" title=\"Title\" unit=\"s\" caption=\"Source\"}\n- Mon: 12\n- Tue: 18 *\n:::\n```\n\n`chart` types: `bar` (default), `hbar`, `line`, `donut`. Data is `- Label: value`\nbullets or a two-column table; `*` after a value calls it out in the accent.\n\n````markdown\n:::: code {file=\"Program.cs\" speed=\"0.025\"}\n```csharp\napp.Run();\n```\n::::\n\n::: terminal {title=\"zsh\"}\n```bash\n$ neko render video.md\n✓ Wrote video.mp4\n```\n:::\n\n::: browser {url=\"example.com\"}\n![Screenshot](\u002Fassets\u002Fshot.png)\n:::\n\n::: phone\n![Screenshot](\u002Fassets\u002Fshot.png)\n:::\n\n::: cursor {from=\"105%,95%\" to=\"52%,58%\" label=\"Click\" at=\"1.5\"}\n:::\n\n::: cursor {on=\"screen\" from=\"104%,96%\" to=\"63.6%,12.9%\" label=\"XML\" at=\"1.2\"}\n:::\n\n::: lower-third {name=\"Ada Lovelace\" role=\"Engineer\" at=\"0.8\" until=\"4.5\"}\n:::\n\n::: captions {style=\"pill\"}\n0.5-2.4 First caption line, timed on the scene clock\n2.5-4.4 and the second.\n:::\n\n::: quote {author=\"Name\" role=\"Role\"}\nThe quote, read in word by word.\n:::\n\n::: steps\n1. **Write** the scenes.\n2. **Render** the MP4.\n:::\n\n::: checklist\n- Ticked as it arrives\n:::\n\n::::: grid {count=\"3\"}\n::: card {title=\"Title\" icon=\"bolt\"}\nText.\n:::\n:::::\n\n::: cta {button=\"Get started\" url=\"example.com\"}\n# The call to *action*\n:::\n\n::: logo {src=\"logo.svg\" text=\"Brand\" tagline=\"Tagline\"}\n:::\n\n::: media {src=\"assets\u002Fclip.webm\" start=\"0\"}\n:::\n````\n\nA screenshot in `browser`\u002F`window`\u002F`phone` arrives with its frame and never animates\non its own (no `kenburns` inside a frame: it grows the picture inside fixed chrome);\na frame holding one screenshot takes its proportions, so nothing is cropped. Put\ndark screenshots on `ground=\"ink\"`: in curiosity the chrome follows the ground. Move\nthe whole scene with `camera` instead.\n\nAlso: `window {title}`, `cols`\u002F`col`, `box`, `stack`, `reveal {enter at}`, `logos`\n(a row of images). Captions styles: `rail`, `pill`, `highlight`. `media` clips\nare muted and seeked frame by frame; prefer WebM.\n\n## Curiosity brand components\n\nIn `theme: curiosity` headlines rise word by word out of a mask, counters ease\nout with no pulse and nothing blurs. Scene `art=` also takes the website's live\ndrawings: `field`, `squares`, the dash mosaics `wave|rows|chart|chart-grid|mountain|band|dither`\n(with `scheme=\"signal|ink|deep|stone|paper\"`) and the story tiles\n`step-grid|join-grid|lattice|dot-chart`. Brand components:\n\n````markdown\n::: tile {art=\"mountain\" label=\"Mountain\" height=\"300px\"}\n:::\n\n::: pixel-window {art=\"mountain\"}\n:::\n\n::: glyphs {names=\"value-connected|value-resolved|value-traceable\" labels=\"Connected|Resolved|Traceable\"}\n:::\n\n::: glyph {name=\"k..*k...kkk.....\" size=\"160px\" label=\"Custom\"}\n:::\n\n::: sudo {clip=\"workIdle\" class=\"corner\"}\n:::\n\n::: mark {cube=\"true\" size=\"300px\"}\n:::\n\n::: wordmark {tagline=\"One line under the name.\"}\n:::\n````\n\n`steps {class=\"stair\"}` draws steps as a widening staircase; `stats {class=\"cards\"}`\nstaggers the stats as paper, deep-blue and slate cards. Still glyphs build once and\nhold (`loop=\"true\"` repeats them). Keep Sudo in a corner: a detail, never the subject.\n\n## Voice-over\n\nNarration is written as text in the same file and spoken by Voxwerk (Qwen3-TTS\nVoiceDesign, pure C#). It is a **separate track on the video's clock**: it never\nmoves the animation, and its lines never overlap each other.\n\n```yaml\nvideo:\n  narration:\n    voice: \"A warm, clear female narrator in her thirties, calm and friendly.\"  # a description…\n    # voice: en-gb-rupert-vale   # …or a Voxwerk catalog id (`neko voices --search calm`):\n    #                            # cloned from its reference sample, one speaker throughout\n    #                            # (a description is re-designed per sentence and drifts)\n    language: english            # optional; seed: 7, gap: 0.5, pause: 0.25, volume: 1, wpm: 150\n    voices:                      # optional named voices for lines\n      guest: \"An elderly man with a slow, raspy, gentle voice.\"\n```\n\n```markdown\n--- {id=\"opening\" layout=\"title\"}\n\n# Say it *in Markdown*\n\n--- {id=\"results\"}\n\n## Revenue *doubled*\n\nUp from 12 to 26 in one quarter. {#bars}\n\n--- {narration}\n\n# Headings are labels, not spoken. Each paragraph or list item is one line.\n\n{at=\"opening+0.6\"}\nEvery Neko video can carry a voice-over.\n\nRevenue doubled in the second quarter. {at=\"#bars\" voice=\"guest\"}\n\nAnd this line simply follows the one before.\n```\n\n- `--- {narration}` (or `{voiceover}`) marks a part as narration, not a scene;\n  put parts anywhere (after each scene, or one at the end). The rule may carry\n  defaults: `--- {narration voice=\"guest\" at=\"scene-4\"}`.\n- Line attributes (a `{…}` at the end of the line or on its own line before it):\n  `at`, `voice`, `language`, `seed`, `pause` (between its sentences), `gap`\n  (after the line before), `volume`.\n- `at`: `12.5` \u002F `1:04.2` (video time), `+0.8` (after the line before ends),\n  `scene-3` or a scene `id` (when its transition in is over), `#id` (when that\n  element enters: `{#id}` on any block, list item or heading), plus an offset:\n  `scene-3+1.2`, `#bars-0.3`. No `at` → follows the line before after `gap`.\n- A line anchored while the previous is still speaking **waits** (and is reported\n  as *shifted*). If the voice-over outlasts the last scene, that scene holds.\n- **Scenes fit their narration**: a scene with no `duration` lasts until every line\n  anchored to it (or to an element in it) has been spoken, plus `tail` (0.8 s,\n  a `narration:` option), before the next transition. So in a narrated video,\n  anchor each line to its scene (`at=\"scene-id+0.4\"`) and leave `duration` out;\n  `fit: false` turns this off.\n\nWorkflow — always preview before synthesizing:\n\n```bash\nneko voiceover videos\u002Flaunch.md --preview   # timing sheet: scenes, animation, sentences (~ = estimated)\nneko voiceover videos\u002Flaunch.md             # synthesize missing sentences → assets\u002Fvoiceover\u002Flaunch\u002F*.ogg\nneko render videos\u002Flaunch.md                # mixes the takes (synthesizes anything missing first)\n```\n\nIn the browser preview, **Timing** (or \u003Ckbd>T\u003C\u002Fkbd>, `#timing`) shows the lanes;\nthe current sentence shows as a subtitle (\u003Ckbd>C\u003C\u002Fkbd>). Align by anchoring every\nline to its scene and letting Neko fit the scenes, then moving anchors or shortening\nlines until nothing is *shifted* or *runs into scene N*. Commit the `.ogg` takes with the page; they are keyed by\nvoice + text, so editing one sentence re-speaks only that one. The first\nsynthesis downloads a ~4.5 GB model; it runs about 5× slower than real time on CPU.\n\n## Rendering\n\n```bash\nneko render videos\u002Flaunch.md                    # → videos\u002Flaunch.mp4\nneko render videos\u002Flaunch.md -o out.mp4 -q high # draft | standard | high\nneko render videos\u002Flaunch.md --still 3.5        # one PNG (poster, checking a frame)\nneko render videos\u002F -o out\u002F --from 4 --to 9 --workers 4 --format webm\nneko render videos\u002Flaunch.md --preview          # the timing sheet only; --no-voiceover skips synthesis\n```\n\nffmpeg is found via `--ffmpeg`, `NEKO_FFMPEG`, the PATH, or downloaded once to\n`~\u002F.neko\u002Fffmpeg`. Chromium comes from Playwright (installed on first use) or\n`--browser`.\n\nEmbed the result in a normal page:\n\n```markdown\n[!video src=\"\u002Fassets\u002Fvideos\u002Flaunch.mp4\" poster=\"\u002Fassets\u002Fvideos\u002Flaunch.png\" link=\"\u002Fvideos\u002Flaunch\" title=\"Launch\"]\n```\n\n## Tips\n\n- One idea per scene; 3–6 s per scene; 2–3 transition types per film.\n- Prefer letting Neko time things; check with `--still` at a few moments.\n- Holds are still: give a long scene a `camera` move or a later beat rather than idle motion.\n- Keep one direction of travel (`push` always moves left); use `zoom` for \"deeper\", `zoom-out` for the payoff.\n- Video pages never appear in the sidebar or search; link them or embed their render.\n- With a voice-over, write the script first, anchor each line to its scene, leave\n  `duration` out so scenes fit their lines, and check `neko voiceover --preview`;\n  keep lines to one or two sentences per scene.\n- **Let the last state be read.** An animation that ends as the scene leaves is\n  never seen (a swap's last word, a chart's last bar). Neko holds every scene at\n  least a second after its last arrival; give a scene that needs reading more\n  (`hold=\"2.5\"`), and use `{delay=\"1\"}` on an element to pause *before* it.\n- **A swap needs room**: its words take `hold` × words seconds; a short line of\n  narration over it does not make the scene long enough by itself.\n- **Click on something.** On a screenshot, write the cursor with `on=\"screen\"` and\n  aim it in the picture's own coordinates (pixel ÷ image size), at the control the\n  narration names; start it after the frame settles (`at` ≥ 1). Check the landing\n  point with `neko render --still`.\n- **Stats in the curiosity theme**: `::: stats {class=\"cards\" count=\"4\"}` steps any\n  number of cards down a 180 px stair; keep values short enough for the column.\n",{"name":5,"description":7},"main","4f114553f19bf593d54dfbf7d4a024a789a660fd",".template\u002F.claude\u002Fskills\u002Fvideo",0,"https:\u002F\u002Fgithub.com\u002Fcuriosity-ai\u002Fneko","https:\u002F\u002Fneko.curiosity.ai\u002F","https:\u002F\u002Fgithub.com\u002Fcuriosity-ai","https:\u002F\u002Fcuriosity.ai","Build enterprise AI by describing it","2026-11-13 21:54:58",{"source":8,"skillName":5,"commands":60,"prompt":70,"zipAvailable":71},[61,64,67],{"tool":62,"command":63},"npx","npx skills add curiosity-ai\u002Fneko --skill video",{"tool":65,"command":66},"bunx","bunx skills add curiosity-ai\u002Fneko --skill video",{"tool":68,"command":69},"pnpm","pnpm dlx skills add curiosity-ai\u002Fneko --skill video","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fcuriosity-ai\u002Fneko\u002Fblob\u002Fmain\u002F.template\u002F.claude\u002Fskills\u002Fvideo\u002FSKILL.md",true,[],[74,89,114,137,154,171],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":80,"publishedAt":44},"01M719XZPVD833ZT3PWDX03CV3","youtube","Embed a YouTube video by pasting its URL on its own line. Neko auto-detects watch\u002Fyoutu.be\u002Fembed forms and honours timestamp, autoplay, loop, and mute parameters.","https:\u002F\u002Fgithub.com\u002Fcuriosity-ai\u002Fneko\u002Fblob\u002Fmain\u002F.template\u002F.claude\u002Fskills\u002Fyoutube\u002FSKILL.md",[],[76,81,82,83,84,85,86,87,88,24],"watch","embed","URL","loop","auto","forms","timestamp","line",{"skillNo":90,"name":91,"nameZh":6,"description":92,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":93,"categories":94,"keywords":98,"publishedAt":44},"01M719XXP648Z2N9BVP2169HM0","workflow","Render a workflow diagram from a node-and-arrows DSL — labelled boxes with icons and optional badges, auto-arranged in columns. Use for pipelines, data flows, sign-off chains, ETL diagrams.","https:\u002F\u002Fgithub.com\u002Fcuriosity-ai\u002Fneko\u002Fblob\u002Fmain\u002F.template\u002F.claude\u002Fskills\u002Fworkflow\u002FSKILL.md",[95],{"categoryNo":96,"categoryName":97,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[91,99,100,101,102,103,104,105,106,107,108,109,110,111,112,85,28,113],"diagrams","for","data","boxes","pipelines","columns","dsl","node","etl","sign","diagram","with","icons","use","flows",{"skillNo":115,"name":116,"nameZh":6,"description":117,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":123,"publishedAt":44},"01M719XNZZ03XR61NZ6A7ZCRFZ","update-documentation","Workflow for updating Neko documentation — base every page on the real source code, never invent APIs, warn loudly when the source isn't available, and check that the page (and any changed `tesserae` sample) renders correctly with Playwright \u002F snapframe \u002F a visual check. Use whenever you add or edit docs that describe code, APIs, components, or live samples.","https:\u002F\u002Fgithub.com\u002Fcuriosity-ai\u002Fneko\u002Fblob\u002Fmain\u002F.template\u002F.claude\u002Fskills\u002Fupdate-documentation\u002FSKILL.md",[120],{"categoryNo":121,"categoryName":122,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",[124,125,126,127,128,129,130,131,110,132,43,41,133,134,91,26,112,135,100,136],"update documentation","documentation","update","describe","base","edit","sample","playwright","check","visual","you","page","never",{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":143,"publishedAt":44},"01M719XJX16NY4BZ43SJGB5PNH","tesserae","Render a live Tesserae C# UI block — Neko compiles and executes the C# at build time and shows both the code and a working preview side-by-side. Use only when the project documents Tesserae or runs live C# samples.","https:\u002F\u002Fgithub.com\u002Fcuriosity-ai\u002Fneko\u002Fblob\u002Fmain\u002F.template\u002F.claude\u002Fskills\u002Ftesserae\u002FSKILL.md",[],[139,144,145,146,147,148,149,41,31,26,150,112,151,28,152,153],"live","time","block","at","build","C#","documents","only","ui","project",{"skillNo":155,"name":156,"nameZh":6,"description":157,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":158,"categories":159,"keywords":160,"publishedAt":44},"01M719XH9ZZ1JDYG3C3GCNS2T3","table","Render a Markdown table with alignment, compact mode, and no-wrap option. Use for any tabular comparison, reference matrix, option list.","https:\u002F\u002Fgithub.com\u002Fcuriosity-ai\u002Fneko\u002Fblob\u002Fmain\u002F.template\u002F.claude\u002Fskills\u002Ftable\u002FSKILL.md",[],[156,100,34,161,110,162,163,164,165,112,166,167,168,169,28,170],"alignment","option","tabular","compact","comparison","reference","list","matrix","wrap","mode",{"skillNo":172,"name":173,"nameZh":6,"description":174,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":175,"categories":176,"keywords":177,"publishedAt":44},"01M719XERPKQR08ZG6X6DRS4WA","tab","Render a tabbed panel where only one tab is visible at a time. Use for \"same operation, multiple languages\u002Fplatforms\u002Ftools\" content — JS\u002FPython\u002FC#, npm\u002Fyarn\u002Fpnpm, macOS\u002FWindows\u002FLinux, etc.","https:\u002F\u002Fgithub.com\u002Fcuriosity-ai\u002Fneko\u002Fblob\u002Fmain\u002F.template\u002F.claude\u002Fskills\u002Ftab\u002FSKILL.md",[],[173,147,178,68,179,180,181,182,183,149,184,112,151,185,186,28,145,100,187,188],"macos","content","Tools","js","yarn","npm","operation","python","linux","panel","windows"]