TV Hack
Log 02 / 06

The launcher

A home screen that doesn't look like everyone else's: black, dots, one accent colour. Two designs died first.

By prutxviBuilt with Claude~6 min read
The minute changes at about 4 seconds in. Watch the dots ease off and on instead of snapping.

Third time right

VersionLookVerdict
v1A grid of every installed app, with letters as icons"The worst launcher I have ever seen"
v2Apple TV style: rotating photo wallpapers, a glassy "Today" cardLooked good, but looked like everything else. And no personal data on my screen.
v3+Dot-matrix, inspired by Nothing OS"Perfect, looks unique"

This is the part of building with an AI that doesn't show up in the code. Claude will happily make a working launcher. Deciding that a working launcher isn't good enough, and saying exactly why, was my job.

What's on the screen

◂ ▸ on the remote moves through the dock. Each icon sweeps on from left to right.

How the ripple works

Everything is drawn on a <canvas> by a renderer about 30 lines long. Each dot has a current brightness and a target brightness. Every frame, each dot moves 22% of the way to its target. Changing a digit just sets new targets, and the easing turns that into a ripple for free.

// launcher/index.html (trimmed)
DotGrid.prototype.draw = function(now){
  for (var i = 0; i < this.v.length; i++) {
    if (now >= this.d[i]) {                          // this dot's start delay has passed
      var diff = this.t[i] - this.v[i];
      if (Math.abs(diff) > 0.01) { this.v[i] += diff * 0.22; moving = true; }
      else this.v[i] = this.t[i];
    } else moving = true;
    // unlit dots stay at 7% white so the grid is always faintly visible
    ctx.fillStyle = 'rgba(255,255,255,' + (0.07 + 0.93 * this.v[i]) + ')';
    ctx.arc(...); ctx.fill();
  }
  return moving;                                     // false → the loop stops
};

Two details make it feel alive. Each dot gets a small start delay based on its column plus a little randomness, so icons light up as a sweep rather than all at once. And the animation loop stops completely when nothing is moving. On a TV with about 1 GB of RAM, the idle launcher does almost no work: one clock update per second.

  Try itthe real renderer, running here

Type up to 8 characters. Change the accent with the dots at the top of the page.

Customise everything

I asked for it to be customisable from the remote. Press ▲ and a settings panel opens, styled like the rest of the OS:

Under the hood, opening an app is one call, tizen.application.launch(appId), and listing installed apps is getAppsInfo. Both need privileges declared in the app's config. Settings live in localStorage.

Snake

A dot-matrix Snake lives inside the launcher: a 48×26 grid, white body, accent-coloured head, blinking food. It speeds up with every food, from 150 ms per step down to 55 ms. Your best score is saved.

Snake, played with the TV remote. The phone controller switches to a swipe pad in this mode.

What Samsung won't allow