<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Melvin Bucio</title>
    <description>The latest articles on DEV Community by Melvin Bucio (@thebuciyo).</description>
    <link>https://dev.to/thebuciyo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3920485%2Fcc5d7c23-d1a0-44d1-8982-8d95fc1c910b.png</url>
      <title>DEV Community: Melvin Bucio</title>
      <link>https://dev.to/thebuciyo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thebuciyo"/>
    <language>en</language>
    <item>
      <title>How I Built a Free Video &amp; Audio Tool Suite for $20/Month</title>
      <dc:creator>Melvin Bucio</dc:creator>
      <pubDate>Fri, 08 May 2026 17:27:40 +0000</pubDate>
      <link>https://dev.to/thebuciyo/how-i-built-a-free-video-audio-tool-suite-for-20month-2dhe</link>
      <guid>https://dev.to/thebuciyo/how-i-built-a-free-video-audio-tool-suite-for-20month-2dhe</guid>
      <description>&lt;p&gt;I got tired of video editing tools that either charged money, added watermarks, or made you create an account just to do something simple like remove silence from a recording.&lt;br&gt;
So five weeks ago I built my own. And then kept building. It's now a full video and audio tool suite with 8 tools, getting organic traffic from Google, ChatGPT, and Copilot, all for about $16-20/month in infrastructure costs.&lt;br&gt;
Here's exactly how it's built.&lt;/p&gt;

&lt;p&gt;The stack&lt;/p&gt;

&lt;p&gt;Frontend: Pure static HTML on Vercel. No React, no Next.js, no build step. Just HTML, Tailwind CDN, and vanilla JS. Vercel's free tier handles it.&lt;br&gt;
Backend: FastAPI on Railway with 2 worker replicas&lt;br&gt;
Queue: Redis + ARQ (async job queue for Python)&lt;br&gt;
Storage: Cloudflare R2 with 1-day lifecycle rules&lt;br&gt;
Processing: FFmpeg for everything&lt;/p&gt;

&lt;p&gt;Monthly cost breakdown:&lt;/p&gt;

&lt;p&gt;Railway (2 replicas): ~$10-12&lt;br&gt;
Cloudflare R2: ~$1-2&lt;br&gt;
Redis (Railway): ~$3-5&lt;br&gt;
Vercel: $0&lt;br&gt;
Total: $16-20/month&lt;/p&gt;

&lt;p&gt;How the processing pipeline works&lt;br&gt;
Every tool follows the same pattern:&lt;/p&gt;

&lt;p&gt;User uploads a file to FastAPI via the browser&lt;br&gt;
FastAPI streams it to Cloudflare R2&lt;br&gt;
FastAPI enqueues a job in Redis via ARQ&lt;br&gt;
A worker replica picks up the job, downloads the file from R2, runs FFmpeg, uploads the result back to R2&lt;br&gt;
Frontend polls /status every 500ms until the job is complete&lt;br&gt;
User gets a presigned download URL, file auto-deletes after 15 minutes&lt;/p&gt;

&lt;p&gt;The flow goes: browser uploads to FastAPI, FastAPI streams to R2 and enqueues a job in Redis, a worker picks up the job, downloads from R2, runs FFmpeg, uploads the result back to R2, and writes the status. The frontend polls every 500ms until it gets a presigned download URL back.&lt;br&gt;
The interesting technical decisions&lt;br&gt;
No user accounts, ever&lt;br&gt;
This was a deliberate architectural decision, not just a UX choice. No accounts means no user database, no sessions, no auth system, no password resets, no GDPR compliance headaches, no data breach liability. Every request is stateless. Files are identified by a UUID job ID, not a user ID.&lt;br&gt;
The tradeoff is you can't offer saved history or preferences. That's fine for a free utility tool. People just want to process a file and leave.&lt;br&gt;
15-minute file deletion&lt;br&gt;
Files are deleted from R2 automatically via lifecycle rules after 1 day, but a cleanup job also runs 15 minutes after each job completes. This isn't just a privacy feature. It keeps R2 storage costs near zero since files never accumulate.&lt;br&gt;
max_jobs=1 per worker&lt;br&gt;
ARQ supports concurrent jobs per worker, but FFmpeg is CPU-bound. Running two FFmpeg processes on the same Railway instance causes them to compete for CPU and both slow down. Setting max_jobs=1 means each worker processes one file at a time. With 2 replicas you get 2 simultaneous jobs, enough for current traffic and easy to scale by adding replicas.&lt;br&gt;
The boto3 mistake that caused 504s&lt;br&gt;
This one took me an embarrassingly long time to catch.&lt;br&gt;
boto3 (the AWS/R2 SDK) is synchronous. My first version called it directly inside a FastAPI async endpoint. Under any meaningful upload load, the event loop blocked while the file transferred to R2, requests piled up, and the server started returning 504s.&lt;br&gt;
The fix was one line:&lt;br&gt;
pythonawait asyncio.to_thread(storage.upload_file, tmp_path, key)&lt;br&gt;
This runs the blocking boto3 call in a thread pool, freeing the event loop to handle other requests during the upload. Obvious in hindsight, painful to debug live.&lt;br&gt;
The silence removal pipeline is not one command&lt;br&gt;
A naive implementation uses a single silenceremove filter:&lt;br&gt;
ffmpeg -i input.mp4 -af silenceremove=stop_periods=-1:stop_duration=0.5:stop_threshold=-35dB output.mp4&lt;br&gt;
This works but gives you very little control over cut padding and re-encode behavior. The actual implementation uses a two-pass approach: silencedetect to find the boundaries, then segment-cut and re-stitch with concat. More code but much better results, especially for speech with natural breath gaps you want to preserve.&lt;/p&gt;

&lt;p&gt;What each tool taught me&lt;/p&gt;

&lt;p&gt;Remove silence: Two-pass silence detection beats single-command filters for speech content&lt;br&gt;
Extract audio: libmp3lame at 192k constant bitrate is the right default for spoken audio. VBR (-q:a) is fine for music but creates surprises when input is voice with quiet sections&lt;br&gt;
Compress video: CRF 23 with libx264 veryfast is the sweet spot for quality vs speed on Railway's hardware&lt;br&gt;
Mute video: Stream copy (-c:v copy -an) makes muting essentially instant since no re-encode is needed&lt;br&gt;
Trim video: Re-encoding is worth the extra seconds vs stream copy because keyframe alignment causes noticeable off-by-seconds errors that users notice&lt;br&gt;
Video to GIF: Palette generation in a single FFmpeg invocation matters far more than I expected. Without it, GIF banding is obvious even at small sizes&lt;br&gt;
Resize to 9:16: The blur bars effect requires splitting into two streams in the filter graph. Non-obvious but produces much better results than black bars&lt;br&gt;
MP4 to MP3: Same backend as extract audio, different SEO surface. One FFmpeg function, two landing pages, two different keyword clusters&lt;/p&gt;

&lt;p&gt;The SEO side&lt;br&gt;
Since the goal is organic traffic, I put real effort into the SEO infrastructure from day one: FAQPage, HowTo, and WebApplication JSON-LD schema on every tool page, comparison pages targeting "free Descript alternative" queries, blog posts targeting long-tail keywords, and Spanish versions of all pages.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0zlmpwonjiqq19pal3y9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0zlmpwonjiqq19pal3y9.png" alt="Search Console performance after 5 weeks" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Five weeks in: 27 clicks in Google Search Console, average position 5.5, and organic referrals already coming in from ChatGPT and Copilot.&lt;br&gt;
The AI referrals were the most surprising thing. ChatGPT and Copilot were recommending the site before Google was sending meaningful traffic. Plain-language description paragraphs on each tool page ("This tool removes silence from video and audio. Upload your file and download a clean version in seconds.") seem to help AI systems understand and cite the tools accurately.&lt;/p&gt;

&lt;p&gt;What surprised me overall&lt;br&gt;
Static HTML is underrated. No build pipeline, no framework updates, no hydration errors, instant Vercel deploys. For a tool suite where each page is mostly the same structure with different copy, it's the right call. I would make the same decision again.&lt;br&gt;
The other surprise was how well the cost scales. Eight tools, all running through the same pipeline, for $16-20/month. FFmpeg does the heavy lifting and Railway scales horizontally by just adding replicas. The unit economics are genuinely good.&lt;/p&gt;

&lt;p&gt;What's next&lt;br&gt;
More tools. Each one is a new keyword cluster, a new internal link target, and a new surface for AI citation. The goal is eventually a comprehensive free video utility suite, the way iLovePDF did it for PDF tools, built one tool at a time.&lt;br&gt;
If you're building something similar or have questions about the FFmpeg pipeline, the ARQ setup, or the R2 lifecycle configuration, drop a comment. Happy to go deeper on any of it.&lt;br&gt;
You can try what I built at vidclean.net.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>showdev</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
