Volito

io.github.monarcproPublished by GitHub account monarcprov0.3.1Updated Nov 1, 2026

Motion graphics as code: find, preview and render lower thirds, titles, charts and 3D to video

VerifiedSTDIODesktop onlyDeveloper ToolsMedia & Design

Overview

AI-generated overview

Finds, previews, checks and renders brand-aware motion graphics — lower thirds, titles, charts, 3D — to video files with alpha.

What you can do
  • Browse and inspect graphics: list the 107 items across twelve packs, read an item's props, parts and source, and see the built-in brand styles.
  • Explore motion: list every move, ease, idle loop, emphasis hit and mood that the motion settings accept.
  • See and measure: render a contact sheet or single frame as an image, run frame-by-frame checks at each aspect, and review timing plus 9:16 platform safe zones.
  • Render and sound: write ProRes, HEVC, WebM, MP4, GIF or PNG output, and produce a synthesised .wav track with its cue list.
  • Author your own: read the program API and validate a Graphic spec before rendering it.
When to use it
Use it when you want an assistant to produce video overlays or titles for editing timelines, social clips or promos, or to iterate on a custom motion graphic with previews and checks before committing to a render.
Requirements
Runs locally via npx (npm package volito, stdio transport). Node 20.10 or newer. Video formats need ffmpeg on PATH or the VOLITO_FFMPEG variable; stills, contact sheets and PNG frames do not, and WebM needs an ffmpeg built with libvpx. No accounts, API keys or headers are declared.
Before you install
Rendering writes files to the paths you give, including the out option and review folders. Custom code and specs are executed to draw frames, so only run graphics you trust. Image props can take a file or URL, which may fetch remote content. No credentials are requested.

Installation

In SourceWeft

  1. Open Volito in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

[Volito: motion graphics, from one sentence. Motion graphics as code for developers and AI agents, by MONARC PRO.]

Volito

Brand-aware, voice-synced motion graphics as code — for developers and AI agents.

[npm version] [CI] [Engine licence: MIT] [Docs on volito.dev]

Website · Docs · Packs · For agents · npm · Changelog

By MONARC STUDIOS, the team behind MONARC PRO. Volito is the motion graphics engine inside the MONARC PRO video editor, opened up; the name is Latin for “to flutter”. Every graphic is a small program — function frame(t, $) returns the SVG of one frame — so it is readable, diffable, seekable to any frame, and something an AI agent can write and fix. It ships with 107 ready-made graphics in twelve packs (3D, maps, transitions, kinetic type, interactive UI and filter effects among them), 36 brand styles, sixteen animated patterns, a CLI, a Node API, a browser player and an MCP server, and renders to ProRes 4444 or HEVC with alpha, WebM, MP4, GIF, PNG frames or SVG.

  • One design, every brand. Items draw with colour roles and faces, not fixed colours: pass one of 36 built-in styles, your DESIGN.md, or a couple of overrides, and the whole pack re-skins.
  • One design, every aspect. Layouts follow the canvas and keep to title-safe areas, including the space platforms reserve on 9:16. 16:9, 9:16, 1:1 and 4:5 from the same item.
  • On the voice. Give a transcript and text lands on the words that say it.
  • Drops onto footage. Overlays render with real alpha for Premiere, Resolve, Final Cut, After Effects and CapCut.
  • Sounds like it moves. --sound gives any render a sound track Volito synthesises itself — a pop for every spring, a whoosh for every move across the frame, ticks for letters, a hit for a slam, a bed in a key — and a program can design its own cues beside its frames.
  • Agent-native. An MCP server gives Claude Code, Cursor and other agents tools to find, preview (as an image they can see), check and render graphics — or to write their own.
  • Many scripts. Latin, Latin Extended, Vietnamese, Cyrillic, Greek and Devanagari (Hindi), shaped properly.

[A 10-second Volito intro: kinetic type, the logo dropping in, an extruded 3D wordmark and an end card]
This intro is a Volito program: kinetic type, a 3D wordmark and an end card, rendered in Node.

bash
npx volito render lower-third \  --prop name="Priya Sharma" --prop role="Product designer" \  --style ember --aspect 16:9 --out priya.mov

Install

bash
npm install volito      # or run it with npx, nothing to install

Volito was first published as @monarcpro/motion; that package is deprecated in favour of this one.

Node 20.10 or newer. Video formats need ffmpeg on your PATH (or VOLITO_FFMPEG); stills, contact sheets and PNG frames do not. WebM needs an ffmpeg built with libvpx.

The packs

[107 graphics in 12 packs: a render from each of Essentials, Broadcast, Social, Data, 3D, Transitions, Annotate, Type, Backdrops, Promo, UI and Effects]

107 graphics in twelve packs. Every one takes any brand style and any aspect, and every part of it takes any move.

PackItems
Essentials (14)lower-third · title-card · headline (kinetic, on the voice) · subscribe · social · callout · stat · bar-chart · steps · quote · banner · end-card · logo-sting · wipe
Broadcast (10)Lower thirds in five looks — lt-bars, lt-reveal (mask reveal), lt-kicker, lt-pill (picture or initials, status dot), lt-news (tight boxes) — ticker (crawl), live-badge (viewers, clock), score-bug (teams, scores, clock, goal flash), location (pin and place card), countdown
Social (8)follow-card (profile, count, Follow press) · notification (phone or desktop) · notifications (a stack that cascades) · comments (typing on) · chat (thread with typing dots) · post (counts and a heart) · now-playing (music card) · rating (stars, score, review)
Data (9)line-chart (draws on, target line) · donut · bar-race (overtaking across periods) · goals (meters) · versus · timeline · funnel · world-map (countries filled by value, regions) · flight (a great-circle route between two places)
3D (7)logo-3d (extruded wordmark, light sweep) · title-3d (letters flip up) · number-3d (an extruded counter) · card-flip (front and back) · cube (a word prism that rolls) · bars-3d (orbiting camera) · globe (spins to a country, routes arc in)
Transitions (11)Cover the frame by the cut, reveal the next shot: iris (circle, diamond, star, square) · blinds · doors (with a Bauhaus disc) · glitch · ink (wobbly blooms) · clock · tiles (Bauhaus shapes) · pixels · stripes · slices · whip — each with a word at the cut
Annotate (10)Point at things in footage (places in % of the frame): arrow (hand-drawn or clean) · circle · spotlight (feathered dim) · focus (brackets that lock on) · highlight (highlighter, underline, box, strike) · stamp (pressed ink) · reactions (live hearts, likes, fire) · pointer (leader line and card) · emphasis · markers (numbered)
Type (10)Kinetic type: typewriter · word-swap (a word that keeps changing) · split-flap · marquee (tilted scrolling bands) · echo · liquid-fill · decode · word-by-word · key-phrase (marker on marked words) · stack (editorial)
Backdrops (9)Moving grounds: pattern (any of the sixteen) · aurora · tiles (Bauhaus field) · retro-grid (synthwave) · blobs (lava goo) · gradient · starfield · bokeh · topo
Promo (8)sale-badge (starburst) · price-card (counts down, strike, click) · coupon (copy the code) · offer-countdown (D:H:M:S) · features (checklist) · cta (button and cursor) · launch · ribbon (crossing tapes)
UI (5)Interactive states (see Interactive states): button (idle, hover, press, loading, done) · toggle · like (rolling count) · loader (success or failure) · bell (badge, read)
Effects (6)SVG filters, no GPU: grain (film grain, re-rolled every film frame) · light-leak · glass (frosted card over drifting colour) · chromatic (channels split and snap) · warp (liquid ripple settling) · neon (flickers on)

volito info <item> lists every prop. To see them all live, serve this package's folder and open examples/gallery.html.

Motion without limits

Every item is made of named parts (volito info lower-third lists them: scrim, spine, plate, name, role). Any part takes any move, and the moves combine freely:

bash
volito render lower-third \  --motion name.in=typewriter --motion plate.in=iris --motion "*.ease=bouncy" \  --motion role.emphasis=pulse@2 --motion spine.idle=pulse --out priya.mov
SettingTakes
in, out38 moves — rise drop slide smear arc pop zoom push grow wipe iris shutter blinds diagonal blur flip turn spin roll swing skew stretch squash bounce elastic slam tilt float glitch flicker typewriter scramble … An exit plays its move backwards.
easeout inOut expo back elastic bounce, springs snappy punchy bouncy calm wobbly, or spring(f,d), steps(n), cubic(x1,y1,x2,y2)
from, outFromthe side a move comes from or leaves to (left, right, up, down, diagonals)
dur, delay, at, outAt, distance, intensity, origin, blurtiming, travel, scale, pivot, motion blur
idlea loop while it holds: float bob pulse breathe wiggle sway drift jitter spin heartbeat shimmer
emphasishits at a time, a beat or a spoken word: "[email protected], pop@now" (pulse pop shake jump wobble flash spin rubber tada)
split, order, staggertext whole, or by lines / words / letters, forward reverse center edges random
keysyour own keyframes: [{"t":0,"x":-300,"op":0},{"t":0.8,"x":0,"op":1,"ease":"bouncy"}] — any path

Or let it choreograph itself: --mood energetic | elegant | playful | cinematic | glitchy | minimal | retro | kinetic, and --seed <n> for a new take on every number (the same number always moves the same way). --speed 2 plays it all twice as fast. volito moves lists everything. Programs you write get the same kit: const M = motion($, t); M.part("card", { at, in: "pop", box }, markup).

3D and maps

The 3D items are real geometry, not tricks: meshes are lit, faces turned away are culled, everything is sorted far to near and projected through a perspective camera — then drawn as SVG paths, so 3D renders on any machine with no GPU, at the same speed as the rest. 3D text is extruded from the outlines of the bundled faces (read straight from the font files), so a logo turns in the brand's own type.

js
function frame(t, $) {  const S = scene3d($, { camera: { yaw: -20 + 40 * (t / $.dur), pitch: -8 } });  S.add(S.text("VOLITO", { face: $.font("display"), size: 220 * $.k, depth: 60 * $.k, color: $.c.fg, side: $.c.accent }));  return S.render();}

Maps use Natural Earth's countries (177, packed into 30 KB): worldMap($, { center, zoom }) projects them flat (Equal Earth), worldGlobe(S, …) puts them on a 3D globe, and worldFind("UK") finds one by name, short name or ISO number. volito api documents both.

Sound design

Every render can carry sound, and Volito makes it the way it makes pictures: from code, from nothing. No sample library, no files to find. --sound reads the graphic's own motion — every part's move leaves a mark — and gives each its sound: a spring pops, a move across the frame whooshes (louder the further it travels), letters tick, a typewriter types, a slam hits, a glitch zaps, a burst sparkles. --bed Dm lays a pad under it in a key, and it steps back under every hit on its own.

bash
volito render logo-sting --prop wordmark=VOLITO --sound --bed Dm --format mp4 --out sting.mp4volito sound lower-third --prop name="Priya Sharma" --out priya.wav     # the track alone, with its cue list

A program designs its own sound beside its frames — function sound($) runs once with the same $ ($.dur, $.beat, $.at(word), $.data), so cues land on the same beats the picture uses:

js
function sound($) {  return {    cues: [      { at: 0.2, kind: "riser", dur: 1.1 },      { at: $.beat("in", 1.3), kind: "hit", level: 1.1 },      { at: 1.5, kind: "shimmer", dur: 1.2, pan: 0.3 },      { at: -0.6, kind: "ding", note: "A5", level: 0.6 },   // negative counts from the end    ],    bed: { key: "D", mode: "minor", from: 0.8, to: -0.4, level: 0.5 },    auto: false,   // true adds the motion's own cues on top  };}
Kind
whoosh swell riser fallair past, soft air rising, a climb into a moment, the fall after it
hit stamp sub popan impact, a heavy slam, a low drop, a bubble pop
tick click type scratchone letter or step, a UI click, keys for a while, pencil on paper
shimmer ding zapsparkle, a bell (note: "A5"), a glitch
tone chorda note, the bed's chord — for a sting that resolves

Each cue takes at, dur, level (0–2), pitch (semitones), pan (-1…1) and seed. The track is stereo 48 kHz, limited, with a room; --sound-out track.wav writes it alone for an editor's timeline beside a ProRes overlay. MP4 and HEVC carry AAC, ProRes carries PCM, WebM carries Opus; PNG and GIF carry none. volito api prints the whole sound reference.

CLI

bash
volito list                                   # every itemvolito info stat                              # what it is, every propvolito styles                                 # the built-in brand stylesvolito moves                                  # every move, ease, idle, hit and moodvolito sheet title-card --mood playful --seed 7   # a new choreographyvolito sheet stat --prop value=72 --prop suffix=% --prop chart=ring   # frames across time, one PNGvolito still title-card --aspect 9:16 --t 1.5 --out frame.pngvolito render banner --prop headline="Doors open at 9" --format webm --out banner.webmvolito check ./my-graphic.js                  # run it at every aspect, report problems

Graphic specs

Any set of options can be saved as a spec: one JSON file for one graphic that every command takes in place of an item. Keep it in your repo, review it, hand it to an agent; options on the command line win over it.

bash
volito spec lower-third --prop name="Priya Sharma" --style ember --aspect 9:16 --out priya.volito.jsonvolito validate priya.volito.json            # its props, parts, files and aspect against the itemvolito render priya.volito.json --prop role="Founder"volito schema                                # the JSON Schema (also at https://volito.dev/schema/graphic.v1.json)
json
{  "$schema": "https://volito.dev/schema/graphic.v1.json",  "volito": 1,  "item": "essentials/lower-third",  "props": { "name": "Priya Sharma", "role": "Product designer" },  "style": "./DESIGN.md",  "aspect": "9:16",  "motion": { "name": { "in": "typewriter" } },  "mood": "elegant",  "seed": 4,  "sound": { "bed": "Dm" },  "render": { "format": "mov", "out": "renders/priya.mov" }}

Paths inside a spec (a DESIGN.md, a program, a transcript, image props) are relative to the spec file. program points at your own frame(t, $) file, or code holds it inline. volito bundle priya.volito.json packs the spec and those files into one priya.volito that every command takes, anywhere.

Review before you render

bash
volito review lower-third --prop name="Priya Sharma" --aspect 9:16

The check at each aspect, then what the frames show: when the graphic settles, how long it holds still and when it leaves (with a warning when the entrance is slow or the hold too short for its words), how much of an overlay sits under Reels', Shorts' and TikTok's interface at 9:16, and a contact sheet per aspect in volito-review/<item>/ with a review.md.

Option
--prop name=valuea prop (repeat). Lists: "a; b; c". Chart rows: "Label: 42; Other: 17"
--props <json or file>every prop at once
--image name=patha picture for an image prop (a file or URL)
--style <name or DESIGN.md>a built-in style or your brand's DESIGN.md
--accent --accent2 --ink --paper #hex · --mode dark|light · --display --text Font:900overrides on the style
--aspect 16:9|9:16|1:1|4:5|WxH · --duration s · --fps n · --width pxthe frame
--bg #hex|transparenta ground under the graphic
--words transcript.json · --offset sland text on a voice ([{w, s, e}] or Whisper JSON)
--motion part.setting=valuehow a part moves (repeat; * for every part) — see Motion without limits
--mood m · --seed n · --speed xa choreography, a new take per seed, faster or slower
--beat in=0.4 --beat out=-0.6move the entrance and exit (negative counts from the end)
--sound · --bed Dm · --sound-level x · --sound-out file.wava sound track synthesised by Volito (see Sound design), a pad in a key, its level, the track alone
--packs <dir>more packs (also VOLITO_PACKS)
--format mov|webm|mp4|hevc|gif|pngfor render; png/svg for still
Format
movProRes 4444 with alpha — the default; for every desktop editor
hevcHEVC with alpha in .mov — small files for Final Cut, iMovie, Safari (macOS)
webmVP9 with alpha — for the web and CapCut
mp4H.264, no alpha — drawn on --bg (black)
gifanimated GIF, 1-bit transparency
pnga folder of PNG frames with alpha

AI agents (MCP)

[An agent adds the Volito MCP server, then calls motion_list, motion_preview, motion_check and motion_render to make a lower third in 16:9 and 9:16]
bash
npx volito init          # adds the server for Claude Code, Cursor and VS Code, and the skillnpx volito doctor        # what is ready: Node, FFmpeg formats, fonts, each agent's setup

Or by hand: claude mcp add volito -- npx -y volito mcp, codex mcp add volito -- npx -y volito mcp, and for Cursor, Windsurf and other MCP clients:

json
{ "mcpServers": { "volito": { "command": "npx", "args": ["-y", "volito", "mcp"] } } }
Tool
motion_listfind graphics by words or category
motion_infoan item's props (and its source with code: true)
motion_stylesthe brand styles
motion_previewa contact sheet as an image — the agent sees how it moves and whether text fits
motion_stillone frame as an image
motion_checkerrors and warnings at every aspect
motion_renderrender to a file and return its path (sound: true muxes a synthesised track, bed: "Dm" a pad)
motion_soundthe graphic's sound alone as a .wav, with its cue list
motion_movesevery move, ease, idle, hit and mood the motion settings take
motion_validatecheck a Graphic spec (inline or a file) against its item before rendering
motion_reviewtiming, 9:16 platform safe zones and a contact sheet per aspect, measured before rendering
motion_apithe program API and the motion kit, for writing new graphics

The preview, still, check, review, render and sound tools take an item, your own code or a spec file, plus motion, mood, seed and speed. A ready-made agent skill is in skills/volito/SKILL.md — npx volito init installs it for Claude Code, npx skills add monarcpro/volito for other agents, or copy it to ~/.claude/skills/volito/ for Claude Code.

Node API

js
import { findItem, renderVideo, renderStill, renderSheet, checkItem } from "volito";
const item = findItem("essentials/lower-third");const result = await renderVideo(item, {  props: { name: "Priya Sharma", role: "Product designer" },  style: "ember",                 // or the text of a DESIGN.md, or { colors, fonts, … }  colors: { accent: "#00A86B" },  // overrides  aspect: "9:16",  out: "priya.mov",});console.log(result.file, result.frames, result.warnings);

Browser

js
import { loadRegistry, findItem, createPlayer } from "volito/browser";
const registry = await loadRegistry();       // the packs, from jsDelivr (or pass your own base URL)const player = await createPlayer(canvas, findItem(registry, "headline"), {  props: { text: "Stop editing. *Start directing.*" },  style: "neon",  aspect: "16:9",});player.play();   // also: pause(), seek(t), update({ props }), destroy()

The player runs each program in a sandboxed Web Worker and draws through the same SVG path as the renderer, so what plays on the page is what renders. Fonts load from base (the package's own fonts/ on jsDelivr by default); serve the package's fonts/ and dist/registry.json to stay offline.

<volito-player>

The same player as an HTML element, with controls and aspect tabs. One script, no build step:

html
<script type="module" src="https://cdn.jsdelivr.net/npm/volito/dist/player.js"></script>
<volito-player item="essentials/lower-third"  props='{"name":"Ada Lovelace","role":"First programmer"}'  brand="cobalt" aspects="all" controls autoplay loop></volito-player>

Or import "volito/player" in a bundled app. Each tab lays the item out again for that aspect, not a crop. It loads when it nears the screen, pauses off screen and in a hidden tab, and does not autoplay for readers who prefer reduced motion.

AttributeWhat it does
itempack/id or an id (or set the program property to your own frame(t, $) code)
propsthe item's props as JSON
branda built-in style; the brand property also takes DESIGN.md text. accent, accent2, ink, paper, mode override colours
aspect · aspectsthe aspect shown (16:9, 9:16, 1:1, 4:5, WIDTHxHEIGHT) · the tabs to offer (all or a list)
duration speed mood seed motion beatsas on the CLI; motion takes part.setting=value separated by ;
controls autoplay loopplay/pause, a scrubber and the time; start when shown; play again at the end
playback-rate · range-start range-endplay faster or slower · play only [start, end) seconds
poster · postersan image until the first frame · per-aspect images as JSON
groundbehind a transparent graphic: footage (default), checker, none or a colour
backgrounda colour drawn into the frame itself
base · loading · resolutionwhere fonts/ and dist/registry.json live · eager to load at once · the canvas's longest side (1920)

Properties and methods: play(), pause(), seek(t), load(), currentTime, duration, paused, ended, ready, playbackRate, props, brand, aspect, options (anything else a build takes: words, media, beats), program, warnings and player (the MotionPlayer underneath). Events, none of which bubble: ready, play, pause, ended, timeupdate (about ten a second), durationchange, aspectchange, warnings and error. Style it with CSS custom properties (--volito-accent, --volito-stage, --volito-max-height, …) or ::part(); Space, ←/→ (a frame, Shift for a second), Home and End work when it has focus. examples/player.html shows each of these.

Interactive states

A graphic can be a live UI element: its timeline cut into named states that page events and your code switch between. Every item in the ui pack declares its own, so this works with no setup:

html
<volito-player item="ui/button" aspect="1000x500" ground="none" props='{"label":"Get started"}'></volito-player><script type="module">  const button = document.querySelector("volito-player");  button.addEventListener("statechange", (e) => console.log(e.detail.to)); // enter → idle → hover → press → loading  await fetch("/api/signup", { method: "POST" });  button.state = "done";                                                  // lands on the check</script>

Any graphic can have states: states='{"idle":{"from":"idle","to":"hover","play":"loop"},…}' (times are seconds or beat names; play is once, loop or hold; next hands a finished once on), and on="pointerenter(idle): hover; pointerleave(hover): idle; click: press" maps page events to them.

Brand styles

36 built in. MONARC PRO's: ember, cream, mono, neon, pop, studio, and the explainer art styles whiteboard, sketch, pastel, pixel, collage, diorama, clay, storybook. And Volito's own, each with an animated pattern for a ground:

StyleLookPattern
cobaltcobalt colour field, cream type, acid limebauhaus
tomatotomato-red poster, black slabshalftone
acidacid-yellow sheet, indigo serifdither
candyneo-brutal: outlines, hard shadows, pink and yellowdots
risorisograph pink and blue on paperhalftone
auroranight with drifting violet and cyan light, glassmesh
sunsetplum ground, coral and gold bloomsmesh
limeink ground, electric limeplus
sportblack, volt and blaze, condensed capsstripes
retroseventies cream, orange and mustard, fat serifwaves
dinercream, cherry and teal, script headlinechecker
blueprintgraph paper, cobalt ink, serifgraph
forestdeep green field, peony pink, soft serifrings
luxeblack and champagne gold, decosunburst
capsuleoutlined pills, coral and limepills
memphiswarm white, hot pink and sky, confetticonfetti
swissoff-white, black, signal red, heavy Intertiles
terminalphosphor green monospacedither
vaporsynthwave magenta and cyanwaves
scifiHUD cyan, geometric displayplus
mintmint sheet, coral popdots
editorialmagazine black and red, didonehatch

volito styles lists them all. Or pass a DESIGN.md:

markdown
---name: acmemode: lightcolors:  accent: "#00A86B"  accent2: "#FFD23F"  ink: "#101418"  paper: "#FAFAF7"fonts:  display: "Poppins:800"  text: "Inter:600"motion: bouncysurface: glass---# AcmeFriendly, confident, never shouty.

Faces available: Inter, Space Grotesk, Space Mono, Poppins, Playfair Display, Montserrat, Anton, Outfit, Gabarito, Caveat, Press Start 2P, Permanent Marker, Patrick Hand, Fredoka, IM Fell English, Bebas Neue, DM Serif Display, Archivo Black, Syne, Unbounded, Righteous, Orbitron, Pacifico, Fraunces and Bricolage Grotesque.

Patterns

A style's texture can name any of sixteen animated patterns, and every ground the items draw picks it up: dots, plus, graph, hatch, stripes, checker, halftone, dither, waves, rings, mesh, confetti, bauhaus, tiles, pills, sunburst (the editor's grid, glow, grain, paper, board, parchment, pixel and studio still work). Programs can draw one anywhere:

js
s += $.pattern(t, "halftone", { box: { x: 0, y: 0, w: W, h: H }, a: 1.2, scale: 1, speed: 0.5 });

Options: box, color, color2, a (strength), scale, speed, angle, at ([x, y] for rings, halftone, sunburst), count, seed, r. They are pure functions of time like everything else — no GPU.

Write your own

bash
volito new promo-card        # item.json + frame.js from a templatevolito sheet ./motion/promo-cardvolito api                   # the whole $ runtimevolito guide                 # how items and packs are laid out
js
function frame(t, $) {  const p = $.data, k = $.k;                       // props, and the canvas scale (1 at 1080 px)  const tin = $.beat("in", 0.2);  return $.g($.enter(t, tin, { dy: 60 * k, ox: $.W / 2, oy: $.H / 2 }),    $.card($.W / 2 - 320 * k, $.H / 2 - 110 * k, 640 * k, 220 * k),    $.text($.case(p.title ?? "Hello"), { ...$.font("display"), size: 80 * k, x: $.W / 2, y: $.H / 2 - 44 * k, anchor: "middle" }));}

A program is a pure function of t: no Date, Math.random (use $.hash), timers, network or DOM. Size by $.k, colour from $.c, faces from $.font(role), and a brand's DESIGN.md re-skins it. A pack is a folder with pack.json, a shared.js of helpers and one folder per item; load it with --packs <dir>.

How it renders

Node runs each program in a fresh vm context holding the same worker source MONARC PRO uses. Only strings and numbers cross into it, and eval, Function, require, process and the network are out of reach. Text is measured with fontkit against the bundled faces; frames are rasterised by resvg; text beyond a face's Latin cut is shaped by fontkit and drawn as outlines, and dash patterns written against pathLength (which resvg ignores) are scaled to each shape's real length first. Frames that don't change are drawn once. The motion kit, the 3D kit and the map data ship as libraries that are added to a program when it is built: items stay small, and the 60 000-character limit applies only to what an item's author (or an agent) wrote.

vm keeps mistakes contained, but it is not a security boundary. Run packs you trust, as you would any npm package.

Development

bash
pnpm install          # Node 22.18 or newer for development (the package itself runs on Node 20.10+)pnpm build            # fonts/ from Fontsource, then dist/pnpm testnode dist/cli.js sheet lower-third --mood playful --seed 7 --out sheet.png

node scripts/review.mjs <aspect> <style> [items | pack:<id>] [times] writes contact sheets to out/, node scripts/styles.mjs [styles] [items] one row per style, node scripts/strip.mjs <items> <aspect> <style> <times> '<props JSON>' the same props across several items, node scripts/variants.mjs <item> one item under many seeds, and node scripts/demo-grid.mjs <item> a 3×3 video of nine choreographies.

The engine in src/engine/ (the runtime every program draws with, its sandbox and the brand styles) is the same code MONARC PRO uses, copied from MONARC PRO's core so this repo stands alone; src/engine/SOURCE.json names the commit. With a MONARC PRO checkout (../monarc) next to this one, pnpm sync-engine brings it up to date and node scripts/sync-engine.mjs --check reports drift. Packs, the motion kit (src/kit.ts), the extra faces (src/fonts-extra.ts), styles (src/styles-extra.ts) and patterns (src/patterns.ts) live here; src/engine.ts splices the faces and patterns into the runtime without editing the copy.

Licence

  • The engine: MIT.
  • The MONARC packs: the MONARC Packs License. Use them in any video, personal or commercial, with no attribution required. Don't resell them as templates.
  • The fonts: each family's SIL Open Font License, in fonts/licenses/ of the installed package (pnpm build writes that folder in a checkout).

Contributing

Issues and pull requests are welcome: CONTRIBUTING.md covers the setup, the tests and how items and packs are written. Report security problems privately, as SECURITY.md says.

Made by MONARC STUDIOS, the team behind MONARC PRO.

Source: README.md at commit af1b115

Tools

12

motion_list

List motion graphics

The graphics in the packs: ref, overlay or full frame, default length, what it is.

Parameterssearchcategory

motion_info

Describe a motion graphic

Everything about one item: what it shows, its length, aspects and every prop with its type and default. `code: true` adds its source (to learn from or adapt).

Parameterscodeitemrequired

motion_styles

List brand styles

The built-in brand styles (colour roles, faces, motion feel). Any style can be replaced by a DESIGN.md, or tuned with `colors`.

Takes no parameters.

motion_moves

List motion settings

Every move (entrances, and exits as the same move played backwards), ease, idle loop, emphasis hit, mood, text split and order the `motion` settings take. Any part of any graphic can use any of them.

Takes no parameters.

motion_preview

Preview a motion graphic

A contact sheet: frames across the graphic's time in one image, so you can see how it moves and whether the text fits. Overlays are shown on a grey stand-in for footage.

Parameterscodeitemmoodseedspecbeatspropsspeedstyletimeswordsaspect+5 more

motion_still

Render one frame

One frame as a PNG (alpha kept), returned as an image and written to `out` when given.

Parameterstoutcodeitemmoodseedspecbeatspropsspeedstylewords+6 more

motion_check

Check a motion graphic

Runs it frame by frame at each aspect and reports errors (throws, SVG that does not parse, a graphic that draws nothing) and warnings (text running off the frame, words never spoken, props that do not fit). Use it in a write → check → preview loop.

Parameterscodeitemmoodseedspecbeatspropsspeedstylewordsaspectcolors+4 more

motion_review

Review a motion graphic

Everything to look at before rendering, measured: the check at each aspect, when it settles and how long it holds still (with a warning when the entrance is slow or the hold too short to read its words), how much of an overlay sits under Reels', Shorts' and TikTok's own interface at 9:16, and a contact sheet per aspect (returned as images, written with a review.md to outDir).

Parameterscodeitemmoodseedspecbeatspropsspeedstylewordsaspectcolors+5 more

motion_render

Render a motion graphic

Render to a file. Formats: mov — ProRes 4444 with alpha (.mov) — drops onto footage in Premiere, Resolve, Final Cut, After Effects; webm — VP9 with alpha (.webm) — for the web and CapCut; needs an ffmpeg built with libvpx; mp4 — H.264 (.mp4) — no alpha: drawn on --bg (black by default); hevc — HEVC with alpha (.mov) — small files for Final Cut, iMovie and Safari; macOS only (VideoToolbox); gif — animated GIF — 1-bit transparency, or drawn on --bg; png — a folder of PNG frames with alpha — no ffmpeg needed. Returns the file's path.

Parametersbedfpsoutcodeitemmoodseedspecbeatspropssoundspeed+12 more

motion_sound

Sound design for a motion graphic

The graphic's sound alone, as a .wav, with its cue list: the program's own sound($) cues when it defines them, else cues read from its motion (a pop for every spring, a whoosh for every move across the frame, ticks for letters, a hit for a slam). Needs no ffmpeg. Use motion_render with sound: true to mux it into the video instead.

Parametersbedoutcodeitemmoodseedspecbeatspropsspeedstylewords+6 more

motion_validate

Validate a Graphic spec

Checks a Graphic spec before rendering: its shape, the item it names, files it points at, props against the item (lengths, types, choices), motion parts, aspect and length. A spec is one JSON document for one graphic: { "volito": 1, "item": "lower-third", "props": {…}, "style": "ember", "aspect": "9:16", "motion": {…}, "mood", "seed", "sound" }. Pass it inline or as a file path; then render it with motion_render { spec: "path" }.

Parametersspecrequired

motion_api

Program API

How to write your own graphic: the frame(t, $) contract, the whole $ runtime (timing, motion, text, shapes, cards, charts, art styles, brand colours and faces) and how items and packs are laid out. Read before passing `code`.

Takes no parameters.

Version history

1
  1. v0.3.1LatestNov 1, 2026

Score

80% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

    Declare a license in the repository or the registry entry.