{"slug": "my-ai-agent-built-a-web-radio-station-in-15-minutes-then-it-refused-to-play-five", "title": "My AI Agent Built a Web Radio Station in 15 Minutes. Then It Refused to Play Five of the Songs.", "summary": "A developer tasked an AI agent with building a web radio station that plays YouTube videos through the official embedded player, and the agent had a working prototype live on GitHub Pages about 15 minutes after the 1:53 AM request, later moving it to a 98-cent .website domain. The agent also screened each track before adding it, verifying embeddability and reviewing lyrics, and declined to play five songs. The station now carries 34 tracks from 40 artists, built up from hand-picked links after the agent's initial pull from a YouTube auto-generated Mix returned a different set of songs than the developer saw.", "body_md": "This is the last agent on the roster from [post 1](https://blakelapierre.substack.com/p/i-run-my-one-person-business-with): **web radio**. The [last regular post](https://blakelapierre.substack.com/p/my-ai-agent-built-a-247-music-stream) was its neighbor, a music stream where every note is generated in code. This one went the other way. It plays real songs by real artists, so most of the agent’s work turned out to be about rules: YouTube’s, Google’s, and its own.\n\nAt the end there’s a short wrap-up of the whole series.\n\n## The ask, at 1:53 AM\n\nOn Oct 2 at 1:53 AM I told a brand-new agent what I wanted: a web radio site that plays videos from my YouTube auto playlists (“it’s super hot stuff”) and makes money from site ads.\n\nBefore it wrote any code, it gave me the rule that shaped everything: the videos have to play through YouTube’s official embedded player, and the player has to stay visible. No hiding the video to make it audio-only and no blocking YouTube’s ads. The money has to come from ads *around* the player. It also warned me that AdSense tends to reject sites that are mostly embedded videos, so the site would need original writing of its own.\n\nThen it looked at the link I sent and spotted a problem. The list ID started with `RD`, which means it was one of YouTube’s auto-generated “Mix” playlists. YouTube builds those on the fly for each viewer, so there’s no fixed track list to read, and visitors wouldn’t hear what I heard. I told it to build a prototype with one song and sort out the playlist later.\n\n- **2:02 AM:** a working prototype on the agents’ shared computer, tested in a headless browser: official player, play/skip/volume, an up-next queue, three ad spots placed around the player (never on top of it), an About section and a privacy page.\n- **2:05 AM:** I named it. “Hardcore. This is the hardest stuff out there.”\n- **2:07 AM:** live on GitHub Pages, at no cost.\n\nAbout 15 minutes from the ask to a public site.\n\n*The Hardcore station, live.*\n\n## The 98-cent domain, and the agent’s mistake\n\nAdSense only approves domains you own, so the agent sent a browser helper to Namecheap to price names. All the obvious .com names were taken. It came back with a list, and it put the renewal price next to every teaser price, because the sub-$1 deals only cover the first year. `hardcoreradio.website` was 98 cents for year one and renews at $20.98, the cheapest renewal of the bunch. I bought it.\n\nHere’s the part I like. While I was still buying the domain, the agent pointed the site at it. For a few minutes, the old GitHub address redirected to a domain that didn’t exist yet, so the station was offline. It said so plainly: “One thing broke, and it’s my fault.” Then it gave me the five DNS records to enter. DNS resolved at about 3:06 AM.\n\nHTTPS took longer. After an hour GitHub still hadn’t issued a certificate, so the agent suggested the usual fix: remove the custom domain in the Pages settings and add it back, which restarts the certificate. I said yes the next evening, and it worked.\n\n## The playlist problem\n\nI asked it to pull in a Mix I liked. Its downloader returned 2,137 entries, because a Mix keeps generating more as you go, so it took the first 50 as a snapshot. It added 43.\n\nThe next morning I looked at the list and said those weren’t really the songs I wanted. The agent’s explanation: Mixes reshuffle for every viewer, so it had gotten a different set than I saw. A few days later I had it pull all 43 and rebuild the lineup from links I picked by hand. The station has grown that way since, a few links at a time, to **34 tracks from 40 artists**: Immortal Technique, R.A. the Rugged Man, Dr. Dre, 50 Cent, Xzibit, Aesop Rock, Rage Against the Machine, Papa Roach, Kavinsky, N.W.A and more.\n\n## The five songs it wouldn’t play\n\nThis is the part of the job I didn’t ask for and am glad it does.\n\nEvery track gets checked before it goes on the station. The agent confirms the video can be embedded, then reads the full lyrics. Profanity, violence, explicit content and angry politics are all fine. That’s the brand, and AdSense allows rough content. What it holds back is a short list: Holocaust denial, antisemitic conspiracy claims, and claims that mass shootings were hoaxes.\n\nFrom that first batch of 43, it held back **five tracks**, going by the artists’ own published lyrics. One of them came back later in a batch of links I sent. It re-checked the song, confirmed the line was really in it, and held it back again, with an explanation instead of a quiet skip.\n\nFor songs that stay, the notes do the work. They describe each song’s politics as the artist’s view, not the station’s. A few of the tracks lean hard into conspiracy themes, and the agent told me so when it added them, including the warning that an AdSense reviewer might notice.\n\nIt’s also strict about its own facts. Each track note is original writing, built only from pages it actually opened: Wikipedia, Genius, Bandcamp, the YouTube description. When it can’t confirm something, it cuts it. On one track it dropped two claims it couldn’t verify. On another it flagged that one detail (calling an album a “1990s” album) came from its own memory, not from a page. When it couldn’t find a reliable bio for one artist, it left the bio out.\n\n## Features, one request at a time\n\nI kept asking for things, and it kept shipping them, each with a test pass in a headless browser before it went live:\n\n- **An artists panel.** Names sorted by how many tracks they have on the station. Tap one for a short bio, play their next track, or highlight their tracks in the queue.\n- **Notes under the player.** The current track’s note sits right under the video and changes with every song.\n- **Random mode.** No track repeats until every track has played, and a new cycle never starts with the song that just ended. The test ran three full cycles of 15 tracks and never played one twice in a row.\n- **Shareable links.** The address bar follows whatever is playing, so a link like`?t=` plus a video ID opens the station on that song. It cues the track instead of autoplaying, because browsers block autoplay.\n- **A cache fix.** Once I refreshed and saw 5 tracks instead of 15. GitHub Pages lets browsers cache files for 10 minutes, so the agent added version stamps to every script so new lineups show up on a normal refresh.\n- **Ratings that aren’t on yet.** It built thumbs-up and thumbs-down voting backed by Firebase, Google’s free app backend, and it passed all 18 checks in a local test. It stays hidden until I create the Firebase project, and I haven’t.\n\n## Then AdSense said no\n\nOn Oct 16 I sent the agent my publisher ID. It added the verification tag, the ad script and the `ads.txt` file, and hid the empty ad boxes so the site looked finished for review. It also caught that the privacy page still had a placeholder where a contact email should be.\n\nA week later, AdSense rejected the site.\n\nThe agent’s answer was a short list of networks that take small new sites with no traffic minimum: Adsterra, Monetag, Infolinks and A-ADS (which wants a domain at least three months old). Its advice: start with Adsterra’s banner ads and skip pop-unders, because they annoy listeners and would hurt a second AdSense try. Bigger networks open up later with traffic. I haven’t switched yet.\n\nIt did the same thing for promotion. It looked for subreddits that allow this kind of post, told me to skip the one that bans internet-only stations, and wrote drafts. When I pushed back on the first draft (“it’s the hardest stuff out there, that is the brand”), it rewrote it to lead with exactly that.\n\n## What I learned from this one\n\n- **The platform’s rules are the spec.** Most of the design came from YouTube’s embed terms and Google’s ad policies, not from me. The agent stated those rules before writing code, which saved a rebuild.\n- **A curator needs a line.** I decide what’s hardcore. The agent decides, out loud, what it won’t put on a site I want ads on, and it tells me why every time.\n- **Cheap now, pricey later.** A 98-cent domain that renews at $20.98 is fine, as long as someone writes the $20.98 down.\n- **Shipping isn’t earning.** The station went live in 15 minutes. Getting approved for ads and finding listeners is taking weeks.\n\n## The series, wrapped\n\nThat’s every agent on the roster. Thirteen posts, from the [team overview](https://blakelapierre.substack.com/p/i-run-my-one-person-business-with) to this one:\n\n1. [The whole setup](https://blakelapierre.substack.com/p/i-run-my-one-person-business-with) : one person, a team of narrow agents.\n2. [The puzzle book factory](https://blakelapierre.substack.com/p/the-puzzle-book-factory) : 15 books built, six on Amazon.\n3. [Debugging a $4 trading bot](https://blakelapierre.substack.com/p/debugging-a-4-trading-bot-it-made) : it made money on the spread and still lost.\n4. [Find free money](https://blakelapierre.substack.com/p/i-gave-an-ai-agent-one-job-find-free) : the bonus scouts and the fine print.\n5. [A house for a patch of desert](https://blakelapierre.substack.com/p/i-asked-an-ai-agent-to-design-a-house) : three budgets in one night.\n6. [Two trading scanners](https://blakelapierre.substack.com/p/two-ai-trading-scanners-one-said) : one said my strategy loses.\n7. [One week, 20 agents](https://blakelapierre.substack.com/p/one-week-20-ai-agents-what-the-whole) : what the whole team did.\n8. [The Odoo bot](https://blakelapierre.substack.com/p/my-ai-agent-reads-handwritten-timesheets) : receipts 100% right, names 14% right.\n9. [The tax code agent](https://blakelapierre.substack.com/p/i-told-my-ai-agent-to-answer-a-tax) : the government site was down, so it went to the Internet Archive.\n10. [Small business capital](https://blakelapierre.substack.com/p/i-asked-my-ai-agent-where-a-business) : most of the answers were “not you.”\n11. [The consulting agent](https://blakelapierre.substack.com/p/my-ai-agent-works-inside-a-clients) : it archives instead of deleting.\n12. [The 24/7 music stream](https://blakelapierre.substack.com/p/my-ai-agent-built-a-247-music-stream) : in the logs, every vote was mine.\n13. Web radio: this post.\n\nAlong the way there were bonus posts on [turning this newsletter into a podcast](https://blakelapierre.substack.com/p/i-turned-my-newsletter-into-a-podcast), the [crypto loan bot](https://blakelapierre.substack.com/p/my-ai-agent-built-a-crypto-loan-bot), and three on [Meridian](https://blakelapierre.substack.com/p/bonus-im-building-a-peer-to-peer), my peer-to-peer browser game.\n\nThe same few lessons kept coming back:\n\n- **Narrow agents beat one big chat.** Each one builds up context in its own lane.\n- **“Mark anything you couldn’t verify” is the most useful instruction I’ve written.** The agents I trust most are the ones that tell me what they couldn’t confirm, like this one cutting facts it couldn’t source.\n- **Humans keep the irreversible buttons.** Trades, money, publishing, buying the domain. The agents prepare everything up to that point.\n- **Building is easy. Finishing and finding people is the hard part.** Books built faster than I could publish them, a stream with one voter, a radio station waiting on ads. The bottleneck moved from making things to deciding, shipping and getting them in front of people.\n\nThe roster is done, but the newsletter isn’t. More bonus posts are coming on what the agents do next, and Meridian keeps getting new tech.\n\n— Blake (written through my AI agents)\n\n*New: (filled in after publishing)*", "url": "https://wpnews.pro/news/my-ai-agent-built-a-web-radio-station-in-15-minutes-then-it-refused-to-play-five", "canonical_source": "https://blakelapierre.substack.com/p/my-ai-agent-built-a-web-radio-station", "published_at": "2026-11-09 15:23:54+00:00", "updated_at": "2026-11-09 15:54:05.781793+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "artificial-intelligence"], "entities": ["YouTube", "Google", "GitHub Pages", "Namecheap", "AdSense", "Immortal Technique", "R.A. the Rugged Man", "N.W.A"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/my-ai-agent-built-a-web-radio-station-in-15-minutes-then-it-refused-to-play-five", "markdown": "https://wpnews.pro/news/my-ai-agent-built-a-web-radio-station-in-15-minutes-then-it-refused-to-play-five.md", "text": "https://wpnews.pro/news/my-ai-agent-built-a-web-radio-station-in-15-minutes-then-it-refused-to-play-five.txt", "jsonld": "https://wpnews.pro/news/my-ai-agent-built-a-web-radio-station-in-15-minutes-then-it-refused-to-play-five.jsonld"}}