<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Rafael Gala on Medium]]></title>
        <description><![CDATA[Stories by Rafael Gala on Medium]]></description>
        <link>https://medium.com/@ffmate?source=rss-75e6b9934541------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*dAxzXTKg6rOJWoNmE-QHFQ.jpeg</url>
            <title>Stories by Rafael Gala on Medium</title>
            <link>https://medium.com/@ffmate?source=rss-75e6b9934541------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Tue, 07 Apr 2026 21:21:30 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@ffmate/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Why We Built FFmate: From Shell Scripts to Smarter FFmpeg Workflows]]></title>
            <link>https://ffmate.medium.com/why-we-built-ffmate-from-shell-scripts-to-smarter-ffmpeg-workflows-e879cc12d76e?source=rss-75e6b9934541------2</link>
            <guid isPermaLink="false">https://medium.com/p/e879cc12d76e</guid>
            <category><![CDATA[ffmpeg-automation]]></category>
            <category><![CDATA[open-source-for-post]]></category>
            <category><![CDATA[rest-api-for-ffmpeg]]></category>
            <category><![CDATA[open-source-transcoding]]></category>
            <category><![CDATA[video-encoding-workflows]]></category>
            <dc:creator><![CDATA[Rafael Gala]]></dc:creator>
            <pubDate>Thu, 19 Jun 2025 13:30:58 GMT</pubDate>
            <atom:updated>2025-06-19T17:42:26.799Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ADBpsWrU93RUy69wCuNtQA.png" /></figure><p>Let’s face it, there’s no shortage of FFmpeg wrappers out there. So many, in fact, that it’s hard to even keep track of them all. From open-source tools to commercial giants, hundreds of developers keep finding reasons to build new tools on top of FFmpeg. You’ve probably used one, or at some point hacked together a script just to make FFmpeg a bit more manageable. That says a lot: FFmpeg is incredibly powerful and supported by a remarkable, ever-growing community</p><p>Over my 20+ year career in broadcast and media tech, I’ve seen just about every kind of transcoding solution out there. From big-name enterprise software that costs more than a car to sleek cloud platforms that promise the world. I’ve tried them all. But no matter how fancy the feature set or how big the brand, I kept running into the same two problems:</p><ol><li>The features I actually need are spread out across different tools.</li><li>And most of them are still way too complicated unless you’re already a workflow or video expert. Everyone else? They’re left behind.</li></ol><p><strong>When “just encode some proxies” isn’t simple</strong></p><p>Mid last year, I joined a project where we needed to build a solid, easy-to-set-up transcoding pipeline that wasn’t overly complex.</p><p>The goal was straightforward: generate proxies from various camera cards, distribute the workload across four Mac Studios, and automatically check the files into the NLE using the project management system.</p><p>Sounds simple enough, right?</p><p>It didn’t take long to realize that most off-the-shelf tools, even the ones that looked great on paper, didn’t check all the boxes.</p><p>There were a few features we absolutely needed, and they just weren’t there:</p><ul><li>A simple interface or API to submit transcode jobs</li><li>A way to automatically send notifications when a job finished</li><li>Something that could run reliably across four machines without a mess of manual setup</li></ul><p>Sure, we found a few transcoding tools that looked like they might work. Some even came close. But once we tried wiring them into a real workflow, the cracks started to show.</p><p>Some relied on AppleScript (which, sadly, doesn’t have a native HTTP client), forcing us to use curl just to send notifications. Others had no way of externalizing progress updates, which made building a responsive UX near impossible. And most didn’t play well across multiple machines, so every script and preset had to be manually copied to all four Macs.</p><p>At that point, it became clear: even with so many wrappers and commercial solutions out there, none of them offered a clean, scalable way to build a modern transcoding workflow.</p><p>That’s when I realized what we were missing wasn’t another transcoding tool. Vanilla FFmpeg is powerful, reliable, and more than capable. But using it the way we needed just wasn’t straightforward. To make it work in a real-world, scalable workflow, we had to build around it.</p><p>What we really needed was a clean, lightweight automation layer, something that took the pain out of using FFmpeg through command-line scripts, and added the features we kept wishing were there.</p><p>Once that clicked, I did what I always do when I’ve got a spark of an idea: I called my good friend <a href="https://x.com/YoSev_dev">Sev</a>.</p><p>Sev and I had talked for years about building an open-source tool together, we just hadn’t found the right idea. But this time, it clicked for both of us. We weren’t trying to reinvent FFmpeg. We just wanted to make it easier to use in the kinds of real-world workflows people deal with every day.</p><p>We bounced around a few ideas and that’s how <a href="https://docs.ffmate.io">FFmate</a> started.</p><p>From day one, we were clear on what we wanted to build: FFmate should strike the perfect balance between<strong> simplicity </strong>and<strong> power.</strong></p><p>That meant:</p><ul><li><strong>Not</strong> just another CLI wrapper</li><li><strong>Not</strong> just another FFmpeg GUI</li><li>But something that offers a clean, REST-based interface and a powerful Web UI, both built from scratch to fit real workflows.</li></ul><p>Here’s what FFmate offers right now:</p><ul><li><a href="https://docs.ffmate.io/docs/web-ui"><strong>Web UI</strong></a><br>To monitor and manage tasks, watchfolders, and presets from the browser.</li><li><a href="https://docs.ffmate.io/docs/tasks"><strong>Job queue with priorities</strong></a><br>Lets you control task order and make sure time-sensitive jobs go first.</li><li><a href="https://docs.ffmate.io/docs/watchfolder"><strong>Watchfolder</strong></a><strong> </strong><br>For workflows where dropping files into a folder is still the fastest way to get things moving.</li><li><a href="https://docs.ffmate.io/docs/presets"><strong>Presets</strong></a><br>We ship 20+ useful presets out of the box, or create your own and reuse them across tasks.</li><li><a href="https://docs.ffmate.io/docs/wildcards"><strong>Wildcards</strong></a><br> Use placeholders like {inputName}, {timestamp}, or {ext} in output paths — FFmate fills in the rest automatically.</li><li><a href="https://docs.ffmate.io/docs/tasks#submitting-multiple-tasks-as-a-batch"><strong>Batch processing</strong></a><br>Group multiple tasks and run them together. Perfect for bulk transcodes or large jobs with shared settings.</li><li><a href="https://docs.ffmate.io/docs/swagger"><strong>REST API</strong></a><br>Abstracts away shell escapes, progress tracking, error parsing, and other FFmpeg quirks.</li><li><a href="https://docs.ffmate.io/docs/getting-started#download-install-ffmate"><strong>Cross-platform support</strong></a><br>Runs on macOS, Windows, Linux, and Docker, there’s no platform lock-in.</li><li><a href="https://docs.ffmate.io/docs/webhooks"><strong>Webhooks</strong></a><br>Get notified on job completions, task changes, or watchfolder events, and yes, without writing AppleScript ever again 😂</li><li><a href="https://docs.ffmate.io/docs/pre-post-prcessing"><strong>Pre- and post-processing hooks</strong></a><br>Run your own script before or after a job</li><li><a href="https://docs.ffmate.io/docs/swagger#how-to-access-the-swagger-ui"><strong>Built-in API docs</strong></a><br>Swagger/OpenAPI docs are included, just open your browser and try it out.</li><li><a href="https://docs.ffmate.io/docs/ffmate-internals#metrics"><strong>Built-in metrics</strong></a><br>We added Prometheus-style metrics so we could actually understand what FFmate was doing. Super handy for advanced use cases or when you’re running things at scale.</li><li><a href="https://docs.ffmate.io/docs/flags"><strong>Config flags</strong></a><strong><br></strong>Set things like FFmpeg path, port, or log level with a few startup flags.</li></ul><h3>What’s next?</h3><p>FFmate is still in its early days, but it’s already helped a bunch of people build better workflows with a lot less frustration. And we’re just getting started.</p><p>We’ve got plans to improve the out-of-the-box experience so your first transcode happens as quickly as possible. We’re also exploring ways to integrate LLMs to help make building FFmpeg commands, and debugging errors, a whole lot easier. We’ve also got plenty of ideas to make the watchfolders even better.</p><p>Sev and I have a long list of things we want to build. If any of this sounds interesting and you want to get involved, come hang out with us on <a href="https://discord.gg/NzfeHn37jT">Discord</a>.</p><p>If you’re tired of hacky FFmpeg scripts or patching together half-solutions, <a href="https://docs.ffmate.io">FFmate</a> might be exactly what you’ve been looking for.</p><h3>Resources</h3><ul><li><strong>Docs</strong>: <a href="https://docs.ffmate.io">docs.ffmate.io</a></li><li><strong>GitHub</strong>: <a href="https://github.com/welovemedia/ffmate">github.com/welovemedia/ffmate</a></li><li><strong>Postman Collection</strong>: <a href="https://www.postman.com/welovemedia/ffmate/overview">FFmate API</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e879cc12d76e" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>