Self-hosted Stremio addon that queries Jackett and streams torrents via an embedded WebTorrent client. No debrid, no qBittorrent, no shared volume. One container, zero persistent storage.
Source: https://github.com/lborruto/jackstream
Stremio + Jackett + WebTorrent is the right stack for a homelab that wants torrent streaming inside Stremio, on any device on the LAN, without:
.torrent download path, and its own credential juggling for private trackers)jackstream takes the IMDB id Stremio sends, asks the local Jackett for torrents, and streams them via WebTorrent. Because Jackett proxies the .torrent URL (with passkeys for private trackers embedded in the announce URLs), WebTorrent connects to private trackers out of the box — no cookies to manage.
Stremio app
│ GET /{config}/manifest.json
│ GET /{config}/stream/{type}/{id}.json
▼
[Express + Stremio addon]
│
├─ Resolve IMDB id → titles via TMDB (24 h cache)
├─ Search Jackett in parallel across title variants
├─ Parse + sort torrents (quality > source > hdr > seeders)
└─ Return streams pointing back to /stream/{config}/{torrentId}/{fileIdx}
│ GET /stream/:config/:torrentId/:fileIdx
▼
[WebTorrent singleton]
│
├─ Download .torrent via Jackett (with passkeys)
├─ Sequential priority, critical first pieces
├─ Wait for STREAM_READY_MB then serve with Range support
└─ Clean up idle torrents, respect maxConcurrentTorrents
/tmp/webtorrent inside the container. When a torrent is idle for TORRENT_IDLE_TIMEOUT_MIN minutes (default 30), it and its downloaded pieces are destroyed.utp-native's prebuilt binary segfaults Node.js under load; TCP-only peer connections work fine.strategy: 'sequential' option; the replacement is manual: torrent.files.forEach(f => f.deselect()) → file.select() → torrent.critical(0, 5).Stremio's Windows desktop client rewrites http:// → https:// before fetching the manifest, which kills plain-HTTP installs from LAN IPs. The usual answers all have drawbacks:
jackstream bundles a cert + key from local-ip.medicmobile.org — a community service that:
*.local-ip.medicmobile.org (and publishes the private key, by design).192-168-0-15.local-ip.medicmobile.org resolves to 192.168.0.15.The addon listens on HTTPS 7001 with that cert, and the configure page auto-transforms a LAN IP (e.g. 192.168.0.15) into the magic hostname (https://192-168-0-15.local-ip.medicmobile.org:7001). Browsers and Stremio both see a valid cert; traffic never leaves the LAN. Zero device-side setup.
Tradeoff: anyone with DNS control on the network could MITM (public private key). On a trusted home LAN it's a non-issue. Not suitable for exposing to the public internet — use a real reverse proxy (Caddy/Nginx/Traefik with Let's Encrypt) for that case.
jackstream:
image: lborruto/jackstream:latest
container_name: jackstream
ports:
- 7000:7000 # HTTP (configure page)
- 7001:7001 # HTTPS (Stremio on LAN devices)
restart: unless-stoppedMulti-arch (amd64 + arm64), so the same image runs on x86 homelabs and Raspberry Pi.
From any device on the LAN:
http://<server-ip>:7000/configure
Fill in:
http://<server-ip>:9117) and its API key.Use Test Jackett / Test TMDB to verify credentials live before installing.
Click Install in Stremio to launch the native Stremio app with the addon preconfigured. The HTTPS URL is also shown below the button — paste it into Stremio's Add-on Repository URL field on clients that don't handle stremio:// deep links (some Windows builds, most TVs).
For a TV or phone, the least painful path is a Stremio account: install once on desktop while signed in, and the addon syncs to every other signed-in client. No 400-character URL typing on a remote.
Per-user filters that don't require redeploying:
CAM, HDCAM, TELESYNC)All filters live in the base64url-encoded URL, so different Stremio installs can use different filter profiles against the same backend.
Created 2026-04-22T18:57:06+02:00, updated 2026-04-22T19:02:21+02:00 · History · Edit