Loading...
Loading...
View Source Code
github.com/Danm72/video-engine
Connect on LinkedIn
linkedin.com/in/d-malone
Follow on Twitter/X
x.com/danmalone_mawla
Share this article
I kept hitting the same wall.
Text posts were grand. Audio had a clean pipeline. Images were sorted. But short launch videos were still a mess: screen recordings, ad-hoc edits, random music picks, and no way to reproduce the result next week.
I'm not gonna lie to you, I burned way too many hours pretending this could be solved with "just one more manual edit." It couldn't.
So I built a dedicated video-engine repo and treated video like code.
Inspiration tweet: Thariq's original post on X.
I tested a few approaches. Template-only was too rigid. Conversational scene building sounded cool but was painful to replay exactly.
Manifest-driven won because it gave me control and replayability.
| Approach | What Broke | Why I Dropped It |
|---|---|---|
| Manual editing | Slow, inconsistent | Fine for one-offs, painful for pipeline work |
| Prompt-only generation | Hard to audit | Too much hidden state and fuzzy diffs |
| Manifest-driven | More upfront design | Best tradeoff for repeatable output |
project context -> manifest.json -> audio generation -> Remotion render -> review report
None of this is exotic on its own. The value is how the pieces fit together.
The strict rule in this engine: no CSS timeline animations. Motion comes from useCurrentFrame(), spring(), and interpolate() so renders stay deterministic and debuggable.
The manifest is the source of truth. Components are just the renderer.
{
"meta": { "title": "My Demo", "fps": 30, "width": 1920, "height": 1080 },
"theme": { "bgColor": "#0a0a0a", "accentColor": "#D57456" },
"music": { "prompt": "warm uplifting lo-fi", "durationMs": 35000 },
"scenes": [
{ "id": "intro", "type": "split-intro", "durationMs": 3200 },
{ "id": "focus", "type": "camera-sequence", "durationMs": 5200 },
{ "id": "proof", "type": "animated-card", "durationMs": 5000 }
]
}
This gave me three quick wins:
twitter-insights-v11.mp4The first renders looked rough. Flat motion. Clipped text. Contrast issues on light cards. Springs that felt like they were stuck in mud.
So I did a frame-level comparison against the reference videos and forced myself to set hard targets instead of guessing.
| Dimension | Target |
|---|---|
| Base background | #0a0a0a |
| Accent color | #D57456 |
| Video length | 30-40s |
| Frame rate | 30fps |
| Transition timing | ~350-800ms |
| Music RMS | -36dB to -38dB |

Then I tackled fixes in phases: clipping and contrast first, spring tuning second, transition and scene-type polish after that. Less glamorous, way more effective.
I originally planned visuals first. That was a mistake, full stop.
Switching to audio-first made timing sane again:
That removed a lot of the "why is this transition late?" debugging spiral.
| Layer | Typical Usage | Est. Cost |
|---|---|---|
| SFX | 5-8 cues | $0.30-$0.50 |
| Music | 1 track | $0.10-$0.20 |
| Total per video | 30-40s clip | $0.40-$0.70 |
The turning point was building a single review command after render.
Before this, I was basically squinting at frames and arguing with myself. After this, I got a concrete report:
python3 scripts/review-render.py out/video.mp4 \
--reference data/reference-profiles/v1-insights.json \
--output out/reviews/video-review.md
Also: if animation feels dead, check spring damping before rewriting half your scene library. Ask me how I know.
1:1, 9:16)/content-video integration in the full content pipelineIt remains to be seen how far I can push full automation without losing quality, but this is already a massive step up from manual editing roulette.
Explore the Full Code
Star the repo to stay updated
Let's Connect
Follow for more smart home content
Follow on Twitter/X
x.com/danmalone_mawla
Continue reading similar content

I built 9 Claude Code skills to keep my one-person portfolio business oriented around goals, KPIs, and the actions that actually move them. Here's how the whole system works.

How to build Android progress notifications for appliances and doors using smart plugs, power monitoring, and a few lines of YAML. No smart appliances required.

I built five AI agents to run my business. Everyone who saw it asked the same thing: how do I get this? So I turned Mission Control into a service.