All projects
2026Websites

Omni

A full-featured streaming platform, built from scratch as a personal learning project.

Omni

The story

Omni is a streaming platform I built from scratch to learn how one works end to end. It is a demo: the catalog, the posters and the details come from the TMDB API, and there are no real streams behind it. Everything around the video is real, though: invite-only accounts, your lists and favorites, your progress, recommendations, watching together. The video pipeline exists only as a proof of concept, with no real content.

commits since January
597
tests passing
300
half-life of a taste, in the recommendations
45 days

A product, not a player

You get in with an invite code. Then you build your library: a watchlist, your favorites, lists of your own, and your progress on everything you started, synced across devices. The home is made of rails, and one of them is made for you. It installs like an app and has an offline page of its own.

Every API call reads the user from the session on the server, never from what the browser sends, so nobody can reach someone else's library by changing an id.

Recommendations that forget

The rail made for you comes from a taste profile built from what you actually watch. It is deliberately simple, and it has one property I cared about: it forgets. What you watched last week counts more than what you watched last spring.

  1. 1

    Engagement

    Every title in your library gets a score for how much you really watched it: one film is weighted by how far you got, a series by how many episodes you finished and how many you tried.

  2. 2

    Recency

    That score fades with time, halving every 45 days from the last time you watched.

  3. 3

    Genres

    The scores add up per genre and are normalised, so your taste is a profile across genres rather than a single favourite.

  4. 4

    The rail

    The catalog is ranked against that profile to fill the rail that is yours.

Watching together

Share a short code and you are in the same room, watching in sync inside the app. The server owns the clock and every player converges on it. The rules are kept apart from the player and the socket, as plain maths, which is what makes them testable.

A small drift is left alone, because correcting it would be more visible than the drift. A bigger one is closed gently, by playing a little slower or faster until the players meet. Only a large gap makes the player jump. The room is remembered for six hours, so a reload or a wrong turn does not throw you out.

of drift is still in sync
0.35 s
the largest gap closed by changing speed
2.5 s
slower or faster, to catch up
5%
a room is remembered
6 h

Everything I had never done

Before Omni I had never touched a VPS. The services run in Docker behind Nginx and Cloudflare, with a firewall in front. The watch-together server is one of them, on WebSocket. Deploys go through one script that stamps the commit into every service's health check, so a private dashboard can tell me whether the server is up to date, next to users, plays and sessions.

It is the project where I learned what it means to put something on the internet and keep it there.

  • Jan224
  • Feb47
  • Mar0
  • Apr0
  • May7
  • Jun176
  • Jul115
  • Aug16
  • Sep12
Commits per month on the app in 2026.

Gallery

Omni · 1
Omni · 2

Want something like this?

I can build the same thing for your product.

Tell me what you have in mind. You get an answer the same day, with a realistic scope and timeline, not a sales pitch.