Hacking a new home screen for my Samsung TV
I saw a variety of social media posts about people being able to use AI to “hack” their televisions into having a smarter home screen, and I finally sat down and did it myself!
I am SUPER happy with the results. In this post, I’ll talk through how I made a new home screen launcher for my TV, and reprogrammed the remote to use it.
About my TV
I have a 2021 Samsung TV (not a Frame, it’s one of their QLED TVs that they used to sell at Costco), and it took some effort to get here, even with all the AI tools I had to throw at it.
The “Smart Hub” thing that they have on these TVs is… hot garbage. My biggest complaint about my TV is how slow it is to get running, how it feels bloated with weird caching, and if someone sits on a remote and turns off the TV (which is more common than you’d hope in a house with toddlers), it takes sometimes a full couple of minutes to get to a normal state again.
They stopped updating the firmware on my TV in 2023, so a bunch of the tutorials on how to do some of these changes online were not very helpful to me.
All this being said, I will admit, I didn’t care if I bricked the TV and had to factory reset it or anything, so I was willing to take risks here. Luckily, I didn’t get to that point, but I probably could have been more cautious.
Getting everything connected
What’s nice about this process is that I didn’t have to plug in my laptop to the TV to make this all work. Being on the same WiFi network + some Bluetooth magic was all I needed.
I had found this article from Nathan from someone who had built an open source project to flash onto a TV, and used that open source project to get prompting! My software stack wasn’t exactly like Nathan’s in his article (because my TV stopped updating at Tizen 6.0) so his setup was not directly interchangeable with mine, but it was really helpful to get started.
I fired up GitHub Copilot on my new Surface Laptop Ultra and popped in this prompt to get started using Copilot Fusion Max in the model picker (not an ad for any of these, but I work at GitHub so I was using some heavy firepower here and want to disclose that):
I have a Samsung TV. I want to change the software on it to get rid of the bloat and ads and put my own software launcher on it. You can use this repository as a reference: https://github.com/nthnclrk/CleanFrame The TV is on the same WiFi as this computer. The model code for it is QN65Q8DAAFXZA.
This got things installing on my computer:
- Node.js and Python (which I already had, but if you don’t, it’ll install these)
- Tizen Studio (the Samsung TV extensions, and the Samsung Certificate Extension)
- Samsung’s
The prompts walked me through which exact extensions I needed in Tizen Studio. I needed a Samsung account to connect to the certificate that I ultimately made with it, which let me create and push an app to my TV.
Developer mode on the TV
While those things were installing, I also had to enable Developer Mode on my TV. This proved to be a pain in the butt, because all of the tutorials online were specific to firmware that was newer than mine.
This part took me literally 2 hours to figure out, so hopefully to save you some time: using the Samsung SmartThings mobile app as my TV remote instead of my actual remote made it ultimately work.
Normally on all other Samsung TVs, you go to your App Settings page and hit 1 2 3 4 5 on your remote, and that will enable Developer Mode. On my TV’s firmware, the TV remote’s connection to the App Settings page is known to be finicky, I guess, and getting the button presses logged had some hidden background interruption in between each number. Using the SmartThings app bypassed this.
You have no idea the joy I felt when it finally worked. I paid no attention to how long it took the Tizen Studio extensions to install because I was distracted by this. Oopsies.
Combining the TV and the certificates in holy matrimony
Anyway, from here, I added my computer’s local IP to Developer Mode on the TV (GitHub Copilot told me what number to input), and it connected over the local network using Samsung’s SDB developer tool (which I never touched, I let AI do the heavy lifting there).
From there, it adapted the packaging process for the CleanFrame open source project and built, signed, installed, and launched it onto my TV!
Making CleanFrame “mine”
Now, if you don’t feel like reading CleanFrame’s open source code, just know that CleanFrame is not a new operating system or firmware for the TV, but rather an HTML/CSS/JavaScript app that launches other apps. It doesn’t replace any of the streaming clients.
It’s truly just an app on the TV, and I could’ve kept it that way. But that would mean turning on my TV the normal way and then opening CleanFrame every single time, which would be pointless.
All this being said, I had to:
- Set up my streaming apps onto CleanFrame, rather than Nathan’s defaults
- Adjust how “Art Mode” worked in it, since my TV is not a Frame
- Make the app the default home screen on my TV
Dealing with #1 and 2 was very easy.
For #1, I told GitHub Copilot that I wanted my default apps on the home screen to be the channels I actually use (for those curious, I put Disney+, YouTube, Plex, Netflix, Prime Video, Apple TV, Peacock, PBS Kids, and Dropout), and it “just worked” for the most part by querying the TV’s already-installed apps.
The main work I did there was making the icons for each of the screens instead of using the defaults. I literally looked up the individual logos for each of them and edited the SVGs myself so they’d be uniform to what I wanted to see on my TV. I probably could have used AI there? Eh? It was fun while other things were running in parallel.
For #2, the “Art Mode” setup I turned into a slideshow of my own photos that I manually loaded into the CleanFrame app. I replaced all the defaults that Nathan had (sorry Nathan) with vacation photos I took and made sure they were all dimensionally the same. I also made those my wallpapers for CleanFrame overall. This is not using Samsung’s native Frame Art Mode because my TV doesn’t have it.
Now… #3.
Making the Home button + power-on work
So, once again, CleanFrame is just an app. Installing it is like installing any random TV app onto the device. Exiting another app or hitting the Home button on my TV remote would still open up the Smart Hub crap that I loathed.
I got particularly stuck here and ran through a few different things to get this working, but want to just say upfront:
I had to switch models to OpenAI ones to make this work. Which is interesting! I noticed that in Nathan’s write-up, he also ran into Claude models refusing to update the TV remote buttons. I had kept an eyeball on the models that Copilot Fusion was switching between while working, and ended up manually just picking GPT-6 Astra to seal the deal. Claude models kept saying that moving forward was dangerous and that they weren’t willing to take on that risk (even when I was like “lol I don’t care, just work” a few times in desperation), and Astra never questioned me, like a good bot.
From here, my tools and I tried a few different things (building native helpers, messing with firmware, etc), and finally I found this portion of CleanFrame’s documentation that unblocked everything to get:
- My remote’s Home button to point to CleanFrame, every time
- My TV to load CleanFrame as soon as it turns on
Long story short, the docs have us add a rule via a separately signed and installed package called XF86Home that works with home routing (for the remote button), and adjust a setting called db/first_screen/type to point my TV to CleanFrame as the “first screen” it shows.
The magical TV experience I always wanted
After all of this, I did some manual testing running some streaming apps and switching to CleanFrame and back, and restarting the TV. It worked!!
I do think there might be a risk where if I accidentally uninstall CleanFrame for whatever reason while the system routing points to it, something might break, but I’m going to just… hope I don’t do that.
Overall though, performance-wise, it’s not perfect, but it’s close? It’s so much better than it was before. If I do a hard shutdown my TV, it does load the Samsung Smart Hub (or Samsung TV Plus, depending on its… mood?) still for about 5-8 seconds before switching to CleanFrame, otherwise it is pretty dang zippy.
CleanFrame’s switching between apps is way faster than the defaults ever were. I like seeing my own photos and easily accessing just the apps that I actually use. I know there’s some bloatware and ads in the background that I can’t remove no matter how hard I try, but now I at least don’t have to see them.
I took a potato-quality video of what my TV looks like so you can see the results! I’ll try to do a nicer video later, but as you can see by the timestamp on the actual TV, it was 2:38am and I was just happy to be done:
I’m really pleased with the results, and would love to once again thank Nathan for the walkthrough and open source project.
I hope this is helpful to anyone out there doing something similar!