mrowser

Watch video from websites your TV has no app for — in a real player, properly in sync.

MIT licensedAndroid 6.0+No Play ServicesOne permission: INTERNET

Streaming on a TV should not mean a catalog

The web is off limits

Watching anything on a TV box means whatever apps the store happens to carry. A site with the video you want, and no app to match, is simply out of reach.

And when you do get there, it drifts

The rare TV browser that opens the site plays the video inside the WebView, whose player slowly loses A/V sync. Lips lead the sound, and it never recovers.

Nothing on the page is clickable

Websites assume a mouse. A D-pad cannot hover a menu, reach a small control, or click a link that was never made focusable.

What mrowser does about it

The page's video, played properly

Open a site, start its video, and mrowser takes over. It watches the page's own requests for the video stream — an HLS manifest, a DASH manifest, or a plain video file — and hands it off the moment one appears, carrying the session's User-Agent, Referer and cookies across so it keeps working. No catalog, no app per site.

In sync for a whole film

Playback moves to a native Media3 / ExoPlayer activity instead of the WebView, which is what keeps audio locked to picture end to end. Real quality selection, audio-track switching and playback speed come with it.

Subtitles you can fix mid-scene

Side-loaded subtitles are rarely quite in step. mrowser renders VTT and SRT itself, so one press shifts their timing by half a second — up to thirty — instantly, with no rebuffer and no restarting the film.

Every site reachable from the remote

A virtual cursor driven by the D-pad, with acceleration and edge detection. Hover menus, small controls and non-focusable links all become clickable. OK clicks, a long press switches to focus navigation, and speed is adjustable.

It leaves and comes back cleanly

BACK drops you onto the page exactly where you left it, and the play chip takes you straight back into the video. Favourites grid, browsing history, HTML5 fullscreen, and an address bar that opens on a held BACK for remotes with no MENU key. It registers as a browser too, so links from other apps can open here.

Ads and pop-unders, refused

A bundled list of about 90,000 known ad hosts, refreshed weekly. Requests to them are answered with an empty stand-in, so a page waiting on its ads still finishes loading, and a script that hijacks your click to open an ad tab gets nowhere. The shield in the address bar counts what was stopped, and allows a site in one press. The video stream is never touched.

Small, quiet, and yours

One permission: INTERNET. No Play Services, no accounts, no analytics, no telemetry. Plain Kotlin, no Compose beyond Media3, a single module — light enough for weak TV boxes.

See it work

mrowser detecting a page's HLS stream, handing it to the native player, and retiming the app-rendered subtitles live
A page with an HLS video → the stream is detected → automatic handoff to the native player → subtitles rendered by the app, retimed to +1.5s while the film keeps playing. Recorded on an Android TV device; the page serves Big Buck Bunny (Creative Commons) over HLS.
mrowser home screen: address bar, History and Settings buttons, and a favourites grid
The launcher: address bar, favourites grid, History and Settings — all D-pad reachable.
mrowser native player with the sub-sync box showing CC and subtitle offset controls over a playing stream
The native player. Top-left, the sub-sync box toggles subtitles and shifts their timing live.

Remote controls

KeyAction
D-pad arrowsMove the cursor, with acceleration and edge detection
OKClick at the cursor
OK long-pressSwitch between cursor mode and focus mode
D-pad held at the screen edgeScroll at the cursor — so a cookie dialog with its own scrollbar scrolls too
MENU or BACK heldOpen the address bar — the hold is for remotes with no MENU key
BACK tappedAddress bar → page history → close page → home
− / + in the playerShift subtitle timing by 0.5s, live, with no rebuffer

Install

  1. Download app-release.apk from the latest release.
  2. Get it onto the TV with a USB stick, a sideload helper such as Downloader or “Send files to TV”, or adb install.
  3. Allow installs from unknown sources for whichever app you used.
  4. Launch mrowser from the Android TV launcher — it registers as a Leanback app.

For automatic updates, add the repository to Obtainium as an app source:

https://github.com/m-salehi-v/mrowser

What it covers: sites that stream over HLS, DASH, or a plain video file (MP4, M4V, WebM, MKV) — which is most of the streaming web. Detection reads the page's request URLs, so a site that hides its stream behind its own protocol (YouTube among them) is not handed off, and DRM/Widevine content stays in the browser by design. Both still play in the page, just without the native player.

mrowser hosts, bundles, indexes and links to no content. It ships with no preset sites or bookmarks, and it does not circumvent DRM — Widevine streams stay in the WebView. Use it only to access content you are authorised to access.