Stop Sending MP4s to Code Review: The Case for Diffable Video
September 19, 2026 · By VideoFlowWhy checking in binary MP4s is a workflow anti-pattern, and how VideoFlow's portable VideoJSON lets you treat motion graphics like source code.
Stop Sending MP4s to Code Review: The Case for Diffable Video
If you have ever tried to review a video change in a pull request, you know the pain. You get a binary blob notification, a "file too large to display" warning, or—if you're lucky—a link to a Dropbox folder with final_v2_edit_fixed.mp4.
This is a workflow anti-pattern. In a world where we treat infrastructure, documentation, and even UI layouts as code, why are we still treating motion graphics as opaque binaries? It’s time to move toward diffable video.
The Binary Bottleneck
Traditional video editing tools (After Effects, Premiere, or even complex FFmpeg scripts) produce output that is fundamentally incompatible with modern engineering practices. When you check an MP4 into a repository, you lose the ability to see what changed, why it changed, and who changed it.
Did the brand color shift from #FF5A1F to something else? Did a transition duration get bumped by 200ms? In a binary world, you have to download the file and eyeball it. In a "video-as-code" world, you just read the diff.

VideoJSON: The Portable Source of Truth
At the heart of VideoFlow is a simple but powerful concept: VideoJSON. Instead of thinking of a video as a stream of pixels, VideoFlow treats it as a tree of layers and keyframes.
When you use the @videoflow/core builder API, you aren't rendering frames yet. You are composing a portable, serializable JSON document. This document describes exactly what is happening on screen, frame by frame, without the weight of the actual media bytes.
{
"name": "Feature Highlight",
"width": 1920, "height": 1080,
"layers": [
{
"type": "text",
"text": "New Feature!",
"color": "#FF5A1F",
"keyframes": {
"opacity": [
{ "time": 0, "value": 0 },
{ "time": 0.5, "value": 1 }
]
}
}
]
}
Because this is plain text, it fits perfectly into your Git workflow. You can lint it, you can version it, and most importantly, you can diff it. A change to a title is a one-line change in your PR, not a 50MB binary overwrite.
How VideoFlow Enables Diffable Workflows
VideoFlow was built specifically to solve the portability problem. By separating the definition of the video (JSON) from the rendering of the video (MP4), it enables a three-stage pipeline that feels natural to any developer.
- Authoring: Use the fluent TypeScript builder to define your scene. You can even test logic in the VideoFlow Playground to see your JSON update in real-time.
- Versioning: Commit the resulting JSON or the TypeScript source to your repository. Your CI/CD pipeline can now treat video changes with the same rigor as code changes.
- Rendering: When you're ready to ship, use one of our official renderers.
Whether you need to export an MP4 in the user's browser using @videoflow/renderer-browser or run a massive batch job on a server with @videoflow/renderer-server, the input is the same. The same JSON produces byte-for-byte identical output across every environment.

Practical Example: Animating with Code
Consider a scenario where you need to update a lower-third graphic across 100 personalized videos. In a traditional workflow, that’s 100 manual exports. With VideoFlow, it’s a single change to a builder function:
import VideoFlow from '@videoflow/core';
const $ = new VideoFlow({ width: 1920, height: 1080 });
// Defining a reusable brand card
const card = $.addShape(
{ width: 40, height: 10, fill: '#FF5A1F', opacity: 0 },
{ shapeType: 'rectangle' }
);
card.fadeIn('500ms');
$.wait('3s');
card.fadeOut('500ms');
const json = await $.compile();
// This 'json' is what you check into Git.
If you decide to change the fill color or the fadeIn duration, your Git diff will show exactly what changed. No guesswork required.
Beyond Code Reviews
Treating videos as diffable JSON opens doors beyond just cleaner pull requests:
- Automated Testing: Assert that a video contains a specific number of layers or that a logo stays on screen for at least 5 seconds.
- LLM Integration: It is trivial for an AI agent to emit a VideoJSON object. You can build prompt-to-video pipelines where the "source code" of the video is generated on the fly.
- Dynamic Personalization: Store the VideoJSON template in a database like Postgres and inject user-specific data at render time.
As we discussed in our post on why JSON portability matters, the separation of concerns is what makes VideoFlow a true toolkit rather than just a library.
Start Diffing Your Videos
The era of the binary-only video workflow is ending. By adopting a video-as-code approach, you bring the power of software engineering—versioning, peer review, and automation—to the world of motion graphics.
Ready to see what your videos look like as code? Check out the VideoFlow Documentation to get started, or head over to the GitHub repository to see how the core renderers are built.
Stop sending MP4s to code review. Start sending JSON.