When URLs go IRL: AKA The only way I'm letting my kid near YouTube

You may be coming here from one of my videos - welcome, and thank you! But I must say up front that this is not a how-to guide. This is a description of how I set things up. Unfortunately, I don't know if there's a clean way to package something like this up to work with any arbitrary home media setup - if I figure it out, I promise I'll let you have it. Still, I hope you stick around and try to find pieces of this setup that might work for you!

OK SO WHAT DID I ACTUALLY MAKE:

My daughter gets a binder full of printed paper. Each page has the thumbnail of a YT video as well as a QR code linking to that video. We choose these videos as a family! There are roughly 20 in there at a given time, and we swap a few out every week or so. Videos are as short as 3 minutes, as long as a full length movie.

When screen time is allowed (usually in the morning while the adults get their shit together), the binder comes out along with a small handheld QR code scanner. One of us is always with her - even though we've already approved the content, this is not meant to be a babysitter.

When she scans a QR code from the binder, the associated video plays on our TV. There are no transport controls. It plays from start to finish. When it's done, the TV goes back to it's screensaver.

After 5 scans, the scanner stops working. The indicator LED turns red, showing her that it's time to stop watching.

OK BUT WHY?

There's a ton of high-quality, free (we're the product, blah, blah), educational content on YouTube. If she's gonna be in front of a screen, we'd prefer that some of that time is spent learning.

There's a ton of dogshit content on YouTube that's designed only to grab and hold her attention. If she's gonna be in front of a screen, we'd prefer that none of that time is spent watching this.

We've observed that when she knows that there's a bunch of other stuff to watch, she wants to switch what she's watching more frequently. We're trying to cultivate an attention span over here! Seeing 30 new thumbnails on the way to the video we agreed on inevitably leads to "wait, what was that one, I want to watch that now!" Our system gently discourages frequent switching by A) containing a (relatively) static collection of content, B) limiting the number of scans per day, and C) requiring just a littttllee bit of physical friction - she has to get up and walk over to the TV stand to scan.

She thinks it's fun!! Turns out kids like to use tools and scan stuff. She loves that she doesn't have to ask us to do things for her.

It takes very, very little time to add or remove content. I didn't want to create something that I would get sick of using, otherwise it would fall out of use. All you have to do to add a video is copy the thumbnail and QR Code to a Word document and hit print.

OK BUT WHY NOT JUST...

I have received many, many comments across my socials with suggestions for alternatives to this. Most of them are either features of the YouTube Kids app or some other third party software that wraps YouTube in some way. Awesome! These are probably simpler than what I have here. But all the suggestions I've seen are either made for a web browser (vs. a television) and/or would require us to hand over the TV remote to our daughter. She's small but she would find her way to Cocomelon Hell in no time at all.

OK SO HOW?

FIRST OFF so many people asked about the QR code scanner. It's an M5Stack Atomic QR base combined with the Atom Lite microcontroller board. It's cheap, accurate, and has WiFi built in, BUT you have to program it yourself. I used MicroPython to program mine, and the description of what that code does is below.

Another potential option if you're not interested in getting into the code is to use one of these off-the-shelf barcode scanners from Amazon . Turns out most of them read QR codes as well! The cool thing about these is that you can plug them in to a computer/TV via USB and they act like a normal keyboard. When you scan a QR code, it literally just types the scanned URL into the computer. Just make sure young users know to keep them pointed away from human eyeballs.

Software

There are three pieces of software that make this system work. The first is Home Assistant

Home Assistant is a free, open source, smart home server. In other words, it's a software application that lets you connect, control, and automate the "smart" devices on your network. If you have Google Home or Alexa or Apple's thing set up at home - Home Assistant is similar, except that it can run on just about any computer and is not developed by any big evil corporation. If you've got any IoT devices in your home, there is a very good chance they will work with Home Assistant. It's admittedly pretty heavy duty if all you're going to do is play videos on a TV, BUT... it's free! Why not install it and see what other projects pop into your head. Last year I used Home Assistant to let my daughter change the color of the lights in her bedroom using her Crayola markers .

I have Home Assistant running on a dedicated computer called Home Assistant Green . It comes with Home Assistant already installed, you just have to plug it into your router. It's super easy to set up and it does an incredible job of finding any smart devices you already have set up! It found my TV (a Samsung Frame) as soon as I logged in.

The second piece of software I used for this project is called Jellyfin

Jellyfin is a media server. You install it onto your computer, tell it where all your music and video files are, and it lets you access and stream them from any other device on your network. It provides a beautiful web app for searching and organizing your media. And just like Home Assistant, it's free and open source! You can also easily integrate it into your Home Assistant install, which becomes extremely powerful when your smart TV and/or speakers are connected as well. You can browse your Jellyfin library directly from your Home Assistant dashboard and with a single click, tell it to play a given piece of media on a given device. This is exactly what my project is doing under the hood. But instead of a single click, it's the QR code scan that triggers Home Assistant to play a video from Jellyfin on my TV.

At this point you might be saying "wait... I thought these were YouTube videos, why are you talking about this media server thing?" That's where the last piece of software comes in.

The third piece of software is... a little custom thing I wrote! It's a lightweight web app that glues everything together. It takes in a YouTube URL from the QR code scanner over WiFi and downloads the video into my Jellyfin Library. You're not... really supposed to be downloading videos off of YouTube outside of the official apps, but there's a software library called yt-dlp that makes it happen regardless. Use at your own risk! [TODO GitHub link to this code, yell at me if you don't see it here soon]

OK PLEASE PUT ALL THIS TOGETHER FOR ME

1. My kid flips through her binder, picks a video to watch. She scans the QR code with the scanner.

2. The scanner connects to my web app over with an HTTP request over WiFi. It passes the YouTube URL it scanned as a query parameter. The scanner has an indicator LED that turns yellow when the request goes out. This signals to her that it's working, but she needs to wait for playback.

3. My web app checks to see if the file has already been downloaded. If it has not, it uses yt-dlp under the hood to download it. Videos can take up to ~20 seconds to download, but that delay only happens the first time she scans. Note that my web app keeps the request from the QR scanner open the whole time.

4. Once the video download has been confirmed, my web app copies the file into a folder on my computer that Jellyfin knows to scan for videos. It then sends an internal HTTP request to Jellyfin and instructs it scan for new files. Finally, it uses one last HTTP request to perform a search within Jellyfin for the target file. From that request, my web app gets the "Jellyfin ID" (just a bunch of random letters and numbers assigned by Jellyfin) for the video. It returns that value to the QR code scanner (remember, the connection had been open this whole time.

5. Once the QR scanner receives the Jellyfin ID for the video it downloaded, the indicator LED changes from Yellow to Blue to indicate success (my daughter yells "It's blue, Dada!!"). It takes the Jellyfin ID and sends to my Home Assistant server, which has been configured with an HTTP WebHook to receive such info.

6. Home Assistant tells my TV to play the given content from Jellyfin. Done

If any of the steps fail, the QR scanner will either receive an explicit error message or will simply time out. Either way, if it never receives a Jellyfin media ID, it blinks red, and my daughter knows to try again or come get me to fix it!

A few weeks in - it's working great. And though I'd already spent some time and $$ setting up Home Assistant, this took me very little time, and pretty much 0 dollars? I should add a disclaimer that though I wrote this post by hand, I used Claude Code to write some of the code for the QR Scanner and web app. There's not very much to it, and it's all very simple. I love writing code but I wasn't gonna get much out of the HTTP client/server boilerplate. And as my fellow parents know, sometimes projects like this fall into the "get it done immediately or it never happens" bucket. Thanks for reading, and let me know what you think!