A self-hosted, zero-cloud video and audio downloader powered by a local Node.js server and a companion Chrome Extension.
Download videos, audio, and reels from YouTube, Instagram, and 1000+ supported sites β all from your own machine.
π Quick Start Β· π Features Β· π Extension Setup Β· π Architecture Β· π€ Contributing
Important
π One-Click Windows Installation:
- Method A (Easiest): Open PowerShell (or Command Prompt) and run this one-line command to download and start the installer immediately:
powershell -ExecutionPolicy Bypass -Command "Invoke-WebRequest -Uri 'https://raw.githubusercontent.com/Saarangggg/videoad/main/install_videoad.bat' -OutFile (Join-Path $env:USERPROFILE 'Desktop\install_videoad.bat') -UseBasicParsing; Start-Process -FilePath (Join-Path $env:USERPROFILE 'Desktop\install_videoad.bat') -Verb RunAs"
- Method B: Right-click this link (install_videoad.bat) and choose "Save link as..." or "Save target as..." to download it directly as a
.batfile (do not left-click it directly, or Chrome will just show it as text). Double-click the saved file to run.
VideoAd is a fully open-source, locally hosted media downloader developed by 5araang that runs entirely on your own computer β no cloud servers, no subscriptions, no data collection. It pairs a sleek web dashboard (served at http://localhost:48774) with a Chrome Extension that detects videos on any webpage and lets you download them instantly with one click.
It is built on top of yt-dlp β the world's most powerful open-source media extractor β and supports 1000+ websites out of the box including YouTube, Instagram, Twitter/X, Reddit, Vimeo, TikTok, SoundCloud, and more.
Why self-hosted? Developed by 5araang with absolute privacy in mind. No rate limits. No ads. No accounts. No sending your history to a third-party server. Your downloads, your machine.
| Feature | Description |
|---|---|
| π¬ Video Downloads | Download best quality MP4 β or choose a specific resolution (1080p, 720p, 480pβ¦) |
| π΅ Audio Extraction | Rip audio as high-quality MP3 directly from any video |
| πΈ Instagram Reels | Download Instagram Reels and posts using one-click cookie connect |
| π On-Page Media Detector | A floating toast appears automatically when a video is detected on any webpage |
| π± Right-Click Context Menu | Right-click any video link or page to trigger an instant download |
| π Live Download Progress | Real-time progress bar, speed, and ETA shown in the extension popup |
| π 1000+ Sites Supported | Powered by yt-dlp β works on YouTube, Vimeo, Twitter, Reddit, TikTok, and hundreds more |
| π 100% Local & Private | All downloads happen on your own machine β no external servers involved |
| β‘ Auto-Setup Installer | One-click install_videoad.bat downloads yt-dlp and ffmpeg automatically if missing |
| π‘ Ad & Tracker Blocker | Built-in blocker for video ads, banners, trackers, popup tabs, YouTube Music ads, and Instagram story ads |
| π Chrome Extension | Companion extension for in-page detection, popup controls, and download triggering |
- Windows (10 or 11)
- Node.js v18 or newer
- Google Chrome browser
To download and install VideoAd automatically on Windows:
Copy and paste this single command into your Windows PowerShell and press Enter. It will automatically download the installer, prompt for Admin elevation, and complete the setup:
powershell -ExecutionPolicy Bypass -Command "Invoke-WebRequest -Uri 'https://raw.githubusercontent.com/Saarangggg/videoad/main/install_videoad.bat' -OutFile (Join-Path $env:USERPROFILE 'Desktop\install_videoad.bat') -UseBasicParsing; Start-Process -FilePath (Join-Path $env:USERPROFILE 'Desktop\install_videoad.bat') -Verb RunAs"- Right-click this link (install_videoad.bat) and choose "Save link as..." or "Save target as..." to save the file to your computer. (Do not left-click it directly, or your browser will display the script's raw code as text.)
- Double-click the downloaded
install_videoad.batfile to run the installer.
- β Checks for Node.js.
- β
Creates a clean directory at
C:\VideoAdand extracts the source code. - β
Downloads standalone
yt-dlp.exeandffmpeg.exebinaries directly intoC:\VideoAd. - β
Installs all Node.js dependencies (
npm install --production). - β
Configures the
videoad://custom protocol handler for background launcher integration. - β Places a VideoAd Downloader shortcut on your Desktop.
- β Starts the server silently in the background and opens the dashboard.
If you prefer to clone the repository manually:
- Clone the repository:
git clone https://github.com/Saarangggg/videoad.git cd videoad - Double-click
install_videoad.bat(it will elevate to Admin, copy files toC:\VideoAd, and set up the silent background shortcut exactly like the one-click installer).
Once setup is complete, load the Chrome Extension:
- Open Chrome and navigate to
chrome://extensions/ - Enable Developer mode (toggle switch in the top-right corner).
- Click "Load unpacked".
- Select the
C:\VideoAd\chrome-extensiondirectory (or thechrome-extension/folder inside your manual clone). - The VideoAd icon will appear in your toolbar. Open it and verify the status shows Connected.
VideoAd includes a built-in, dynamic ad-blocking system inside the companion Chrome Extension:
- Automatic Ad Skipping: Instantly skips video ads on YouTube and audio ads on YouTube Music (playback is muted and speed-boosted to 16x, automatically clicking the skip button).
- Instagram Ad Skippers: Auto-skips sponsored Stories slides and hides sponsored posts from your home feed dynamically.
- Redirection & Popunder Blocker: Intercepts and blocks programmatic popups and popunder ads (typical on movie/streaming sites) safely without violating Content Security Policy (CSP).
- Clean Interface: Safely hides all visual display ads, companion ads, and sponsored banners without breaking main site navigation headers or video players.
- Easy Toggle: Turn the ad blocker on or off at any time using the Ad & Tracker Blocker switch inside the extension settings panel.
VideoAd runs completely in the background with no terminal windows visible.
- When you double-click the VideoAd Downloader Desktop shortcut, it starts silently and opens your browser.
- When the Chrome Extension detects a video and prompts you to start, it launches the server automatically in the background using the custom registered protocol.
- The console log windows will never interrupt or clutter your desktop!
To stop the background server, open a command prompt and run:
taskkill /f /im node.exeInstagram downloads require your session cookies. The extension handles this safely:
- Make sure you are logged into Instagram in Chrome
- Open the extension popup β click the β Settings gear icon
- In the Instagram section, click "Connect"
- The status dot turns π’ green once your session cookies are saved locally
- You can now download any Instagram Reel or post without interruption
Your cookies are saved locally on your machine in
instagram_cookies.txtβ they are never sent anywhere externally.
To completely remove VideoAd from your system:
Copy and paste this single command into your Windows PowerShell and press Enter to stop the server, delete custom protocol registry keys, delete Desktop shortcuts, and remove the C:\VideoAd installation folder:
powershell -ExecutionPolicy Bypass -Command "Invoke-WebRequest -Uri 'https://raw.githubusercontent.com/Saarangggg/videoad/main/uninstall_videoad.bat' -OutFile (Join-Path $env:USERPROFILE 'Desktop\uninstall_videoad.bat') -UseBasicParsing; Start-Process -FilePath (Join-Path $env:USERPROFILE 'Desktop\uninstall_videoad.bat') -Verb RunAs"- Right-click this link (uninstall_videoad.bat) and choose "Save link as..." to save the uninstaller script.
- Double-click the downloaded
uninstall_videoad.batfile to run the cleanup tool.
videoad/
βββ π server.js # Express backend β yt-dlp orchestration + API
βββ π package.json # Node.js dependencies
βββ π setup_and_run.bat # One-click installer & launcher
βββ π run_downloader.bat # Quick server restart shortcut (Desktop)
βββ π public/ # Frontend web dashboard
β βββ index.html # Download UI (paste URL, view progress)
β βββ app.js # Frontend logic
β βββ style.css # Glassmorphism dark UI styles
βββ π chrome-extension/ # Chrome Extension
β βββ manifest.json # Extension configuration (Manifest V3)
β βββ popup.html # Extension popup UI
β βββ popup.js # Popup interaction logic
β βββ background.js # Service worker (context menus, messaging)
β βββ content.js # Bridge between page and background
β βββ detector.js # On-page media detection + floating toast
β βββ detector.css # Toast overlay styling
β βββ icon.png # Extension icon
βββ π downloads/ # Temporary download storage (auto-cleaned)
βββ π .gitignore
βββ π README.md
ββββββββββββββββββββββββββββββββββββ
β Chrome Browser β
β β
β ββββββββββββββββββββββββββββββ β
β β Chrome Extension β β
β β ββββββββββββ βββββββββββ β β
β β β popup.js β βdetector β β β
β β ββββββββββββ βββββββββββ β β
β β β sendMessage β β
β β ββββββββββββββββββββββ β β
β β β background.js β β β
β β β (Service Worker) β β β
β β ββββββββββββββββββββββ β β
β ββββββββββββββ¬ββββββββββββββββ β
β β HTTP fetch β
βββββββββββββββββΌβββββββββββββββββββ
βΌ
ββββββββββββββββββββββββββββββββββββ
β Local Node.js Server :48774 β
β β
β POST /api/info β yt-dlp β
β POST /api/download β yt-dlp β
β GET /api/tasks β progress β
β POST /api/save-cookies β file β
β GET /api/instagram-cookie-statusβ
β β
β yt-dlp + ffmpeg (local bins) β
ββββββββββββββββββββββββββββββββββββ
| Layer | Technology |
|---|---|
| Backend | Node.js Β· Express Β· child_process (spawn) |
| Media Extraction | yt-dlp (standalone binary) |
| Audio/Video Merge | FFmpeg (static binary) |
| Frontend UI | HTML5 Β· Vanilla JavaScript Β· CSS3 (Glassmorphism) |
| Extension | Chrome Extension Manifest V3 Β· Service Workers |
| Protocol Launcher | Windows Registry HKCU\Software\Classes\videoad |
VideoAd supports all sites supported by yt-dlp, including:
YouTube Β· Instagram Β· Twitter / X Β· TikTok Β· Reddit Β· Vimeo Β· Dailymotion Β· SoundCloud Β· Twitch Β· Facebook Β· Pinterest Β· LinkedIn Β· Bilibili Β· and 1000+ more β
npm start
# Server runs at http://localhost:48774| Method | Endpoint | Description |
|---|---|---|
POST |
/api/info |
Fetch video title, thumbnail, duration, formats |
POST |
/api/download |
Start a background download task |
GET |
/api/tasks |
List all active download tasks |
GET |
/api/download-file/:id |
Serve a completed download file |
POST |
/api/cancel/:id |
Cancel an active download |
POST |
/api/save-cookies |
Save Instagram session cookies from extension |
GET |
/api/instagram-cookie-status |
Check if Instagram cookies are saved |
GET |
/api/extension-path |
Serve extension path for self-registration |
| Type | Format | Notes |
|---|---|---|
video |
MP4 (best quality) | Merges best video + audio streams via FFmpeg |
audio |
MP3 | Strips audio track and converts |
video + resolution |
MP4 (custom height) | e.g. limit to 720p |
- No telemetry β the app never phones home or logs anything externally.
- No authentication β runs on
localhostonly (accessible from your LAN if needed). - Cookies stay local β Instagram session cookies are written to
instagram_cookies.txton your own machine only. - Auto file cleanup β downloaded files in the
/downloads/folder are automatically deleted after 1 hour. .gitignoreprotected βinstagram_cookies.txt,*.pem,node_modules/, anddownloads/are excluded from version control.
Contributions are welcome and appreciated! Whether it's a bug fix, new feature, or documentation improvement.
- Fork the repository
- Create a branch for your feature:
git checkout -b feature/my-new-feature - Commit your changes:
git commit -m "Add my feature" - Push to the branch:
git push origin feature/my-new-feature - Open a Pull Request on GitHub
- Add Firefox extension support
- Subtitle/caption download option
- Playlist batch download support
- Download history / library view
- macOS / Linux setup script equivalents
- Cookie connect support for Twitter, TikTok
Server won't start?
- Make sure Node.js is installed:
node --version - Delete
node_modules/and runnpm installagain
yt-dlp or ffmpeg not found?
- Re-run
setup_and_run.batβ it will re-download missing binaries automatically
Instagram downloads fail?
- Make sure you're logged into Instagram in Chrome
- Open the extension popup β Settings β Instagram β click Connect
- The status dot must be π’ green before attempting a download
"Extension context invalidated" errors in console?
- This is harmless β it happens when the extension reloads while pages are open
- Reload the extension at
chrome://extensions/to reset
Chrome cookie database locked?
- Do NOT use
--cookies-from-browsermanually β use the extension Connect button instead (it reads cookies through the Chrome API, bypassing the file lock entirely)
This project is open source and available under the MIT License.
MIT License β Copyright (c) 2025 Saarang
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction...
If VideoAd has been useful to you, please consider giving it a β on GitHub β it helps others discover the project!