The launcher
A home screen that doesn't look like everyone else's: black, dots, one accent colour. Two designs died first.
Third time right
| Version | Look | Verdict |
|---|---|---|
| v1 | A grid of every installed app, with letters as icons | "The worst launcher I have ever seen" |
| v2 | Apple TV style: rotating photo wallpapers, a glassy "Today" card | Looked 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
- A black screen with a faint dot grid, like an unlit LED panel. (This website uses the same grid behind the text.)
- A huge clock made of glowing dots, in a 5×7 dot font, that ripples when the minute changes.
- A row of 60 tiny dots under it that fills as the seconds pass, with the current second in the accent colour.
- Date and weather in the corners, in the Doto typeface, with a pulsing accent dot.
- A dock of app icons drawn in dots. The selected one lights up in a left-to-right sweep and gets a pulsing marker.
- A QR code, also drawn in dots, that turns your phone into the remote (see log 04).
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.
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:
- Accent colour: Red, White, Yellow, Green, Blue or Orange.
- 12- or 24-hour clock, three clock sizes, seconds bar on or off, weather and city.
- Apps: put any installed app in the dock, remove it or reorder it. Apps without a dot icon get one generated automatically from their initials, drawn in the same 5×7 font inside a frame.
- Doom style (LED dots or classic pixels), phone link (same Wi-Fi or internet), dot background, reset.
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.
What Samsung won't allow
- It can't replace Samsung's Home bar and can't start automatically at boot. The workaround is to pin it as the first app on the bar.
- It can't change system settings. Nothing here touches the TV's firmware.