Your Usenet-powered bridge between Prowlarr/NZBHydra, NZBDav, and Stremio.
Query your favorite indexers, stream directly over WebDAV, and manage it all from a friendly web dashboard.
- Docker image:
ghcr.io/sanket9225/usenetstreamer:latest - Admin dashboard:
https://your-addon-domain/<token>/admin/ - Manifest template:
https://your-addon-domain/<token>/manifest.json - Discord: Community chat
- Support: Buy me a coffee
- Self-hosting guide: Jump to instructions
Disclaimer: UsenetStreamer is not affiliated with any Usenet provider or indexer, does not host or distribute media, and is offered strictly for educational purposes.
Buy Me A Coffee β β every cup keeps the addon maintained, hosted, and packed with new features.
- Smarter dedupe pipeline β collapses near-identical releases using normalized titles, indexer IDs, and sizes, so stream rows stay tidy even with aggressive multi-indexer searches.
- Multi-language preferences β pick several preferred audio languages in the admin panel; the sorter surfaces hits with π badges and falls back gracefully when none match.
- Two-tier sorting polish β quality/size ordering got revamped so languages, instant hits, and per-quality limits all blend without bouncing streams around between refreshes.
- Per-resolution caps β optionally limit the number of 4K/1080p/etc. streams kept before the next tier is considered, preventing walls of similar releases.
- Retry-friendly triage β if every NZB in the first pass fails health checks, the next manifest request transparently samples fresh candidates so youβre not stuck with a dead cache.
- Built-in Easynews bridge β native username/password fields expose Easynews as another indexer, no Flask proxy needed, and streams skip NNTP triage while staying marked β .
- Curated Newznab presets β enable the new built-in indexers list to bootstrap direct APIs quickly (paid flag doubles as health-check eligibility).
- Cleaner stream formatting β manifest responses now display consistent title, badge, and language lines across desktop/mobile Stremio.
- Parallel queries to Prowlarr or NZBHydra with automatic deduplication.
- Two-tier cache (Stremio responses + verified NZBs) to keep repeat requests instant.
- Configurable TTLs and size limits so you can tune memory usage for any server.
- IMDb/TMDB/TVDB-aware search plans and TVDB-prefixed ID support (no Cinemeta needed).
- Release titles parsed for resolution, quality, and audio language, enabling
quality_then_sizeorlanguage_quality_sizesorting. - Preferred language groups (single or multiple) rise to the top and display with clear π labels.
- Optional dedupe filter (enabled by default) collapses identical releases; toggle it off to inspect every hit.
- A single per-quality cap (e.g., 4) keeps only the first few results for each resolution before falling back to the next tier.
- Completed NZBDav jobs are recognized automatically and surfaced with a β‘ tag.
- Instant streams are floated to the top of the list so you can start watching immediately.
- Toggle Easynews in the admin panel, drop in your username/password, and get native search results without running the standalone proxy.
- Movies/series use strict Cinemeta matching for precise hits, while external text-only addons stay in loose mode.
- Easynews results skip triage (they're treated as β verified) but still flow through the usual dedupe/sorting pipeline.
- Optional triage downloads a handful of NZBs, samples archives over NNTP, and flags broken uploads before Stremio sees them.
- Decisions are cached per download URL and per normalized title, so later requests inherit health verdicts instantly.
- Shared-secret gate ensures only URLs with
/your-secret/can load the manifest or streams. - Admin dashboard, manifest, and stream endpoints all reuse the same token.
- Stremio request: Stremio calls
/stream/<type>/<id>.json(optionally with?lang=deor other hints). - Indexer search: UsenetStreamer plans IMDb/TMDB/TVDB searches plus fallbacks and queries Prowlarr/NZBHydra simultaneously.
- Release parsing: Titles are normalized for resolution, size, and language; oversize files above your cap are dropped.
- Triage & caching (optional): Health checks sample NZBs via NNTP; decisions and NZBs are cached.
- NZBDav streaming: Chosen NZBs feed NZBDav, which exposes a WebDAV stream back to Stremio.
- Instant detection: Completed NZBDav jobs are matched by normalized title and tagged β‘ for instant playback.
docker run -d --restart unless-stopped \
--name usenetstreamer \
-p 7000:7000 \
-e ADDON_SHARED_SECRET=super-secret-token \
ghcr.io/sanket9225/usenetstreamer:latestservices:
usenetstreamer:
image: ghcr.io/sanket9225/usenetstreamer:latest
container_name: usenetstreamer
restart: unless-stopped
ports:
- "7000:7000"
environment:
ADDON_SHARED_SECRET: super-secret-tokenThen browse to https://your-domain/super-secret-token/admin/ to enter your credentials. The container ships with Node 20, exposes port 7000, and supports both linux/amd64 and linux/arm64 thanks to buildx.
git clone https://github.com/Sanket9225/UsenetStreamer.git
cd UsenetStreamer
npm install
node server.jsCreate .env (see .env.example) or, better, load http://localhost:7000/<token>/admin/ to configure everything from the UI.
Stremio requires HTTPS. Place Nginx/Caddy/Traefik in front of the addon, terminate TLS, and forward to http://127.0.0.1:7000. Expose /manifest.json, /stream/*, /nzb/*, /assets/*, and /admin/*. Update ADDON_BASE_URL accordingly.
Prefer a hand-held walkthrough? Read docs/beginners-guide.md for a soup-to-nuts tutorial that covers:
- Picking a Usenet provider + indexer, spinning up a VPS, and installing Docker.
- Deploying Prowlarr, NZBDav, and UsenetStreamer with a single
docker composefile. - Opening firewall ports, wiring DuckDNS, and configuring Caddy for HTTPS the beginner way.
Refer to that guide whenever you need a step-by-step checklist; the rest of this README focuses on day-to-day usage details.
Visit https://your-addon-domain/<token>/admin/ to:
- Load and edit every runtime setting with validation and helpful hints.
- Trigger connection tests for indexer manager, NZBDav, and NNTP provider.
- Copy the ready-to-use manifest URL right after saving.
- Restart the addon safely once changes are persisted.
The dashboard is protected by the same shared secret as the manifest. Rotate it if you ever suspect exposure.
The dashboard writes to config/runtime-env.json, but the addon still respects traditional env vars for automation or container platforms. Key settings include:
If you need to keep configuration outside the project tree (e.g. bind-mounting a host folder in Docker, using a central config path for multiple forks), set the environment variable CONFIG_DIR before starting the process:
CONFIG_DIR=/data/usenetstreamer-config node server.jsRules:
- If
CONFIG_DIRis set and non-empty, it is resolved withpath.resolve()(relative paths become absolute from the current working directory). - The file
runtime-env.jsonwill then live at:$CONFIG_DIR/runtime-env.json. - The directory is auto-created if missing.
- Leaving
CONFIG_DIRunset falls back to the bundled defaultconfig/directory next to the code.
This allows forks or containerized deployments to update upstream code without losing local runtime settings.
INDEXER_MANAGER(defaultprowlarr) β setnzbhydrafor Hydra.INDEXER_MANAGER_URL,INDEXER_MANAGER_API_KEY,INDEXER_MANAGER_INDEXERS,INDEXER_MANAGER_STRICT_ID_MATCH.ADDON_BASE_URL(must be HTTPS),ADDON_SHARED_SECRET(required for security).NZB_SORT_MODE(quality_then_sizeorlanguage_quality_size),NZB_PREFERRED_LANGUAGE(comma-separated to prioritize multiple languages),NZB_MAX_RESULT_SIZE_GB(defaults to 30 GB, set 0 for no cap),NZB_DEDUP_ENABLED(collapse duplicate releases by title/indexer/size),NZB_ALLOWED_RESOLUTIONS(whitelist of qualities to keep),NZB_RESOLUTION_LIMIT_PER_QUALITY(optional uniform cap; e.g.4keeps at most four streams for each enabled resolution).NZBDAV_URL,NZBDAV_API_KEY,NZBDAV_WEBDAV_URL,NZBDAV_WEBDAV_USER,NZBDAV_WEBDAV_PASS,NZBDAV_CATEGORY*.EASYNEWS_ENABLED,EASYNEWS_USERNAME,EASYNEWS_PASSWORDβ enable the built-in Easynews search bridge (text-only search with optional strict matching).NZBDAV_HISTORY_FETCH_LIMIT,NZBDAV_CACHE_TTL_MINUTES(controls instant detection cache).NZB_TRIAGE_*for NNTP health checks (host, port, user/pass, timeouts, candidate counts, reuse pool, etc.).
See .env.example for the complete list and defaults.
- Switch to
language_quality_sizesorting to pin one or more preferred languages (set via dashboard orNZB_PREFERRED_LANGUAGE=English,Tamil). - Matching releases get a β tag plus
π <Language>badges, but non-matching streams stay available.
- Completed NZBDav titles and still-mounted NZBs are resolved by normalized titles.
- Instant streams jump to the top of the response and are logged in Stremio metadata (
cached,cachedFromHistory).
- Triage can mark NZBs
β verified,β οΈ unverified, orπ« blocked, reflected in stream tags. - Approved samples optionally store NZB payloads in memory, letting NZBDav mount them without re-fetching.
| Platform | Status |
|---|---|
| Stremio 4.x desktop (Win/Linux) | β Tested |
| Stremio 5.x beta | β Tested |
| Android TV / Mobile | β Tested |
| iOS via Safari/TestFlight | β Tested |
| Web (Chromium-based browsers) | β Tested |
| tvOS / Apple TV (Omni/Vidi/Fusion) | β Reported working |
Anything that can load HTTPS manifests and handle externalPlayer hints should work. Open an issue or drop by Discord if you hit a platform-specific quirk.
- Discord: Join the chat
- Buy me a coffee: Keep development humming
- Issues & PRs: GitHub tracker
Huge thanks to everyone testing, filing bugs, and sharing feature ideas.