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 dayPosters, 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.
Settings → Providers → omdbApiKeyTMDB
Free for personal useThe 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.
Settings → Providers → tmdbApiKeyOpenRouter
Pay per call — pennies, with free models availableRecommendations based on what you already have
Without it: No recommendations. Nothing else changes.
Settings → Providers → openrouterApiKeyWhere 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