{"id":49595734,"url":"https://github.com/archisvaze/arcdlp","last_synced_at":"2026-05-04T04:05:36.942Z","repository":{"id":345496958,"uuid":"1186037697","full_name":"archisvaze/arcdlp","owner":"archisvaze","description":"Open-source desktop video downloader powered by yt-dlp and electron. Download videos and audio from YouTube, Vimeo, Twitter, and thousands of sites. Works on macOS, Windows and Linux.","archived":false,"fork":false,"pushed_at":"2026-03-20T02:48:13.000Z","size":36806,"stargazers_count":36,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-20T02:51:05.578Z","etag":null,"topics":["audio-downloader","cross-platform","desktop-app","electron","macos","open-source","playlist-downloader","video","video-downloader","youtube","youtube-downloader","yt-dlp"],"latest_commit_sha":null,"homepage":"https://github.com/archisvaze/arcdlp","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/archisvaze.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-19T07:45:31.000Z","updated_at":"2026-03-20T02:48:17.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/archisvaze/arcdlp","commit_stats":null,"previous_names":["archisvaze/arcdlp"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/archisvaze/arcdlp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/archisvaze%2Farcdlp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/archisvaze%2Farcdlp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/archisvaze%2Farcdlp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/archisvaze%2Farcdlp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/archisvaze","download_url":"https://codeload.github.com/archisvaze/arcdlp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/archisvaze%2Farcdlp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32593961,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T22:12:39.696Z","status":"online","status_checked_at":"2026-05-04T02:00:06.625Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["audio-downloader","cross-platform","desktop-app","electron","macos","open-source","playlist-downloader","video","video-downloader","youtube","youtube-downloader","yt-dlp"],"created_at":"2026-05-04T04:05:36.421Z","updated_at":"2026-05-04T04:05:36.932Z","avatar_url":"https://github.com/archisvaze.png","language":"JavaScript","funding_links":["https://github.com/sponsors/archisvaze","https://buymeacoffee.com/archisvaze"],"categories":["Comparison at a glance"],"sub_categories":["The board"],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"build/icon.png\" width=\"128\" alt=\"ArcDLP icon\" /\u003e\n\n# ArcDLP\n\nOpen-source desktop video downloader powered by\n[yt-dlp](https://github.com/yt-dlp/yt-dlp). Paste a URL, pick a quality,\ndownload.\n\nSupports YouTube, Vimeo, Twitter/X, SoundCloud, Instagram, and\n[thousands of other sites](https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md).\n\nEverything runs locally on your machine - no cloud, no accounts, no tracking.\n\n**[Download](https://github.com/archisvaze/arcdlp/releases/latest)**\n\n\u003c/div\u003e\n\n\u003cbr/\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"screenshots/Screenshot1.png\" width=\"48%\" alt=\"ArcDLP video download\" /\u003e\n  \u0026nbsp;\u0026nbsp;\n  \u003cimg src=\"screenshots/Screenshot2.png\" width=\"48%\" alt=\"ArcDLP playlist\" /\u003e\n\u003c/p\u003e\n\n## Download \u0026 Install\n\n**[Download the latest release](https://github.com/archisvaze/arcdlp/releases/latest)**\n\nGo to the Releases page, scroll down to **Assets**, and click the file for your\nsystem:\n\n- **macOS**: `ArcDLP-x.x.x.dmg`\n- **Windows**: `ArcDLP-Setup-x.x.x.exe`\n- **Linux**: `ArcDLP-x.x.x.AppImage`\n\nNo dependencies to install. yt-dlp and ffmpeg are bundled inside the app.\n\n### macOS\n\n1. Download the `.dmg` file\n2. Open it and drag ArcDLP to your Applications folder\n3. Open ArcDLP\n\nmacOS will show a security warning the first time because the app is not\ncode-signed yet. This is normal.\n\nTo fix it:\n\n1. Click **Done**\n2. Open **System Settings**\n3. Go to **Privacy \u0026 Security**\n4. Scroll down and click **Open Anyway** next to ArcDLP\n5. Enter your password\n\nYou only need to do this once.\n\n### Windows\n\n1. Download and run the `.exe` installer\n2. Click **More info**, then click **Run anyway**\n3. The installer will set up ArcDLP and create a shortcut automatically\n\nArcDLP installs per-user (no admin required) and can be uninstalled from\nSettings \u003e Apps.\n\n### Linux\n\n1. Download the `.AppImage` file\n2. Make it executable: right-click → Properties → Permissions → check **Allow\n   executing file as program**\n3. Double-click to run\n\n## Features\n\n- **Single video downloads** - Fetch video info, preview metadata, choose\n  quality (4K/2K/1080p/720p/480p/360p/240p), and download as MP4 or extract\n  audio as MP3\n- **Playlist support** - Paste a playlist URL, select which items to download,\n  pick a format, and queue them all at once\n- **Instagram saved collections** - Paste a saved collection URL, the app scrapes\n  all post links from the collection page, and queues them for download\n- **Download queue** - Sequential processing with per-item progress, retry,\n  cancel, and skip. One failure never stops the rest\n- **YouTube sign-in** - Access age-restricted, private, and members-only content\n  through a built-in browser login window. Credentials go directly to Google\n- **Instagram sign-in** - Access your private saved collections through a\n  built-in browser login window. Credentials go directly to Instagram\n- **Download history** - Quick access to previously fetched videos with cached\n  metadata\n- **Multi-site compatibility** - Works with any site yt-dlp supports. Format\n  detection adapts automatically to different streaming approaches across sites\n- **Update notifications** - The app checks for new releases on startup and lets\n  you know when an update is available\n- **Light and dark mode** - Follows your system preference. macOS vibrancy\n  supported\n\n## Usage\n\n1. Paste a video or playlist URL and click **Fetch**\n2. Pick a quality (or choose MP3 for audio extraction)\n3. Click **Add to Queue**\n4. Downloads are saved to `~/Downloads/ArcDLP` by default (changeable in\n   Settings)\n\nFor playlists, you can select/deselect individual items and choose a format for\nthe whole batch before queueing.\n\nTo access private or age-restricted YouTube videos, sign in via **Settings \u003e\nYouTube Account**. Your credentials go directly to Google through their standard\nlogin page.\n\n### Instagram Saved Collections\n\nyt-dlp supports downloading individual Instagram posts and reels, but it has no\nextractor for saved collections. ArcDLP bridges this gap with a built-in scraper.\n\n1. Sign in to Instagram via **Settings \u003e Instagram Account**\n2. Paste a saved collection URL (e.g.\n   `https://www.instagram.com/username/saved/collection-name/12345/`)\n3. Click **Fetch** - the app opens the collection page in a hidden browser\n   window using your Instagram session\n4. It scrolls through the page, collecting all `\u003ca\u003e` tags with `/p/` and\n   `/reel/` href patterns\n5. Found posts appear in a playlist-style picker where you can select/deselect\n   items\n6. Click **Add Selected to Queue** - each post is downloaded individually via\n   yt-dlp with your Instagram cookies\n\nThe scraper stops after 5 consecutive scrolls with no new posts, or after a\n3-minute timeout (partial results are returned if any were found). Large\ncollections may be rate-limited by Instagram.\n\n## Support the Project\n\nIf ArcDLP is useful to you, consider supporting development:\n\n- [Sponsor on GitHub](https://github.com/sponsors/archisvaze)\n- [Buy Me a Coffee](https://buymeacoffee.com/archisvaze)\n\n---\n\n## For Developers\n\nEverything below is for people who want to build from source, modify the app, or\ncontribute.\n\n### Contributing\n\nContributions are welcome. The codebase is intentionally simple - no frameworks,\nno build tools, vanilla JS throughout.\n\nBefore making changes, read through the code and match existing patterns. A few\nprinciples the project follows:\n\n- **Keep it simple.** If something can be done in 30 lines, don't use a library.\n- **Resilience first.** One failure should never kill the queue. Users should\n  always know what's happening.\n- **Explicit actions only.** No auto-fetching, no auto-retrying. Every action\n  traces to a button click.\n- **Let yt-dlp do the work.** Don't reimplement what yt-dlp already handles. The\n  app is a GUI wrapper, not a competing tool.\n- **Multi-site compatibility.** Never assume YouTube-specific behavior unless\n  explicitly scoped. Format detection, error handling, and UI labels should work\n  for any site yt-dlp supports.\n\n#### Getting Started\n\n1. Fork and clone the repo\n2. `npm install` (downloads yt-dlp + ffmpeg automatically) - See details below\n   for Windows and Linux install\n3. `npm run dev` to launch with DevTools - See more details below\n4. Make your changes, test across a few different sites\n5. Open a PR with a clear description of what changed and why\n\n### Build from Source\n\n```bash\ngit clone https://github.com/archisvaze/arcdlp.git\ncd arcdlp\nnpm install\n```\n\n#### Cross-platform builds\n\nBoth `ffmpeg-static` and the yt-dlp postinstall script download platform-specific\nbinaries during `npm install`. On macOS, this works automatically, no setup needed.\n\nIf you're building for a different architecture (e.g. building the Linux x64\nAppImage from an ARM machine), set these environment variables **before**\n`npm install` to ensure the correct binaries are downloaded:\n\n**Windows (x64):**\n\n    $env:npm_config_platform = \"win32\"\n    $env:npm_config_arch = \"x64\"\n    rm -r -Force node_modules\n    npm install\n\n**Linux (x64):**\n\n    export npm_config_platform=linux\n    export npm_config_arch=x64\n    rm -rf node_modules bin\n    npm install\n\nOnly one binary per platform is downloaded per install. If you need to switch\ntarget architectures, delete `node_modules` and `bin` and run `npm install`\nagain with the new env vars.\n\n### Development\n\n```bash\nnpm run dev          # macOS / Linux\nnpm run dev:win      # Windows\n```\n\nThis launches the app with DevTools enabled and verbose logging.\n\n### Production Builds\n\n```bash\nnpm run build:mac      # macOS - produces .dmg and .zip\nnpm run build:win      # Windows - produces NSIS installer\nnpm run build:linux    # Linux - produces AppImage\nnpm run build:all      # All platforms\n```\n\nBoth yt-dlp and ffmpeg binaries are bundled into the built app via\n`extraResources` in package.json.\n\n### Project Structure\n\n```\narcdlp/\n├── src/\n│   ├── main/\n│   │   ├── main.js          # Electron main process, IPC, window, history\n│   │   ├── preload.js        # Context bridge (window.api)\n│   │   ├── ytdlp.js          # yt-dlp integration: spawn, parse, download\n│   │   ├── queue.js          # Sequential download queue with per-item state\n│   │   ├── cookies.js        # YouTube + Instagram cookie auth\n│   │   ├── scraper.js        # Instagram collection scraper (BrowserWindow)\n│   │   ├── updater.js        # Update checker via GitHub Releases API\n│   │   └── utils.js          # Dev mode flag, logging helpers\n│   └── renderer/\n│       ├── index.html        # UI structure\n│       ├── renderer.js       # UI logic, state, rendering\n│       └── index.css         # All styles\n├── scripts/\n│   ├── postinstall.js        # Downloads yt-dlp binary on npm install\n│   └── fix-ffmpeg-win.js     # Renames ffmpeg for Windows builds\n├── bin/                      # yt-dlp binary (auto-populated by postinstall)\n├── build/                    # App icons (icon.icns, icon.ico, icon.png)\n├── package.json\n├── LICENSE\n└── README.md\n```\n\n### How It Works\n\n1. User pastes a URL and clicks Fetch\n2. App spawns `yt-dlp --dump-json` to get video metadata and available formats\n3. User picks a quality preset or audio extraction\n4. Click \"Add to Queue\" - the download is queued and processed sequentially\n5. yt-dlp handles the actual download with `--progress-template` for structured\n   progress output\n6. Completed files are saved to the configured download folder\n\nFor playlists, the app uses `--flat-playlist --dump-json` to stream items one at\na time, then queues selected items for download.\n\nFor Instagram saved collections, the app opens the collection page in a hidden\n`BrowserWindow`, scrolls through it collecting anchor tags (`\u003ca href=\"/p/...\"\u003e`)\nand (`\u003ca href=\"/reel/...\"\u003e`) via `executeJavaScript`, then presents the scraped\nURLs in the playlist picker UI. Each post is then downloaded individually by\nyt-dlp using the Instagram session cookies.\n\n### Dependencies\n\nOnly two runtime dependencies:\n\n- **electron-store** - Persistent settings and history\n- **ffmpeg-static** - Bundled ffmpeg binary for audio extraction and format\n  merging\n\nDev dependencies: `electron`, `electron-builder`.\n\nyt-dlp handles all downloading, format selection, and ffmpeg orchestration\ninternally. The app is a GUI wrapper around it.\n\n### Roadmap\n\nArcDLP covers the core download workflow, but yt-dlp has a huge feature set that\ncould be surfaced in the GUI. Here's what's planned and where contributors can\nhelp.\n\n#### Quality of Life\n\n- ~~**Thumbnails in playlist items** - The data is already fetched, just not\n  rendered yet~~ _(completed in v1.2.3)_\n- **File size estimates** - Show approximate size on quality presets when\n  available\n- **Download complete notification** - System notification when the queue\n  finishes (only if window is not focused)\n- **Playlist fetch cancellation** - Currently can't cancel a playlist fetch\n  mid-way through\n- **Verbose log toggle** - Clean messages by default, raw yt-dlp output when\n  debugging\n\n#### Advanced yt-dlp Features\n\nyt-dlp supports a lot more than basic downloading. These features would make\ngreat contributions:\n\n- **Subtitle downloads** - `--write-subs`, `--sub-langs`, language selection UI\n- **Embed metadata** - `--embed-thumbnail`, `--embed-metadata` for tagging files\n- **SponsorBlock integration** - `--sponsorblock-remove`, `--sponsorblock-mark`\n  to skip or mark sponsored segments\n- **Additional audio formats** - AAC, FLAC, WAV, Opus extraction (currently MP3\n  only)\n- **Format filtering** - Expose yt-dlp's format selection syntax for advanced\n  users\n- **Download archive** - `--download-archive` to skip already-downloaded videos\n- **Rate limiting** - `--limit-rate` for bandwidth control\n- **Proxy support** - `--proxy` for users behind restrictive networks\n- **Custom output templates** - `--output` template configuration in settings\n- **Chapter splitting** - `--split-chapters` to save individual chapters as\n  separate files\n\n#### App-Level Features\n\n- **Keyboard shortcuts** - Quick access to common actions\n- **More site-specific auth** - Expand the cookie login flow to more sites\n  beyond YouTube and Instagram\n- **Playlist detection for more sites** - Currently conservative (YouTube,\n  SoundCloud, and Instagram saved collections)\n- **DOM virtualization for large playlists** - Currently renders all items,\n  works fine under ~1000\n\n#### Known Cleanup Items\n\n- `video:fetch` IPC returns the full raw JSON (50-200KB) even in production -\n  should be dev-only\n- Queue `_items` array has no upper bound - consider a cap or auto-clear\n- Playlist checkbox uses inline `onchange` handler - could use event delegation\n- Log type detection is greedy (`msg.includes('complete')` matches \"incomplete\")\n\n## License\n\n[MIT](LICENSE)\n\n## Credits\n\n- [yt-dlp](https://github.com/yt-dlp/yt-dlp) - The engine that does all the\n  heavy lifting\n- [Electron](https://www.electronjs.org/) - Desktop app framework\n- [ffmpeg](https://ffmpeg.org/) - Audio/video processing (bundled via\n  ffmpeg-static)\n- [electron-icon-builder](https://github.com/safu9/electron-icon-builder) - Made icon with Canva and exported the icon files via electron-icon-builder\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farchisvaze%2Farcdlp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farchisvaze%2Farcdlp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farchisvaze%2Farcdlp/lists"}