01 · Before the mixer
It started with a taco.
Back in 2020, I made Taco Bot: a very silly Discord bot built around taco pictures, taco trivia, taco coins, and whatever other command sounded funny to a middle schooler stuck at home. Then people actually started using it. It reached more than 150 servers, created a small community, and became the first thing I built that belonged to people other than me.
That was exciting. It was also terrifying. Every bug now had an audience. Every new feature produced three more ideas. I learned APIs, asynchronous Python, hosting, and the extremely important lesson that an in-memory currency will disappear when Heroku restarts. Sorry again to everyone who lost their tacos.
Taco Bot taught me that the most fun projects are not necessarily the most serious ones. They are the ones that make somebody ask for one more feature.
02 · MusicMixer
So, naturally, I made another bot.
MusicMixer was the successor. The original pitch was simple: a Discord music bot that could play audio from YouTube, modify it, and let you download the result. It could change pitch and speed, boost the bass, and turn a normal song into something ungodly.
Play. Mix. Download. Three words, one enormous pile of FFmpeg commands.
The old website promised everything with complete confidence. It had giant screenshots, a square bot avatar, and exactly the kind of vocabulary you would expect from a middle schooler building audio effects for Discord. Some details are probably better left in 2020.
Underneath all of that was the same instinct Taco Bot gave me: take a tool that normally lives in a terminal, put a friendlier face on it, and let people make something weird.
03 · The Flask years
Then the bot escaped Discord.
The website happened because running MusicMixer as a Discord bot became deeply annoying. It needed an always-on computer with FFmpeg, a downloader, enough storage, and constant access to a real file directory. Every request wrote media in and out of that directory. My implementation did far too much direct file rewriting, which meant a bad filename, a failed cleanup, or one careless path could become a much bigger problem than a broken Discord command.
The Discord voice side became unreliable too. Getting the bot to join a channel, disconnect cleanly, and consistently play audio grew stranger over time for reasons I honestly no longer remember. Eventually I spent more time persuading the bot to enter and leave voice channels correctly than I did making the audio features fun.
So the bot escaped Discord and became a Flask website. You uploaded a file, Python launched FFmpeg or yt-dlp through a subprocess, the server did the work, and you downloaded whatever came out the other side. I found PythonAnywhere and hosted it there. For a while, it actually worked.
The funny part is that the useful idea was never the server. It was the workflow: give MusicMixer a piece of media, make a few understandable choices, and get the version you actually wanted.
Flask, subprocesses, temporary folders, and server-side media.
Next.js, Web Workers, local storage, and FFmpeg compiled for the browser.
04 · Why it stopped
YouTube kept moving the goalposts.
One of the main reasons I stopped working on MusicMixer was the downloader. I started with youtube-dl, which was already finicky: it ran into hosting problems, the API was annoying to work around, and its own documentation made it sound like parts of what I depended on would be deprecated soon. Eventually, keeping it alive felt less like maintaining a feature and more like negotiating with it.
So I switched to yt-dlp. It was newer and more actively maintained. In theory, it was the answer. In practice, I still had the same problem: sometimes it simply would not download. A link would work one day, fail the next, and leave me trying to figure out whether I had broken something or YouTube had changed something again.
The website worked, right up until its most important command was no longer allowed.
PythonAnywhere eventually blocked the yt-dlp calls MusicMixer depended on unless I upgraded to a paid plan. The reason was understandable; letting free accounts run media downloaders is an obvious way to make a hosting service miserable. It was still the final nail in the coffin for a broke middle and high schooler. Between the downloader breaking unpredictably, the cost of proper hosting, and an architecture built around constantly writing and deleting media files, keeping MusicMixer alive stopped making sense.
Then high school picked up, and MusicMixer was quietly left behind. Taco Bot lasted longer, but hosting kept getting more expensive there too. When Heroku removed its free tier, I eventually had to shut Taco Bot down as well. Neither project ended with a dramatic final message. They just became harder to keep online than a teenager with homework could reasonably justify.
05 · This version
The useful part, rebuilt properly.
Today’s MusicMixer keeps the old promise without keeping the old architecture. Files stay on your device. FFmpeg runs locally in a worker. You can convert, trim, split, merge, change pitch or speed, clean up a voice recording, normalize loudness, add fades, and push the bass all the way to “Oh my god,” because some ideas deserve to survive.
It is slower than native FFmpeg. Browsers have memory limits. Closing the tab still closes the workshop. But there is no upload server quietly holding your voice memo, no account to create, and no mystery copy of your media waiting in somebody else’s bucket.
YouTube importing is the one piece that does not belong in the hosted site. yt-dlp needs a native runtime and downloading media comes with real permission and platform-rule questions. If it returns, it will live in an optional desktop edition, run locally, and ask you to confirm that you are allowed to download the thing you gave it.
06 · Looking back
Some projects are worth keeping.
Taco Bot and MusicMixer are important relics of my past. They taught me Python, APIs, asynchronous code, deployment, FFmpeg, and more about Discord bot programming than I could have learned from any tutorial. More importantly, they taught me what happens when software leaves your laptop and becomes something other people rely on.
They even earned me Discord's “Early Verified Bot Developer” badge, which a surprising number of people have since tried to buy from me. That is a very strange legacy for two bots made by a kid, but I suppose it proves that the internet remembers the weirdest parts of your résumé.
They also gave me my first taste of the impact customer-facing technology can have. The “customers” were Discord users trying to play the bass-boosted Gummy Bear song or answer as many taco trivia questions as humanly possible, but the lesson was real: people notice when something works, care when it breaks, and will happily tell you what it should do next.
MusicMixer is not the most important thing I have ever built. It may, however, be one of the clearest records of how I learned to build: start with a joke, add far too many features, break several things, learn why they broke, and eventually come back with better tools.
Taco Bot gave me the spark. MusicMixer gave that spark a waveform and an unreasonable amount of bass.
I would absolutely build it again. Apparently, I just did.
