Open-Source Cold Email & Warmup Platform
Warmbly 是开源的冷邮件平台:温暖您的邮箱、发送活动、并对每条回复进行分流。可在我们的云端运行,也可自行托管整套系统。
AI 翻译
尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
After Effects-style motion graphics for code and AI agents — keyframes, text animators, kinetic typography, MCP server. From the creator of CustomerPro.in.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗After Effects-style motion graphics for code and AI agents. From the creator of CustomerPro.in.
DT.ly describes a video as plain JSON — compositions, layers, keyframes with easing curves, text animators, masks, track mattes, trim paths, parenting, effects and motion blur — and renders it to MP4. An MCP server lets AI agents edit projects keyframe by keyframe and look at the frames they make.
wiggle included.Requires Node.js 20+ and FFmpeg on your PATH (brew install ffmpeg, sudo apt install ffmpeg, or winget install ffmpeg).
npm install @dnyantra/dtly
Try it without installing:
npx @dnyantra/dtly init hello.json --starter kinetic --title "Hello"
npx @dnyantra/dtly render hello.json hello.mp4
Install the plugin (MCP server + the moti skill) in one step:
/plugin install dtly --marketplace dnyantra/dtly
Or add the pieces yourself:
claude mcp add --scope user dtly -- npx -y @dnyantra/dtly mcp
npx @dnyantra/dtly skill install --agent claude
The moti skill uses the open Agent Skills format, so one command installs it for every supported agent:
npx skills add dnyantra/dtly # or: npx @dnyantra/dtly skill install --agent all
Then add the MCP server (the editing tools) to your agent:
| Agent | Setup |
|---|---|
| Codex | codex mcp add dtly -- npx -y @dnyantra/dtly mcp |
| Cursor | ~/.cursor/mcp.json → {"mcpServers": {"dtly": {"command": "npx", "args": ["-y", "@dnyantra/dtly", "mcp"]}}} |
| Gemini CLI | ~/.gemini/settings.json → same mcpServers block as Cursor |
| VS Code + Copilot | .vscode/mcp.json → {"servers": {"dtly": {"type": "stdio", "command": "npx", "args": ["-y", "@dnyantra/dtly", "mcp"]}}} |
| Windsurf | ~/.codeium/windsurf/mcp_config.json → same mcpServers block as Cursor |
npx @dnyantra/dtly setup <agent> prints these steps for your agent. Agents without MCP can still use
DT.ly through the skill's CLI fallback (init, still, sheet, render).
Then ask for things like /moti make a 10 second kinetic typography opener for my bakery or
"ease the call-to-action in with a spring and move it 0.3 s later".
npx @dnyantra/dtly studio project.json
studio_open tool.| Shortcut | Action |
|---|---|
| Space | Play / pause |
| ← / → (Shift: 10 frames) | Step one frame |
| Home / End | First / last frame |
| J / K | Previous / next keyframe of the selected layer |
| [ / ] | Move layer start to playhead / trim layer end at playhead |
| ⌘Z / ⇧⌘Z | Undo / redo |
| ⌘D | Duplicate layer |
| Delete | Delete selected keyframe (or layer) |
| ⌘/Ctrl + scroll, + / − | Zoom the timeline |
The studio listens on 127.0.0.1 only and its API needs a per-session token.
After npm install -g @dnyantra/dtly (or via npx @dnyantra/dtly …):
dtly init <project.json> [--starter opener|kinetic|bars] [--title "Text"]
dtly render <project.json> <out.mp4> [--from s] [--to s] [--comp id] [--workers n]
dtly still <project.json> <time> <out.png> [--scale 0.5]
dtly sheet <project.json> <out.png> <t1,t2,...>
dtly import-svg <project.json> <file.svg> [--width 600] [--at x,y]
dtly captions <project.json> <audio|video|.srt|.vtt|.json> [--lang mr-IN]
dtly map-tiles <out.png> --tiles <url> --route "lat,lon;lat,lon" [--attribution "…"]
dtly studio <project.json> [--port 4400] [--no-open]
dtly presets
dtly mcp
dtly setup <claude|codex|cursor|gemini|copilot|windsurf>
dtly skill install [--agent claude|codex|cursor|gemini|copilot|all] [--project] [--dir path]
import {newProject, addLayer, setKeyframe, PRESETS} from '@dnyantra/dtly';
import {writeProject, renderVideo} from '@dnyantra/dtly/node';
const p = newProject({name: 'Promo', duration: 5, background: '#111'});
addLayer(p, 'main', {
type: 'text', id: 'title', text: 'Fresh bread daily', size: 120, color: '#ffffff',
animators: [{unit: 'word', stagger: 0.1, duration: 0.6, ease: 'backOut', from: {opacity: 0, y: 60}}],
});
setKeyframe(p, 'title', 'transform.scale', 0, [90, 90], {spring: {stiffness: 180, damping: 12}});
setKeyframe(p, 'title', 'transform.scale', 1, [100, 100]);
PRESETS['element.highlightWord'].apply(p, 'main', {layer: 'title', at: 1});
writeProject('promo.json', p);
await renderVideo('promo.json', 'promo.mp4');
Entry points: @dnyantra/dtly (model, edits, presets, renderer — browser-safe),
@dnyantra/dtly/node (MP4/PNG rendering, project files), @dnyantra/dtly/mcp (MCP server).
Installing the package also gives you the dtly command.
| After Effects | DT.ly |
|---|---|
| Composition / precomp | comps[], layer type: "precomp" |
| Layer in/out | inPoint, outPoint (seconds) |
| Transform | transform.anchor/position/scale(%)/rotation(°)/opacity(%)/skew |
| Keyframes + easing | {keyframes: [{t, v, ease}]} — easyEase, expoOut, backOut, [x1,y1,x2,y2], {spring: {...}}, hold |
wiggle() | {keyframes, wiggle: {freq, amp}} |
| Parenting / null | parent: id, type: "null" |
| Masks / track mattes | masks: [...], matte: {layer, mode} |
| Trim paths | shape trim: {start, end} |
| Text animators | animators: [{unit, stagger, duration, ease, from: {...}, clip, mode}] |
| Effects | blur, dropShadow, glow, fill, brightness, saturate, contrast, tilt, cornerPin, rgbSplit, glitch, wave, curves, colorBalance, exposure, temperature, vignette, lut |
| Adjustment layer | type: "adjustment" |
| Shape morphing / repeater | keyframe path; repeater |
| Footage (Lottie) | type: "lottie" |
| Motion blur | motionBlur: {samples, shutter} |
Layer index 0 is the top of the stack, as in After Effects. See
plugin/skills/moti/SKILL.md for the full guide.
git clone https://github.com/dnyantra/dtly && cd dtly
npm install # also builds dist/
npm test # typecheck + end-to-end smoke test (renders + MCP round trip)
npm run test:studio # drives the Studio in your installed Chrome (puppeteer-core)
npm run dev -- render examples/kinetic.json out.mp4
Opening Claude Code in the repo loads the local MCP server (.mcp.json) and the skill.
MIT for the code. Bundled fonts (Baloo 2, Mukta) are under the SIL Open Font License 1.1.
DT.ly is made by the creator of CustomerPro.in — WhatsApp marketing, campaigns and AI agents for small businesses.