Deviload — a clean Windows desktop front-end for yt-lp: paste a link, pick quality, download. Playlists,chapters, trim, GIF, one-click YouTube sign-in, RU/E.
JavaScript
163
88 commits
updated Oct 14, 2026
Video, music and a little fire.
Download with yt-dlp. Listen with Devil Music. Edit with Devil Cut.
Built with Rust and Tauri 2 · English, Russian and Spanish
Deviload is free. If it saves you time, a coffee helps me keep building it.
Install & docs · Screenshots · Report an issue · Suggest a feature

Desktop app for downloading video and music with yt-dlp, built with Rust and Tauri 2. Windows is the main target; macOS and Linux builds come from CI, and the Mac build has been tried on a real Mac. The interface is available in English, Russian and Spanish and switches instantly from the language menu in the top bar.
All buttons above open the latest release. Choose the asset for your system:
| System | Release asset | Instructions |
|---|---|---|
| Windows x64 | Deviload-<version>-setup.exe or Deviload-<version>-windows-x64-portable.zip | Windows installation |
| macOS · test build | Deviload-<version>-macos-test.zip | macOS installation · unsigned and not notarized |
| Linux x86_64 | Deviload-<version>-amd64.deb or Deviload-<version>-x86_64.AppImage | Linux installation |
Documentation: Requirements · Build from source · Releases · Data and privacy · Translations
.nfo, a thumbnail, a tvshow.nfo and a poster, and music by artist and album. With the server address and an API key, Deviload asks the server to scan once the downloads finish.cookies.txt file instead of embedded Google sign-in. Firefox cookies or your own cookies.txt also work on Windows and macOS (and Chrome, Edge, Brave or Safari on macOS).
| Devil Music · discover | Devil Music · Now Playing |
|---|---|
![]() | ![]() |
| Devil Cut | Library |
|---|---|
![]() | ![]() |
| Settings backup | Download profiles |
![]() | ![]() |
The full-width music workspace shows 2.7 with the live catalog and a sample local playlist. The older music views show 2.6.7; the other workspace screenshots show 2.6.5 with sample media.
Download Deviload-<version>-setup.exe from the releases page and run it. It installs for the current user without administrator rights, adds a Start menu shortcut (in the Pronexsteam folder) and brings yt-dlp, FFmpeg and Deno along. Any folder you can write to works; folders inside Program Files need administrator rights, so the installer stops and says so. Later versions install from inside the app. A portable zip is published next to it.
Download Deviload-<version>-macos-test.zip from the latest release, extract it and move Deviload.app to Applications. The build is not signed with an Apple Developer ID or notarized. Before the first start, run:
xattr -cr /Applications/Deviload.app
The archive includes yt-dlp, FFmpeg and Deno. The in-app updater signature is separate from Apple code signing.
sudo apt install ./Deviload-<version>-amd64.deb on Debian or Ubuntu, or make the AppImage executable (chmod +x Deviload-<version>-x86_64.AppImage) and run it. Both bring yt-dlp, FFmpeg and Deno along; the AppImage updates itself from inside the app, the .deb package is updated by installing the new one. The built-in player uses the system's GStreamer, so MKV playback needs its usual plugins (gstreamer1.0-plugins-good).
Deviload runs yt-dlp, FFmpeg, FFprobe and Deno as separate processes. It looks for them next to the executable, in a bin folder next to it, and in PATH (plus /opt/homebrew/bin and /usr/local/bin on macOS). Windows also needs the Microsoft Edge WebView2 Runtime, which Windows 10 and 11 normally include.
You need Node.js 22 or newer, Rust with the MSVC toolchain and Visual Studio Build Tools with the C++ workload and a Windows SDK.
npm ci
powershell -ExecutionPolicy Bypass -File scripts\fetch-tools.ps1 # yt-dlp, FFmpeg, FFprobe, Deno into .\bin
npm run tauri dev # run in development mode
powershell -ExecutionPolicy Bypass -File scripts\package.ps1 # installer, portable zip and latest.json in .\dist
scripts\package.ps1 builds the release, copies the installer to dist\Deviload-<version>-setup.exe, writes the update feed dist\latest.json and assembles a portable dist\Deviload\ folder (Deviload.exe, the engines in bin\, the licence texts) zipped as dist\Deviload-<version>-windows-x64-portable.zip.
In-app updates are signed. The script reads the private key and its password from TAURI_SIGNING_PRIVATE_KEY and TAURI_SIGNING_PRIVATE_KEY_PASSWORD, or from a key file with a .password file next to it: DEVILOAD_UPDATER_KEY, then keys\deviload-updater.key (the keys folder is ignored by git), then %USERPROFILE%\.tauri\deviload-updater.key. The matching public key is in src-tauri/tauri.conf.json; a build signed with any other key cannot update existing installs.
Pushing a tag that matches the version, for example v2.0.0, runs .github/workflows/release.yml: GitHub builds and tests the app and publishes the installer, the portable zip and latest.json as the latest release, then adds the macOS and Linux builds. Every build is signed for in-app updates, and a last job joins the Windows, macOS (Deviload-<version>-macos.app.tar.gz) and Linux (the AppImage) entries into one latest.json, so one release updates all three. If the macOS or Linux build fails, the feed still goes out for Windows, and those systems only show that a new version exists. The release description comes from .github/release-notes/<tag>.md when that file exists; changing the file on main later updates the published description too. The repository needs two secrets: TAURI_SIGNING_PRIVATE_KEY (the content of the key file) and TAURI_SIGNING_PRIVATE_KEY_PASSWORD. Installed copies read the update feed from the updates branch (update feed), so update checks do not count as downloads; the copy attached to each release stays as a fallback for 2.0.0. The same run adds an unsigned macOS test build, Deviload-<version>-macos-test.zip, with yt-dlp, FFmpeg and Deno inside (scripts/fetch-tools-macos.sh). It is not notarized, so it needs xattr -cr /Applications/Deviload.app once before the first start. .github/workflows/macos.yml rebuilds only that file for the release of the current version when the macos-test branch is pushed.
On Debian or Ubuntu install the libraries Tauri builds against, then:
sudo apt install libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf libxdo-dev libssl-dev
bash scripts/fetch-tools-linux.sh # yt-dlp, FFmpeg, FFprobe, Deno into ./bin
npm ci
npm run tauri dev
npm run tauri build -- --config src-tauri/tauri.ci.conf.json # .deb and AppImage, without update signing
Install the Xcode Command Line Tools, Rust and Node.js, then add both Rust targets for a universal build:
bash scripts/fetch-tools-macos.sh # yt-dlp, FFmpeg, FFprobe, Deno into ./bin
rustup target add aarch64-apple-darwin x86_64-apple-darwin
npm ci
npm run tauri dev
npm run tauri build -- --target universal-apple-darwin --bundles app --config src-tauri/tauri.macos-bundle.conf.json
Without the script, engines from brew install yt-dlp ffmpeg deno work too.
Published macOS builds are not signed with an Apple Developer ID or notarized. The in-app updater signature is separate from Apple code signing.
The queue (queue.json), per-format download archives and the saved YouTube sign-in (youtube-cookies.txt) live in the app data folder: %APPDATA%\com.deviload.desktop on Windows, ~/Library/Application Support/com.deviload.desktop on macOS. The sign-in export keeps only YouTube and Google cookies and never leaves your computer. Library tags, collections, player positions, Devil Cut projects and the proxy are stored in library.json, watched lists and artists in watches.json and the phone link key in phone.json, all in the same folder. The media server address and API key, if you set them, are kept in queue.json and are only sent to that server. Files received from a phone go to Deviload from phone inside the download folder.
Deviload has no telemetry. Besides the sites you download from, it contacts GitHub to check for a new Deviload (only the version number is requested) and to update yt-dlp; the yt-dlp update can be turned off in the settings. The phone link only listens on the local network address and only while it is on; every file a phone sends needs your confirmation.
Devil Music contacts YouTube Music for catalog results, artwork hosts for covers, and YouTube media servers for audio. Opening lyrics sends the track title, artist and duration to LRCLIB. Its listening profile stays in local WebView storage. Likes are never automatically evicted; recent history is bounded to 80 songs and recommendation history to 1,000 learned tracks. Profiles also keep up to 30 playlists with 500 total entries and 200 saved artists, albums or catalog playlists. Export/import files are limited to 2 MB and contain metadata and preferences, not music files or account credentials. If a profile reaches the storage limit, saving reports an error rather than removing older likes. Reinstalling the operating system can erase local preferences; export a backup first.
The current development version adds filtered, paginated music search, saved artists and albums, playback from existing full-track downloads, timed lyrics, equalizer presets, volume smoothing and optional track overlap. Smoothing is a compressor, not measured album loudness normalization. Regional charts can be hidden; personal discovery uses local listening signals, likes, followed artists and explicit exclusions. This is adaptive ranking, not a trained neural recommendation model.
Playback prepares the next track and likely selections in advance, with bounded background requests and a second audio decoder. Cached signed links are retained until their expiry safety margin, for at most one hour. Unprepared tracks still depend on upstream extraction and media availability; instant startup is not guaranteed. Rate limits stop requests instead of triggering an endless retry loop.
Engines run with an argument list and no shell. A task counts as finished only when yt-dlp exits with code 0, and the queue file is written atomically.
npm run check
npm test
cargo test --manifest-path src-tauri/Cargo.toml --locked
cargo test --manifest-path src-tauri/Cargo.toml --locked -- --include-ignored # also runs FFmpeg/yt-dlp integration tests
The integration tests generate their own media and serve it from a local HTTP server, so they need the engines but no network. npm test also checks that every interface string has a Russian translation. The integration tests also render Devil Cut projects with transitions, music, captions, GIF and MP3 output through FFmpeg.
English is the source language. Russian strings live in src/locales/ru.js, keyed by the English text. Messages from the Rust core are English and are translated in the interface, including messages that carry runtime values ("Search failed: {detail}").
Deviload is maintained by Samvel Avetisyan (Pronexsteam). Outside contributions arrive as pull requests and are reviewed by the maintainer.
Deviload transfers no information to other networked systems except the sites you download from, GitHub for update checks, which ask only for the version number and, while you use the phone link, the phone on your local network. See Data and privacy.
Deviload is free and stays free. If it saves you time, you can buy me a coffee on Ko-fi; it helps me keep working on it.
Deviload is MIT licensed. The Windows installer and the portable build ship yt-dlp (Unlicense), FFmpeg (GPL v3 build) and Deno (MIT); see bundled licences for details and the other bundled components.
Deviload — a clean Windows desktop front-end for yt-lp: paste a link, pick quality, download. Playlists,chapters, trim, GIF, one-click YouTube sign-in, RU/E.
JavaScript
163
88 commits
updated Oct 14, 2026
Video, music and a little fire.
Download with yt-dlp. Listen with Devil Music. Edit with Devil Cut.
Built with Rust and Tauri 2 · English, Russian and Spanish
Deviload is free. If it saves you time, a coffee helps me keep building it.
Install & docs · Screenshots · Report an issue · Suggest a feature

Desktop app for downloading video and music with yt-dlp, built with Rust and Tauri 2. Windows is the main target; macOS and Linux builds come from CI, and the Mac build has been tried on a real Mac. The interface is available in English, Russian and Spanish and switches instantly from the language menu in the top bar.
All buttons above open the latest release. Choose the asset for your system:
| System | Release asset | Instructions |
|---|---|---|
| Windows x64 | Deviload-<version>-setup.exe or Deviload-<version>-windows-x64-portable.zip | Windows installation |
| macOS · test build | Deviload-<version>-macos-test.zip | macOS installation · unsigned and not notarized |
| Linux x86_64 | Deviload-<version>-amd64.deb or Deviload-<version>-x86_64.AppImage | Linux installation |
Documentation: Requirements · Build from source · Releases · Data and privacy · Translations
.nfo, a thumbnail, a tvshow.nfo and a poster, and music by artist and album. With the server address and an API key, Deviload asks the server to scan once the downloads finish.cookies.txt file instead of embedded Google sign-in. Firefox cookies or your own cookies.txt also work on Windows and macOS (and Chrome, Edge, Brave or Safari on macOS).
| Devil Music · discover | Devil Music · Now Playing |
|---|---|
![]() | ![]() |
| Devil Cut | Library |
|---|---|
![]() | ![]() |
| Settings backup | Download profiles |
![]() | ![]() |
The full-width music workspace shows 2.7 with the live catalog and a sample local playlist. The older music views show 2.6.7; the other workspace screenshots show 2.6.5 with sample media.
Download Deviload-<version>-setup.exe from the releases page and run it. It installs for the current user without administrator rights, adds a Start menu shortcut (in the Pronexsteam folder) and brings yt-dlp, FFmpeg and Deno along. Any folder you can write to works; folders inside Program Files need administrator rights, so the installer stops and says so. Later versions install from inside the app. A portable zip is published next to it.
Download Deviload-<version>-macos-test.zip from the latest release, extract it and move Deviload.app to Applications. The build is not signed with an Apple Developer ID or notarized. Before the first start, run:
xattr -cr /Applications/Deviload.app
The archive includes yt-dlp, FFmpeg and Deno. The in-app updater signature is separate from Apple code signing.
sudo apt install ./Deviload-<version>-amd64.deb on Debian or Ubuntu, or make the AppImage executable (chmod +x Deviload-<version>-x86_64.AppImage) and run it. Both bring yt-dlp, FFmpeg and Deno along; the AppImage updates itself from inside the app, the .deb package is updated by installing the new one. The built-in player uses the system's GStreamer, so MKV playback needs its usual plugins (gstreamer1.0-plugins-good).
Deviload runs yt-dlp, FFmpeg, FFprobe and Deno as separate processes. It looks for them next to the executable, in a bin folder next to it, and in PATH (plus /opt/homebrew/bin and /usr/local/bin on macOS). Windows also needs the Microsoft Edge WebView2 Runtime, which Windows 10 and 11 normally include.
You need Node.js 22 or newer, Rust with the MSVC toolchain and Visual Studio Build Tools with the C++ workload and a Windows SDK.
npm ci
powershell -ExecutionPolicy Bypass -File scripts\fetch-tools.ps1 # yt-dlp, FFmpeg, FFprobe, Deno into .\bin
npm run tauri dev # run in development mode
powershell -ExecutionPolicy Bypass -File scripts\package.ps1 # installer, portable zip and latest.json in .\dist
scripts\package.ps1 builds the release, copies the installer to dist\Deviload-<version>-setup.exe, writes the update feed dist\latest.json and assembles a portable dist\Deviload\ folder (Deviload.exe, the engines in bin\, the licence texts) zipped as dist\Deviload-<version>-windows-x64-portable.zip.
In-app updates are signed. The script reads the private key and its password from TAURI_SIGNING_PRIVATE_KEY and TAURI_SIGNING_PRIVATE_KEY_PASSWORD, or from a key file with a .password file next to it: DEVILOAD_UPDATER_KEY, then keys\deviload-updater.key (the keys folder is ignored by git), then %USERPROFILE%\.tauri\deviload-updater.key. The matching public key is in src-tauri/tauri.conf.json; a build signed with any other key cannot update existing installs.
Pushing a tag that matches the version, for example v2.0.0, runs .github/workflows/release.yml: GitHub builds and tests the app and publishes the installer, the portable zip and latest.json as the latest release, then adds the macOS and Linux builds. Every build is signed for in-app updates, and a last job joins the Windows, macOS (Deviload-<version>-macos.app.tar.gz) and Linux (the AppImage) entries into one latest.json, so one release updates all three. If the macOS or Linux build fails, the feed still goes out for Windows, and those systems only show that a new version exists. The release description comes from .github/release-notes/<tag>.md when that file exists; changing the file on main later updates the published description too. The repository needs two secrets: TAURI_SIGNING_PRIVATE_KEY (the content of the key file) and TAURI_SIGNING_PRIVATE_KEY_PASSWORD. Installed copies read the update feed from the updates branch (update feed), so update checks do not count as downloads; the copy attached to each release stays as a fallback for 2.0.0. The same run adds an unsigned macOS test build, Deviload-<version>-macos-test.zip, with yt-dlp, FFmpeg and Deno inside (scripts/fetch-tools-macos.sh). It is not notarized, so it needs xattr -cr /Applications/Deviload.app once before the first start. .github/workflows/macos.yml rebuilds only that file for the release of the current version when the macos-test branch is pushed.
On Debian or Ubuntu install the libraries Tauri builds against, then:
sudo apt install libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf libxdo-dev libssl-dev
bash scripts/fetch-tools-linux.sh # yt-dlp, FFmpeg, FFprobe, Deno into ./bin
npm ci
npm run tauri dev
npm run tauri build -- --config src-tauri/tauri.ci.conf.json # .deb and AppImage, without update signing
Install the Xcode Command Line Tools, Rust and Node.js, then add both Rust targets for a universal build:
bash scripts/fetch-tools-macos.sh # yt-dlp, FFmpeg, FFprobe, Deno into ./bin
rustup target add aarch64-apple-darwin x86_64-apple-darwin
npm ci
npm run tauri dev
npm run tauri build -- --target universal-apple-darwin --bundles app --config src-tauri/tauri.macos-bundle.conf.json
Without the script, engines from brew install yt-dlp ffmpeg deno work too.
Published macOS builds are not signed with an Apple Developer ID or notarized. The in-app updater signature is separate from Apple code signing.
The queue (queue.json), per-format download archives and the saved YouTube sign-in (youtube-cookies.txt) live in the app data folder: %APPDATA%\com.deviload.desktop on Windows, ~/Library/Application Support/com.deviload.desktop on macOS. The sign-in export keeps only YouTube and Google cookies and never leaves your computer. Library tags, collections, player positions, Devil Cut projects and the proxy are stored in library.json, watched lists and artists in watches.json and the phone link key in phone.json, all in the same folder. The media server address and API key, if you set them, are kept in queue.json and are only sent to that server. Files received from a phone go to Deviload from phone inside the download folder.
Deviload has no telemetry. Besides the sites you download from, it contacts GitHub to check for a new Deviload (only the version number is requested) and to update yt-dlp; the yt-dlp update can be turned off in the settings. The phone link only listens on the local network address and only while it is on; every file a phone sends needs your confirmation.
Devil Music contacts YouTube Music for catalog results, artwork hosts for covers, and YouTube media servers for audio. Opening lyrics sends the track title, artist and duration to LRCLIB. Its listening profile stays in local WebView storage. Likes are never automatically evicted; recent history is bounded to 80 songs and recommendation history to 1,000 learned tracks. Profiles also keep up to 30 playlists with 500 total entries and 200 saved artists, albums or catalog playlists. Export/import files are limited to 2 MB and contain metadata and preferences, not music files or account credentials. If a profile reaches the storage limit, saving reports an error rather than removing older likes. Reinstalling the operating system can erase local preferences; export a backup first.
The current development version adds filtered, paginated music search, saved artists and albums, playback from existing full-track downloads, timed lyrics, equalizer presets, volume smoothing and optional track overlap. Smoothing is a compressor, not measured album loudness normalization. Regional charts can be hidden; personal discovery uses local listening signals, likes, followed artists and explicit exclusions. This is adaptive ranking, not a trained neural recommendation model.
Playback prepares the next track and likely selections in advance, with bounded background requests and a second audio decoder. Cached signed links are retained until their expiry safety margin, for at most one hour. Unprepared tracks still depend on upstream extraction and media availability; instant startup is not guaranteed. Rate limits stop requests instead of triggering an endless retry loop.
Engines run with an argument list and no shell. A task counts as finished only when yt-dlp exits with code 0, and the queue file is written atomically.
npm run check
npm test
cargo test --manifest-path src-tauri/Cargo.toml --locked
cargo test --manifest-path src-tauri/Cargo.toml --locked -- --include-ignored # also runs FFmpeg/yt-dlp integration tests
The integration tests generate their own media and serve it from a local HTTP server, so they need the engines but no network. npm test also checks that every interface string has a Russian translation. The integration tests also render Devil Cut projects with transitions, music, captions, GIF and MP3 output through FFmpeg.
English is the source language. Russian strings live in src/locales/ru.js, keyed by the English text. Messages from the Rust core are English and are translated in the interface, including messages that carry runtime values ("Search failed: {detail}").
Deviload is maintained by Samvel Avetisyan (Pronexsteam). Outside contributions arrive as pull requests and are reviewed by the maintainer.
Deviload transfers no information to other networked systems except the sites you download from, GitHub for update checks, which ask only for the version number and, while you use the phone link, the phone on your local network. See Data and privacy.
Deviload is free and stays free. If it saves you time, you can buy me a coffee on Ko-fi; it helps me keep working on it.
Deviload is MIT licensed. The Windows installer and the portable build ship yt-dlp (Unlicense), FFmpeg (GPL v3 build) and Deno (MIT); see bundled licences for details and the other bundled components.