DuoTV
Self-hosted · one small box · the whole household

Your home's TV, streams, radio and cameras. One app.

DuoTV is a media server you run at home. Thousands of internet TV channels with one guide, Twitch and YouTube live, world radio, your security cameras and every recording — with pause and rewind, live AI subtitles in any language, and watching in sync with family anywhere.

https://duotv.home
DuoTV playing a live internet channel with the guide beside the picture
~11kfree channels, seeded from iptv-org
~12 slive subtitles behind live, translated
0.1 swatch-together sync between devices
99,928radio stations on a globe
1Docker image, one Go binary
Watch

The world's free TV, cleaned up and in one list.

Add any M3U playlist — or start with iptv-org's world index — and DuoTV turns tens of thousands of raw streams into a channel list that stays fast, numbered and healthy.

26k streamsYour playlists

iptv-org, any M3U, single addresses.

19k channelsCopies merged

One entry per channel; the best copy plays first.

a few KB eachChecked

A playlist and its first segment — every 48 h, dead ones daily.

what you seeWorking channels

Numbered for good; dead ones hidden, favourites repaired.

  • One channel, many sources

    Copies of a channel from different playlists merge into one entry and the best one plays first — a list of 26k streams became 19k channels.

  • Fast at 22,000 channels

    Lists are virtualised, filtering and search run on the server: the Live page on a throttled phone went from 1.24 MB to 21.7 KB.

  • No transcoding when it isn't needed

    About 98 % of healthy streams are HLS and pass straight through to the browser; the rest are transcoded on the iGPU.

  • Health checks that cost almost nothing

    A playlist plus its first segment — a few KB per stream. Dead channels hide themselves and come back when they recover.

  • Dead favourites repaired

    When a favourite stays dead for a day, DuoTV looks for a working copy in your playlists and stream catalogues, tests it and offers it with a preview.

  • Channel logos that look right

    White-on-transparent logos get a darkened copy; missing ones are found automatically.

  • Catch-up

    Playlists that carry an archive play past programmes back, seekable, for up to 30 days.

  • Protected streams

    Encrypted channels a playlist carries the means to play are decrypted on the server and play like any other — nothing about them ever reaches a browser.

  • Per-country routing

    WireGuard tunnels run inside the server process, so only the streams that need a country's connection use one — nothing changes on the host.

  • Plays in your other apps too

    M3U and XMLTV for VLC, Kodi, TiviMate and Jellyfin, with a personal token per user.

The guide
One guide for every channel, built from listing sites and the playlists' own XMLTV.
Multiview
Multiview: up to four channels or cameras at once.
Streams

Twitch, YouTube and the rest — in the same player.

Twitch, Kick, YouTube, Bilibili, TwitCasting and SHOWROOM live streams get everything TV channels get: rewind, clips, subtitles, recording and casting.

  • Low-latency mode

    About 2.5 s behind a Twitch stream instead of the usual 18–22 s.

  • Live chat beside the picture

    Emotes and badges, a delay that lines chat up with the video, and AI translation into any language with a live cost meter.

  • Your accounts, linked

    Link Twitch or Kick to write in chat and import everyone you follow.

  • Went-live alerts and auto-recording

    Followed channels can record themselves — with the chat, replayed in step.

  • Web TV

    A curated list of always-on web channels: news, music, study rooms.

  • Live cameras of the world

    About 2,540 public cameras in 80 countries, found from YouTube and Bilibili live search and SkylineWebcams.

Streams
Streams: followed channels and who's live.
Live cameras of the world
Live cameras of the world, by country.
Pause · rewind · record

Every live thing becomes something you can rewind.

A live buffer, a recorder that works from the guide, and a library that edits losslessly — for any channel or stream.

  • Pause and rewind live

    A 30-min buffer by default (up to 4 h), picture previews on the seek bar, "from the start".

  • Clips

    Cut any range of the buffer into a recording or a download.

  • Recordings from the guide

    One-off, keyword and series rules, "new episodes only", padding and quotas.

  • Lossless editing

    Trim a 10-minute 1080p recording in 0.2 s.

  • Ad breaks found and skipped

    Learns each channel's on-screen graphics: 99.5 % precision by time on the test set.

  • Continue watching, Up next

    Seek-bar thumbnails, a countdown to the next episode.

  • NAS archive over SMB

    Back up or move recordings per rule and play straight from the NAS.

  • Listen

    A channel's sound only, as 64 kbit/s AAC for a screen-off phone — about 2 % of one core.

  • Even volume, sleep timer

    A loudness leveller tames a 10 dB-louder ad in ~0.6 s; the sleep timer fades sound and picture out.

Subtitles & AI

Understand anything on screen — in your language.

Optional and cheap by design: every AI call is metered in tokens and dollars, and every feature has a hard limit and an off switch.

~1.1 s for a 6-second chunk held ~12 s behind live Live channelits sound, as it plays 6-second chunkscut at the quietest moment HearWhisper large-v3, cloud Translatelast lines as context On your pictureon the picture's clock No cloud? The server's own Whisper nothing leaves the box · a longer delay

Heard once, read in everyone's language.

Each viewer picks the translation, the words as spoken, or both at once — in English or any other language. The speech is heard once; each language is translated once, in parallel, and shared by everyone who picked it.

6 s of speech from the live channel Heard once the words as spoken, language detected spoken: 日本語 English always first, never waits Türkçe in parallel, ~1.2 s Any language up to 3 at once, most wanted first Viewer 1 · English The typhoon is moving north. Viewer 2 · both, in Turkish 台風は北へ進んでいます Tayfun kuzeye ilerliyor. Viewer 3 · Spanish El tifón avanza hacia el norte.
once per languageShared, not per viewer

Ten people watching in Turkish cost one Turkish translation per chunk.

spoken = chosenNo call at all

Pick the language being spoken and you simply get the original.

tap a wordReading and meaning

The picture pauses on it: 台風 → たいふう, "typhoon" — a built-in Japanese dictionary in ~1 ms, plus the AI's sense in your language.

The free allowance goes to English first: an extra language pauses — and the player says so — before it would use up the day's free quota.

  • Live subtitles in any language

    Speech is heard and translated in the cloud about 12 s behind live, with a local Whisper fallback that keeps everything on the box.

  • Original and translation together

    Tap a word for its meaning and reading; a built-in Japanese dictionary answers in about 1 ms.

  • Voice-over

    Subtitles read aloud while the programme ducks underneath — or free with an on-box voice.

  • What's on screen?

    Pause and ask "Who is this? Where is this? Translate the text" — fractions of a cent per question.

  • What's this song?

    Song recognition from radio, live TV or recordings, with the fingerprinting done in Go.

  • Recordings that explain themselves

    AI subtitles, summaries with chapters, search inside recordings and questions answered with clickable moments.

  • Morning digest

    Overnight news becomes a few short stories with "Watch" links, pushed at your time.

  • Save recipe

    A cooking show becomes an ingredient checklist and timestamped steps.

Live subtitles
Live subtitles with the translation under the original.
Together

Watch in sync with family, wherever they are.

The server keeps one playback state for the room. Every player measures its clock against the server's and steers itself to the same moment, four times a second.

The room one playback state, on the server position · server time · speed clocks matched by round trips TV in the living room a recording in step · 0.08 s Phone on a train 0.6 s behind nudging speed +8 % Laptop at a friend's buffering the room waits
under 0.12 sLeave it alone

Close enough that nobody can tell.

up to 1.5 sNudge the speed

At most ±8 %, so no one sees a jump.

over 1.5 sSeek

Jump straight to the room's moment.

Someone's connection stalls? The room holds at the same place, "Waiting for …", until they're ready — up to 8 s, so one slow line can't stop everyone.

  • Watch together

    Rooms that keep every player in step — recordings within 0.08 s, live within 0.1–0.2 s — for TV, streams, catch-up, radio and cameras.

  • Room life

    Chat, reactions and full-screen effects; invites by push, QR or a 6-character code; the room waits for whoever is buffering.

  • Go live

    Share a phone's camera or screen, or stream from OBS over RTMP, to the household — 0.2–0.4 s behind on the low-latency path.

Cameras

A camera recorder that tells you what happened.

No detector running on every frame: motion inside your zones wakes it, it looks at a few cropped frames, and the event gets a label — and, if you want, a sentence.

~77 ms a frame, on the CPU CameraUSB · IP · ONVIF Motiononly inside your zones Detector a few cropped frames person vehicle animal In wordsoptional, one sentence “Person in a teal shirt hangs laundry” Timelinesearchable events Popup on the TVover what's playing Push · daily summary"4 person visits · 1 cat"
  • USB webcams and IP cameras

    ONVIF/RTSP with discovery, sub-second live view, pan/tilt with presets.

  • Continuous or motion recording

    Motion zones, a timeline, timelapse, retention and a NAS archive by day.

  • Person, vehicle, animal

    A small detector checks a few cropped frames per motion event — about 77 ms a frame on the CPU.

  • Events in words

    "Person in a teal shirt hangs laundry" — searchable, plus a written summary of each day.

  • Popups over the TV

    A camera can pop up over whatever is playing, with optional push alerts.

  • Planes in the frame

    Labels the aircraft visible in a sky-facing camera.

Radio · world · space

Leave the world running on the TV.

Beyond TV: the planet's radio, live data on maps, and the sky above your house.

  • World radio on a globe

    99,928 stations in 245 countries with now-playing titles, plus public shortwave receivers with a live waterfall and live sounds from microphones and hydrophones around the world.

  • World now

    A live map of earthquakes, flights, rain radar, the ISS, the day/night line and the news by country.

  • Weather and hazards

    Rain-in-minutes alerts, animated radar, air quality, lightning, wildfires, a live seismograph and earthquake alerts with your own thresholds.

  • Sky tonight, Earth & space

    ISS and Starlink passes, meteor showers, the whole Earth from NASA EPIC, the Sun in seven wavelengths, the newest photos from Mars.

  • Concerts and classic films

    The Internet Archive's live music and public-domain films, on demand or as themed 24/7 channels.

  • Your own channels

    Turn your media files — or fireplace, rain and ocean loops — into channels that play on a clock like real TV.

World now
World now: quakes, flights, weather and news on one map.
Radio
Radio: stations of the world on a globe.
Phone · TV · everywhere

The same home, on every screen.

  • Installable web app

    A phone layout with touch gestures, casting to Chromecast and AirPlay, and a notification drawer.

  • Android app

    Reaches home from anywhere with no VPN app on the phone — the network runs inside the app. Picture-in-picture, background audio, encrypted push.

  • TV mode

    A ten-foot, remote-driven interface with a channel switcher and info bar — it can run on the box's own HDMI.

  • Phone as a remote

    Pair with a 6-digit code or QR and drive any screen playing DuoTV.

  • Looks you pick

    Seven complete UI packs per device, and a player button row you arrange yourself.

  • My home

    A page each user arranges: inline players, cameras, weather, clock, notes and shortcuts.

DuoTV on a phone
Playing on a phone
Android app

Home in your pocket. No VPN app, no open ports.

The DuoTV app carries its own ZeroTier node inside it. At home it talks to the server over Wi-Fi; anywhere else it reaches it over an encrypted peer-to-peer network that the server runs itself — nothing to install, no VPN slot taken, nothing exposed to the internet.

Your phone DuoTV app The full DuoTV UI WebView · PiP · background audio In-app proxy home or away? picks the path ZeroTier node, built in libzt + its own TCP/IP stack no ZeroTier app · no VPN slot other sites go out directly At home · straight over Wi-Fi TLS checked against your server's own CA Any network mobile data, hotel Wi-Fi… Away · encrypted peer-to-peer DuoTV server at home, no port forwarding DuoTV gates the app network Its own ZeroTier controller no third-party account phones on the app network can reach only the server
01Install and open

The app's node joins the server's network on its own.

02 · 10 minPending

The new phone can reach only the sign-in page.

03Sign in

Password, two-factor, or scan a QR code from a signed-in screen.

04Paired to you

The phone is yours: everything works, at home or away.

Three wrong passwords or time running out removes the phone. Admins see pending and paired phones — with their connection, direct or relayed, and latency — and can approve, refuse or remove any of them.

  • Fast enough for HD

    The in-app node moved 31–40 Mbit/s in tests; DuoTV's streams need 6–10.

  • A real app around it

    Picture-in-picture, background audio, encrypted push notifications, in-app updates.

  • Go live from the phone

    Share the phone's camera or screen to the household, from anywhere.

Accounts & admin

Built for a household, not a single user.

  • Real sign-in

    Users and roles, Argon2id, authenticator apps with recovery codes, passkeys, QR sign-in.

  • Invite links

    Single- or multi-use, with a guided walkthrough for new accounts.

  • Backups you can trust

    Nightly verified database backups and an encrypted settings snapshot with a section-by-section restore preview.

  • Health in plain words

    Disk, memory, backups, tunnels, guide, certificates and AI limits; companion containers heal themselves.

  • Stats and Wrapped

    Viewing heatmaps, streaks and top channels — and a shareable monthly Wrapped.

  • Accounting

    Traffic per stream and per tunnel, AI cost per feature, an audit log.

Screens

A closer look.

Under the hood

One idea: everything is a Source.

Every module ends in a Source — an MPEG-TS byte stream fanned out to whoever subscribes. It starts with its first viewer and stops a few seconds after the last one leaves, so flipping channels stays fast. The player, the recorder and the analyzer never know where a Source came from.

Internet channelany M3U · catch-up Web live streamTwitch · YouTube · Kick… CameraUSB · ONVIF · RTSP Phone going livecamera or screen · OBS Your own channelyour files, on a clock Source one MPEG-TS stream, fanned out to every subscriber starts with the first viewer stops after the last Live sessionHLS for browsers · TS for players Recorderwrites the original — no re-encode Analyzerframes → detector → events
Server
Go — one static binary that embeds the UI; PostgreSQL 17 (pgx, no cgo)
Media
ffmpeg 7 with Intel VAAPI, go2rtc for cameras (WebRTC/MSE), streamlink, in-process WireGuard (wireguard-go + gVisor netstack)
Web
React 19, Vite, Bun, Tailwind 4, shadcn on Base UI, TanStack Query/Table/Virtual, hls.js, MapLibre GL, WebGPU
Sidecars
faster-whisper (local subtitles), Piper (voice), YOLOX-tiny on OpenVINO (detection), the iptv-org/epg grabber
Android
Kotlin WebView shell with ZeroTier inside the app (libzt) and FCM push
AI
OpenRouter through one metered client; Groq's free plan for live subtitles
Deploy
One Docker image and a compose file on Debian
Runs on
A 2016 mini PC: Intel i5-6500T (4 cores), HD 530 iGPU, 11 GB RAM, 110 GB NVMe
Coming soon

DuoTV isn't released yet.

It runs every day in one household while it gets ready for yours. When it ships, it will be one Docker image and a compose file — any Linux box with Docker, an Intel iGPU if you have one, everything else optional.

  1. One command to start

    docker compose up -d, then the first visit creates your admin account.

  2. Bring your playlists

    Any M3U by address, file or single stream — or iptv-org's world index in one click.

  3. Invite the household

    Invite links, phones paired at sign-in, and an AI key only if you want the AI features.