My marketing department is a cron job
· first published on LinkedIn · 6 min read · Tim Thomas

How FM.video turns real radio airplay into AI-made reels, and why writing the brand down as files was the whole trick.
I run FM.video alone. It turns real radio stations into continuous music video channels: the scraper listens to what 117 stations across a dozen countries are actually playing, the matcher finds the real music video for every song, and the site plays them back as lean-back TV. Radio you can watch.
Last week I asked the same AI that built the product to become its marketing department. This is how that went, because I think the process is the story.
Act one: Design
Before a line of app code existed, I sat with an AI design partner and built the brand: the wordmark, the waves iconmark that animates when something is playing, the pink, the display face, the voice. The output was not a mood board. It was a set of brand guidelines written down in files that machines can read as easily as humans.
That decision, which felt like tidiness at the time, turned out to be the whole trick.
Act two: Code
Then I pointed Claude Code at the guidelines and built the product: a Python scraper and matcher, a FastAPI backend, a Next.js PWA, TV casting, channels, charts, playlists. The usual startup surface area, except the team standup is one person talking to a terminal.
Along the way the app accumulated something valuable that no competitor has: a live database of what every station is playing, right now, and the actual music video for each song. Millions of airplay events. Radio programmers are the best editors in music, and we effectively employ all of them.
Act three: the marketing agents
Here is the recursive part. Marketing needs content. Content needs taste, media and brand consistency. We had all three sitting in the codebase: the airplay data (taste), the matched videos (media), and the brand guidelines (consistency).
So inside the same coding environment, I asked for a reel factory: agents that read the last 24 hours of airplay, pull short clips of the hottest songs, and render 9:16 social videos through branded templates. Not slideshows. Real editorial formats:
- Top 10 countdowns: 10 to 1 in fifteen seconds from real airplay, the rank digits slamming in, scaled by the bass of the soundtrack.
- Scroll feeds: a phone inside the phone, flicking through what is hot, and the music changes as each video scrolls past.
- Beat flicks: hard cuts through dozens of video stills, timed to the beat, carrying one huge message.
- Milkdrop visualizers: genuine Winamp-era Milkdrop, rendered frame by frame in portrait, reacting to the actual track, with popping captions. One is a four-track mixtape with now-playing chips and the visuals morphing at every song change.
- Channel showreels: 45 to 60 second promos for our themed channels, ten or more tracks each, music switching with every scroll.
- The Daily 420: our standing 4:20pm appointment, complete with drifting leaves and smoke.
Every reel is generated. The charts pick the songs. The templates cut the video. The brand guidelines from act one are encoded as components, so the logo sits in the platform safe area, the end sting animates the iconmark, and every frame is on brand without a designer touching it.
Three from the first drop, straight out of the factory:
The whole catalogue is public at fm.video/reels, with the curated showcase at fm.video/reels/library.
The details that make it feel human
Two examples of the difference between generated and generic.
The scroll feed cards carry a station chip: the station that actually played that track. An early version assigned stations round-robin, and I caught The Rock, our national rock station, supposedly playing Harry Styles. Unacceptable. Now the factory queries the airplay database for which station really played each clip the most. Crazy Frog gets chipped to the Spanish station that genuinely spun it. The data keeps the jokes honest.
And the Milkdrop reels are not a filter that looks like Milkdrop. They are Milkdrop, the real Butterchurn engine, rendered deterministically one frame at a time so a software renderer can never drop a frame, with the audio levels sliced from the decoded track so the visuals react to the music sample-accurately.
What one person plus agents shipped in a day
The first drop: 44 finished reels across a dozen formats, a public showcase at fm.video/reels/library, a vertical feed at fm.video/reels, and an admin desk where I type a playlist or channel name and get a bespoke promo reel ten minutes later.
Then we put it on the clock. Every morning at six, a timer renders the day's reel from the live global charts, and every day of the week is a DIFFERENT format: a fullscreen clip on Monday, the new-video beat flick on Tuesday, a rotating channel showcase on Wednesday, our Aotearoa spotlight on Thursday (the one track that New Zealand radio is playing far more than anywhere else), the 4:20 sting on Friday, Milkdrop on Saturday, and the chart countdown only on Sunday, when a week of movement makes it worth counting down. The rule we learned by running it: never the same two posts in one week. Charts that move slowly make repeated formats read as reposts, so no format repeats.
The marginal cost of the next reel is roughly zero. The marginal cost of the next FORMAT is one conversation.
Cadence is a research question, not a vibe
How often to post turned out to have a real answer, and a different one per platform. TikTok distributes every video independently through the For You page, so posts do not cannibalise each other; Buffer's study of 11.4 million posts found per-post views RISE with volume. So TikTok gets two to three reels a day, spaced three to four hours apart. Facebook and Instagram are follower feeds where flooding suppresses reach, so they get at most one a day, drawn from the same drop. The factory generates enough for the hungriest platform and the schedule throttles the rest. One pipeline, per-platform release valves.
Why this matters beyond music
Every company sits on some stream of live data that could be turned into media: prices, matches, releases, weather, whatever moves. The playbook that worked here generalises:
- Write your brand down in files, not vibes. Guidelines that a machine can follow are guidelines that get followed.
- Let the product's own data pick the content. Taste is the expensive part of content marketing, and we got ours from radio programmers.
- Put the marketing agents inside the codebase, not beside it. Ours can query the production database, read the brand components, and ship a new format as a pull request.
FM.video is free, made in Aotearoa New Zealand, and built by one person with a very capable pair of hands that lives in a terminal. The reels are at fm.video/reels/library. Judge them as you would judge any media team's work. Then remember the media team is a cron job.