Invidious
Invidious
Invidious is a privacy-respecting alternative frontend for YouTube. It lets you watch YouTube videos without Google tracking, without ads, and without requiring JavaScript. Your requests go through your seedbox's connection, not your home IP.
PMSS has built-in proxy support for Invidious. Once you install it and tell PMSS which port it runs on, the reverse proxy configuration is generated and maintained automatically.
What You Get
- No Google tracking -- Invidious proxies video streams through your server. Google sees your seedbox's IP, not yours.
- No ads -- YouTube ads are stripped.
- No JavaScript required -- the interface works without JS (though JS enables extras like comments).
- RSS feeds -- subscribe to channels via RSS without a Google account.
- Two access paths -- one public (shareable), one private (behind your seedbox login).
Access Paths
Once configured, Invidious is available at two URLs:
| Path | URL | Authentication |
|---|---|---|
| Public | https://SERVER.pulsedmedia.com/public-USERNAME/invidious/ |
None -- anyone with the link can access it |
| Private | https://SERVER.pulsedmedia.com/user-USERNAME/apps/invidious/ |
Behind your seedbox login |
The public path is useful for sharing your Invidious instance with friends or using it from devices where you don't want to enter your seedbox credentials. The private path keeps it behind authentication.
Installation
Invidious needs a PostgreSQL database. Docker Compose is the recommended way to run both together.
Step 1: Create a Docker Compose file
<syntaxhighlight lang="bash"> mkdir -p ~/invidious && cd ~/invidious </syntaxhighlight>
Create docker-compose.yml:
<syntaxhighlight lang="yaml"> version: "3" services:
invidious:
image: quay.io/invidious/invidious:latest
restart: unless-stopped
ports:
- "127.0.0.1:3100:3000"
environment:
INVIDIOUS_CONFIG: |
db:
dbname: invidious
user: kemal
password:
# ↑ Set your own database password above (e.g. a random string).
host: invidious-db
port: 5432
check_tables: true
external_port: 443
domain: SERVER.pulsedmedia.com
https_only: true
depends_on:
- invidious-db
invidious-db:
image: docker.io/library/postgres:14
restart: unless-stopped
volumes:
- postgresdata:/var/lib/postgresql/data
- ./config/sql:/config/sql
- ./docker/init-invidious-db.sh:/docker-entrypoint-initdb.d/init-invidious-db.sh
environment:
POSTGRES_DB: invidious
POSTGRES_USER: kemal
POSTGRES_PASSWORD:
# ↑ Must match the password set in the Invidious config above.
volumes:
postgresdata:
</syntaxhighlight>
Notes:
- Port
3100is bound to127.0.0.1so Invidious is only reachable through the lighttpd proxy, not directly from the internet. - Pick a port that isn't in use. Check with
ss -tlnp. - Replace
SERVERwith your actual server hostname.
Step 2: Start it
<syntaxhighlight lang="bash"> docker compose up -d </syntaxhighlight>
Verify it's running:
<syntaxhighlight lang="bash"> docker compose ps curl http://127.0.0.1:3100/ </syntaxhighlight>
You should see Invidious HTML output.
Step 3: Tell PMSS the port
Create a file containing just the port number:
<syntaxhighlight lang="bash"> echo "3100" > ~/.invidiousPort </syntaxhighlight>
PMSS reads this file and automatically generates the reverse proxy fragment at ~/.lighttpd/custom.d/pmss-invidious.conf. This happens during the next lighttpd configuration regeneration cycle.
If you don't want to wait for the automatic cycle, you can trigger a regeneration or contact support.
Step 4: Verify
Once the proxy is active, visit:
https://SERVER.pulsedmedia.com/user-USERNAME/apps/invidious/
You should see the Invidious search page.
Disabling Invidious
Remove the port file:
<syntaxhighlight lang="bash"> rm ~/.invidiousPort </syntaxhighlight>
PMSS will clean up the proxy fragment (pmss-invidious.conf) on the next regeneration cycle. You can then stop and remove the containers:
<syntaxhighlight lang="bash"> cd ~/invidious docker compose down </syntaxhighlight>
Add -v to also delete the PostgreSQL data volume:
<syntaxhighlight lang="bash"> docker compose down -v </syntaxhighlight>
Configuration Tips
Proxy videos through your server
By default, Invidious can serve video URLs that point directly to Google. To route all video traffic through your seedbox (better privacy), add to the INVIDIOUS_CONFIG block:
<syntaxhighlight lang="yaml"> local: true </syntaxhighlight>
This uses more bandwidth and CPU but means your browser never contacts Google directly.
Registration
To allow account creation on your instance (for saved subscriptions, playlists):
<syntaxhighlight lang="yaml"> registration_enabled: true </syntaxhighlight>
To keep it personal, leave registration disabled and use the default account, or limit registrations after creating your own.
Popular page and trending
Disable the popular/trending endpoints if you want a minimal instance:
<syntaxhighlight lang="yaml"> popular_enabled: false </syntaxhighlight>
Adding an Invidious Tab
You can add Invidious as a tab in your web panel using .customFrames:
invidious|Private YouTube|Invidious|/user-USERNAME/apps/invidious/
Troubleshooting
Invidious shows "Could not extract video data"
YouTube regularly changes its API. Update to the latest Invidious image:
<syntaxhighlight lang="bash"> cd ~/invidious docker compose pull docker compose up -d </syntaxhighlight>
This is the most common issue with Invidious. The project releases frequent updates to track YouTube API changes.
Proxy returns 502 Bad Gateway
The container isn't running or isn't listening on the expected port:
<syntaxhighlight lang="bash"> docker compose ps curl http://127.0.0.1:3100/ ss -tlnp | grep 3100 </syntaxhighlight>
Check container logs:
<syntaxhighlight lang="bash"> docker compose logs invidious </syntaxhighlight>
Database connection errors
The PostgreSQL container may not be ready yet. Check its status:
<syntaxhighlight lang="bash"> docker compose logs invidious-db </syntaxhighlight>
If it's still initializing, wait a minute and try again. Invidious will retry database connections on startup.
See Also
- Lighttpd Custom Configuration -- manual proxy configuration (Invidious uses PMSS auto-configuration, but this explains how it works underneath)
- Custom Tabs -- adding Invidious as a tab in your panel
- Docker Rootless -- how Docker works on your seedbox
- Install Media Stack -- Jellyfin, Sonarr, Radarr, and other media tools