A Stremio addon that lets you watch YouTube videos and access your subscriptions, watch later list, and history directly inside Stremio.
- Watch YouTube Content in Stremio β Browse and watch your favorite YouTube videos without leaving the Stremio app.
- Personalized Feeds β Access your Subscriptions, Watch Later list, and viewing history.
- Powerful Search β Search for YouTube videos and channels directly within Stremio.
- Customizable Catalogs β Use default catalogs or add your own custom playlists.
- Ad- and Click-Bait-Free - Use SponsorBlock (with configurable Gemini fallback support) and/or DeArrow across all of YouTube.
- Secure Configuration β User data (including cookies) is encrypted for security.
- Easy Deployment β Deploy with Docker, Node.js, or ngrok.
For more detailed instructions or other platforms, go to the YT-DLP cookie extraction guide
-
Install the Addon Get cookies.txt LOCALLY in a Chromium browser (or cookies.txt for Firefox)


-
Allow the extension in Private Windows



EnableAllow in InPrivate

-
Go to youtube.com and sign in
-
In your Stremio-logged-in browser, go to youtubio.elfhosted.com and Paste the Content in the Textbox

-
Generate and Install the manifest in the way of your choosing


Important
The manifest URL is a credential-bearing URL when it contains encrypted cookies. Keep it private. After upgrading, generate a new manifest URL; old raw-JSON URLs may not work with playlist URLs.
- Docker installed
# Build the Docker image
docker build -t youtubio .- Node.js 24 installed
- npm package manager
- YT-DLP installed
# Install dependencies
npm install --omit=dev
# Start the addon
npm startBy default, the addon will be available at: http://localhost:7000
Copy .env.example to .env and set the values needed by your deployment. npm start loads .env automatically. For Docker, supply the file at runtime: docker run --env-file .env -p 7000:7000 youtubio.
| Variable | Default | Effect |
|---|---|---|
ENCRYPTION_KEY |
Random per process | Base64-encoded 32-byte key used to encrypt and decrypt user cookies and Gemini keys. Required for production so generated configuration URLs survive restarts. |
PORT |
7000 |
HTTP listening port. |
CACHE_TTL |
3600 |
Cached yt-dlp metadata lifetime and Stremio catalog cache hint, in seconds. TTL remains supported for existing deployments. |
REDIS_URL |
Unset | Optional Redis URL for shared yt-dlp metadata caching. A bounded in-process cache is used without Redis or when it is unavailable. |
CONFIG_DB_PATH |
XDG state directory | SQLite path for encrypted server-side configurations. Set to /data/youtubio.sqlite and mount /data persistently in Docker/Coolify. |
PRIVATE_MODE |
Unset | Set to 1 to require a password before generating protected Stremio addon links. Existing unprotected links stop working. |
PRIVATE_MODE_PASSWORD |
Unset | Shared password for private mode (at least 16 characters). Keep it secret and stable; changing it invalidates previously issued access tokens. |
SPACE_HOST |
Unset | Public hostname, without https://, shown in the startup configuration URL. |
YTDLP_EXTRACTORS |
all |
Value passed to yt-dlp's --ies option to restrict enabled extractors. |
DEV_LOGGING |
Unset | Enables Fastify debug logs, error logging, and main-branch icon assets. |
NO_DEARROW |
Unset | Disables DeArrow titles and thumbnails and hides its configuration option. |
NO_SPONSORBLOCK |
Unset | Disables SponsorBlock and Gemini fallback and hides their configuration options. |
EMBED |
Unset | Trusted HTML inserted into the configuration page. Do not set from untrusted input. |
YTDLP_EXTRACTORS_EMBED |
Unset | Trusted HTML inserted into the supported-extractors section. Do not set from untrusted input. |
Search catalogs return 20 results per page using Stremio's skip parameter. Search results use fixed cache lifetimes: 20 minutes for video searches and 5 days for channel searches. Other cacheable metadata uses TTL. The in-process cache holds up to 100 entries or 32 MiB per instance and is cleared on restart.
Private mode issues a separate access token on each successful password entry. Stremio cannot supply a password on every request, so generated addon URLs carry that token and should be treated as credentials. Installed links do not expire; the configuration page can revoke all links issued from one password entry. Changing PRIVATE_MODE_PASSWORD also invalidates existing tokens. Use HTTPS and preserve the SQLite database, ENCRYPTION_KEY, and private-mode password when moving between servers. Direct media URLs returned by yt-dlp may still be accessible at their original providers; private mode protects this addon's endpoints. Public YouTube searches run without cookies, so expired Google sessions do not prevent searching; account-only feeds still require valid cookies.
For DEV_LOGGING, NO_DEARROW, and NO_SPONSORBLOCK, any non-empty value enables the option.
- Node.js 24 installed
- npm package manager
- YT-DLP installed
- ngrok account
# Install dependencies
npm install
# Start the addon
npm run localBy default, the addon will be available at: http://localhost:7000
Playlist ID / URL: https://www.youtube.com/results?search_query={term}{sort}
Name: Search
Sort Order (Sort Name: Sort ID):
Note
By including the &sp= in the ID, we can ensure the catalog works without sorting parameters as well.
- Video Relevance:
&sp=CAASAhAB - Video Upload Date:
&sp=CAISAhAB - Video View Count:
&sp=CAMSAhAB - Video Rating:
&sp=CAESAhAB - Channel Relevance:
&sp=CAASAhAC - Channel Upload Date:
&sp=CAISAhAC - Channel View Count:
&sp=CAMSAhAC - Channel Rating:
&sp=CAESAhAC





