An old TV as a clean screen: debloat instead of landfill

A 2015 Samsung UE60J6240 still has an acceptable panel, but its own software turned it into e-waste: slow, with ads in the interface and sending telemetry to the manufacturer. Instead of binning it, I stripped the factory system down to a single job: picture and sound over HDMI, with no ads and no telemetry.

· 5 min read

Written in November 2026 from notes made at the time.

I have a 2015 Samsung UE60J6240 at home. The panel is still acceptable, but the software aged far faster than the hardware: the menu lags, ads appear in the interface, and once it is on the network the set sends telemetry to the manufacturer’s servers. I feed it video from an external player and from a PC over HDMI – and that is all I need from it. I decided to bring it back to that one role.

The factory system, not my own

It is tempting to flash your own Linux onto hardware like this, and it is something I think about for the future – but not on this TV and not now. The factory system, for all its faults, correctly drives the panel, the backlight, the audio path, the remote and the low-latency mode for a console or a PC. Rebuilding that from scratch on undocumented hardware carries a real risk that a picture never appears at all. So here I chose the simpler, safer route: stay on the factory system and only slim it down.

I gained root on the TV. I will not reveal the details – I will only say that where Claude and Codex refused, Chinese AI tools stepped in. From that point the problem was no longer “how do I get in” but “how do I make my changes survive a reboot”.

A change that has to survive a reboot

The TV’s main system is mounted read-only – you cannot permanently change anything in it, and that is a good thing. I can only write to one directory, which survives a reboot. So I keep every change – disabled services, network rules, the menu’s look – not in the system itself but in a startup script that lives in that directory and reapplies everything on each boot. The system stays untouched; if something goes wrong, deleting a single file returns the TV to factory state.

Along the way I met a trap in the old init system: after dropping in your own service you have to force a reload of the configuration before you start it – otherwise the system simply does not see it and it fails silently.

Live in a single startup script, reapplied on every boot
# the TV system is read-only; one directory is writable, so my changes
$ cat /opt/etc/boot-hook.sh
#  - masks for unneeded services (store, smart hub panels, mirroring)
#  - network rules: LAN only, no direct route out to the internet
#  - swapped-in menu theme via bind mount (the system stays untouched)

# free memory on my unit (reconstructed from notes, not a benchmark):
#   factory, after a cold start    ~195 MiB
#   after debloat, same context    ~312 MiB

Less system, less network

Slimming down is not one big switch but many small cuts, each checked in turn. I disabled the manufacturer’s updates and the telemetry services, the store and part of the smart hub panels, and I removed the Screen Mirroring entry I never use from the source menu. Separately I blocked the TV’s direct route out to the internet while leaving the local network working, because I need it for the player and for Home Assistant.

I am careful here not to confuse “prepared” with “confirmed”. Adding a rule or masking a service does not mean the traffic actually stopped – I check that by watching the connections, not by the list of changes alone. The same goes for performance: after the cuts the TV has noticeably more free memory, but free memory alone is not proof of lower picture latency, so I do not describe it as such.

A menu I reworked for myself

Since I am staying on the factory source menu, it might as well look better. The native interface keeps its appearance in compiled resource files. I replaced them with my own theme – dark, rounded cards and consistent icons – but not by overwriting the system, only by mounting my file on top of the original at runtime. The original stays untouched on disk, and the whole change is one extra file and no background process. That was my condition: the looks must not cost smoothness.

The standby wall

I connected the TV to Home Assistant – state, volume, mute and power-off all work from automation. One thing stopped me, though: turning it on. In standby this unit disappears from the network entirely, answers nothing, and switching it on with the remote is a cold start every time, not a wake. The Wi-Fi driver advertises wake-on-network, but in practice it does not work on this model – I tested it and let it go. I will handle power-on later by another route, over infrared or HDMI-CEC from the player, rather than forcing it through a network that simply is not there in standby.

What I learned

  • A read-only system is an ally, not an obstacle. Since nothing can be changed permanently, all my changes have to sit in one startup script – which means I always know what I did, and I undo it by deleting a single file.
  • “Masked” is not “confirmed”. A disabled service or an added rule is only an intention; whether the traffic really stopped shows up only when you watch the connections. A memory measurement is not a latency measurement either.
  • Not every feature can be added. Turning the TV on from standby over the network ran into the fact that in standby there is no network. Sometimes the right conclusion is to change the route, not to insist on the first idea.

All posts