Repository files navigation

pull-vids

GitHub releaseHomebrewLicense: MITGo VersionGitHub stars

A free, open-source CLI tool for downloading videos and audio from 1000+ websites. Inspired by tools like Downie and PullTube, but completely free!

Built with Go for blazingly fast performance! 🚀

Supported Platforms

Works with any site supported by yt-dlp, including:

  • YouTube - Videos, playlists, channels
  • Vimeo - Videos and channels
  • Twitter/X - Videos and GIFs
  • TikTok - Videos
  • Instagram - Videos, Reels, Stories
  • Facebook - Videos
  • Twitch - VODs and clips
  • Reddit - Videos from v.redd.it
  • Dailymotion - Videos
  • And 1000+ more! - Full list

Features

  • Download videos from 1000+ websites
  • Cookie authentication for YouTube bot detection bypass
  • Automatic retry with exponential backoff for rate limiting
  • Sleep intervals between downloads to avoid rate limits
  • Various quality options (360p to 4K)
  • Audio-only extraction (MP3, M4A, etc.)
  • Playlist and channel support
  • Beautiful real-time progress bars
  • Cross-platform (Windows, macOS, Linux)
  • Single binary - no dependencies to install
  • Fast startup - < 1ms
  • No ads, no paywalls, just downloads

Demo

Demo

Installation

Package Managers (Recommended)

macOS (Homebrew):

brew tap vib795/tap
brew install pull-vids

Upgrading from a version before 0.3.3? Run this once, on each machine:

brew uninstall pull-vids && brew install vib795/tap/pull-vids

brew upgrade will report pull-vids 64 already installed and do nothing. See Troubleshooting for why.

Any platform with Go 1.24+:

go install github.com/vib795/pull-vids@latest

Chocolatey, APT, AUR and Snap are not available yet. Earlier versions of this README listed them before the packages were published, so choco install pull-vids and friends fail with "package was not found". Use Homebrew, go install, or the install scripts below. Tracking issue: #10.

Quick Install Script

macOS / Linux:

curl -fsSL https://raw.githubusercontent.com/vib795/pull-vids/develop/install.sh | bash

Windows (PowerShell as Administrator):

irm https://raw.githubusercontent.com/vib795/pull-vids/develop/install.ps1 | iex

Manual Installation

Option 1: Download Pre-built Binary

Download the latest release for your platform from Releases:

Releases ship as compressed archives, so download and extract before installing.

macOS:

# Apple Silicon (M1/M2/M3) - use darwin-amd64 on Intel
curl -L https://github.com/vib795/pull-vids/releases/latest/download/pull-vids-darwin-arm64.tar.gz -o pull-vids.tar.gz
tar -xzf pull-vids.tar.gz
chmod +x pull-vids-darwin-arm64
sudo mv pull-vids-darwin-arm64 /usr/local/bin/pull-vids

Linux:

# AMD64 - use linux-arm64 on ARM
curl -L https://github.com/vib795/pull-vids/releases/latest/download/pull-vids-linux-amd64.tar.gz -o pull-vids.tar.gz
tar -xzf pull-vids.tar.gz
chmod +x pull-vids-linux-amd64
sudo mv pull-vids-linux-amd64 /usr/local/bin/pull-vids

Windows:

  1. Download pull-vids-windows-amd64.zip
  2. Extract it, then rename pull-vids-windows-amd64.exe to pull-vids.exe
  3. Move it to a directory in your PATH (e.g., C:\Program Files\pull-vids\)

Option 2: Build from Source

Requirements:

  • Go 1.24 or higher (see go.mod)
  • Git

Build:

# Clone the repository
git clone https://github.com/vib795/pull-vids.git
cd pull-vids
# Build for your platform
make build
# Or build for all platforms
make build-all
# Install to system
make install

Install Dependencies

pull-vids requires ffmpeg and yt-dlp to work:

macOS:

brew install ffmpeg yt-dlp

Ubuntu/Debian:

sudo apt update
sudo apt install ffmpeg
pip install yt-dlp

Windows:

winget install ffmpeg
pip install yt-dlp

Verify installation:

ffmpeg -version
yt-dlp --version
pull-vids --version

Usage

Basic Examples

Download from YouTube:

pull-vids "https://www.youtube.com/watch?v=VIDEO_ID"

Download from Vimeo:

pull-vids "https://vimeo.com/123456789"

Download from Twitter/X:

pull-vids "https://twitter.com/user/status/123456"

Download from TikTok:

pull-vids "https://www.tiktok.com/@user/video/123456"

Download from Instagram:

pull-vids "https://www.instagram.com/p/ABC123/"

Download from Twitch:

pull-vids "https://www.twitch.tv/videos/123456789"

Download audio only:

pull-vids -a "https://www.youtube.com/watch?v=VIDEO_ID"

Download in specific quality:

pull-vids -q 720p "https://vimeo.com/123456789"

Download to a specific directory:

pull-vids -o ~/Videos "https://www.youtube.com/watch?v=VIDEO_ID"

Download entire playlist:

pull-vids -p "https://www.youtube.com/playlist?list=PLAYLIST_ID"

YouTube Authentication (Cookie Support)

If you get a bot detection error from YouTube, you'll need to authenticate using cookies from your browser.

Option 1: Export Cookies Manually (Recommended - Most Reliable)

  1. Install a browser extension to export cookies:

  2. Visit YouTube and make sure you're logged in

  3. Click the extension icon and export cookies for youtube.com

  4. Save the file (e.g., youtube-cookies.txt)

  5. Use with pull-vids:

    pull-vids --cookies youtube-cookies.txt "https://www.youtube.com/watch?v=VIDEO_ID"

Option 2: Extract Cookies from Browser

Firefox (usually works without issues):

pull-vids --cookies-from-browser firefox "https://www.youtube.com/watch?v=VIDEO_ID"

Chrome:

pull-vids --cookies-from-browser chrome "https://www.youtube.com/watch?v=VIDEO_ID"

Safari (macOS only):

pull-vids --cookies-from-browser safari "https://www.youtube.com/watch?v=VIDEO_ID"

⚠️ macOS Safari Users: If you get a permission error, you need to grant Full Disk Access:

  1. Open System SettingsPrivacy & SecurityFull Disk Access
  2. Click the + button and add your terminal app (Terminal.app or iTerm2)
  3. Restart your terminal
  4. Try again

⚠️ Chrome/Chromium Users: If Chrome doesn't work, try exporting cookies manually (Option 1) or use Firefox.

Supported browsers:firefox, chrome, safari, edge, chromium, brave, opera, vivaldi

Important: Make sure you're logged into YouTube in the browser before extracting cookies!

Command-Line Options

usage: pull-vids [-h] [-o OUTPUT] [-q QUALITY] [-a] [-p] [-f FORMAT]
[--cookies COOKIES] [--cookies-from-browser BROWSER]
[--sleep-interval SECONDS] [-N CONNECTIONS]
[--downloader BACKEND] [--http-chunk-size SIZE]
[-v] [--no-banner] url
positional arguments:
url Video URL from any supported site (1000+ platforms)
options:
-h, --help show this help message and exit
-o OUTPUT, --output OUTPUT
Output directory (default: ~/Downloads/pull-vids)
-q QUALITY, --quality QUALITY
Video quality: best, high, medium, low, 2160p, 1440p, 1080p, 720p, 480p, 360p
(default: best)
-a, --audio-only Download audio only
-p, --playlist Download entire playlist
-f FORMAT, --format FORMAT
Output format (mp4, mkv, mp3, m4a, etc.)
--cookies COOKIES Path to cookies file (Netscape format)
--cookies-from-browser BROWSER
Extract cookies from browser (chrome, firefox, safari, edge, etc.)
--sleep-interval SECONDS
Sleep interval in seconds between downloads (avoids rate limiting)
-N, --connections N Parallel connections per download (default: 8)
--downloader BACKEND Transfer backend: auto, native, or aria2c (default: auto)
--http-chunk-size SIZE
Chunk size for the native downloader (default: 10M)
-v, --version show program's version number and exit
--no-banner Don't show the banner

Download Speed

Google's CDN rate-limits each TCP connection independently, at roughly 3 MB/s per connection. A single-stream download therefore leaves a fast link almost entirely idle, and adding connections scales throughput close to linearly:

ConnectionsThroughput
13.3 MB/s
412.5 MB/s
825.8 MB/s
1648.7 MB/s
3295.2 MB/s (saturates a 1 Gbps link)

pull-vids uses 8 connections by default. To go faster:

pull-vids -N 16 "https://www.youtube.com/watch?v=VIDEO_ID"

Two things worth knowing:

  • Install aria2 for the full benefit. With --downloader auto (the default), aria2c is used when available and splits any URL into parallel ranged requests. Without it, the native downloader can only parallelise formats that are already fragmented. Homebrew installs it as a dependency.
  • Do not raise -N indefinitely. The CDN returns HTTP 403 when the connection count is too high. pull-vids detects this and halves the connection count on each retry, but starting lower (-N 4) is more reliable for large batches.

Your storage matters too: writing to a network share caps throughput at the share's write speed regardless of connection count.

Quality Options

  • best - Best available quality (default)
  • high - Up to 1080p
  • medium - Up to 720p
  • low - Up to 480p
  • 2160p, 1440p, 1080p, 720p, 480p, 360p - Specific resolutions

Format Options

Video formats: mp4 (default), mkv, webm Audio formats: mp3 (default), m4a, opus, wav

Examples

# Download 4K video
pull-vids -q 2160p "https://www.youtube.com/watch?v=VIDEO_ID"# Download as MP3
pull-vids -a -f mp3 "https://www.youtube.com/watch?v=VIDEO_ID"# Download playlist to Music folder
pull-vids -a -p -o ~/Music "https://www.youtube.com/playlist?list=PLAYLIST_ID"# Download in MKV format
pull-vids -f mkv "https://www.youtube.com/watch?v=VIDEO_ID"# Download with cookies for YouTube bot detection
pull-vids --cookies-from-browser firefox "https://www.youtube.com/watch?v=VIDEO_ID"# Download long playlist with rate limit protection
pull-vids --cookies-from-browser firefox --sleep-interval 5 -p "https://www.youtube.com/playlist?list=PLAYLIST_ID"

Why pull-vids?

  • Free Forever - No subscriptions, no trials, no limitations
  • Open Source - Transparent code you can trust and modify
  • Privacy Focused - No tracking, no data collection
  • Powerful - Built on yt-dlp, supporting 1000+ video platforms
  • Simple - Clean CLI interface, no bloat
  • Fast - Compiles to a single binary with zero startup time
  • Portable - Single executable, no runtime dependencies

Limitations

DRM-Protected Content

This tool CANNOT download DRM-protected content. This includes:

  • ❌ Amazon Prime Video
  • ❌ Netflix
  • ❌ Disney+
  • ❌ Hulu
  • ❌ HBO Max
  • ❌ Apple TV+
  • ❌ Other paid streaming services

Why? These services use DRM (Digital Rights Management) protection. yt-dlp does not and will not support bypassing DRM due to legal restrictions and ethical reasons.

What You CAN Download

User-uploaded content:

  • YouTube (videos, playlists, channels, live streams)
  • Vimeo (public and password-protected videos)
  • Social media (Twitter, TikTok, Instagram, Facebook)
  • Twitch (VODs and clips)
  • Reddit (v.redd.it videos)
  • And 1000+ other sites with publicly accessible content

Public platforms where content creators share their work ✅ Content you have legal rights to download

Note: Just because you can download something doesn't mean you should. Always respect:

  • Copyright laws
  • Platform Terms of Service
  • Content creator rights
  • Fair use guidelines

Troubleshooting

brew upgrade says "pull-vids 64 already installed" and never updates:

Run this once on the affected machine:

brew uninstall pull-vids && brew install vib795/tap/pull-vids

Formulas before 0.3.3 did not declare a version, so Homebrew inferred one from the download filename — pull-vids-darwin-arm64.tar.gz yields 64. Every release looked like version 64, so the binary was installed into Cellar/pull-vids/64 and each new release appeared to be already installed.

brew upgrade cannot repair this, because it compares the installed version against the formula version and 64 sorts higher than 0.3.4. Homebrew concludes the installed copy is newer and declines. Only a fresh install rebuilds the keg under the correct name.

Releases from 0.3.3 onward declare the version explicitly, so this is a one-time cleanup. Machines installing fresh are unaffected and upgrade normally.

"ffmpeg not found" error:

  • Make sure ffmpeg is installed and in your PATH
  • Try running ffmpeg -version to verify installation

"No video formats found" error:

  • The video might be region-locked or unavailable
  • Try a different quality setting
  • Check if the URL is correct

"Sign in to confirm you're not a bot" error:

  • See the YouTube Authentication (Cookie Support) section above
  • Use --cookies-from-browser or --cookies flag
  • pull-vids will automatically retry up to 3 times with exponential backoff (30s, 60s, 120s)

Rate limiting on long playlists:

  • Use --sleep-interval 5 to add delays between downloads
  • Recommended: 5-10 seconds for playlists with 30+ videos
  • Automatic retry kicks in if rate limiting is detected despite the sleep interval

Slow downloads:

  • Google's CDN throttles each connection separately, so a single stream is slow no matter how fast your link is. Raise the connection count: -N 16
  • Install aria2 (brew install aria2) if it is missing; without it pull-vids falls back to a downloader that can only parallelise fragmented formats
  • Writing to a network share caps throughput at the share's write speed
  • See Download Speed for measured numbers
  • Use a different quality setting
  • Some platforms have rate limits

Contributing

Contributions are welcome! Feel free to open issues or submit pull requests.

License

MIT License - feel free to use this tool however you want!

Credits

Core:

  • yt-dlp - The amazing YouTube downloading library

Go libraries:

Inspired by Downie and PullTube, but free and open-source!

Disclaimer

This tool is for personal use only. Please respect copyright laws and each platform's Terms of Service. Only download videos you have the right to download.

About

Universal video downloader CLI supporting 1000+ websites. Free, open-source alternative to Downie/PullTube built with Go.

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

pull-vids

GitHub releaseHomebrewLicense: MITGo VersionGitHub stars

A free, open-source CLI tool for downloading videos and audio from 1000+ websites. Inspired by tools like Downie and PullTube, but completely free!

Built with Go for blazingly fast performance! 🚀

Supported Platforms

Works with any site supported by yt-dlp, including:

  • YouTube - Videos, playlists, channels
  • Vimeo - Videos and channels
  • Twitter/X - Videos and GIFs
  • TikTok - Videos
  • Instagram - Videos, Reels, Stories
  • Facebook - Videos
  • Twitch - VODs and clips
  • Reddit - Videos from v.redd.it
  • Dailymotion - Videos
  • And 1000+ more! - Full list

Features

  • Download videos from 1000+ websites
  • Cookie authentication for YouTube bot detection bypass
  • Automatic retry with exponential backoff for rate limiting
  • Sleep intervals between downloads to avoid rate limits
  • Various quality options (360p to 4K)
  • Audio-only extraction (MP3, M4A, etc.)
  • Playlist and channel support
  • Beautiful real-time progress bars
  • Cross-platform (Windows, macOS, Linux)
  • Single binary - no dependencies to install
  • Fast startup - < 1ms
  • No ads, no paywalls, just downloads

Demo

Demo

Installation

Package Managers (Recommended)

macOS (Homebrew):

brew tap vib795/tap
brew install pull-vids

Upgrading from a version before 0.3.3? Run this once, on each machine:

brew uninstall pull-vids && brew install vib795/tap/pull-vids

brew upgrade will report pull-vids 64 already installed and do nothing. See Troubleshooting for why.

Any platform with Go 1.24+:

go install github.com/vib795/pull-vids@latest

Chocolatey, APT, AUR and Snap are not available yet. Earlier versions of this README listed them before the packages were published, so choco install pull-vids and friends fail with "package was not found". Use Homebrew, go install, or the install scripts below. Tracking issue: #10.

Quick Install Script

macOS / Linux:

curl -fsSL https://raw.githubusercontent.com/vib795/pull-vids/develop/install.sh | bash

Windows (PowerShell as Administrator):

irm https://raw.githubusercontent.com/vib795/pull-vids/develop/install.ps1 | iex

Manual Installation

Option 1: Download Pre-built Binary

Download the latest release for your platform from Releases:

Releases ship as compressed archives, so download and extract before installing.

macOS:

# Apple Silicon (M1/M2/M3) - use darwin-amd64 on Intel
curl -L https://github.com/vib795/pull-vids/releases/latest/download/pull-vids-darwin-arm64.tar.gz -o pull-vids.tar.gz
tar -xzf pull-vids.tar.gz
chmod +x pull-vids-darwin-arm64
sudo mv pull-vids-darwin-arm64 /usr/local/bin/pull-vids

Linux:

# AMD64 - use linux-arm64 on ARM
curl -L https://github.com/vib795/pull-vids/releases/latest/download/pull-vids-linux-amd64.tar.gz -o pull-vids.tar.gz
tar -xzf pull-vids.tar.gz
chmod +x pull-vids-linux-amd64
sudo mv pull-vids-linux-amd64 /usr/local/bin/pull-vids

Windows:

  1. Download pull-vids-windows-amd64.zip
  2. Extract it, then rename pull-vids-windows-amd64.exe to pull-vids.exe
  3. Move it to a directory in your PATH (e.g., C:\Program Files\pull-vids\)

Option 2: Build from Source

Requirements:

  • Go 1.24 or higher (see go.mod)
  • Git

Build:

# Clone the repository
git clone https://github.com/vib795/pull-vids.git
cd pull-vids
# Build for your platform
make build
# Or build for all platforms
make build-all
# Install to system
make install

Install Dependencies

pull-vids requires ffmpeg and yt-dlp to work:

macOS:

brew install ffmpeg yt-dlp

Ubuntu/Debian:

sudo apt update
sudo apt install ffmpeg
pip install yt-dlp

Windows:

winget install ffmpeg
pip install yt-dlp

Verify installation:

ffmpeg -version
yt-dlp --version
pull-vids --version

Usage

Basic Examples

Download from YouTube:

pull-vids "https://www.youtube.com/watch?v=VIDEO_ID"

Download from Vimeo:

pull-vids "https://vimeo.com/123456789"

Download from Twitter/X:

pull-vids "https://twitter.com/user/status/123456"

Download from TikTok:

pull-vids "https://www.tiktok.com/@user/video/123456"

Download from Instagram:

pull-vids "https://www.instagram.com/p/ABC123/"

Download from Twitch:

pull-vids "https://www.twitch.tv/videos/123456789"

Download audio only:

pull-vids -a "https://www.youtube.com/watch?v=VIDEO_ID"

Download in specific quality:

pull-vids -q 720p "https://vimeo.com/123456789"

Download to a specific directory:

pull-vids -o ~/Videos "https://www.youtube.com/watch?v=VIDEO_ID"

Download entire playlist:

pull-vids -p "https://www.youtube.com/playlist?list=PLAYLIST_ID"

YouTube Authentication (Cookie Support)

If you get a bot detection error from YouTube, you'll need to authenticate using cookies from your browser.

Option 1: Export Cookies Manually (Recommended - Most Reliable)

  1. Install a browser extension to export cookies:

  2. Visit YouTube and make sure you're logged in

  3. Click the extension icon and export cookies for youtube.com

  4. Save the file (e.g., youtube-cookies.txt)

  5. Use with pull-vids:

    pull-vids --cookies youtube-cookies.txt "https://www.youtube.com/watch?v=VIDEO_ID"

Option 2: Extract Cookies from Browser

Firefox (usually works without issues):

pull-vids --cookies-from-browser firefox "https://www.youtube.com/watch?v=VIDEO_ID"

Chrome:

pull-vids --cookies-from-browser chrome "https://www.youtube.com/watch?v=VIDEO_ID"

Safari (macOS only):

pull-vids --cookies-from-browser safari "https://www.youtube.com/watch?v=VIDEO_ID"

⚠️ macOS Safari Users: If you get a permission error, you need to grant Full Disk Access:

  1. Open System SettingsPrivacy & SecurityFull Disk Access
  2. Click the + button and add your terminal app (Terminal.app or iTerm2)
  3. Restart your terminal
  4. Try again

⚠️ Chrome/Chromium Users: If Chrome doesn't work, try exporting cookies manually (Option 1) or use Firefox.

Supported browsers:firefox, chrome, safari, edge, chromium, brave, opera, vivaldi

Important: Make sure you're logged into YouTube in the browser before extracting cookies!

Command-Line Options

usage: pull-vids [-h] [-o OUTPUT] [-q QUALITY] [-a] [-p] [-f FORMAT]
[--cookies COOKIES] [--cookies-from-browser BROWSER]
[--sleep-interval SECONDS] [-N CONNECTIONS]
[--downloader BACKEND] [--http-chunk-size SIZE]
[-v] [--no-banner] url
positional arguments:
url Video URL from any supported site (1000+ platforms)
options:
-h, --help show this help message and exit
-o OUTPUT, --output OUTPUT
Output directory (default: ~/Downloads/pull-vids)
-q QUALITY, --quality QUALITY
Video quality: best, high, medium, low, 2160p, 1440p, 1080p, 720p, 480p, 360p
(default: best)
-a, --audio-only Download audio only
-p, --playlist Download entire playlist
-f FORMAT, --format FORMAT
Output format (mp4, mkv, mp3, m4a, etc.)
--cookies COOKIES Path to cookies file (Netscape format)
--cookies-from-browser BROWSER
Extract cookies from browser (chrome, firefox, safari, edge, etc.)
--sleep-interval SECONDS
Sleep interval in seconds between downloads (avoids rate limiting)
-N, --connections N Parallel connections per download (default: 8)
--downloader BACKEND Transfer backend: auto, native, or aria2c (default: auto)
--http-chunk-size SIZE
Chunk size for the native downloader (default: 10M)
-v, --version show program's version number and exit
--no-banner Don't show the banner

Download Speed

Google's CDN rate-limits each TCP connection independently, at roughly 3 MB/s per connection. A single-stream download therefore leaves a fast link almost entirely idle, and adding connections scales throughput close to linearly:

ConnectionsThroughput
13.3 MB/s
412.5 MB/s
825.8 MB/s
1648.7 MB/s
3295.2 MB/s (saturates a 1 Gbps link)

pull-vids uses 8 connections by default. To go faster:

pull-vids -N 16 "https://www.youtube.com/watch?v=VIDEO_ID"

Two things worth knowing:

  • Install aria2 for the full benefit. With --downloader auto (the default), aria2c is used when available and splits any URL into parallel ranged requests. Without it, the native downloader can only parallelise formats that are already fragmented. Homebrew installs it as a dependency.
  • Do not raise -N indefinitely. The CDN returns HTTP 403 when the connection count is too high. pull-vids detects this and halves the connection count on each retry, but starting lower (-N 4) is more reliable for large batches.

Your storage matters too: writing to a network share caps throughput at the share's write speed regardless of connection count.

Quality Options

  • best - Best available quality (default)
  • high - Up to 1080p
  • medium - Up to 720p
  • low - Up to 480p
  • 2160p, 1440p, 1080p, 720p, 480p, 360p - Specific resolutions

Format Options

Video formats: mp4 (default), mkv, webm Audio formats: mp3 (default), m4a, opus, wav

Examples

# Download 4K video
pull-vids -q 2160p "https://www.youtube.com/watch?v=VIDEO_ID"# Download as MP3
pull-vids -a -f mp3 "https://www.youtube.com/watch?v=VIDEO_ID"# Download playlist to Music folder
pull-vids -a -p -o ~/Music "https://www.youtube.com/playlist?list=PLAYLIST_ID"# Download in MKV format
pull-vids -f mkv "https://www.youtube.com/watch?v=VIDEO_ID"# Download with cookies for YouTube bot detection
pull-vids --cookies-from-browser firefox "https://www.youtube.com/watch?v=VIDEO_ID"# Download long playlist with rate limit protection
pull-vids --cookies-from-browser firefox --sleep-interval 5 -p "https://www.youtube.com/playlist?list=PLAYLIST_ID"

Why pull-vids?

  • Free Forever - No subscriptions, no trials, no limitations
  • Open Source - Transparent code you can trust and modify
  • Privacy Focused - No tracking, no data collection
  • Powerful - Built on yt-dlp, supporting 1000+ video platforms
  • Simple - Clean CLI interface, no bloat
  • Fast - Compiles to a single binary with zero startup time
  • Portable - Single executable, no runtime dependencies

Limitations

DRM-Protected Content

This tool CANNOT download DRM-protected content. This includes:

  • ❌ Amazon Prime Video
  • ❌ Netflix
  • ❌ Disney+
  • ❌ Hulu
  • ❌ HBO Max
  • ❌ Apple TV+
  • ❌ Other paid streaming services

Why? These services use DRM (Digital Rights Management) protection. yt-dlp does not and will not support bypassing DRM due to legal restrictions and ethical reasons.

What You CAN Download

User-uploaded content:

  • YouTube (videos, playlists, channels, live streams)
  • Vimeo (public and password-protected videos)
  • Social media (Twitter, TikTok, Instagram, Facebook)
  • Twitch (VODs and clips)
  • Reddit (v.redd.it videos)
  • And 1000+ other sites with publicly accessible content

Public platforms where content creators share their work ✅ Content you have legal rights to download

Note: Just because you can download something doesn't mean you should. Always respect:

  • Copyright laws
  • Platform Terms of Service
  • Content creator rights
  • Fair use guidelines

Troubleshooting

brew upgrade says "pull-vids 64 already installed" and never updates:

Run this once on the affected machine:

brew uninstall pull-vids && brew install vib795/tap/pull-vids

Formulas before 0.3.3 did not declare a version, so Homebrew inferred one from the download filename — pull-vids-darwin-arm64.tar.gz yields 64. Every release looked like version 64, so the binary was installed into Cellar/pull-vids/64 and each new release appeared to be already installed.

brew upgrade cannot repair this, because it compares the installed version against the formula version and 64 sorts higher than 0.3.4. Homebrew concludes the installed copy is newer and declines. Only a fresh install rebuilds the keg under the correct name.

Releases from 0.3.3 onward declare the version explicitly, so this is a one-time cleanup. Machines installing fresh are unaffected and upgrade normally.

"ffmpeg not found" error:

  • Make sure ffmpeg is installed and in your PATH
  • Try running ffmpeg -version to verify installation

"No video formats found" error:

  • The video might be region-locked or unavailable
  • Try a different quality setting
  • Check if the URL is correct

"Sign in to confirm you're not a bot" error:

  • See the YouTube Authentication (Cookie Support) section above
  • Use --cookies-from-browser or --cookies flag
  • pull-vids will automatically retry up to 3 times with exponential backoff (30s, 60s, 120s)

Rate limiting on long playlists:

  • Use --sleep-interval 5 to add delays between downloads
  • Recommended: 5-10 seconds for playlists with 30+ videos
  • Automatic retry kicks in if rate limiting is detected despite the sleep interval

Slow downloads:

  • Google's CDN throttles each connection separately, so a single stream is slow no matter how fast your link is. Raise the connection count: -N 16
  • Install aria2 (brew install aria2) if it is missing; without it pull-vids falls back to a downloader that can only parallelise fragmented formats
  • Writing to a network share caps throughput at the share's write speed
  • See Download Speed for measured numbers
  • Use a different quality setting
  • Some platforms have rate limits

Contributing

Contributions are welcome! Feel free to open issues or submit pull requests.

License

MIT License - feel free to use this tool however you want!

Credits

Core:

  • yt-dlp - The amazing YouTube downloading library

Go libraries:

Inspired by Downie and PullTube, but free and open-source!

Disclaimer

This tool is for personal use only. Please respect copyright laws and each platform's Terms of Service. Only download videos you have the right to download.

About

Universal video downloader CLI supporting 1000+ websites. Free, open-source alternative to Downie/PullTube built with Go.

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

pull-vids

GitHub releaseHomebrewLicense: MITGo VersionGitHub stars

A free, open-source CLI tool for downloading videos and audio from 1000+ websites. Inspired by tools like Downie and PullTube, but completely free!

Built with Go for blazingly fast performance! 🚀

Supported Platforms

Works with any site supported by yt-dlp, including:

  • YouTube - Videos, playlists, channels
  • Vimeo - Videos and channels
  • Twitter/X - Videos and GIFs
  • TikTok - Videos
  • Instagram - Videos, Reels, Stories
  • Facebook - Videos
  • Twitch - VODs and clips
  • Reddit - Videos from v.redd.it
  • Dailymotion - Videos
  • And 1000+ more! - Full list

Features

  • Download videos from 1000+ websites
  • Cookie authentication for YouTube bot detection bypass
  • Automatic retry with exponential backoff for rate limiting
  • Sleep intervals between downloads to avoid rate limits
  • Various quality options (360p to 4K)
  • Audio-only extraction (MP3, M4A, etc.)
  • Playlist and channel support
  • Beautiful real-time progress bars
  • Cross-platform (Windows, macOS, Linux)
  • Single binary - no dependencies to install
  • Fast startup - < 1ms
  • No ads, no paywalls, just downloads

Demo

Demo

Installation

Package Managers (Recommended)

macOS (Homebrew):

brew tap vib795/tap
brew install pull-vids

Upgrading from a version before 0.3.3? Run this once, on each machine:

brew uninstall pull-vids && brew install vib795/tap/pull-vids

brew upgrade will report pull-vids 64 already installed and do nothing. See Troubleshooting for why.

Any platform with Go 1.24+:

go install github.com/vib795/pull-vids@latest

Chocolatey, APT, AUR and Snap are not available yet. Earlier versions of this README listed them before the packages were published, so choco install pull-vids and friends fail with "package was not found". Use Homebrew, go install, or the install scripts below. Tracking issue: #10.

Quick Install Script

macOS / Linux:

curl -fsSL https://raw.githubusercontent.com/vib795/pull-vids/develop/install.sh | bash

Windows (PowerShell as Administrator):

irm https://raw.githubusercontent.com/vib795/pull-vids/develop/install.ps1 | iex

Manual Installation

Option 1: Download Pre-built Binary

Download the latest release for your platform from Releases:

Releases ship as compressed archives, so download and extract before installing.

macOS:

# Apple Silicon (M1/M2/M3) - use darwin-amd64 on Intel
curl -L https://github.com/vib795/pull-vids/releases/latest/download/pull-vids-darwin-arm64.tar.gz -o pull-vids.tar.gz
tar -xzf pull-vids.tar.gz
chmod +x pull-vids-darwin-arm64
sudo mv pull-vids-darwin-arm64 /usr/local/bin/pull-vids

Linux:

# AMD64 - use linux-arm64 on ARM
curl -L https://github.com/vib795/pull-vids/releases/latest/download/pull-vids-linux-amd64.tar.gz -o pull-vids.tar.gz
tar -xzf pull-vids.tar.gz
chmod +x pull-vids-linux-amd64
sudo mv pull-vids-linux-amd64 /usr/local/bin/pull-vids

Windows:

  1. Download pull-vids-windows-amd64.zip
  2. Extract it, then rename pull-vids-windows-amd64.exe to pull-vids.exe
  3. Move it to a directory in your PATH (e.g., C:\Program Files\pull-vids\)

Option 2: Build from Source

Requirements:

  • Go 1.24 or higher (see go.mod)
  • Git

Build:

# Clone the repository
git clone https://github.com/vib795/pull-vids.git
cd pull-vids
# Build for your platform
make build
# Or build for all platforms
make build-all
# Install to system
make install

Install Dependencies

pull-vids requires ffmpeg and yt-dlp to work:

macOS:

brew install ffmpeg yt-dlp

Ubuntu/Debian:

sudo apt update
sudo apt install ffmpeg
pip install yt-dlp

Windows:

winget install ffmpeg
pip install yt-dlp

Verify installation:

ffmpeg -version
yt-dlp --version
pull-vids --version

Usage

Basic Examples

Download from YouTube:

pull-vids "https://www.youtube.com/watch?v=VIDEO_ID"

Download from Vimeo:

pull-vids "https://vimeo.com/123456789"

Download from Twitter/X:

pull-vids "https://twitter.com/user/status/123456"

Download from TikTok:

pull-vids "https://www.tiktok.com/@user/video/123456"

Download from Instagram:

pull-vids "https://www.instagram.com/p/ABC123/"

Download from Twitch:

pull-vids "https://www.twitch.tv/videos/123456789"

Download audio only:

pull-vids -a "https://www.youtube.com/watch?v=VIDEO_ID"

Download in specific quality:

pull-vids -q 720p "https://vimeo.com/123456789"

Download to a specific directory:

pull-vids -o ~/Videos "https://www.youtube.com/watch?v=VIDEO_ID"

Download entire playlist:

pull-vids -p "https://www.youtube.com/playlist?list=PLAYLIST_ID"

YouTube Authentication (Cookie Support)

If you get a bot detection error from YouTube, you'll need to authenticate using cookies from your browser.

Option 1: Export Cookies Manually (Recommended - Most Reliable)

  1. Install a browser extension to export cookies:

  2. Visit YouTube and make sure you're logged in

  3. Click the extension icon and export cookies for youtube.com

  4. Save the file (e.g., youtube-cookies.txt)

  5. Use with pull-vids:

    pull-vids --cookies youtube-cookies.txt "https://www.youtube.com/watch?v=VIDEO_ID"

Option 2: Extract Cookies from Browser

Firefox (usually works without issues):

pull-vids --cookies-from-browser firefox "https://www.youtube.com/watch?v=VIDEO_ID"

Chrome:

pull-vids --cookies-from-browser chrome "https://www.youtube.com/watch?v=VIDEO_ID"

Safari (macOS only):

pull-vids --cookies-from-browser safari "https://www.youtube.com/watch?v=VIDEO_ID"

⚠️ macOS Safari Users: If you get a permission error, you need to grant Full Disk Access:

  1. Open System SettingsPrivacy & SecurityFull Disk Access
  2. Click the + button and add your terminal app (Terminal.app or iTerm2)
  3. Restart your terminal
  4. Try again

⚠️ Chrome/Chromium Users: If Chrome doesn't work, try exporting cookies manually (Option 1) or use Firefox.

Supported browsers:firefox, chrome, safari, edge, chromium, brave, opera, vivaldi

Important: Make sure you're logged into YouTube in the browser before extracting cookies!

Command-Line Options

usage: pull-vids [-h] [-o OUTPUT] [-q QUALITY] [-a] [-p] [-f FORMAT]
[--cookies COOKIES] [--cookies-from-browser BROWSER]
[--sleep-interval SECONDS] [-N CONNECTIONS]
[--downloader BACKEND] [--http-chunk-size SIZE]
[-v] [--no-banner] url
positional arguments:
url Video URL from any supported site (1000+ platforms)
options:
-h, --help show this help message and exit
-o OUTPUT, --output OUTPUT
Output directory (default: ~/Downloads/pull-vids)
-q QUALITY, --quality QUALITY
Video quality: best, high, medium, low, 2160p, 1440p, 1080p, 720p, 480p, 360p
(default: best)
-a, --audio-only Download audio only
-p, --playlist Download entire playlist
-f FORMAT, --format FORMAT
Output format (mp4, mkv, mp3, m4a, etc.)
--cookies COOKIES Path to cookies file (Netscape format)
--cookies-from-browser BROWSER
Extract cookies from browser (chrome, firefox, safari, edge, etc.)
--sleep-interval SECONDS
Sleep interval in seconds between downloads (avoids rate limiting)
-N, --connections N Parallel connections per download (default: 8)
--downloader BACKEND Transfer backend: auto, native, or aria2c (default: auto)
--http-chunk-size SIZE
Chunk size for the native downloader (default: 10M)
-v, --version show program's version number and exit
--no-banner Don't show the banner

Download Speed

Google's CDN rate-limits each TCP connection independently, at roughly 3 MB/s per connection. A single-stream download therefore leaves a fast link almost entirely idle, and adding connections scales throughput close to linearly:

ConnectionsThroughput
13.3 MB/s
412.5 MB/s
825.8 MB/s
1648.7 MB/s
3295.2 MB/s (saturates a 1 Gbps link)

pull-vids uses 8 connections by default. To go faster:

pull-vids -N 16 "https://www.youtube.com/watch?v=VIDEO_ID"

Two things worth knowing:

  • Install aria2 for the full benefit. With --downloader auto (the default), aria2c is used when available and splits any URL into parallel ranged requests. Without it, the native downloader can only parallelise formats that are already fragmented. Homebrew installs it as a dependency.
  • Do not raise -N indefinitely. The CDN returns HTTP 403 when the connection count is too high. pull-vids detects this and halves the connection count on each retry, but starting lower (-N 4) is more reliable for large batches.

Your storage matters too: writing to a network share caps throughput at the share's write speed regardless of connection count.

Quality Options

  • best - Best available quality (default)
  • high - Up to 1080p
  • medium - Up to 720p
  • low - Up to 480p
  • 2160p, 1440p, 1080p, 720p, 480p, 360p - Specific resolutions

Format Options

Video formats: mp4 (default), mkv, webm Audio formats: mp3 (default), m4a, opus, wav

Examples

# Download 4K video
pull-vids -q 2160p "https://www.youtube.com/watch?v=VIDEO_ID"# Download as MP3
pull-vids -a -f mp3 "https://www.youtube.com/watch?v=VIDEO_ID"# Download playlist to Music folder
pull-vids -a -p -o ~/Music "https://www.youtube.com/playlist?list=PLAYLIST_ID"# Download in MKV format
pull-vids -f mkv "https://www.youtube.com/watch?v=VIDEO_ID"# Download with cookies for YouTube bot detection
pull-vids --cookies-from-browser firefox "https://www.youtube.com/watch?v=VIDEO_ID"# Download long playlist with rate limit protection
pull-vids --cookies-from-browser firefox --sleep-interval 5 -p "https://www.youtube.com/playlist?list=PLAYLIST_ID"

Why pull-vids?

  • Free Forever - No subscriptions, no trials, no limitations
  • Open Source - Transparent code you can trust and modify
  • Privacy Focused - No tracking, no data collection
  • Powerful - Built on yt-dlp, supporting 1000+ video platforms
  • Simple - Clean CLI interface, no bloat
  • Fast - Compiles to a single binary with zero startup time
  • Portable - Single executable, no runtime dependencies

Limitations

DRM-Protected Content

This tool CANNOT download DRM-protected content. This includes:

  • ❌ Amazon Prime Video
  • ❌ Netflix
  • ❌ Disney+
  • ❌ Hulu
  • ❌ HBO Max
  • ❌ Apple TV+
  • ❌ Other paid streaming services

Why? These services use DRM (Digital Rights Management) protection. yt-dlp does not and will not support bypassing DRM due to legal restrictions and ethical reasons.

What You CAN Download

User-uploaded content:

  • YouTube (videos, playlists, channels, live streams)
  • Vimeo (public and password-protected videos)
  • Social media (Twitter, TikTok, Instagram, Facebook)
  • Twitch (VODs and clips)
  • Reddit (v.redd.it videos)
  • And 1000+ other sites with publicly accessible content

Public platforms where content creators share their work ✅ Content you have legal rights to download

Note: Just because you can download something doesn't mean you should. Always respect:

  • Copyright laws
  • Platform Terms of Service
  • Content creator rights
  • Fair use guidelines

Troubleshooting

brew upgrade says "pull-vids 64 already installed" and never updates:

Run this once on the affected machine:

brew uninstall pull-vids && brew install vib795/tap/pull-vids

Formulas before 0.3.3 did not declare a version, so Homebrew inferred one from the download filename — pull-vids-darwin-arm64.tar.gz yields 64. Every release looked like version 64, so the binary was installed into Cellar/pull-vids/64 and each new release appeared to be already installed.

brew upgrade cannot repair this, because it compares the installed version against the formula version and 64 sorts higher than 0.3.4. Homebrew concludes the installed copy is newer and declines. Only a fresh install rebuilds the keg under the correct name.

Releases from 0.3.3 onward declare the version explicitly, so this is a one-time cleanup. Machines installing fresh are unaffected and upgrade normally.

"ffmpeg not found" error:

  • Make sure ffmpeg is installed and in your PATH
  • Try running ffmpeg -version to verify installation

"No video formats found" error:

  • The video might be region-locked or unavailable
  • Try a different quality setting
  • Check if the URL is correct

"Sign in to confirm you're not a bot" error:

  • See the YouTube Authentication (Cookie Support) section above
  • Use --cookies-from-browser or --cookies flag
  • pull-vids will automatically retry up to 3 times with exponential backoff (30s, 60s, 120s)

Rate limiting on long playlists:

  • Use --sleep-interval 5 to add delays between downloads
  • Recommended: 5-10 seconds for playlists with 30+ videos
  • Automatic retry kicks in if rate limiting is detected despite the sleep interval

Slow downloads:

  • Google's CDN throttles each connection separately, so a single stream is slow no matter how fast your link is. Raise the connection count: -N 16
  • Install aria2 (brew install aria2) if it is missing; without it pull-vids falls back to a downloader that can only parallelise fragmented formats
  • Writing to a network share caps throughput at the share's write speed
  • See Download Speed for measured numbers
  • Use a different quality setting
  • Some platforms have rate limits

Contributing

Contributions are welcome! Feel free to open issues or submit pull requests.

License

MIT License - feel free to use this tool however you want!

Credits

Core:

  • yt-dlp - The amazing YouTube downloading library

Go libraries:

Inspired by Downie and PullTube, but free and open-source!

Disclaimer

This tool is for personal use only. Please respect copyright laws and each platform's Terms of Service. Only download videos you have the right to download.

About

Universal video downloader CLI supporting 1000+ websites. Free, open-source alternative to Downie/PullTube built with Go.

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

pull-vids

GitHub releaseHomebrewLicense: MITGo VersionGitHub stars

A free, open-source CLI tool for downloading videos and audio from 1000+ websites. Inspired by tools like Downie and PullTube, but completely free!

Built with Go for blazingly fast performance! 🚀

Supported Platforms

Works with any site supported by yt-dlp, including:

  • YouTube - Videos, playlists, channels
  • Vimeo - Videos and channels
  • Twitter/X - Videos and GIFs
  • TikTok - Videos
  • Instagram - Videos, Reels, Stories
  • Facebook - Videos
  • Twitch - VODs and clips
  • Reddit - Videos from v.redd.it
  • Dailymotion - Videos
  • And 1000+ more! - Full list

Features

  • Download videos from 1000+ websites
  • Cookie authentication for YouTube bot detection bypass
  • Automatic retry with exponential backoff for rate limiting
  • Sleep intervals between downloads to avoid rate limits
  • Various quality options (360p to 4K)
  • Audio-only extraction (MP3, M4A, etc.)
  • Playlist and channel support
  • Beautiful real-time progress bars
  • Cross-platform (Windows, macOS, Linux)
  • Single binary - no dependencies to install
  • Fast startup - < 1ms
  • No ads, no paywalls, just downloads

Demo

Demo

Installation

Package Managers (Recommended)

macOS (Homebrew):

brew tap vib795/tap
brew install pull-vids

Upgrading from a version before 0.3.3? Run this once, on each machine:

brew uninstall pull-vids && brew install vib795/tap/pull-vids

brew upgrade will report pull-vids 64 already installed and do nothing. See Troubleshooting for why.

Any platform with Go 1.24+:

go install github.com/vib795/pull-vids@latest

Chocolatey, APT, AUR and Snap are not available yet. Earlier versions of this README listed them before the packages were published, so choco install pull-vids and friends fail with "package was not found". Use Homebrew, go install, or the install scripts below. Tracking issue: #10.

Quick Install Script

macOS / Linux:

curl -fsSL https://raw.githubusercontent.com/vib795/pull-vids/develop/install.sh | bash

Windows (PowerShell as Administrator):

irm https://raw.githubusercontent.com/vib795/pull-vids/develop/install.ps1 | iex

Manual Installation

Option 1: Download Pre-built Binary

Download the latest release for your platform from Releases:

Releases ship as compressed archives, so download and extract before installing.

macOS:

# Apple Silicon (M1/M2/M3) - use darwin-amd64 on Intel
curl -L https://github.com/vib795/pull-vids/releases/latest/download/pull-vids-darwin-arm64.tar.gz -o pull-vids.tar.gz
tar -xzf pull-vids.tar.gz
chmod +x pull-vids-darwin-arm64
sudo mv pull-vids-darwin-arm64 /usr/local/bin/pull-vids

Linux:

# AMD64 - use linux-arm64 on ARM
curl -L https://github.com/vib795/pull-vids/releases/latest/download/pull-vids-linux-amd64.tar.gz -o pull-vids.tar.gz
tar -xzf pull-vids.tar.gz
chmod +x pull-vids-linux-amd64
sudo mv pull-vids-linux-amd64 /usr/local/bin/pull-vids

Windows:

  1. Download pull-vids-windows-amd64.zip
  2. Extract it, then rename pull-vids-windows-amd64.exe to pull-vids.exe
  3. Move it to a directory in your PATH (e.g., C:\Program Files\pull-vids\)

Option 2: Build from Source

Requirements:

  • Go 1.24 or higher (see go.mod)
  • Git

Build:

# Clone the repository
git clone https://github.com/vib795/pull-vids.git
cd pull-vids
# Build for your platform
make build
# Or build for all platforms
make build-all
# Install to system
make install

Install Dependencies

pull-vids requires ffmpeg and yt-dlp to work:

macOS:

brew install ffmpeg yt-dlp

Ubuntu/Debian:

sudo apt update
sudo apt install ffmpeg
pip install yt-dlp

Windows:

winget install ffmpeg
pip install yt-dlp

Verify installation:

ffmpeg -version
yt-dlp --version
pull-vids --version

Usage

Basic Examples

Download from YouTube:

pull-vids "https://www.youtube.com/watch?v=VIDEO_ID"

Download from Vimeo:

pull-vids "https://vimeo.com/123456789"

Download from Twitter/X:

pull-vids "https://twitter.com/user/status/123456"

Download from TikTok:

pull-vids "https://www.tiktok.com/@user/video/123456"

Download from Instagram:

pull-vids "https://www.instagram.com/p/ABC123/"

Download from Twitch:

pull-vids "https://www.twitch.tv/videos/123456789"

Download audio only:

pull-vids -a "https://www.youtube.com/watch?v=VIDEO_ID"

Download in specific quality:

pull-vids -q 720p "https://vimeo.com/123456789"

Download to a specific directory:

pull-vids -o ~/Videos "https://www.youtube.com/watch?v=VIDEO_ID"

Download entire playlist:

pull-vids -p "https://www.youtube.com/playlist?list=PLAYLIST_ID"

YouTube Authentication (Cookie Support)

If you get a bot detection error from YouTube, you'll need to authenticate using cookies from your browser.

Option 1: Export Cookies Manually (Recommended - Most Reliable)

  1. Install a browser extension to export cookies:

  2. Visit YouTube and make sure you're logged in

  3. Click the extension icon and export cookies for youtube.com

  4. Save the file (e.g., youtube-cookies.txt)

  5. Use with pull-vids:

    pull-vids --cookies youtube-cookies.txt "https://www.youtube.com/watch?v=VIDEO_ID"

Option 2: Extract Cookies from Browser

Firefox (usually works without issues):

pull-vids --cookies-from-browser firefox "https://www.youtube.com/watch?v=VIDEO_ID"

Chrome:

pull-vids --cookies-from-browser chrome "https://www.youtube.com/watch?v=VIDEO_ID"

Safari (macOS only):

pull-vids --cookies-from-browser safari "https://www.youtube.com/watch?v=VIDEO_ID"

⚠️ macOS Safari Users: If you get a permission error, you need to grant Full Disk Access:

  1. Open System SettingsPrivacy & SecurityFull Disk Access
  2. Click the + button and add your terminal app (Terminal.app or iTerm2)
  3. Restart your terminal
  4. Try again

⚠️ Chrome/Chromium Users: If Chrome doesn't work, try exporting cookies manually (Option 1) or use Firefox.

Supported browsers:firefox, chrome, safari, edge, chromium, brave, opera, vivaldi

Important: Make sure you're logged into YouTube in the browser before extracting cookies!

Command-Line Options

usage: pull-vids [-h] [-o OUTPUT] [-q QUALITY] [-a] [-p] [-f FORMAT]
[--cookies COOKIES] [--cookies-from-browser BROWSER]
[--sleep-interval SECONDS] [-N CONNECTIONS]
[--downloader BACKEND] [--http-chunk-size SIZE]
[-v] [--no-banner] url
positional arguments:
url Video URL from any supported site (1000+ platforms)
options:
-h, --help show this help message and exit
-o OUTPUT, --output OUTPUT
Output directory (default: ~/Downloads/pull-vids)
-q QUALITY, --quality QUALITY
Video quality: best, high, medium, low, 2160p, 1440p, 1080p, 720p, 480p, 360p
(default: best)
-a, --audio-only Download audio only
-p, --playlist Download entire playlist
-f FORMAT, --format FORMAT
Output format (mp4, mkv, mp3, m4a, etc.)
--cookies COOKIES Path to cookies file (Netscape format)
--cookies-from-browser BROWSER
Extract cookies from browser (chrome, firefox, safari, edge, etc.)
--sleep-interval SECONDS
Sleep interval in seconds between downloads (avoids rate limiting)
-N, --connections N Parallel connections per download (default: 8)
--downloader BACKEND Transfer backend: auto, native, or aria2c (default: auto)
--http-chunk-size SIZE
Chunk size for the native downloader (default: 10M)
-v, --version show program's version number and exit
--no-banner Don't show the banner

Download Speed

Google's CDN rate-limits each TCP connection independently, at roughly 3 MB/s per connection. A single-stream download therefore leaves a fast link almost entirely idle, and adding connections scales throughput close to linearly:

ConnectionsThroughput
13.3 MB/s
412.5 MB/s
825.8 MB/s
1648.7 MB/s
3295.2 MB/s (saturates a 1 Gbps link)

pull-vids uses 8 connections by default. To go faster:

pull-vids -N 16 "https://www.youtube.com/watch?v=VIDEO_ID"

Two things worth knowing:

  • Install aria2 for the full benefit. With --downloader auto (the default), aria2c is used when available and splits any URL into parallel ranged requests. Without it, the native downloader can only parallelise formats that are already fragmented. Homebrew installs it as a dependency.
  • Do not raise -N indefinitely. The CDN returns HTTP 403 when the connection count is too high. pull-vids detects this and halves the connection count on each retry, but starting lower (-N 4) is more reliable for large batches.

Your storage matters too: writing to a network share caps throughput at the share's write speed regardless of connection count.

Quality Options

  • best - Best available quality (default)
  • high - Up to 1080p
  • medium - Up to 720p
  • low - Up to 480p
  • 2160p, 1440p, 1080p, 720p, 480p, 360p - Specific resolutions

Format Options

Video formats: mp4 (default), mkv, webm Audio formats: mp3 (default), m4a, opus, wav

Examples

# Download 4K video
pull-vids -q 2160p "https://www.youtube.com/watch?v=VIDEO_ID"# Download as MP3
pull-vids -a -f mp3 "https://www.youtube.com/watch?v=VIDEO_ID"# Download playlist to Music folder
pull-vids -a -p -o ~/Music "https://www.youtube.com/playlist?list=PLAYLIST_ID"# Download in MKV format
pull-vids -f mkv "https://www.youtube.com/watch?v=VIDEO_ID"# Download with cookies for YouTube bot detection
pull-vids --cookies-from-browser firefox "https://www.youtube.com/watch?v=VIDEO_ID"# Download long playlist with rate limit protection
pull-vids --cookies-from-browser firefox --sleep-interval 5 -p "https://www.youtube.com/playlist?list=PLAYLIST_ID"

Why pull-vids?

  • Free Forever - No subscriptions, no trials, no limitations
  • Open Source - Transparent code you can trust and modify
  • Privacy Focused - No tracking, no data collection
  • Powerful - Built on yt-dlp, supporting 1000+ video platforms
  • Simple - Clean CLI interface, no bloat
  • Fast - Compiles to a single binary with zero startup time
  • Portable - Single executable, no runtime dependencies

Limitations

DRM-Protected Content

This tool CANNOT download DRM-protected content. This includes:

  • ❌ Amazon Prime Video
  • ❌ Netflix
  • ❌ Disney+
  • ❌ Hulu
  • ❌ HBO Max
  • ❌ Apple TV+
  • ❌ Other paid streaming services

Why? These services use DRM (Digital Rights Management) protection. yt-dlp does not and will not support bypassing DRM due to legal restrictions and ethical reasons.

What You CAN Download

User-uploaded content:

  • YouTube (videos, playlists, channels, live streams)
  • Vimeo (public and password-protected videos)
  • Social media (Twitter, TikTok, Instagram, Facebook)
  • Twitch (VODs and clips)
  • Reddit (v.redd.it videos)
  • And 1000+ other sites with publicly accessible content

Public platforms where content creators share their work ✅ Content you have legal rights to download

Note: Just because you can download something doesn't mean you should. Always respect:

  • Copyright laws
  • Platform Terms of Service
  • Content creator rights
  • Fair use guidelines

Troubleshooting

brew upgrade says "pull-vids 64 already installed" and never updates:

Run this once on the affected machine:

brew uninstall pull-vids && brew install vib795/tap/pull-vids

Formulas before 0.3.3 did not declare a version, so Homebrew inferred one from the download filename — pull-vids-darwin-arm64.tar.gz yields 64. Every release looked like version 64, so the binary was installed into Cellar/pull-vids/64 and each new release appeared to be already installed.

brew upgrade cannot repair this, because it compares the installed version against the formula version and 64 sorts higher than 0.3.4. Homebrew concludes the installed copy is newer and declines. Only a fresh install rebuilds the keg under the correct name.

Releases from 0.3.3 onward declare the version explicitly, so this is a one-time cleanup. Machines installing fresh are unaffected and upgrade normally.

"ffmpeg not found" error:

  • Make sure ffmpeg is installed and in your PATH
  • Try running ffmpeg -version to verify installation

"No video formats found" error:

  • The video might be region-locked or unavailable
  • Try a different quality setting
  • Check if the URL is correct

"Sign in to confirm you're not a bot" error:

  • See the YouTube Authentication (Cookie Support) section above
  • Use --cookies-from-browser or --cookies flag
  • pull-vids will automatically retry up to 3 times with exponential backoff (30s, 60s, 120s)

Rate limiting on long playlists:

  • Use --sleep-interval 5 to add delays between downloads
  • Recommended: 5-10 seconds for playlists with 30+ videos
  • Automatic retry kicks in if rate limiting is detected despite the sleep interval

Slow downloads:

  • Google's CDN throttles each connection separately, so a single stream is slow no matter how fast your link is. Raise the connection count: -N 16
  • Install aria2 (brew install aria2) if it is missing; without it pull-vids falls back to a downloader that can only parallelise fragmented formats
  • Writing to a network share caps throughput at the share's write speed
  • See Download Speed for measured numbers
  • Use a different quality setting
  • Some platforms have rate limits

Contributing

Contributions are welcome! Feel free to open issues or submit pull requests.

License

MIT License - feel free to use this tool however you want!

Credits

Core:

  • yt-dlp - The amazing YouTube downloading library

Go libraries:

Inspired by Downie and PullTube, but free and open-source!

Disclaimer

This tool is for personal use only. Please respect copyright laws and each platform's Terms of Service. Only download videos you have the right to download.

About

Universal video downloader CLI supporting 1000+ websites. Free, open-source alternative to Downie/PullTube built with Go.

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

pull-vids

GitHub releaseHomebrewLicense: MITGo VersionGitHub stars

A free, open-source CLI tool for downloading videos and audio from 1000+ websites. Inspired by tools like Downie and PullTube, but completely free!

Built with Go for blazingly fast performance! 🚀

Supported Platforms

Works with any site supported by yt-dlp, including:

  • YouTube - Videos, playlists, channels
  • Vimeo - Videos and channels
  • Twitter/X - Videos and GIFs
  • TikTok - Videos
  • Instagram - Videos, Reels, Stories
  • Facebook - Videos
  • Twitch - VODs and clips
  • Reddit - Videos from v.redd.it
  • Dailymotion - Videos
  • And 1000+ more! - Full list

Features

  • Download videos from 1000+ websites
  • Cookie authentication for YouTube bot detection bypass
  • Automatic retry with exponential backoff for rate limiting
  • Sleep intervals between downloads to avoid rate limits
  • Various quality options (360p to 4K)
  • Audio-only extraction (MP3, M4A, etc.)
  • Playlist and channel support
  • Beautiful real-time progress bars
  • Cross-platform (Windows, macOS, Linux)
  • Single binary - no dependencies to install
  • Fast startup - < 1ms
  • No ads, no paywalls, just downloads

Demo

Demo

Installation

Package Managers (Recommended)

macOS (Homebrew):

brew tap vib795/tap
brew install pull-vids

Upgrading from a version before 0.3.3? Run this once, on each machine:

brew uninstall pull-vids && brew install vib795/tap/pull-vids

brew upgrade will report pull-vids 64 already installed and do nothing. See Troubleshooting for why.

Any platform with Go 1.24+:

go install github.com/vib795/pull-vids@latest

Chocolatey, APT, AUR and Snap are not available yet. Earlier versions of this README listed them before the packages were published, so choco install pull-vids and friends fail with "package was not found". Use Homebrew, go install, or the install scripts below. Tracking issue: #10.

Quick Install Script

macOS / Linux:

curl -fsSL https://raw.githubusercontent.com/vib795/pull-vids/develop/install.sh | bash

Windows (PowerShell as Administrator):

irm https://raw.githubusercontent.com/vib795/pull-vids/develop/install.ps1 | iex

Manual Installation

Option 1: Download Pre-built Binary

Download the latest release for your platform from Releases:

Releases ship as compressed archives, so download and extract before installing.

macOS:

# Apple Silicon (M1/M2/M3) - use darwin-amd64 on Intel
curl -L https://github.com/vib795/pull-vids/releases/latest/download/pull-vids-darwin-arm64.tar.gz -o pull-vids.tar.gz
tar -xzf pull-vids.tar.gz
chmod +x pull-vids-darwin-arm64
sudo mv pull-vids-darwin-arm64 /usr/local/bin/pull-vids

Linux:

# AMD64 - use linux-arm64 on ARM
curl -L https://github.com/vib795/pull-vids/releases/latest/download/pull-vids-linux-amd64.tar.gz -o pull-vids.tar.gz
tar -xzf pull-vids.tar.gz
chmod +x pull-vids-linux-amd64
sudo mv pull-vids-linux-amd64 /usr/local/bin/pull-vids

Windows:

  1. Download pull-vids-windows-amd64.zip
  2. Extract it, then rename pull-vids-windows-amd64.exe to pull-vids.exe
  3. Move it to a directory in your PATH (e.g., C:\Program Files\pull-vids\)

Option 2: Build from Source

Requirements:

  • Go 1.24 or higher (see go.mod)
  • Git

Build:

# Clone the repository
git clone https://github.com/vib795/pull-vids.git
cd pull-vids
# Build for your platform
make build
# Or build for all platforms
make build-all
# Install to system
make install

Install Dependencies

pull-vids requires ffmpeg and yt-dlp to work:

macOS:

brew install ffmpeg yt-dlp

Ubuntu/Debian:

sudo apt update
sudo apt install ffmpeg
pip install yt-dlp

Windows:

winget install ffmpeg
pip install yt-dlp

Verify installation:

ffmpeg -version
yt-dlp --version
pull-vids --version

Usage

Basic Examples

Download from YouTube:

pull-vids "https://www.youtube.com/watch?v=VIDEO_ID"

Download from Vimeo:

pull-vids "https://vimeo.com/123456789"

Download from Twitter/X:

pull-vids "https://twitter.com/user/status/123456"

Download from TikTok:

pull-vids "https://www.tiktok.com/@user/video/123456"

Download from Instagram:

pull-vids "https://www.instagram.com/p/ABC123/"

Download from Twitch:

pull-vids "https://www.twitch.tv/videos/123456789"

Download audio only:

pull-vids -a "https://www.youtube.com/watch?v=VIDEO_ID"

Download in specific quality:

pull-vids -q 720p "https://vimeo.com/123456789"

Download to a specific directory:

pull-vids -o ~/Videos "https://www.youtube.com/watch?v=VIDEO_ID"

Download entire playlist:

pull-vids -p "https://www.youtube.com/playlist?list=PLAYLIST_ID"

YouTube Authentication (Cookie Support)

If you get a bot detection error from YouTube, you'll need to authenticate using cookies from your browser.

Option 1: Export Cookies Manually (Recommended - Most Reliable)

  1. Install a browser extension to export cookies:

  2. Visit YouTube and make sure you're logged in

  3. Click the extension icon and export cookies for youtube.com

  4. Save the file (e.g., youtube-cookies.txt)

  5. Use with pull-vids:

    pull-vids --cookies youtube-cookies.txt "https://www.youtube.com/watch?v=VIDEO_ID"

Option 2: Extract Cookies from Browser

Firefox (usually works without issues):

pull-vids --cookies-from-browser firefox "https://www.youtube.com/watch?v=VIDEO_ID"

Chrome:

pull-vids --cookies-from-browser chrome "https://www.youtube.com/watch?v=VIDEO_ID"

Safari (macOS only):

pull-vids --cookies-from-browser safari "https://www.youtube.com/watch?v=VIDEO_ID"

⚠️ macOS Safari Users: If you get a permission error, you need to grant Full Disk Access:

  1. Open System SettingsPrivacy & SecurityFull Disk Access
  2. Click the + button and add your terminal app (Terminal.app or iTerm2)
  3. Restart your terminal
  4. Try again

⚠️ Chrome/Chromium Users: If Chrome doesn't work, try exporting cookies manually (Option 1) or use Firefox.

Supported browsers:firefox, chrome, safari, edge, chromium, brave, opera, vivaldi

Important: Make sure you're logged into YouTube in the browser before extracting cookies!

Command-Line Options

usage: pull-vids [-h] [-o OUTPUT] [-q QUALITY] [-a] [-p] [-f FORMAT]
[--cookies COOKIES] [--cookies-from-browser BROWSER]
[--sleep-interval SECONDS] [-N CONNECTIONS]
[--downloader BACKEND] [--http-chunk-size SIZE]
[-v] [--no-banner] url
positional arguments:
url Video URL from any supported site (1000+ platforms)
options:
-h, --help show this help message and exit
-o OUTPUT, --output OUTPUT
Output directory (default: ~/Downloads/pull-vids)
-q QUALITY, --quality QUALITY
Video quality: best, high, medium, low, 2160p, 1440p, 1080p, 720p, 480p, 360p
(default: best)
-a, --audio-only Download audio only
-p, --playlist Download entire playlist
-f FORMAT, --format FORMAT
Output format (mp4, mkv, mp3, m4a, etc.)
--cookies COOKIES Path to cookies file (Netscape format)
--cookies-from-browser BROWSER
Extract cookies from browser (chrome, firefox, safari, edge, etc.)
--sleep-interval SECONDS
Sleep interval in seconds between downloads (avoids rate limiting)
-N, --connections N Parallel connections per download (default: 8)
--downloader BACKEND Transfer backend: auto, native, or aria2c (default: auto)
--http-chunk-size SIZE
Chunk size for the native downloader (default: 10M)
-v, --version show program's version number and exit
--no-banner Don't show the banner

Download Speed

Google's CDN rate-limits each TCP connection independently, at roughly 3 MB/s per connection. A single-stream download therefore leaves a fast link almost entirely idle, and adding connections scales throughput close to linearly:

ConnectionsThroughput
13.3 MB/s
412.5 MB/s
825.8 MB/s
1648.7 MB/s
3295.2 MB/s (saturates a 1 Gbps link)

pull-vids uses 8 connections by default. To go faster:

pull-vids -N 16 "https://www.youtube.com/watch?v=VIDEO_ID"

Two things worth knowing:

  • Install aria2 for the full benefit. With --downloader auto (the default), aria2c is used when available and splits any URL into parallel ranged requests. Without it, the native downloader can only parallelise formats that are already fragmented. Homebrew installs it as a dependency.
  • Do not raise -N indefinitely. The CDN returns HTTP 403 when the connection count is too high. pull-vids detects this and halves the connection count on each retry, but starting lower (-N 4) is more reliable for large batches.

Your storage matters too: writing to a network share caps throughput at the share's write speed regardless of connection count.

Quality Options

  • best - Best available quality (default)
  • high - Up to 1080p
  • medium - Up to 720p
  • low - Up to 480p
  • 2160p, 1440p, 1080p, 720p, 480p, 360p - Specific resolutions

Format Options

Video formats: mp4 (default), mkv, webm Audio formats: mp3 (default), m4a, opus, wav

Examples

# Download 4K video
pull-vids -q 2160p "https://www.youtube.com/watch?v=VIDEO_ID"# Download as MP3
pull-vids -a -f mp3 "https://www.youtube.com/watch?v=VIDEO_ID"# Download playlist to Music folder
pull-vids -a -p -o ~/Music "https://www.youtube.com/playlist?list=PLAYLIST_ID"# Download in MKV format
pull-vids -f mkv "https://www.youtube.com/watch?v=VIDEO_ID"# Download with cookies for YouTube bot detection
pull-vids --cookies-from-browser firefox "https://www.youtube.com/watch?v=VIDEO_ID"# Download long playlist with rate limit protection
pull-vids --cookies-from-browser firefox --sleep-interval 5 -p "https://www.youtube.com/playlist?list=PLAYLIST_ID"

Why pull-vids?

  • Free Forever - No subscriptions, no trials, no limitations
  • Open Source - Transparent code you can trust and modify
  • Privacy Focused - No tracking, no data collection
  • Powerful - Built on yt-dlp, supporting 1000+ video platforms
  • Simple - Clean CLI interface, no bloat
  • Fast - Compiles to a single binary with zero startup time
  • Portable - Single executable, no runtime dependencies

Limitations

DRM-Protected Content

This tool CANNOT download DRM-protected content. This includes:

  • ❌ Amazon Prime Video
  • ❌ Netflix
  • ❌ Disney+
  • ❌ Hulu
  • ❌ HBO Max
  • ❌ Apple TV+
  • ❌ Other paid streaming services

Why? These services use DRM (Digital Rights Management) protection. yt-dlp does not and will not support bypassing DRM due to legal restrictions and ethical reasons.

What You CAN Download

User-uploaded content:

  • YouTube (videos, playlists, channels, live streams)
  • Vimeo (public and password-protected videos)
  • Social media (Twitter, TikTok, Instagram, Facebook)
  • Twitch (VODs and clips)
  • Reddit (v.redd.it videos)
  • And 1000+ other sites with publicly accessible content

Public platforms where content creators share their work ✅ Content you have legal rights to download

Note: Just because you can download something doesn't mean you should. Always respect:

  • Copyright laws
  • Platform Terms of Service
  • Content creator rights
  • Fair use guidelines

Troubleshooting

brew upgrade says "pull-vids 64 already installed" and never updates:

Run this once on the affected machine:

brew uninstall pull-vids && brew install vib795/tap/pull-vids

Formulas before 0.3.3 did not declare a version, so Homebrew inferred one from the download filename — pull-vids-darwin-arm64.tar.gz yields 64. Every release looked like version 64, so the binary was installed into Cellar/pull-vids/64 and each new release appeared to be already installed.

brew upgrade cannot repair this, because it compares the installed version against the formula version and 64 sorts higher than 0.3.4. Homebrew concludes the installed copy is newer and declines. Only a fresh install rebuilds the keg under the correct name.

Releases from 0.3.3 onward declare the version explicitly, so this is a one-time cleanup. Machines installing fresh are unaffected and upgrade normally.

"ffmpeg not found" error:

  • Make sure ffmpeg is installed and in your PATH
  • Try running ffmpeg -version to verify installation

"No video formats found" error:

  • The video might be region-locked or unavailable
  • Try a different quality setting
  • Check if the URL is correct

"Sign in to confirm you're not a bot" error:

  • See the YouTube Authentication (Cookie Support) section above
  • Use --cookies-from-browser or --cookies flag
  • pull-vids will automatically retry up to 3 times with exponential backoff (30s, 60s, 120s)

Rate limiting on long playlists:

  • Use --sleep-interval 5 to add delays between downloads
  • Recommended: 5-10 seconds for playlists with 30+ videos
  • Automatic retry kicks in if rate limiting is detected despite the sleep interval

Slow downloads:

  • Google's CDN throttles each connection separately, so a single stream is slow no matter how fast your link is. Raise the connection count: -N 16
  • Install aria2 (brew install aria2) if it is missing; without it pull-vids falls back to a downloader that can only parallelise fragmented formats
  • Writing to a network share caps throughput at the share's write speed
  • See Download Speed for measured numbers
  • Use a different quality setting
  • Some platforms have rate limits

Contributing

Contributions are welcome! Feel free to open issues or submit pull requests.

License

MIT License - feel free to use this tool however you want!

Credits

Core:

  • yt-dlp - The amazing YouTube downloading library

Go libraries:

Inspired by Downie and PullTube, but free and open-source!

Disclaimer

This tool is for personal use only. Please respect copyright laws and each platform's Terms of Service. Only download videos you have the right to download.

About

Universal video downloader CLI supporting 1000+ websites. Free, open-source alternative to Downie/PullTube built with Go.

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

pull-vids

GitHub releaseHomebrewLicense: MITGo VersionGitHub stars

A free, open-source CLI tool for downloading videos and audio from 1000+ websites. Inspired by tools like Downie and PullTube, but completely free!

Built with Go for blazingly fast performance! 🚀

Supported Platforms

Works with any site supported by yt-dlp, including:

  • YouTube - Videos, playlists, channels
  • Vimeo - Videos and channels
  • Twitter/X - Videos and GIFs
  • TikTok - Videos
  • Instagram - Videos, Reels, Stories
  • Facebook - Videos
  • Twitch - VODs and clips
  • Reddit - Videos from v.redd.it
  • Dailymotion - Videos
  • And 1000+ more! - Full list

Features

  • Download videos from 1000+ websites
  • Cookie authentication for YouTube bot detection bypass
  • Automatic retry with exponential backoff for rate limiting
  • Sleep intervals between downloads to avoid rate limits
  • Various quality options (360p to 4K)
  • Audio-only extraction (MP3, M4A, etc.)
  • Playlist and channel support
  • Beautiful real-time progress bars
  • Cross-platform (Windows, macOS, Linux)
  • Single binary - no dependencies to install
  • Fast startup - < 1ms
  • No ads, no paywalls, just downloads

Demo

Demo

Installation

Package Managers (Recommended)

macOS (Homebrew):

brew tap vib795/tap
brew install pull-vids

Upgrading from a version before 0.3.3? Run this once, on each machine:

brew uninstall pull-vids && brew install vib795/tap/pull-vids

brew upgrade will report pull-vids 64 already installed and do nothing. See Troubleshooting for why.

Any platform with Go 1.24+:

go install github.com/vib795/pull-vids@latest

Chocolatey, APT, AUR and Snap are not available yet. Earlier versions of this README listed them before the packages were published, so choco install pull-vids and friends fail with "package was not found". Use Homebrew, go install, or the install scripts below. Tracking issue: #10.

Quick Install Script

macOS / Linux:

curl -fsSL https://raw.githubusercontent.com/vib795/pull-vids/develop/install.sh | bash

Windows (PowerShell as Administrator):

irm https://raw.githubusercontent.com/vib795/pull-vids/develop/install.ps1 | iex

Manual Installation

Option 1: Download Pre-built Binary

Download the latest release for your platform from Releases:

Releases ship as compressed archives, so download and extract before installing.

macOS:

# Apple Silicon (M1/M2/M3) - use darwin-amd64 on Intel
curl -L https://github.com/vib795/pull-vids/releases/latest/download/pull-vids-darwin-arm64.tar.gz -o pull-vids.tar.gz
tar -xzf pull-vids.tar.gz
chmod +x pull-vids-darwin-arm64
sudo mv pull-vids-darwin-arm64 /usr/local/bin/pull-vids

Linux:

# AMD64 - use linux-arm64 on ARM
curl -L https://github.com/vib795/pull-vids/releases/latest/download/pull-vids-linux-amd64.tar.gz -o pull-vids.tar.gz
tar -xzf pull-vids.tar.gz
chmod +x pull-vids-linux-amd64
sudo mv pull-vids-linux-amd64 /usr/local/bin/pull-vids

Windows:

  1. Download pull-vids-windows-amd64.zip
  2. Extract it, then rename pull-vids-windows-amd64.exe to pull-vids.exe
  3. Move it to a directory in your PATH (e.g., C:\Program Files\pull-vids\)

Option 2: Build from Source

Requirements:

  • Go 1.24 or higher (see go.mod)
  • Git

Build:

# Clone the repository
git clone https://github.com/vib795/pull-vids.git
cd pull-vids
# Build for your platform
make build
# Or build for all platforms
make build-all
# Install to system
make install

Install Dependencies

pull-vids requires ffmpeg and yt-dlp to work:

macOS:

brew install ffmpeg yt-dlp

Ubuntu/Debian:

sudo apt update
sudo apt install ffmpeg
pip install yt-dlp

Windows:

winget install ffmpeg
pip install yt-dlp

Verify installation:

ffmpeg -version
yt-dlp --version
pull-vids --version

Usage

Basic Examples

Download from YouTube:

pull-vids "https://www.youtube.com/watch?v=VIDEO_ID"

Download from Vimeo:

pull-vids "https://vimeo.com/123456789"

Download from Twitter/X:

pull-vids "https://twitter.com/user/status/123456"

Download from TikTok:

pull-vids "https://www.tiktok.com/@user/video/123456"

Download from Instagram:

pull-vids "https://www.instagram.com/p/ABC123/"

Download from Twitch:

pull-vids "https://www.twitch.tv/videos/123456789"

Download audio only:

pull-vids -a "https://www.youtube.com/watch?v=VIDEO_ID"

Download in specific quality:

pull-vids -q 720p "https://vimeo.com/123456789"

Download to a specific directory:

pull-vids -o ~/Videos "https://www.youtube.com/watch?v=VIDEO_ID"

Download entire playlist:

pull-vids -p "https://www.youtube.com/playlist?list=PLAYLIST_ID"

YouTube Authentication (Cookie Support)

If you get a bot detection error from YouTube, you'll need to authenticate using cookies from your browser.

Option 1: Export Cookies Manually (Recommended - Most Reliable)

  1. Install a browser extension to export cookies:

  2. Visit YouTube and make sure you're logged in

  3. Click the extension icon and export cookies for youtube.com

  4. Save the file (e.g., youtube-cookies.txt)

  5. Use with pull-vids:

    pull-vids --cookies youtube-cookies.txt "https://www.youtube.com/watch?v=VIDEO_ID"

Option 2: Extract Cookies from Browser

Firefox (usually works without issues):

pull-vids --cookies-from-browser firefox "https://www.youtube.com/watch?v=VIDEO_ID"

Chrome:

pull-vids --cookies-from-browser chrome "https://www.youtube.com/watch?v=VIDEO_ID"

Safari (macOS only):

pull-vids --cookies-from-browser safari "https://www.youtube.com/watch?v=VIDEO_ID"

⚠️ macOS Safari Users: If you get a permission error, you need to grant Full Disk Access:

  1. Open System SettingsPrivacy & SecurityFull Disk Access
  2. Click the + button and add your terminal app (Terminal.app or iTerm2)
  3. Restart your terminal
  4. Try again

⚠️ Chrome/Chromium Users: If Chrome doesn't work, try exporting cookies manually (Option 1) or use Firefox.

Supported browsers:firefox, chrome, safari, edge, chromium, brave, opera, vivaldi

Important: Make sure you're logged into YouTube in the browser before extracting cookies!

Command-Line Options

usage: pull-vids [-h] [-o OUTPUT] [-q QUALITY] [-a] [-p] [-f FORMAT]
[--cookies COOKIES] [--cookies-from-browser BROWSER]
[--sleep-interval SECONDS] [-N CONNECTIONS]
[--downloader BACKEND] [--http-chunk-size SIZE]
[-v] [--no-banner] url
positional arguments:
url Video URL from any supported site (1000+ platforms)
options:
-h, --help show this help message and exit
-o OUTPUT, --output OUTPUT
Output directory (default: ~/Downloads/pull-vids)
-q QUALITY, --quality QUALITY
Video quality: best, high, medium, low, 2160p, 1440p, 1080p, 720p, 480p, 360p
(default: best)
-a, --audio-only Download audio only
-p, --playlist Download entire playlist
-f FORMAT, --format FORMAT
Output format (mp4, mkv, mp3, m4a, etc.)
--cookies COOKIES Path to cookies file (Netscape format)
--cookies-from-browser BROWSER
Extract cookies from browser (chrome, firefox, safari, edge, etc.)
--sleep-interval SECONDS
Sleep interval in seconds between downloads (avoids rate limiting)
-N, --connections N Parallel connections per download (default: 8)
--downloader BACKEND Transfer backend: auto, native, or aria2c (default: auto)
--http-chunk-size SIZE
Chunk size for the native downloader (default: 10M)
-v, --version show program's version number and exit
--no-banner Don't show the banner

Download Speed

Google's CDN rate-limits each TCP connection independently, at roughly 3 MB/s per connection. A single-stream download therefore leaves a fast link almost entirely idle, and adding connections scales throughput close to linearly:

ConnectionsThroughput
13.3 MB/s
412.5 MB/s
825.8 MB/s
1648.7 MB/s
3295.2 MB/s (saturates a 1 Gbps link)

pull-vids uses 8 connections by default. To go faster:

pull-vids -N 16 "https://www.youtube.com/watch?v=VIDEO_ID"

Two things worth knowing:

  • Install aria2 for the full benefit. With --downloader auto (the default), aria2c is used when available and splits any URL into parallel ranged requests. Without it, the native downloader can only parallelise formats that are already fragmented. Homebrew installs it as a dependency.
  • Do not raise -N indefinitely. The CDN returns HTTP 403 when the connection count is too high. pull-vids detects this and halves the connection count on each retry, but starting lower (-N 4) is more reliable for large batches.

Your storage matters too: writing to a network share caps throughput at the share's write speed regardless of connection count.

Quality Options

  • best - Best available quality (default)
  • high - Up to 1080p
  • medium - Up to 720p
  • low - Up to 480p
  • 2160p, 1440p, 1080p, 720p, 480p, 360p - Specific resolutions

Format Options

Video formats: mp4 (default), mkv, webm Audio formats: mp3 (default), m4a, opus, wav

Examples

# Download 4K video
pull-vids -q 2160p "https://www.youtube.com/watch?v=VIDEO_ID"# Download as MP3
pull-vids -a -f mp3 "https://www.youtube.com/watch?v=VIDEO_ID"# Download playlist to Music folder
pull-vids -a -p -o ~/Music "https://www.youtube.com/playlist?list=PLAYLIST_ID"# Download in MKV format
pull-vids -f mkv "https://www.youtube.com/watch?v=VIDEO_ID"# Download with cookies for YouTube bot detection
pull-vids --cookies-from-browser firefox "https://www.youtube.com/watch?v=VIDEO_ID"# Download long playlist with rate limit protection
pull-vids --cookies-from-browser firefox --sleep-interval 5 -p "https://www.youtube.com/playlist?list=PLAYLIST_ID"

Why pull-vids?

  • Free Forever - No subscriptions, no trials, no limitations
  • Open Source - Transparent code you can trust and modify
  • Privacy Focused - No tracking, no data collection
  • Powerful - Built on yt-dlp, supporting 1000+ video platforms
  • Simple - Clean CLI interface, no bloat
  • Fast - Compiles to a single binary with zero startup time
  • Portable - Single executable, no runtime dependencies

Limitations

DRM-Protected Content

This tool CANNOT download DRM-protected content. This includes:

  • ❌ Amazon Prime Video
  • ❌ Netflix
  • ❌ Disney+
  • ❌ Hulu
  • ❌ HBO Max
  • ❌ Apple TV+
  • ❌ Other paid streaming services

Why? These services use DRM (Digital Rights Management) protection. yt-dlp does not and will not support bypassing DRM due to legal restrictions and ethical reasons.

What You CAN Download

User-uploaded content:

  • YouTube (videos, playlists, channels, live streams)
  • Vimeo (public and password-protected videos)
  • Social media (Twitter, TikTok, Instagram, Facebook)
  • Twitch (VODs and clips)
  • Reddit (v.redd.it videos)
  • And 1000+ other sites with publicly accessible content

Public platforms where content creators share their work ✅ Content you have legal rights to download

Note: Just because you can download something doesn't mean you should. Always respect:

  • Copyright laws
  • Platform Terms of Service
  • Content creator rights
  • Fair use guidelines

Troubleshooting

brew upgrade says "pull-vids 64 already installed" and never updates:

Run this once on the affected machine:

brew uninstall pull-vids && brew install vib795/tap/pull-vids

Formulas before 0.3.3 did not declare a version, so Homebrew inferred one from the download filename — pull-vids-darwin-arm64.tar.gz yields 64. Every release looked like version 64, so the binary was installed into Cellar/pull-vids/64 and each new release appeared to be already installed.

brew upgrade cannot repair this, because it compares the installed version against the formula version and 64 sorts higher than 0.3.4. Homebrew concludes the installed copy is newer and declines. Only a fresh install rebuilds the keg under the correct name.

Releases from 0.3.3 onward declare the version explicitly, so this is a one-time cleanup. Machines installing fresh are unaffected and upgrade normally.

"ffmpeg not found" error:

  • Make sure ffmpeg is installed and in your PATH
  • Try running ffmpeg -version to verify installation

"No video formats found" error:

  • The video might be region-locked or unavailable
  • Try a different quality setting
  • Check if the URL is correct

"Sign in to confirm you're not a bot" error:

  • See the YouTube Authentication (Cookie Support) section above
  • Use --cookies-from-browser or --cookies flag
  • pull-vids will automatically retry up to 3 times with exponential backoff (30s, 60s, 120s)

Rate limiting on long playlists:

  • Use --sleep-interval 5 to add delays between downloads
  • Recommended: 5-10 seconds for playlists with 30+ videos
  • Automatic retry kicks in if rate limiting is detected despite the sleep interval

Slow downloads:

  • Google's CDN throttles each connection separately, so a single stream is slow no matter how fast your link is. Raise the connection count: -N 16
  • Install aria2 (brew install aria2) if it is missing; without it pull-vids falls back to a downloader that can only parallelise fragmented formats
  • Writing to a network share caps throughput at the share's write speed
  • See Download Speed for measured numbers
  • Use a different quality setting
  • Some platforms have rate limits

Contributing

Contributions are welcome! Feel free to open issues or submit pull requests.

License

MIT License - feel free to use this tool however you want!

Credits

Core:

  • yt-dlp - The amazing YouTube downloading library

Go libraries:

Inspired by Downie and PullTube, but free and open-source!

Disclaimer

This tool is for personal use only. Please respect copyright laws and each platform's Terms of Service. Only download videos you have the right to download.

About

Universal video downloader CLI supporting 1000+ websites. Free, open-source alternative to Downie/PullTube built with Go.

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

pull-vids

GitHub releaseHomebrewLicense: MITGo VersionGitHub stars

A free, open-source CLI tool for downloading videos and audio from 1000+ websites. Inspired by tools like Downie and PullTube, but completely free!

Built with Go for blazingly fast performance! 🚀

Supported Platforms

Works with any site supported by yt-dlp, including:

  • YouTube - Videos, playlists, channels
  • Vimeo - Videos and channels
  • Twitter/X - Videos and GIFs
  • TikTok - Videos
  • Instagram - Videos, Reels, Stories
  • Facebook - Videos
  • Twitch - VODs and clips
  • Reddit - Videos from v.redd.it
  • Dailymotion - Videos
  • And 1000+ more! - Full list

Features

  • Download videos from 1000+ websites
  • Cookie authentication for YouTube bot detection bypass
  • Automatic retry with exponential backoff for rate limiting
  • Sleep intervals between downloads to avoid rate limits
  • Various quality options (360p to 4K)
  • Audio-only extraction (MP3, M4A, etc.)
  • Playlist and channel support
  • Beautiful real-time progress bars
  • Cross-platform (Windows, macOS, Linux)
  • Single binary - no dependencies to install
  • Fast startup - < 1ms
  • No ads, no paywalls, just downloads

Demo

Demo

Installation

Package Managers (Recommended)

macOS (Homebrew):

brew tap vib795/tap
brew install pull-vids

Upgrading from a version before 0.3.3? Run this once, on each machine:

brew uninstall pull-vids && brew install vib795/tap/pull-vids

brew upgrade will report pull-vids 64 already installed and do nothing. See Troubleshooting for why.

Any platform with Go 1.24+:

go install github.com/vib795/pull-vids@latest

Chocolatey, APT, AUR and Snap are not available yet. Earlier versions of this README listed them before the packages were published, so choco install pull-vids and friends fail with "package was not found". Use Homebrew, go install, or the install scripts below. Tracking issue: #10.

Quick Install Script

macOS / Linux:

curl -fsSL https://raw.githubusercontent.com/vib795/pull-vids/develop/install.sh | bash

Windows (PowerShell as Administrator):

irm https://raw.githubusercontent.com/vib795/pull-vids/develop/install.ps1 | iex

Manual Installation

Option 1: Download Pre-built Binary

Download the latest release for your platform from Releases:

Releases ship as compressed archives, so download and extract before installing.

macOS:

# Apple Silicon (M1/M2/M3) - use darwin-amd64 on Intel
curl -L https://github.com/vib795/pull-vids/releases/latest/download/pull-vids-darwin-arm64.tar.gz -o pull-vids.tar.gz
tar -xzf pull-vids.tar.gz
chmod +x pull-vids-darwin-arm64
sudo mv pull-vids-darwin-arm64 /usr/local/bin/pull-vids

Linux:

# AMD64 - use linux-arm64 on ARM
curl -L https://github.com/vib795/pull-vids/releases/latest/download/pull-vids-linux-amd64.tar.gz -o pull-vids.tar.gz
tar -xzf pull-vids.tar.gz
chmod +x pull-vids-linux-amd64
sudo mv pull-vids-linux-amd64 /usr/local/bin/pull-vids

Windows:

  1. Download pull-vids-windows-amd64.zip
  2. Extract it, then rename pull-vids-windows-amd64.exe to pull-vids.exe
  3. Move it to a directory in your PATH (e.g., C:\Program Files\pull-vids\)

Option 2: Build from Source

Requirements:

  • Go 1.24 or higher (see go.mod)
  • Git

Build:

# Clone the repository
git clone https://github.com/vib795/pull-vids.git
cd pull-vids
# Build for your platform
make build
# Or build for all platforms
make build-all
# Install to system
make install

Install Dependencies

pull-vids requires ffmpeg and yt-dlp to work:

macOS:

brew install ffmpeg yt-dlp

Ubuntu/Debian:

sudo apt update
sudo apt install ffmpeg
pip install yt-dlp

Windows:

winget install ffmpeg
pip install yt-dlp

Verify installation:

ffmpeg -version
yt-dlp --version
pull-vids --version

Usage

Basic Examples

Download from YouTube:

pull-vids "https://www.youtube.com/watch?v=VIDEO_ID"

Download from Vimeo:

pull-vids "https://vimeo.com/123456789"

Download from Twitter/X:

pull-vids "https://twitter.com/user/status/123456"

Download from TikTok:

pull-vids "https://www.tiktok.com/@user/video/123456"

Download from Instagram:

pull-vids "https://www.instagram.com/p/ABC123/"

Download from Twitch:

pull-vids "https://www.twitch.tv/videos/123456789"

Download audio only:

pull-vids -a "https://www.youtube.com/watch?v=VIDEO_ID"

Download in specific quality:

pull-vids -q 720p "https://vimeo.com/123456789"

Download to a specific directory:

pull-vids -o ~/Videos "https://www.youtube.com/watch?v=VIDEO_ID"

Download entire playlist:

pull-vids -p "https://www.youtube.com/playlist?list=PLAYLIST_ID"

YouTube Authentication (Cookie Support)

If you get a bot detection error from YouTube, you'll need to authenticate using cookies from your browser.

Option 1: Export Cookies Manually (Recommended - Most Reliable)

  1. Install a browser extension to export cookies:

  2. Visit YouTube and make sure you're logged in

  3. Click the extension icon and export cookies for youtube.com

  4. Save the file (e.g., youtube-cookies.txt)

  5. Use with pull-vids:

    pull-vids --cookies youtube-cookies.txt "https://www.youtube.com/watch?v=VIDEO_ID"

Option 2: Extract Cookies from Browser

Firefox (usually works without issues):

pull-vids --cookies-from-browser firefox "https://www.youtube.com/watch?v=VIDEO_ID"

Chrome:

pull-vids --cookies-from-browser chrome "https://www.youtube.com/watch?v=VIDEO_ID"

Safari (macOS only):

pull-vids --cookies-from-browser safari "https://www.youtube.com/watch?v=VIDEO_ID"

⚠️ macOS Safari Users: If you get a permission error, you need to grant Full Disk Access:

  1. Open System SettingsPrivacy & SecurityFull Disk Access
  2. Click the + button and add your terminal app (Terminal.app or iTerm2)
  3. Restart your terminal
  4. Try again

⚠️ Chrome/Chromium Users: If Chrome doesn't work, try exporting cookies manually (Option 1) or use Firefox.

Supported browsers:firefox, chrome, safari, edge, chromium, brave, opera, vivaldi

Important: Make sure you're logged into YouTube in the browser before extracting cookies!

Command-Line Options

usage: pull-vids [-h] [-o OUTPUT] [-q QUALITY] [-a] [-p] [-f FORMAT]
[--cookies COOKIES] [--cookies-from-browser BROWSER]
[--sleep-interval SECONDS] [-N CONNECTIONS]
[--downloader BACKEND] [--http-chunk-size SIZE]
[-v] [--no-banner] url
positional arguments:
url Video URL from any supported site (1000+ platforms)
options:
-h, --help show this help message and exit
-o OUTPUT, --output OUTPUT
Output directory (default: ~/Downloads/pull-vids)
-q QUALITY, --quality QUALITY
Video quality: best, high, medium, low, 2160p, 1440p, 1080p, 720p, 480p, 360p
(default: best)
-a, --audio-only Download audio only
-p, --playlist Download entire playlist
-f FORMAT, --format FORMAT
Output format (mp4, mkv, mp3, m4a, etc.)
--cookies COOKIES Path to cookies file (Netscape format)
--cookies-from-browser BROWSER
Extract cookies from browser (chrome, firefox, safari, edge, etc.)
--sleep-interval SECONDS
Sleep interval in seconds between downloads (avoids rate limiting)
-N, --connections N Parallel connections per download (default: 8)
--downloader BACKEND Transfer backend: auto, native, or aria2c (default: auto)
--http-chunk-size SIZE
Chunk size for the native downloader (default: 10M)
-v, --version show program's version number and exit
--no-banner Don't show the banner

Download Speed

Google's CDN rate-limits each TCP connection independently, at roughly 3 MB/s per connection. A single-stream download therefore leaves a fast link almost entirely idle, and adding connections scales throughput close to linearly:

ConnectionsThroughput
13.3 MB/s
412.5 MB/s
825.8 MB/s
1648.7 MB/s
3295.2 MB/s (saturates a 1 Gbps link)

pull-vids uses 8 connections by default. To go faster:

pull-vids -N 16 "https://www.youtube.com/watch?v=VIDEO_ID"

Two things worth knowing:

  • Install aria2 for the full benefit. With --downloader auto (the default), aria2c is used when available and splits any URL into parallel ranged requests. Without it, the native downloader can only parallelise formats that are already fragmented. Homebrew installs it as a dependency.
  • Do not raise -N indefinitely. The CDN returns HTTP 403 when the connection count is too high. pull-vids detects this and halves the connection count on each retry, but starting lower (-N 4) is more reliable for large batches.

Your storage matters too: writing to a network share caps throughput at the share's write speed regardless of connection count.

Quality Options

  • best - Best available quality (default)
  • high - Up to 1080p
  • medium - Up to 720p
  • low - Up to 480p
  • 2160p, 1440p, 1080p, 720p, 480p, 360p - Specific resolutions

Format Options

Video formats: mp4 (default), mkv, webm Audio formats: mp3 (default), m4a, opus, wav

Examples

# Download 4K video
pull-vids -q 2160p "https://www.youtube.com/watch?v=VIDEO_ID"# Download as MP3
pull-vids -a -f mp3 "https://www.youtube.com/watch?v=VIDEO_ID"# Download playlist to Music folder
pull-vids -a -p -o ~/Music "https://www.youtube.com/playlist?list=PLAYLIST_ID"# Download in MKV format
pull-vids -f mkv "https://www.youtube.com/watch?v=VIDEO_ID"# Download with cookies for YouTube bot detection
pull-vids --cookies-from-browser firefox "https://www.youtube.com/watch?v=VIDEO_ID"# Download long playlist with rate limit protection
pull-vids --cookies-from-browser firefox --sleep-interval 5 -p "https://www.youtube.com/playlist?list=PLAYLIST_ID"

Why pull-vids?

  • Free Forever - No subscriptions, no trials, no limitations
  • Open Source - Transparent code you can trust and modify
  • Privacy Focused - No tracking, no data collection
  • Powerful - Built on yt-dlp, supporting 1000+ video platforms
  • Simple - Clean CLI interface, no bloat
  • Fast - Compiles to a single binary with zero startup time
  • Portable - Single executable, no runtime dependencies

Limitations

DRM-Protected Content

This tool CANNOT download DRM-protected content. This includes:

  • ❌ Amazon Prime Video
  • ❌ Netflix
  • ❌ Disney+
  • ❌ Hulu
  • ❌ HBO Max
  • ❌ Apple TV+
  • ❌ Other paid streaming services

Why? These services use DRM (Digital Rights Management) protection. yt-dlp does not and will not support bypassing DRM due to legal restrictions and ethical reasons.

What You CAN Download

User-uploaded content:

  • YouTube (videos, playlists, channels, live streams)
  • Vimeo (public and password-protected videos)
  • Social media (Twitter, TikTok, Instagram, Facebook)
  • Twitch (VODs and clips)
  • Reddit (v.redd.it videos)
  • And 1000+ other sites with publicly accessible content

Public platforms where content creators share their work ✅ Content you have legal rights to download

Note: Just because you can download something doesn't mean you should. Always respect:

  • Copyright laws
  • Platform Terms of Service
  • Content creator rights
  • Fair use guidelines

Troubleshooting

brew upgrade says "pull-vids 64 already installed" and never updates:

Run this once on the affected machine:

brew uninstall pull-vids && brew install vib795/tap/pull-vids

Formulas before 0.3.3 did not declare a version, so Homebrew inferred one from the download filename — pull-vids-darwin-arm64.tar.gz yields 64. Every release looked like version 64, so the binary was installed into Cellar/pull-vids/64 and each new release appeared to be already installed.

brew upgrade cannot repair this, because it compares the installed version against the formula version and 64 sorts higher than 0.3.4. Homebrew concludes the installed copy is newer and declines. Only a fresh install rebuilds the keg under the correct name.

Releases from 0.3.3 onward declare the version explicitly, so this is a one-time cleanup. Machines installing fresh are unaffected and upgrade normally.

"ffmpeg not found" error:

  • Make sure ffmpeg is installed and in your PATH
  • Try running ffmpeg -version to verify installation

"No video formats found" error:

  • The video might be region-locked or unavailable
  • Try a different quality setting
  • Check if the URL is correct

"Sign in to confirm you're not a bot" error:

  • See the YouTube Authentication (Cookie Support) section above
  • Use --cookies-from-browser or --cookies flag
  • pull-vids will automatically retry up to 3 times with exponential backoff (30s, 60s, 120s)

Rate limiting on long playlists:

  • Use --sleep-interval 5 to add delays between downloads
  • Recommended: 5-10 seconds for playlists with 30+ videos
  • Automatic retry kicks in if rate limiting is detected despite the sleep interval

Slow downloads:

  • Google's CDN throttles each connection separately, so a single stream is slow no matter how fast your link is. Raise the connection count: -N 16
  • Install aria2 (brew install aria2) if it is missing; without it pull-vids falls back to a downloader that can only parallelise fragmented formats
  • Writing to a network share caps throughput at the share's write speed
  • See Download Speed for measured numbers
  • Use a different quality setting
  • Some platforms have rate limits

Contributing

Contributions are welcome! Feel free to open issues or submit pull requests.

License

MIT License - feel free to use this tool however you want!

Credits

Core:

  • yt-dlp - The amazing YouTube downloading library

Go libraries:

Inspired by Downie and PullTube, but free and open-source!

Disclaimer

This tool is for personal use only. Please respect copyright laws and each platform's Terms of Service. Only download videos you have the right to download.

About

Universal video downloader CLI supporting 1000+ websites. Free, open-source alternative to Downie/PullTube built with Go.

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

pull-vids

GitHub releaseHomebrewLicense: MITGo VersionGitHub stars

A free, open-source CLI tool for downloading videos and audio from 1000+ websites. Inspired by tools like Downie and PullTube, but completely free!

Built with Go for blazingly fast performance! 🚀

Supported Platforms

Works with any site supported by yt-dlp, including:

  • YouTube - Videos, playlists, channels
  • Vimeo - Videos and channels
  • Twitter/X - Videos and GIFs
  • TikTok - Videos
  • Instagram - Videos, Reels, Stories
  • Facebook - Videos
  • Twitch - VODs and clips
  • Reddit - Videos from v.redd.it
  • Dailymotion - Videos
  • And 1000+ more! - Full list

Features

  • Download videos from 1000+ websites
  • Cookie authentication for YouTube bot detection bypass
  • Automatic retry with exponential backoff for rate limiting
  • Sleep intervals between downloads to avoid rate limits
  • Various quality options (360p to 4K)
  • Audio-only extraction (MP3, M4A, etc.)
  • Playlist and channel support
  • Beautiful real-time progress bars
  • Cross-platform (Windows, macOS, Linux)
  • Single binary - no dependencies to install
  • Fast startup - < 1ms
  • No ads, no paywalls, just downloads

Demo

Demo

Installation

Package Managers (Recommended)

macOS (Homebrew):

brew tap vib795/tap
brew install pull-vids

Upgrading from a version before 0.3.3? Run this once, on each machine:

brew uninstall pull-vids && brew install vib795/tap/pull-vids

brew upgrade will report pull-vids 64 already installed and do nothing. See Troubleshooting for why.

Any platform with Go 1.24+:

go install github.com/vib795/pull-vids@latest

Chocolatey, APT, AUR and Snap are not available yet. Earlier versions of this README listed them before the packages were published, so choco install pull-vids and friends fail with "package was not found". Use Homebrew, go install, or the install scripts below. Tracking issue: #10.

Quick Install Script

macOS / Linux:

curl -fsSL https://raw.githubusercontent.com/vib795/pull-vids/develop/install.sh | bash

Windows (PowerShell as Administrator):

irm https://raw.githubusercontent.com/vib795/pull-vids/develop/install.ps1 | iex

Manual Installation

Option 1: Download Pre-built Binary

Download the latest release for your platform from Releases:

Releases ship as compressed archives, so download and extract before installing.

macOS:

# Apple Silicon (M1/M2/M3) - use darwin-amd64 on Intel
curl -L https://github.com/vib795/pull-vids/releases/latest/download/pull-vids-darwin-arm64.tar.gz -o pull-vids.tar.gz
tar -xzf pull-vids.tar.gz
chmod +x pull-vids-darwin-arm64
sudo mv pull-vids-darwin-arm64 /usr/local/bin/pull-vids

Linux:

# AMD64 - use linux-arm64 on ARM
curl -L https://github.com/vib795/pull-vids/releases/latest/download/pull-vids-linux-amd64.tar.gz -o pull-vids.tar.gz
tar -xzf pull-vids.tar.gz
chmod +x pull-vids-linux-amd64
sudo mv pull-vids-linux-amd64 /usr/local/bin/pull-vids

Windows:

  1. Download pull-vids-windows-amd64.zip
  2. Extract it, then rename pull-vids-windows-amd64.exe to pull-vids.exe
  3. Move it to a directory in your PATH (e.g., C:\Program Files\pull-vids\)

Option 2: Build from Source

Requirements:

  • Go 1.24 or higher (see go.mod)
  • Git

Build:

# Clone the repository
git clone https://github.com/vib795/pull-vids.git
cd pull-vids
# Build for your platform
make build
# Or build for all platforms
make build-all
# Install to system
make install

Install Dependencies

pull-vids requires ffmpeg and yt-dlp to work:

macOS:

brew install ffmpeg yt-dlp

Ubuntu/Debian:

sudo apt update
sudo apt install ffmpeg
pip install yt-dlp

Windows:

winget install ffmpeg
pip install yt-dlp

Verify installation:

ffmpeg -version
yt-dlp --version
pull-vids --version

Usage

Basic Examples

Download from YouTube:

pull-vids "https://www.youtube.com/watch?v=VIDEO_ID"

Download from Vimeo:

pull-vids "https://vimeo.com/123456789"

Download from Twitter/X:

pull-vids "https://twitter.com/user/status/123456"

Download from TikTok:

pull-vids "https://www.tiktok.com/@user/video/123456"

Download from Instagram:

pull-vids "https://www.instagram.com/p/ABC123/"

Download from Twitch:

pull-vids "https://www.twitch.tv/videos/123456789"

Download audio only:

pull-vids -a "https://www.youtube.com/watch?v=VIDEO_ID"

Download in specific quality:

pull-vids -q 720p "https://vimeo.com/123456789"

Download to a specific directory:

pull-vids -o ~/Videos "https://www.youtube.com/watch?v=VIDEO_ID"

Download entire playlist:

pull-vids -p "https://www.youtube.com/playlist?list=PLAYLIST_ID"

YouTube Authentication (Cookie Support)

If you get a bot detection error from YouTube, you'll need to authenticate using cookies from your browser.

Option 1: Export Cookies Manually (Recommended - Most Reliable)

  1. Install a browser extension to export cookies:

  2. Visit YouTube and make sure you're logged in

  3. Click the extension icon and export cookies for youtube.com

  4. Save the file (e.g., youtube-cookies.txt)

  5. Use with pull-vids:

    pull-vids --cookies youtube-cookies.txt "https://www.youtube.com/watch?v=VIDEO_ID"

Option 2: Extract Cookies from Browser

Firefox (usually works without issues):

pull-vids --cookies-from-browser firefox "https://www.youtube.com/watch?v=VIDEO_ID"

Chrome:

pull-vids --cookies-from-browser chrome "https://www.youtube.com/watch?v=VIDEO_ID"

Safari (macOS only):

pull-vids --cookies-from-browser safari "https://www.youtube.com/watch?v=VIDEO_ID"

⚠️ macOS Safari Users: If you get a permission error, you need to grant Full Disk Access:

  1. Open System SettingsPrivacy & SecurityFull Disk Access
  2. Click the + button and add your terminal app (Terminal.app or iTerm2)
  3. Restart your terminal
  4. Try again

⚠️ Chrome/Chromium Users: If Chrome doesn't work, try exporting cookies manually (Option 1) or use Firefox.

Supported browsers:firefox, chrome, safari, edge, chromium, brave, opera, vivaldi

Important: Make sure you're logged into YouTube in the browser before extracting cookies!

Command-Line Options

usage: pull-vids [-h] [-o OUTPUT] [-q QUALITY] [-a] [-p] [-f FORMAT]
[--cookies COOKIES] [--cookies-from-browser BROWSER]
[--sleep-interval SECONDS] [-N CONNECTIONS]
[--downloader BACKEND] [--http-chunk-size SIZE]
[-v] [--no-banner] url
positional arguments:
url Video URL from any supported site (1000+ platforms)
options:
-h, --help show this help message and exit
-o OUTPUT, --output OUTPUT
Output directory (default: ~/Downloads/pull-vids)
-q QUALITY, --quality QUALITY
Video quality: best, high, medium, low, 2160p, 1440p, 1080p, 720p, 480p, 360p
(default: best)
-a, --audio-only Download audio only
-p, --playlist Download entire playlist
-f FORMAT, --format FORMAT
Output format (mp4, mkv, mp3, m4a, etc.)
--cookies COOKIES Path to cookies file (Netscape format)
--cookies-from-browser BROWSER
Extract cookies from browser (chrome, firefox, safari, edge, etc.)
--sleep-interval SECONDS
Sleep interval in seconds between downloads (avoids rate limiting)
-N, --connections N Parallel connections per download (default: 8)
--downloader BACKEND Transfer backend: auto, native, or aria2c (default: auto)
--http-chunk-size SIZE
Chunk size for the native downloader (default: 10M)
-v, --version show program's version number and exit
--no-banner Don't show the banner

Download Speed

Google's CDN rate-limits each TCP connection independently, at roughly 3 MB/s per connection. A single-stream download therefore leaves a fast link almost entirely idle, and adding connections scales throughput close to linearly:

ConnectionsThroughput
13.3 MB/s
412.5 MB/s
825.8 MB/s
1648.7 MB/s
3295.2 MB/s (saturates a 1 Gbps link)

pull-vids uses 8 connections by default. To go faster:

pull-vids -N 16 "https://www.youtube.com/watch?v=VIDEO_ID"

Two things worth knowing:

  • Install aria2 for the full benefit. With --downloader auto (the default), aria2c is used when available and splits any URL into parallel ranged requests. Without it, the native downloader can only parallelise formats that are already fragmented. Homebrew installs it as a dependency.
  • Do not raise -N indefinitely. The CDN returns HTTP 403 when the connection count is too high. pull-vids detects this and halves the connection count on each retry, but starting lower (-N 4) is more reliable for large batches.

Your storage matters too: writing to a network share caps throughput at the share's write speed regardless of connection count.

Quality Options

  • best - Best available quality (default)
  • high - Up to 1080p
  • medium - Up to 720p
  • low - Up to 480p
  • 2160p, 1440p, 1080p, 720p, 480p, 360p - Specific resolutions

Format Options

Video formats: mp4 (default), mkv, webm Audio formats: mp3 (default), m4a, opus, wav

Examples

# Download 4K video
pull-vids -q 2160p "https://www.youtube.com/watch?v=VIDEO_ID"# Download as MP3
pull-vids -a -f mp3 "https://www.youtube.com/watch?v=VIDEO_ID"# Download playlist to Music folder
pull-vids -a -p -o ~/Music "https://www.youtube.com/playlist?list=PLAYLIST_ID"# Download in MKV format
pull-vids -f mkv "https://www.youtube.com/watch?v=VIDEO_ID"# Download with cookies for YouTube bot detection
pull-vids --cookies-from-browser firefox "https://www.youtube.com/watch?v=VIDEO_ID"# Download long playlist with rate limit protection
pull-vids --cookies-from-browser firefox --sleep-interval 5 -p "https://www.youtube.com/playlist?list=PLAYLIST_ID"

Why pull-vids?

  • Free Forever - No subscriptions, no trials, no limitations
  • Open Source - Transparent code you can trust and modify
  • Privacy Focused - No tracking, no data collection
  • Powerful - Built on yt-dlp, supporting 1000+ video platforms
  • Simple - Clean CLI interface, no bloat
  • Fast - Compiles to a single binary with zero startup time
  • Portable - Single executable, no runtime dependencies

Limitations

DRM-Protected Content

This tool CANNOT download DRM-protected content. This includes:

  • ❌ Amazon Prime Video
  • ❌ Netflix
  • ❌ Disney+
  • ❌ Hulu
  • ❌ HBO Max
  • ❌ Apple TV+
  • ❌ Other paid streaming services

Why? These services use DRM (Digital Rights Management) protection. yt-dlp does not and will not support bypassing DRM due to legal restrictions and ethical reasons.

What You CAN Download

User-uploaded content:

  • YouTube (videos, playlists, channels, live streams)
  • Vimeo (public and password-protected videos)
  • Social media (Twitter, TikTok, Instagram, Facebook)
  • Twitch (VODs and clips)
  • Reddit (v.redd.it videos)
  • And 1000+ other sites with publicly accessible content

Public platforms where content creators share their work ✅ Content you have legal rights to download

Note: Just because you can download something doesn't mean you should. Always respect:

  • Copyright laws
  • Platform Terms of Service
  • Content creator rights
  • Fair use guidelines

Troubleshooting

brew upgrade says "pull-vids 64 already installed" and never updates:

Run this once on the affected machine:

brew uninstall pull-vids && brew install vib795/tap/pull-vids

Formulas before 0.3.3 did not declare a version, so Homebrew inferred one from the download filename — pull-vids-darwin-arm64.tar.gz yields 64. Every release looked like version 64, so the binary was installed into Cellar/pull-vids/64 and each new release appeared to be already installed.

brew upgrade cannot repair this, because it compares the installed version against the formula version and 64 sorts higher than 0.3.4. Homebrew concludes the installed copy is newer and declines. Only a fresh install rebuilds the keg under the correct name.

Releases from 0.3.3 onward declare the version explicitly, so this is a one-time cleanup. Machines installing fresh are unaffected and upgrade normally.

"ffmpeg not found" error:

  • Make sure ffmpeg is installed and in your PATH
  • Try running ffmpeg -version to verify installation

"No video formats found" error:

  • The video might be region-locked or unavailable
  • Try a different quality setting
  • Check if the URL is correct

"Sign in to confirm you're not a bot" error:

  • See the YouTube Authentication (Cookie Support) section above
  • Use --cookies-from-browser or --cookies flag
  • pull-vids will automatically retry up to 3 times with exponential backoff (30s, 60s, 120s)

Rate limiting on long playlists:

  • Use --sleep-interval 5 to add delays between downloads
  • Recommended: 5-10 seconds for playlists with 30+ videos
  • Automatic retry kicks in if rate limiting is detected despite the sleep interval

Slow downloads:

  • Google's CDN throttles each connection separately, so a single stream is slow no matter how fast your link is. Raise the connection count: -N 16
  • Install aria2 (brew install aria2) if it is missing; without it pull-vids falls back to a downloader that can only parallelise fragmented formats
  • Writing to a network share caps throughput at the share's write speed
  • See Download Speed for measured numbers
  • Use a different quality setting
  • Some platforms have rate limits

Contributing

Contributions are welcome! Feel free to open issues or submit pull requests.

License

MIT License - feel free to use this tool however you want!

Credits

Core:

  • yt-dlp - The amazing YouTube downloading library

Go libraries:

Inspired by Downie and PullTube, but free and open-source!

Disclaimer

This tool is for personal use only. Please respect copyright laws and each platform's Terms of Service. Only download videos you have the right to download.

About

Universal video downloader CLI supporting 1000+ websites. Free, open-source alternative to Downie/PullTube built with Go.

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages