watchbucko.online

The streaming app I built for one living room, on a real domain since 26 July. The first hole showed up that evening, and my fix for it opened the second one by morning.

watchbucko.online, drawn as a two-ink print

I put the TV app I built for my living room on the public internet. Within hours, anyone who found it could have taken my account.

The app is called Bucko. I had been building it since April for my own TV, and on 26 July it got a real address at www.watchbucko.online. A real URL changes exactly one thing. Anyone can type it. Not my friends, anyone.

The Bucko TV guide on a Saturday morning: a sports category with programme blocks across the timeline, the now-line running through live football, the provider's name masked in the channel list.
the guide on a saturday morning · the provider keeps its name to itself

Becoming Bucko

It was going to be a hardware thing, running on a small chip.

That idea survived one day. On 8 April it became a web app.

The name took three tries. ipTV Local, then Bucko, then watchbucko.online. The dark rebrand landed on 12 June.

The day before that, 11 June, it reached the actual living room, installed on the Samsung. The same day the phone became a remote.

The Bucko web home: recently watched and favourites rows above the categories and groups wall of one account.
the web app's home · one account's worth of categories

Bigger than the machine

On the Samsung the catalogue is bigger than the machine browsing it.

A catalogue that size arrives dirty. One film comes in from the provider two dozen times under two dozen names. Bucko now picks the name that appears most often across those copies. The old rule took the shortest one, which is how Harry Potter and the Order of the Phoenix turned up on my TV as "Harry Potter i Zakon Feniksa".

The Bucko movie detail over a blurred poster grid: The Dark Knight poster, rating and runtime, cast list, 25 sources, and one Play Movie button.
the movies side, mid-browse · 25 copies of one film, collapsed into one button
One search for batman across everything: a live channels row, a movies row, and a series row in one results screen.
one search across everything · 13 live, 299 movies, 18 series

Going live

The domain was never the plan. What forced it was a browser rule. The provider sends every stream unencrypted, the app is served encrypted, and a browser will not play the one inside the other. The TV and desktop builds are exempt from that rule. The web app has to obey it, and the web app is the one I wanted to be able to hand to someone.

Every fix I could find was a proxy, something in the middle that re-serves the stream. The first one ran on Vercel, whose monthly allowance live TV eats in about 30 hours. The one that stuck runs on a Cloudflare Worker. That same morning I pointed the domain at the live app.

The hole

The first hole was there by launch evening. The app has a guest sign-in, for someone bringing their own account. The code behind it would set the app's access cookie for anyone who asked, and the value in that cookie was the access password itself. One request, no credentials, and you were holding the gate's own key.

That cookie unlocked more than the app. It also unlocked the part of the app that hands out my real provider account, the one the TV uses. Two steps. The app had been public for a few hours and its worst path was that short.

The evening fix split the session in two. Type the password and everything opens. Bring your own account and the app opens, and my credentials stay locked.

I went to bed thinking it was closed. It was. The same fix had opened the next one on the way past.

To keep the sign-in form working while my credentials stayed locked, I had the gate hand a guest session to anyone who so much as loaded the sign-in screen. That session opened two relays. The first gave out the address of my Cloudflare proxy and its token, so a stranger had an open pipe running on my account. The second fetched any URL you pointed it at and streamed the answer back through my Vercel account, wearing the app's domain.

A guest session costs a real account now. The rule I wrote down afterwards was to gate an endpoint by what it returns, not by what it's called.

What the weekend left behind is a front door that asks for your own account.

The Bucko sign-in gate: a dark screen with the Bucko mark, a Sign in with your Xtream account form, and the line Credentials stored locally in your browser only.
the front door, after the weekend · your own account is the way in
the launch weekend, laid out the way bucko lays out everything else · two rows, one channel

One connection

The provider account allows one connection at a time. Everything about Bucko follows from that. Whoever holds the slot keeps it. The TV usually wins because the TV is usually already playing.

One slot also means a dropped stream has to be recovered in place, so the player got the one quality I actually wanted from a TV. Stubbornness.

The living-room Samsung on Bucko's idle screen: an on-this-day page over a photograph, a resume-watching chip, and Phone connected in the corner.
the living room · where the one connection goes
The remote's home: a TV is idle card, search, and folders, with French marked WATCHING NOW.
The remote's TV menu sheet: a D-pad with an oversized OK button and a Back row.
The folders and playlists sheet: create a folder, set one live, delete, over the favourites list.
the remote, three screens deep · the phone that only steers

The domain still resolves

As of 29 August 2026 the repo had been quiet since 7 August. The domain is still there and strangers can still type it. What changed that weekend is what they get when they do, which is a gate asking for their own account while mine stays behind the password. It still plays every evening.