DEV Community

Cover image for I Built ArgoBeat to Stop Paying Brain.fm $15/Month
Daniel LaForce
Daniel LaForce

Posted on

I Built ArgoBeat to Stop Paying Brain.fm $15/Month

This is a submission for the GitHub Finish-Up-A-Thon Challenge

I have ADD. Brain.fm was one of the first things that actually helped me sit down and get through calculus, discrete math, and the other stuff I kept trying not to drift away from. It made the room feel quieter, and honestly, it made my brain feel quieter too. It worked well enough that I kept paying $14.99 a month without thinking too hard about it.

Then I hit the very normal student reality of paying for Netflix and another $15 subscription, and the whole thing started to feel ridiculous. Why was I paying someone else for something that mattered that much to my focus?

So I built ArgoBeat. It’s my version of that idea. Open source. Free. Mine.

What It Does

ArgoBeat is a browser-first audio player built with the Web Audio API. It layers subtle modulation under ambient soundscapes so the music stays listenable instead of turning into a science experiment. There are five moods: focus, deepWork, relax, meditate, and sleep. Pick one, hit play, and it does the same basic job Brain.fm did for me: it gets the noise out of the way so I can actually pay attention.

The Problem I Hit

I finished the core player months ago, but I ran into one limitation I couldn’t ignore: the app was still carrying too much of the versioning and control logic. The tracks already lived in R2, but I wanted a cleaner control plane for the active config instead of keeping the listening app as the thing that knew everything.

That was the part that kept bugging me.

What Changed This Week

I rebuilt the control layer so the listening UI and the backend config are no longer one blob.

I added an admin backend with a cached public config endpoint, an authenticated update route, and a telemetry endpoint. It runs through both Express and Cloudflare Workers adapters, and the active config now carries the production R2 host, bucket, and active prefix.

I wired the web player to prepare a config fetcher at startup, and the engine now exposes a config fetcher hook so the runtime can move toward external config instead of living entirely on local defaults. The legacy v0.1.0 player stays intact, while v0.2.0 is the current default.

I also cleaned up the surrounding pieces: versioned routes, local testing helpers, and the docs and tests around the backend path.

What I Can Do Now

I can keep the catalog in R2, keep the legacy route around for comparison, and keep pushing the architecture toward cleaner runtime switching instead of hard-wiring everything into the player itself.

The Real Win

The part I care about most is iteration. I can test different modulation depths, try different ambient categories, and keep pushing the architecture toward something I can actually evolve. That feels a lot better than shipping the same thing forever and pretending it’s finished.

And it’s open source, which matters to me. Anyone with ADD, or anyone who just needs fewer distractions, can use it without paying a monthly bill or inheriting someone else’s product decisions.


Website: https://argobox.com/beat

GitHubFinishUpAThon #ArgoBeat #WebAudio #ADD #OpenSource

Top comments (0)