Back to home Feature · Real-time

Runs chromeless. Feels native.

Open it fullscreen in a chromeless browser — no tabs, no address bar — and there's no sign it's a browser at all. On your TV or your desktop it presents like a native application: instant, reactive, every surface always live. Phoenix LiveView is the reason it feels that way.

Chromeless / kioskPhoenix LiveViewWeb reach, native feel
Install All features
Fullscreen, chromeless home screen with rows that update themselves in real time Live · fullscreen
The best of both worlds

A web app that forgets it's a browser.

Media Centaur is built to run chromeless — fullscreen kiosk mode, no tabs, no address bar, no browser chrome of any kind. On a TV across the room or a desktop at your desk, nothing gives away that there's a browser underneath. It simply looks and behaves like a native desktop application.

And it feels native too: interactions respond the instant you make them. No page reloads. No spinners. No loading… Click, navigate, scrub a status — it answers immediately, the way a real desktop app does, because the screen is never rebuilt from a fresh request.

Web reach
  • Runs in the browser engine you already have — nothing heavyweight to install for the UI
  • Same surface at your desk and on your couch, no second client
  • No Electron bloat, no app-store gatekeeper
Native feel
  • Instant, reactive — interactions land with no perceptible round-trip
  • No reloads, no spinners, no refresh button anywhere
  • Every surface stays live without a refresh-driven SPA
The home screen filling the whole display, with no browser chrome around it
No chrome — hover to see what's gone
Why it can do this

One mechanism, two payoffs.

The same thing that makes it feel native is the thing that keeps every surface live. Phoenix LiveView holds your UI state on the server and pushes diffs over a persistent connection — so the screen updates in real time without ever polling or refreshing. That's why it's reactive and always current.

Feels like a native app

Interactions respond immediately — no page reloads, no spinners, no loading… The screen reacts the instant you act, exactly the way a desktop application does.

Powered by Phoenix LiveView

The whole UI runs on Phoenix LiveView over a persistent connection. State lives on the server and diffs are pushed to the browser — the same mechanism that makes it feel native keeps it live.

Every surface, always current

The library, the review queue, download activity, the home rows — all of it updates itself. Open a screen and walk away; it stays right even as the library changes behind it.

No polling, no refresh

There is no refresh button and nothing hammering the server on a timer. Changes are pushed once, to exactly the surfaces that care — efficient and instant at the same time.

What "live" looks like

Things just happen.

A sample of the events that flow through the system — each one lands on the relevant screen the instant the backend produces it, with no action on your part.

Live activity
New file detected — appears in the library grid Library just now
Metadata fetched — title identified via TMDB Library just now
Artwork downloaded — poster fills in on the card Library moments ago
Download changed status — Grabbed → Pending, live Activity moments ago
Playback started on another screen — reflected everywhere Playback moments ago
Every surface, always current

Status changes in front of you.

Download activity is the clearest tell: a grab moves from Grabbed to Pending to landed without you touching anything. The same liveness runs under the library, the review queue, and the home rows.

Library grid Review queue Download activity Home rows
Review queue updating itself as matches resolve
No polling, no refresh

The queue clears itself.

Resolve a low-confidence match and the review queue updates in place — no reload to see the count drop, no stale row lingering. Whatever changes the state pushes the new state straight to the screen.

Because it's push, not poll, an idle screen costs nothing and a busy one stays perfectly current. One persistent connection does the work a refresh button used to.

See it move. Nothing to refresh.

Downloads the latest release, verifies its checksum, installs atomically, and sets up a service unit. Open it, drop a file in a watched directory, and watch the library fill in live.

$ curl -fsSL https://raw.githubusercontent.com/media-centaur/media-centaur/main/installer/install.sh | sh