jely2002/youtube-dl-gui
Open Video Downloader - A cross-platform GUI for youtube-dl made in Rust with Tauri and Vue + Typescript.
Mixed signals — read the receipts
weakest axiscopyleft license (AGPL-3.0) — review compatibility
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ✓Last commit 1d ago
- ✓9 active contributors
- ✓AGPL-3.0 licensed
Show all 7 evidence items →Show less
- ✓CI configured
- ✓Tests present
- ⚠Concentrated ownership — top contributor handles 72% of recent commits
- ⚠AGPL-3.0 is copyleft — check downstream compatibility
What would change the summary?
- →Use as dependency Concerns → Mixed if: relicense under MIT/Apache-2.0 (rare for established libs)
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Forkable" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/jely2002/youtube-dl-gui)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/jely2002/youtube-dl-gui on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: jely2002/youtube-dl-gui
Generated by RepoPilot · 2026-05-09 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/jely2002/youtube-dl-gui shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
WAIT — Mixed signals — read the receipts
- Last commit 1d ago
- 9 active contributors
- AGPL-3.0 licensed
- CI configured
- Tests present
- ⚠ Concentrated ownership — top contributor handles 72% of recent commits
- ⚠ AGPL-3.0 is copyleft — check downstream compatibility
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live jely2002/youtube-dl-gui
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/jely2002/youtube-dl-gui.
What it runs against: a local clone of jely2002/youtube-dl-gui — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in jely2002/youtube-dl-gui | Confirms the artifact applies here, not a fork |
| 2 | License is still AGPL-3.0 | Catches relicense before you depend on it |
| 3 | Default branch main exists | Catches branch renames |
| 4 | Last commit ≤ 31 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of jely2002/youtube-dl-gui. If you don't
# have one yet, run these first:
#
# git clone https://github.com/jely2002/youtube-dl-gui.git
# cd youtube-dl-gui
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of jely2002/youtube-dl-gui and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "jely2002/youtube-dl-gui(\\.git)?\\b" \\
&& ok "origin remote is jely2002/youtube-dl-gui" \\
|| miss "origin remote is not jely2002/youtube-dl-gui (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(AGPL-3\\.0)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"AGPL-3\\.0\"" package.json 2>/dev/null) \\
&& ok "license is AGPL-3.0" \\
|| miss "license drift — was AGPL-3.0 at generation time"
# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
&& ok "default branch main exists" \\
|| miss "default branch main no longer exists"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 31 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~1d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/jely2002/youtube-dl-gui"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
Open Video Downloader is a cross-platform desktop application (built with Tauri, Vue 3, and TypeScript) that wraps yt-dlp to provide a GUI for downloading videos, audio, subtitles, and metadata from hundreds of websites. It eliminates the need for command-line interaction while supporting advanced features like playlist batch downloads, quality selection, custom filename templates, and smart queue management across Windows, macOS, and Linux. Tauri monorepo: src-tauri/ contains the Rust backend with desktop integration (window management, file system, process spawning), src/ contains the Vue 3 + TypeScript frontend (components, stores, views), and src-isolation/ is a separate sandbox build. The app splits concerns between Tauri commands (Rust backend in src-tauri/src/) invoked from Vue via @tauri-apps/api, with persistent state via @tauri-apps/plugin-store.
👥Who it's for
End users who want to download videos from YouTube, streaming platforms, and other sites without touching the terminal; developers maintaining the Rust/Vue codebase who need to extend download features, improve the UI, or port to new platforms. Also relevant for maintainers of yt-dlp who want a reference GUI implementation.
🌱Maturity & risk
Production-ready: v3.2.0 is actively maintained with cross-platform CI/CD pipelines (.github/workflows including distribute.yml, msix.yml, rust-ci.yml, vue-ci.yml), comprehensive test coverage (Vitest for unit tests, Playwright for e2e), and an established release process including automatic updates and code signing. The project has substantial community usage (thousands of GitHub downloads) and ongoing active development.
Moderate risk: dependency on yt-dlp means breaking changes in that upstream project could impact functionality; single primary maintainer (jely2002) visible in repo structure increases bus factor. The codebase spans three complex languages (Rust 273KB, Vue 237KB, TypeScript 204KB) which can slow onboarding. However, CI/CD automation and test coverage mitigate regression risk.
Active areas of work
Active v3.x development with recent work on Tauri 2.x migration (evident from @tauri-apps dependency versions), security/signing features (scripts/sign-manifest.ts, build/AppxManifest.xml for Windows), automatic update infrastructure (plugin-updater integration), and cross-platform testing (playwright.config.ts). The distribute.yml workflow suggests regular release cadence.
🚀Get running
git clone https://github.com/jely2002/youtube-dl-gui.git
cd youtube-dl-gui
npm install
npm run dev
This starts the dev server via Vite with hot reload. For a full build with Tauri app bundling, use npm run build (requires Rust toolchain and platform-specific dependencies listed in .github/actions/install-tauri-deps/action.yml).
Daily commands:
Development: npm run dev (Vite dev server on localhost with Tauri bridge). Production: npm run build (compiles Vue + TypeScript, then Tauri builds native binaries). For platform-specific builds: npm run tauri build (outputs to src-tauri/target/release/bundle/). Tests: npm run test:unit (Vitest), npm run test:e2e (Playwright), npm run test (both).
🗺️Map of the codebase
- src-tauri/Cargo.toml: Defines Rust dependencies and Tauri configuration; critical for understanding backend dependencies and cross-platform build targets.
- src-tauri/src/main.rs: Tauri application entry point that initializes the window, sets up IPC commands, and integrates plugins (updater, store, shell, etc).
- package.json: Frontend build configuration, dev/build scripts, and all npm dependencies including Tauri and Vue ecosystem versions.
- .github/workflows/distribute.yml: Release pipeline orchestrating cross-platform builds (Windows MSIX, macOS DMG, Linux AppImage/deb) and artifact signing.
- src/main.ts: Vue 3 + TypeScript app bootstrap; initializes Sentry, Tauri plugins, routing, and global state.
- playwright.config.ts: End-to-end test configuration; defines how automated UI tests run against the Tauri app.
- vite.config.ts: Frontend bundler config for Vite; defines dev server, build output, and Tauri plugin integration.
- eslint.config.js: TypeScript/Vue linting rules; enforces code style and catches common bugs in frontend.
🛠️How to make changes
UI changes: edit .vue files in src/components/ and src/views/. State management: check @tauri-apps/plugin-store integration in src/store/ (if present). Download logic: modify Rust backend in src-tauri/src/commands/ (likely download.rs or similar). Adding platform features: extend Tauri plugin usage in src/services/ or add new Rust commands. Styling: update src/styles/ or inline <style scoped> blocks. Tests: add .test.ts files alongside source, or e2e scenarios in playwright.config.ts.
🪤Traps & gotchas
- yt-dlp binary dependency: The app requires a valid yt-dlp installation or embedded binary; if yt-dlp version mismatches, features may break silently. 2. Tauri plugin versions: Each @tauri-apps/plugin-* must match the major Tauri version (currently v2.x); mismatches cause runtime errors. 3. Platform SDK requirements: Building on Windows requires MSVC toolchain; macOS needs Xcode; Linux needs libssl/libgtk dev packages (documented in .github/actions/install-tauri-deps). 4. IPC serialization: Data passed between Vue and Rust must be serializable; circular references or custom types will panic. 5. Environment variables:
DEV=truein scripts/dev gates development-only code paths (hot reload, debug console)—missing this breaks dev mode. 6. Auto-update signing: The manifest.json and code-signing keys (scripts/sign-manifest.ts) must match or updates fail silently.
💡Concepts to learn
- Tauri IPC (Inter-Process Communication) — The bridge between Vue frontend and Rust backend; all download commands, file operations, and OS integration flow through Tauri's IPC serialization mechanism, which has specific type constraints and error handling patterns.
- Process spawning and subprocess communication — The Rust backend spawns yt-dlp as a child process and must capture stdout/stderr for progress updates, error handling, and streaming log data back to the Vue UI without blocking.
- Cross-platform code signing and notarization — The distribute.yml and msix.yml workflows implement platform-specific signing (Windows MSIX certificate, macOS notarization); understanding this is critical for release builds and auto-update verification (scripts/sign-manifest.ts).
- Vite module federation and bundling — The vite.config.ts and vite.config.isolation.ts split the build into two targets (main app and sandbox isolation build); understanding Vite's bundling strategy is essential for modifying the build pipeline or adding code splitting.
- Reactive state management with Tauri Store plugin — Persistent application state (download history, settings, queue) is managed via @tauri-apps/plugin-store, which requires async reads/writes and differs from in-memory stores like Pinia—this affects how frontend state is initialized and persisted.
- Playwright test automation for desktop apps — E2E tests (playwright.config.ts, test:e2e) must interact with Tauri's window directly rather than a web server; understanding Tauri's test environment and native window automation is key to writing reliable e2e scenarios.
- Manifest signing and software update verification — The automatic updater (@tauri-apps/plugin-updater) verifies downloaded updates against a signed manifest (scripts/sign-manifest.ts, scripts/verify-manifest.ts); this prevents tampering but requires careful key management and build coordination.
🔗Related repos
yt-dlp/yt-dlp— The core extraction engine that Open Video Downloader wraps; all download functionality depends on yt-dlp's supported sites and command-line options.akoSBB/DownloadManager— Alternative Tauri-based download manager with similar architecture; useful reference for cross-platform download queue management patterns.VueTube/VueTube— Another Vue 3 + Tauri desktop app for video content; shares frontend framework and desktop IPC patterns, useful for architecture comparison.tauri-apps/tauri— The core framework repo; essential for understanding Tauri APIs, plugin system, and cross-platform build tooling used throughout the project.vuejs/core— Vue 3 framework repo; relevant for understanding reactive state management and component lifecycle patterns used in src/.
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add E2E tests for core download workflows in Playwright
The repo has playwright.config.ts configured but the test:e2e script likely has minimal coverage. The main user workflows (paste URL → select format → download) should be tested end-to-end to catch regressions in the Tauri + Vue integration, especially since this is a desktop app with complex IPC between frontend and Rust backend.
- [ ] Create tests/e2e/ directory structure for Playwright tests
- [ ] Add test for basic video download workflow (URL input → format selection → start download)
- [ ] Add test for audio-only extraction workflow
- [ ] Add test for settings persistence via @tauri-apps/plugin-store
- [ ] Add test for error handling (invalid URL, network failure)
- [ ] Update playwright.config.ts with proper test timeouts for Tauri app startup
Add unit tests for src-tauri Rust backend with critical path coverage
The repo has rust:clippy and rust:fmt linting but no visible test/ directory in src-tauri. The critical download logic, manifest signing (scripts/sign-manifest.ts calls into Rust), and IPC handlers should have unit test coverage. This is especially important given the security-sensitive nature of manifest verification.
- [ ] Create src-tauri/tests/ directory structure
- [ ] Add unit tests for manifest signing/verification logic (related to scripts/sign-manifest.ts and scripts/verify-manifest.ts)
- [ ] Add unit tests for download command building and execution
- [ ] Add unit tests for configuration file parsing (plugin-store integration)
- [ ] Update src-tauri/Cargo.toml to include dev-dependencies if needed
- [ ] Add test execution to rust-ci.yml workflow
Add missing CI workflow for frontend accessibility and bundle size checks
The repo has vue-ci.yml and rust-ci.yml but no automated checks for accessibility (a11y) or bundle size regressions. Given the Vue + TypeScript frontend, adding axe accessibility scanning and bundle size monitoring would catch regressions early. The vite build outputs should be analyzed.
- [ ] Create .github/workflows/a11y-bundle-check.yml
- [ ] Add axe-core/playwright integration to scan rendered pages for accessibility violations
- [ ] Add size-limit or bundlesize tool configuration to src/ build output
- [ ] Configure workflow to fail on accessibility violations or >5% bundle size increase
- [ ] Add baseline bundle size tracking (e.g., via artifacts or comments on PRs)
🌿Good first issues
- Add progress percentage display in download queue UI: The queue management UI likely exists in src/components/ but may lack granular progress bars showing per-download percentage. This is a isolated Vue component fix with no backend changes needed—good for learning the component structure.
- Write integration tests for subtitle download feature: Test files exist (playwright.config.ts, test:e2e script) but subtitle-specific e2e tests may be missing. Add a Playwright test scenario that verifies subtitles are correctly downloaded and saved—teaches the test harness without deep codebase knowledge.
- Expose custom output filename templates in preferences UI: Backend likely supports filename templating (common in yt-dlp wrappers) but the UI in src/views/ may not expose all template variables. Add a settings form showing available placeholders (%(title)s, %(uploader)s, etc.) with a preview—combines frontend UI work with optional backend documentation.
⭐Top contributors
Click to expand
Top contributors
- @jely2002 — 72 commits
- @dependabot[bot] — 18 commits
- @bovirus — 4 commits
- @TURBOKANTR — 1 commits
- @atsushi2965 — 1 commits
📝Recent commits
Click to expand
Recent commits
2255c50— build(deps): bump uuid from 13.0.0 to 14.0.0 (#742) (dependabot[bot])3af850e— build(deps): bump openssl from 0.10.76 to 0.10.78 in /src-tauri (#741) (dependabot[bot])3e28947— build(deps): bump rustls-webpki from 0.103.10 to 0.103.13 in /src-tauri (#740) (dependabot[bot])8f5962c— build(deps): bump actix-http from 3.12.0 to 3.12.1 in /src-tauri (#739) (dependabot[bot])599240f— Italian language update (#733) (bovirus)24af4ee— build(deps): bump rand from 0.10.0 to 0.10.1 in /src-tauri (#735) (dependabot[bot])7717f58— Feature/improved codec selection (#732) (jely2002)5c8715b— build(deps-dev): bump vite from 8.0.1 to 8.0.5 (#731) (dependabot[bot])39c2a7c— build(deps-dev): bump lodash from 4.17.23 to 4.18.1 (#728) (dependabot[bot])02c5f51— Merge branch 'release' (jely2002)
🔒Security observations
- High · Incomplete Dependency Information —
package.json. The package.json file is truncated and incomplete. The @tauri-apps/plugin-updater dependency version is cut off, making it impossible to verify if vulnerable versions are being used. This is critical for a desktop application that handles downloads and updates. Fix: Provide the complete package.json file. Verify all dependencies against security advisories using 'npm audit' and regularly update dependencies to patch versions. - High · Potential Command Injection via yt-dlp —
src-tauri (Rust backend - specific files not visible). The application wraps yt-dlp (a command-line tool) as indicated by the README. Desktop applications that invoke external command-line tools with user input (video URLs) are vulnerable to command injection if input is not properly sanitized. The presence of @tauri-apps/plugin-shell suggests shell command execution. Fix: Ensure all user inputs (URLs, options) are validated and sanitized before passing to yt-dlp. Use parameterized execution instead of shell interpolation. Implement strict allowlisting of acceptable options and URL schemes. - High · Sentry Integration Without Verification —
package.json (dependencies), src code configuration not visible. The application includes @sentry/vue for error tracking. Without verifying the Sentry configuration, there is risk of sensitive user data (download URLs, file paths, user actions) being sent to external services. Fix: Review Sentry configuration to ensure personally identifiable information and sensitive data is not captured. Implement data filtering/scrubbing for error reports. Use Sentry's privacy settings appropriately. - Medium · No Visible Input Validation Framework —
Frontend codebase (src directory structure not fully visible). Based on the file structure, there is no evidence of a dedicated input validation library or security middleware for the Vue/TypeScript frontend. XSS vulnerabilities could occur if user input or external data is rendered without proper escaping. Fix: Implement proper output encoding for all user-controlled data. Use Vue's built-in XSS protections and avoid using v-html with untrusted content. Consider using a validation library like Zod or Joi. - Medium · Auto-update Plugin Without Security Headers Verification —
src-tauri/capabilities/default.json (likely configuration), package.json. The application uses @tauri-apps/plugin-updater for automatic updates. If the update server doesn't use HTTPS or implement proper security headers, the application could be vulnerable to MITM attacks delivering malicious updates. Fix: Verify that the updater is configured to only download updates over HTTPS. Implement signature verification for downloaded updates. Review the Tauri documentation for secure update practices. - Medium · Clipboard Manager Plugin Exposure —
package.json (dependencies), src-tauri/capabilities/default.json. The @tauri-apps/plugin-clipboard-manager is included, which allows clipboard access. This could expose sensitive information if an attacker gains control of the application or if clipboard operations are not properly scoped. Fix: Review clipboard-manager capability permissions in the capabilities/default.json file. Ensure clipboard operations are only used when necessary. Implement user consent prompts for clipboard access. - Medium · Store Plugin Data Security —
package.json (dependencies), src-tauri code (not visible). The @tauri-apps/plugin-store is used for persistent data storage. Without verification of encryption at rest, sensitive settings or download history could be stored in plaintext. Fix: Verify that sensitive data stored via the store plugin is encrypted. Review what data is being persisted. Consider implementing encryption for user-sensitive information like download history or credentials. - Low · Global Shortcut Plugin Attack Surface —
package.json (dependencies), src-tauri code (not visible). The @tauri-apps/plugin-global-shortcut allows the application to listen for global keyboard shortcuts. While this is a user-facing feature, it increases the attack surface if not properly validated. Fix: Verify that global shortcuts are limited to necessary commands. Implement rate limiting on shortcut execution. Document all registered global shortcuts for transparency. - Low · Missing Security Headers Documentation —
undefined. The file structure shows documentation Fix: undefined
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.