Open-Source Cold Email & Warmup Platform
Warmbly is the open-source platform for cold email: warm your mailboxes, send campaigns, and triage every reply. Run it on our cloud or self-host the whole thing.
Customer Pro is an AI-powered customer platform for teams — one inbox for WhatsApp, Instagram, Facebook and email, with campaigns, social post scheduling, catalog and AI agents in one place.
MarketingGitHub @dnyantraOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
After Effects-style motion graphics for code and AI agents — keyframes, text animators, kinetic typography, MCP server. From the creator of CustomerPro.in.
Taken from the repository README
Loading the full README.
Read the full 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.