Run it on your own keys

Sail exists so you do not have to do this. But Qar is yours, and a media server that depends on someone else's service to show a poster is not really self-hosted — so every provider can be swapped for your own key, and Qar will then never contact us at all.

These keys are for metadata: what a film is called, what it looks like, what it is about. Downloading and playback have never needed a key and never talk to any of this.

The three providers

OMDb

Free — 1,000 lookups a day

Posters, plots, ratings, episode listings

Without it: Titles still download and play. They arrive with no artwork and no description, and episode listings have to be worked out from the files.

Get a keySettings → Providers → omdbApiKey

TMDB

Free for personal use

The Discover catalogue — popular and trending titles

Without it: Discover is empty. Search still works: you can ask for anything by name, you just cannot browse for it.

Get a keySettings → Providers → tmdbApiKey

OpenRouter

Pay per call — pennies, with free models available

Recommendations based on what you already have

Without it: No recommendations. Nothing else changes.

Get a keySettings → Providers → openrouterApiKey

Where the keys go

The settings page is the easy path — Settings → Providers, paste, and Qar checks each key against the provider before saving it. Each one can also be switched off without throwing the key away.

If you would rather configure the machine than the app, the same values are read from /etc/qar/qar.conf:

OMDB_API_KEY=your_key_here
TMDB_API_KEY=your_key_here
OPENROUTER_API_KEY=your_key_here
OPENROUTER_CHAT_MODEL=openai/gpt-oss-20b

Then sudo systemctl restart qar-backend. A key set here wins over one saved in the app.

Running Sail yourself

Sail is not a special build — it is a small Express service in the open, and if you run several Qar installs it is worth running one: the shared cache means the fifth machine to ask about a film pays nothing for the answer.

Give it Postgres and your keys, point your installs at it, and it behaves exactly as ours does. The provider code is a shared package both sides import, so there is no drift between them to worry about.

Source for the site and Sail