Back to Projects
OliverFlix wordmark
Personal BuildAndroid · Solo

Turning six streaming apps into one beautiful home screen

A months-long staring contest with cookies, CDNs, and very encrypted video — that started as “I’m tired of juggling apps, and tired of the bill,” and became the most stubborn, satisfying thing I’ve ever built.

6
Streaming services, one home screen
1,000+
Live TV channels, filtered to the good stuff
4-step
On-device chase to reach a locked stream
~30s → ~1s
Tile load time after the rebuild
The idea

It started with two kinds of tired

The first was juggling apps — one for movies, one for cricket, one for the kids, and a constant itch for the old cartoons I grew up on. Six apps, six logos, six places to forget my password.

The second was the bill. Stacking five or six subscriptions adds up to a genuinely silly number every month — to watch the exact same stuff that’s already floating around the internet anyway. It felt like renting the same movie six times from six different landlords. So I asked a slightly unhinged question: what if all of it lived behind one home screen — and stopped quietly draining my wallet?

The scraper

Teaching my app to “see”

The first wall: nobody hands you a clean API. So I built a scraper pipeline backed by a little serverless brain in the cloud. For each service I’d basically ask, “what’s on the home page right now?” and turn the messy answer into clean rows my app could render — Trending, Action, Top 10, the works.

The catch: these places don’t just let you walk in — every knock needs valid session cookies. So I built a tiny cookie butler: a bot whose whole job is keeping a fresh batch warm, ready to hand one over the second the app needs to peek inside. No butler, no party.

The artwork war

Making it look expensive

Getting the content was half the fight. The art I was handed ranged from “sad and blurry” to — I swear this happened — a 1.9 MB, 4K portrait crammed into a thumbnail the size of a postage stamp, which made the whole grid move like it was wading through wet cement.

So I went art-hunting. I matched every title against a proper movie-poster database, pulled the crisp high-res versions, and for the hero banner I baked the best ones right into the app so it’s razor-sharp the instant you open it. Postage-stamp problem: solved.

The hardest problem

Streams that refuse to play anywhere but here

The cartoons nearly broke me. Their streams sit behind a CDN with serious trust issues — a bouncer who checks not just your face but your home address. The video link comes signed with your phone’s exact network fingerprint. Grab it from a server, another network, anywhere else — and it slams the door with a 403. My clever plan to do it on the backend? Dead on arrival.

So I rebuilt the whole thing to run on the phone itself, as a four-step chase:

01

Open the episode

Start at the episode page — the front door, nothing secret yet.

02

Follow the first trapdoor

It points at a player frame, which points somewhere else again.

03

Follow the second

Through the next hop to the real host that actually holds the file.

04

Reach the vault

A final endpoint hands over the stream AES-256 encrypted — decrypted on the phone, in pure JS.

When that first cartoon finally played — IP-locked link and all — it felt like picking a lock I’d personally installed.

Live TV

The “easy” win

I scooped up a thousand-plus channels from the open IPTV lists that drift around the internet like messages in bottles, filtered them down to actual entertainment (no doomscrolling-the-news channels), and added a little green / red dot so you can tell at a glance which channels are alive — tap it to re-check. Unlike everything else, these just work, which was suspicious enough that I checked twice.

Performance

Making it feel instant

Working wasn’t enough — it was slow. Switch to a provider and you’d stare at grey boxes long enough to question your life choices. The fix was a mindset change: show whatever’s cached instantly, then quietly refresh in the background.

I stopped the cache from deleting its own homework, trimmed the timeouts, loaded images straight from the phone, and pre-warmed the other tabs while you weren’t looking. Half-a-minute waits turned into about a second.

Self-update

The trick I’m quietly smug about

I never want to ship an update just to change what’s featured. So the Top 10 rows read a single file I host — I edit it, every phone updates, no app store involved. And on launch the app checks for a newer build and offers it up with a friendly popup. It basically patches itself, like a Tamagotchi that fixes its own bugs.

Where it is now

Six services, a cartoon vault, a thousand live channels — one app, one home screen, sharp art, instant loads, and a little on-device lock-picking doing the impossible quietly in the background. It started as “I’m tired of juggling apps, and tired of the bill,” and somewhere along the way became the most stubborn, satisfying thing I’ve ever built.

Under the hood

AndroidServerless scraperCookie poolOn-device cryptoAES-256HLS / Live TVStale-while-revalidateSelf-update