// Product · Open TV

Free-to-air TV, no accounts, no cloud.

A single binary serves the API and the web client. Type open-tv and you’re watching. It ships with no channels: you add your own M3U lists. Nothing leaves your machine, and the player points straight at the broadcaster.

  • Open source · MIT
  • No accounts, no telemetry
  • One binary, zero dependencies
  • macOS · Linux · Windows
// KORVEN RECEIVER · KV-88 SERIESSIGNAL STABLE
PICK A CHANNEL
KORVENKV-88
FROM CORE TO BUILD

● LIVE Channel-surfing the real catalog: 54 channels from 32 broadcasters.A real signal, live from each broadcaster. It doesn’t pass through this site.

// Why it exists

I didn’t want to pay to watch a few World Cup matches.

Looking for a way to watch them, I ran into something I didn’t expect: thousands of channels broadcasting free-to-air, in the open, for anyone to see. Among them, the ones showing those matches. Plain old broadcast TV, except now it travels over the internet.

Finding them wasn’t the problem. Watching them was, without installing a player full of ads or handing my data to someone in exchange. So I built my own: one binary, your lists, done.

I opened it up because I see no point in keeping it to myself.

// The difference

It isn’t a service. It’s a program you own.

IPTV apps hand you a catalog and keep your data. This one hands you the player and gets out of the way. Tap each point to see how:

d1It starts empty, and that’s the feature.bring your own

A clean install ships without a single channel. The first screen asks you for a source: your own M3U URL, a file you upload, or one of six public iptv-org lists in one click.

✓ Nobody decides for you what you can watch · ✓ no catalog to expire and no server that depends on me · ✓ your sources live in your SQLite, not in an account

d2The signal tells the truth, even when it’s bad.honest signal

The gateway checks every stream on its own: whether it’s alive, how long it takes, and, what almost nobody measures, whether your browser can actually play it. That third verdict gets its own color.

✓ “unchecked” is a different state from “down”, and it’s drawn differently · ✓ a channel that won’t play says so and explains why, instead of spinning a loader forever

d3The video doesn’t go through me. Or anyone.no relay

The player points straight at each channel’s broadcaster. The local gateway only proxies when the browser can’t handle a stream by itself, and that proxy never listens beyond localhost.

✕ What does NOT exist: a Korven server in the middle, telemetry, accounts, history. Nothing of yours leaves your machine, and there’s nothing I could see even if I wanted to.

The demo on this site isn’t a mockup: it’s 54 real channels from 32 broadcasters that publish their signal free-to-air, playing straight from each one’s server. Nothing to install, no email to give.

Open the demo →

// Install

One command, and it’s running.

No Docker, no runtime to install, no account to create. It’s one binary, with the whole gateway and web client inside.

01

One command

Homebrew on macOS, the curl installer on macOS and Linux (it verifies the checksum before installing), or go install if you already have Go. On Windows, or if you prefer, download the archive from Releases and check it against checksums.txt.

$ brew install --cask gdberysan/tap/open-tv

02

Type open-tv

It creates its data directory, listens on the first free port and opens your browser. Since it ships with no channels, the first screen asks you for a source. You’re watching within seconds.

$ open-tv

macOS arm64 · amd64Linux amd64 · arm64Windows amd64Homebrew and the curl installer don’t go through Gatekeeper’s quarantine; the standalone binary does, and the guide explains how to clear it.

// Open source

The code is free. The identity isn’t.

The whole program is MIT-licensed: use it, read it, change it, sell it if you like. The only thing reserved is the brand. The “Korven” name, the wordmark and the emblem have their own license, so if you publish a fork, give it your own name.

cmd/open-tv the entrypoint

internal/domain · ports · adapters clean architecture, pure-Go SQLite

internal/api chi v5, same-origin guard, strict CSP

internal/proxy HLS on loopback only, with an SSRF guard

web/ Svelte 5, embedded with go:embed

.github/workflows tests with -race, vet, gofmt, svelte-check and secret scanning on every push

MIT the codeKorven brand the name and the emblem

View the code on GitHub →

Issues are open for bugs, a channel that won’t play, or an idea.

// Privacy

There’s nothing I can see.

This isn’t a privacy-policy promise: the channel simply doesn’t exist. Open TV has no accounts, no server of its own, and never sends a single request to Korven. Your sources live in your local SQLite, your favorites in your browser’s localStorage, and playback stats only in memory, so they’re gone on restart, because they were never written anywhere.

// What it doesn’t do

Deliberately, just a player.

Premium channels

It doesn’t ship them and doesn’t know how to get them. It plays links you add.

DRM

It neither includes it nor breaks it. A protected stream stays protected.

Geo-bypass

No VPN, no tricks: if your region blocks a channel, it stays blocked here.

Third-party credentials

It doesn’t ask for them, store them or manage them.

Hosting or rebroadcasting

It doesn’t store video or re-stream it. Your sources are your responsibility.

// Questions

Does it come with channels?

No. A clean install starts empty: you add your own M3U list, upload a file, or pick with one click one of the six public iptv-org sources it suggests. It’s a design decision, not a gap: nobody decides for you what you can watch.

Is it legal?

Open TV doesn’t host or distribute anything: it’s a player for lists you choose to add. Whether those lists are legal depends on you and your jurisdiction. The demo on this site is deliberately limited to broadcasters that publish their signal free-to-air on their own website.

Does it collect any of my data?

None. No accounts, no sign-up, no telemetry. Favorites live in your browser’s localStorage and playback stats only in the process’s memory: they’re gone on restart, never written to disk and never sent anywhere.

Why won’t some channels play in the browser?

Some streams use codecs or headers the browser rejects even though the channel is live. The installed binary detects it and retries through a local proxy (loopback only); if it still fails, it says so plainly instead of pretending it works. The demo on this site has no such second route: a website can’t proxy someone else’s video without rebroadcasting it, so it only carries channels the browser plays on its own.

How is the demo different from the app?

The demo carries a frozen, curated catalog of 54 channels from 32 free-to-air broadcasters, and it doesn’t let you add sources or save anything. The installed app starts empty and it’s yours: any sources you want, favorites, an EPG guide per source and the local proxy for difficult channels.

Where’s the code?

All of it is on GitHub, MIT-licensed: a Go gateway, a Svelte client, tests and CI. What isn’t under that license is the identity: the “Korven” name, the wordmark and the emblem have their own, so a fork uses its own name.

What about the native macOS app?

It exists (Flutter, libmpv, AirPlay) and still builds, but it’s frozen: it isn’t part of version 1 and gets no active development. The living path is the binary with its web client.

Questions? Email me → · Want to read how the demo is built? How it’s built → · And the other product? CVForge →

Try it here. Install it if it’s useful.

The demo asks for no email and plays 54 real channels. The program is free and the whole codebase is on GitHub. There’s no way this goes wrong for you.

demo catalog · · 54 channels from 32 broadcasters