OPEN SOURCE & PRIVATE

Self-Host veedeeoh On Your Home Server

Run your own instance with Docker or from source. Standalone: no account with us, no database to set up, and nothing about your viewing passing through anything we operate.

What you get, and what you do not

Read this first, it saves the questions

Self-hosted veedeeoh is standalone. It needs no account with us, no database, no API key, and no network calls to anything we run. It is the whole catalogue, the whole player, and your own machine.

You get the same thing to watch. The catalogue is Pluto, Tubi and the Internet Archive, all free, and the hosted version has no title yours does not.

What it does not have are the things we built for running it as a service: accounts, syncing your list between devices, household profiles across people, watch parties, subscriptions, referrals. Those are the cloud product, and cloud is sold on access rather than on content: it works on every device you pick up, with nothing to install and nothing to keep running. If that is not a problem you have, self-hosting is not a lesser version. It is the whole thing.

Profiles, My List and watch progress all still work here. They live in a JSON store on the machine running the server, not in anybody's cloud.

Option A: Docker Compose

Any Linux box, NAS, Unraid, or a Raspberry Pi
git clone https://github.com/ItsCodejac/veedeeoh.git cd veedeeoh docker compose up -d --build

That is the whole setup. Your instance is at http://localhost:8321.

There is nothing to configure first. If you want it on a different port, set PORT.

Option B: From source

For development, or hosting without Docker
npm ci --prefix frontend npm ci --prefix backend npm run build:selfhost npm start --prefix backend

The build writes the app into src/tvlc/static/ and the server serves it on 8321. For development instead, run npm run dev in backend/ and again in frontend/; Vite serves on 5173 and proxies the API to the backend.

The build prints which of the two products it is making. The explicit self-host build ignores cloud credentials and says building SELF-HOST, and that is the one you want. There is no fallback to our project and no way to end up pointed at it by accident.

Environment variables

All optional
VariableDefaultWhat it does
PORT 8321 Port the server listens on.
VEEDEEOH_DATA_DIR platform default Directory for local server data. Docker uses its persistent volume at /data.
PROXY_URL this origin Absolute base for the stream proxy, when it is not served from the same origin as the app.

That is the entire list. Anything you may have seen about Supabase URLs and anon keys belongs to the cloud build and is not needed, or wanted, here.

Where your data lives

On your machine, in files you can read

My List, watched history and exact resume positions are saved per local profile in library.json on the server. The default directory is ~/.local/share/tvlc on Linux or ~/Library/Application Support/tvlc on macOS. Docker mounts the persistent named volume at /data. The catalogue cache is rebuilt in memory when needed.

Profile names, avatars, PINs and playback preferences remain in each browser. Exporting or backing up the server folder does not include those browser settings. Existing instance-wide favourites and watched files are preserved and imported into Main Profile.

Stop the service before copying or restoring its data. Keep the .bak files: writes are atomic, and the server can recover the previous snapshot if a JSON file is damaged.

docker compose stop docker compose cp veedeeoh:/data ./veedeeoh-backup docker compose start

To restore, stop the service, copy ./veedeeoh-backup/. back to veedeeoh:/data with docker compose cp, then start it. Keep a separate copy of the current folder before restoring. See the repository README for update and source-install instructions.