A local web app for downloading Twitter/X and Instagram videos at the highest available quality, with bulk paste / file upload, live progress, quality presets, cookie support for login-gated content, and a built-in yt-dlp updater.
Everything runs on your own machine (127.0.0.1 only — nothing is exposed to
the network). Extraction is done by yt-dlp;
ffmpeg comes bundled via the imageio-ffmpeg package, so there is nothing to
install manually besides Python.
- Windows with Python 3.11+ (
winget install Python.Python.3.12if needed)
Double-click run.bat (or run it from a terminal). First start creates a
.venv and installs dependencies; then your browser opens at
http://127.0.0.1:8765.
- Paste links into the big box — one per line (commas/spaces also work) — or click Upload .txt / .csv with a file of links.
- Hit Download All (or Ctrl+Enter). Supported links:
https://x.com/<user>/status/<id>/twitter.com/...https://www.instagram.com/p/<code>/,/reel/<code>/,/tv/<code>/
- Watch progress per file. Failed jobs show the reason and a Retry button; links you already downloaded are marked skipped with a Download Anyway override. Instagram carousels download every video in the post.
Files are saved to <save folder>/twitter/ or <save folder>/instagram/ as
Uploader - Title [id].mp4 (Windows-safe, collision-proof names).
| Setting | Notes |
|---|---|
| Save folder | Native folder picker; remembered between sessions |
| Quality | Best available (default), 1080p max, or 720p max |
| Parallel downloads | 1–5, default 3 |
| Login cookies | For private/login-gated content — see below |
| Extra yt-dlp args | Appended to every download, e.g. --sleep-interval 3 --max-sleep-interval 8 |
| Twitter fallback | When yt-dlp fails on a tweet, retry it via twittervideodownloader.com in a headless browser (ads blocked at network level) |
| Update yt-dlp | One click; also warns when your copy is >30 days old |
Public posts work with no setup. For private accounts, stories-adjacent content, or when Instagram demands login:
- From Firefox / Edge: log in to the site in that browser, then pick it as the cookie source. (Chrome usually fails on Windows — Chrome 127+ encrypts cookies in a way tools can't read; use Firefox/Edge or a file.)
- cookies.txt: export with a browser extension like "Get cookies.txt LOCALLY", then upload it in Settings.
Twitter and Instagram change their internals constantly. In order of likelihood:
- Update yt-dlp (Settings → Update yt-dlp). This fixes most breakage.
- Failed tweets are automatically retried through
twittervideodownloader.com in a headless browser (jobs show "via fallback
site"). Chromium for this installs on first
run.bat(one-time, ~150 MB). - Instagram rate limits bulk downloads — the app automatically slows down for
a few minutes when this is detected (you'll see a banner). Adding
--sleep-interval 3 --max-sleep-interval 8to extra args helps for big batches. - "Login required" errors → set a cookie source.
More detail in docs/TROUBLESHOOTING.md; design docs in docs/ARCHITECTURE.md; agent/contributor guidance in AGENTS.md.
Download history lives in data/history.jsonl; settings in
data/settings.json. Delete either to reset.
Download only content you have the right to save. You are responsible for complying with each platform's terms of service and applicable copyright law.