This App is built on top of TwinVine — an open-source project created by vinefeeder / A_n_g_e_l_a.
TwinVine combines VineFeeder (a service scraper and download manager) with Envied (a DRM decryption and media processing engine) to download content from a range of streaming services. Full credit for the underlying technology goes to the original authors — without their work this launcher would not exist.
TwinVine is a powerful tool but requires some comfort with the command line to set up and use. I wanted to make it a little easier for me to install and use — no terminal, no technical knowledge, just a clean window where you click a service, pick your episodes, and download.
EnvyUI handles everything automatically: installing all required tools, setting up the Python environment, and providing a straightforward GUI that wraps the entire TwinVine workflow.
⚠ Windows Only — EnvyUI is a Windows 10/11 application only.
This is not a replacement for the original project
- For more complex downloads and use of other services I would strongly recommend the original developer's project above. You can still call Envied from the command line for services not listed in EnvyUI or for more complex downloads, but this is not supported so your mileage may vary.
This release. The following known issues exist — contributions and bug reports are welcome.
1. CWTV When using browse by category it will list all shows rather than genres/categories as at this time we've been unable to get the data from CWTV, keyword search for a particular show would be a better option at present. 2. Download Log Panel Sometimes the live data will disappear for a split second every now and then, the download is still ongoing just a minor quirk that is actively being fixed. 3. Download Log Panel Sometimes it may take a short while for the live download data to show in the download log panel so please give it a little while to appear before you cancel a download. 4. Browser by Category When fetching information from a service can sometime take a little bit of time to get, especially if a list is large and it could also depend on your connection speed, you will see an error if it fails to get any results. 5. IMDBApi Error in Download Log Panel imdbapi.dev is down or unavailable, which will show as an error when downloading, while this does not affect the actual download we added a fix for this, see the help page of the app to address this issue.
Before installing, you will need:
- Windows 10 or 11 (64-bit)
- Python 3.12 or 3.13 or 3.14 — download the Windows installer (64-bit) from the official releases page:
-
During installation tick "Add Python to PATH"
-
Do not use the Microsoft Store version of Python or the install manager from Python at this time.
Everything else (Git, FFmpeg, MKVToolNix, Bento4, Shaka Packager, N_m3u8DL-RE, dovi_tool, hdr10plus_tool, CCExtractor, SubtitleEdit, and all Python packages) is downloaded and installed automatically by the app.
- Services Credentials - Some services like All4 require login details, username/password before they will download, please see the help page for more details after install.
- VPN Use - Some services may require the use of a VPN depending on your location.
Download and unzip EnvyUI.zip, then double-click EnvyUI.bat to launch.
On first launch EnvyUI.bat automatically installs the following into your system Python before the app opens — you will see a brief console window while this happens:
- PyQt6 — the UI framework
- PyQt6-WebEngine — powers the in-app terminal panel
- pywinpty — enables real-time download progress output
- certifi — SSL certificates for secure connections
- uv — the Python package manager used to build the EnvyCore environment
Once the app opens, click Install / Update → Install EnvyUI Tools and wait for the setup to complete. This downloads around 500MB of tools and takes 2–5 minutes depending on your connection. Progress is shown in the Log tab.
There are two ways to start a download:
Option 1 — Search box first Type a keyword or paste a URL into the URL or Search box, then click a service button. The search runs immediately against that service.
Option 2 — Service button first Click a service button directly and choose from four actions:
- Search by keyword — type a show name to find it
- Greedy Search by URL — paste a show page URL to fetch all available content
- Download by URL — paste a direct episode URL to download immediately
- Browse by Category — browse the service's categories
Either way, once results appear:
- Select the series you want from the list
- Tick the episodes you want and click Confirm
- The download begins automatically — progress is shown in the panel below
For more detail on all options and features, check the Help page inside the app.
Toggle Batch Mode on to queue episodes from multiple shows before downloading them all at once. The sidebar shows how many episodes are queued. Click Run Batch when ready.
⚠ While some services on the app may have paid for or subscription plans we can only offer support or bug reports for Free-to-air content only as we are unable to test anything other than services that offer Free-to-air content and while envied lists over 60 services we only list services that we have been able to test and are known to work with the app, you can of course still use envied from a terminal window inside the EnvyCore folder if you're familiar with envied commands structure. All services listed below are free to watch without a subscription (though some require a free account for login).
Main page: ALL4 · BBC iPlayer · ITVX · My5 · U (UKTV) · RTE · STV · TPTV · Rakuten TV · Tubi · Pluto TV · VM Play (IE) · TVNZ · ThreeNow (NZ) · ABC iView (AU) · 7plus (AU) · 9Now (AU) · 10play (AU) · SBS On Demand (AU) · Roku (US) · CBS (US) · NBC · PBS · The CW (US) · Crave · CBC Gem · Plex
Extended Services page: Blaze TV, NFBC, RTE+, NPO, ARD Mediathek, NRK
EnvyUI bundles a snapshot of envied (the download engine from TwinVine) and adds a Windows GUI on top. It is not a fork of TwinVine — it is a separate project that includes envied directly. This section documents what we do differently and why, so anyone comparing the two knows what to expect.
VineFeeder has been removed entirely. In TwinVine, VineFeeder is a second GUI layer that sits in front of envied and drives it. EnvyUI replaces that role with its own launcher (envy_launcher.py), which calls envied directly using uv run envied dl. This means there is no dependency on VineFeeder updates and no risk of GUI/engine version mismatches.
Auto-update from GitHub has been removed. TwinVine pulls updates from external repositories automatically. EnvyUI updates are controlled releases only — you get exactly what has been tested and bundled.
EnvyUI organises downloads into a Plex / Jellyfin / Kodi compatible layout automatically:
- TV:
Downloads/Show Name (Year)/Season 01/Show Name S01E01 Episode Name.mkv - Movies:
Downloads/Movie Name (Year)/Movie Name (Year).mkv
The show folder always uses the series premiere year (e.g. Death in Paradise always goes in Death in Paradise (2011)/ regardless of which season you download). TwinVine drops all files flat into the download directory.
EnvyUI correctly propagates the IMDB ID from the metadata provider chain through to the MKV tag writer. In the upstream version the IMDB ID was returned by the provider but silently discarded — only the TMDB ID was passed along. Downloaded files from EnvyUI carry correct IMDB, TMDB, and TVDB tags where available.
EnvyUI handles BBC HLG downloads via the --range HLG CLI argument with automatic retry logic in the launcher. The old BbcLoader.check_uhd monkeypatch used in earlier versions is not present — the current approach is cleaner and does not require patching envied internals at runtime.
The following service-level changes are present in EnvyUI but not currently in the TwinVine upstream. These are intentional fixes — do not revert them when syncing.
| Service | Change | Why |
|---|---|---|
| PBS | Next.js App Router RSC fix | TwinVine's version is broken on the current PBS site — our fix handles the updated page structure |
| VM | mp4decrypt override + fTTML subtitle filter |
Upstream does not handle fTTML subtitles correctly for this service |
| RKTN | URL parsing improvements + safety defaults | More robust handling of Rakuten TV URL variations |
| TUBI | h264_720p and h265_720p added to limit_resolutions[] API param |
UK region compatibility — without this, 720p options are not returned |
| NINE | _is_caption_track() filter + _first_source() HTTPS helper |
Prevents thumbnail/metadata tracks being added as subtitles; prefers HTTPS sources with fallback |
When you click Install / Update → Install EnvyUI Tools, the installer automatically patches several files within the bundled EnvyCore. These are applied once and backed up (.bak files) before any change is made. They are re-checked and skipped if already applied.
Python version compatibility
pyproject.tomlfiles — therequires-pythonupper bound (e.g.<=3.12) is widened so the environment builds correctly on Python 3.13 and 3.14 without manual editing.pywinptyversion pin — the<3upper bound is removed so Python 3.14 can install the newer 3.x release that added 3.14 support.brotli→brotlicffi— thebrotlipackage requires C++ Build Tools to compile on Python 3.14+. It is swapped tobrotlicffi, a pure-Python equivalent that installs without a compiler.utilities.py— theFPSclass usesast.Numwhich was removed in Python 3.14. Avisit_Constantmethod is added alongsidevisit_Numso frame-rate parsing works on all Python versions.
Download engine
commands/dl.py— the per-episode summary message"Processed all titles in Xm Xs"is shortened to"Processed in Xm Xs". The original wording is misleading when downloading multiple episodes.
Metadata providers
core/providers/__init__.py— OMDb is added to the metadata provider chain and the order is corrected to: IMDBApi → TMDB → OMDb → Simkl. The upstream order puts Simkl before TMDB, which is slower and less reliable as a metadata source.core/config.py— theomdb_api_keyfield is added to the config class so envied can read an OMDb API key fromenvied.yaml. Without this the OMDb provider has no way to retrieve its key.
Services
services/TEN/__init__.py— three fixes: (1) removes aconfig.downloadercheck that was dropped in a later envied version and raises a false error, (2) forcestitle.language = "en"at the start ofget_tracksbecause the language set during episode construction is sometimes lost due to Python bytecode caching, (3) addsOnSegmentFilterto skip Google DAI ad segments so they don't interrupt the download.services/CWTV/__init__.py— same language guard as TEN: forcestitle.language = "en"at the start ofget_tracks. Without this the core track selector falls back to"orig"and skips the video track entirely.core/manifests/hls.py— adds an empty-batch guard for Google DAI ad-break streams. When an ad segment is skipped, the AES key-change trigger can fire with a negative range length, crashing the download with "None of the segment files exist".services/PBS/__init__.py— rewrites_fetch_video_bridgefor the current PBS website. PBS migrated to Next.js App Router and stream URLs now live in RSC payload chunks rather than the oldwindow.videoBridgeobject. The upstream version is broken on the current site.
Config
envied.yaml— on first install,envied-working-example.yamlis copied toenvied.yaml. Thevaultsandcookiespaths are then rewritten to absolute paths so they resolve correctly regardless of which directory envied is launched from.
EnvyUI has so far only been tested by a small number of users. If you find a bug, have a suggestion, or want to contribute, please:
- Open an issue on the GitHub Issues page — bug reports, feature requests, and general feedback are all welcome
- Submit a pull request if you have a fix or improvement you'd like to contribute
- Test on different services — not all supported services have been fully tested, so reports on what works and what doesn't are particularly helpful
Your feedback helps make it better for everyone.
This tool is intended for personal use only. You are responsible for ensuring you have the right to download any content you access. The authors of EnvyUI take no responsibility for how this software is used.













