Cross-platform desktop downloader for YouTube and other platforms, built with Electron + React and powered by yt-dlp. Pre-built release artifacts are published for Windows, macOS, and Linux.
Main dashboard for pasting a link, fetching metadata, picking a format, selecting a clip range, enabling Turbo download, and adding items to the queue.
Active queue workspace with download overview, per-job status, and inline logs for the selected item.
History dashboard for browsing past downloads with day grouping, status filters and inline details.
Settings workspace for saving defaults, checking system status, and managing app and yt-dlp updates.
- Notion-like desktop workspace with dedicated
New Download,Active Queue,History, andSettingsviews - Queue-based downloads with per-item progress, transfer size and logs
- Format picker listing every stream with resolution, FPS, codec and estimated size
- Open the finished file's folder straight from the queue or history
- Pause, resume, cancel, and retry controls
- Optional clip-range downloads with a two-handle range control
- Smart fallback strategy for format/download failures
- Built-in
yt-dlpupdater with progress feedback while metadata loads - In-app app-update notification (checks GitHub latest release)
- Conditional auth handling for age/bot-restricted content
- Clear centered popup when no downloadable formats are available
- Light and dark themes that follow the app, not the OS flash
| Shortcut | Action |
|---|---|
Enter |
Inspect the URL in the address field |
Ctrl + Enter |
Add the current setup to the queue |
Ctrl + 1 … 4 |
Jump between New Download, Active Queue, History and Settings |
Ctrl + F |
Search history |
Ctrl + L |
Focus the URL field |
Esc |
Close the open dialog |
Dropping a link anywhere on the window starts a metadata fetch, and the Paste button reads the clipboard through the main process.
StreamFetch handles restricted content in a guided flow:
- Try normal fetch/download first.
- If authentication is required, a popup appears (browser cookies).
- If browser cookie access fails (DPAPI/locked DB), popup enables
cookies.txtimport. - Retry can be applied both at fetch-time and download-time.
- If video still has no downloadable streams, StreamFetch shows a dedicated "No Downloadable Formats" popup.
- Single video and playlist support (a playlist URL queues every item)
- Structured workspace shell with sidebar navigation and saved defaults
- Format picker for video+audio, video-only (merged with the best audio track) and audio-only streams
- Clip-range download for single videos (
ss,mm:ss,hh:mm:ss) - Global speed limit (
500K,2M,1.5M) - Download history with day grouping, status filters, search and inline logs
- Runtime logs with progress-line filtering, copy and export
- Frameless desktop UI with custom window controls
- Single-instance guard so two windows never share one download queue
yt-dlpis required and is bundled with every release build.ffmpegis strongly recommended and also bundled. Without it StreamFetch cannot merge separate video and audio streams, so quality falls back to single-file formats and clip-range downloads are disabled. Settings → System status reports whether FFmpeg was detected.
- Electron 34
- React 18 + Vite 6
- Tailwind CSS 3
yt-dlp+ optionalffmpeg
streamfetch/
electron/ # Main process + preload bridge
src/ # React renderer
bin/ # Platform binaries bundled into release builds
release/ # Build outputs
npm install
npm run devnpm run build:renderer
npm startRelease builds bundle yt-dlp and ffmpeg automatically in CI.
For local source builds, provide binaries in bin/ for your platform (yt-dlp and optional ffmpeg) or install them in your system $PATH, then clone and build:
git clone https://github.com/Shripad735/streamfetch.git
cd streamfetch
npm install
npm run buildPre-built Windows setup executables are published with every release. To build locally:
npm run build:winArtifact is created in release/:
StreamFetch-Setup-<version>.exe(installer)
npm run build:macnpm run build:linuxYou can download only a specific part of a single video:
- Fetch video metadata.
- Turn
Clip rangeon insideDownload options. - Drag the range handles, or type
Start timeandEnd timeusingss,mm:ss, orhh:mm:ss. - Queue the job.
Notes:
- Clip range is available only for single videos (not playlist jobs).
ffmpegis required for clip extraction.
- GitHub workflow runs on
v*tags (for examplev1.4.0). - Workflow validates that tag version (
vX.Y.Z) matchespackage.jsonversion. - Tagged releases build artifacts for Windows, Linux, and macOS.
- macOS build is configured as non-blocking in CI (to avoid blocking release when mac runners are unavailable).
- Release notes are auto-generated from commits between the previous release tag and the current tag.
- Notes are grouped into
Features,Fixes, andOther Changesbased on commit message prefix.
Use these commit prefixes to classify notes:
feat: add app update notification bannerfix: handle age-restricted download retryhotfix: prevent renderer crash on startup
nodeIntegration: falsecontextIsolation: true- Strict preload bridge for allowed IPC channels only
- Download execution uses validated
spawnarguments - Renderer navigation and
window.openare blocked and delegated to the system browser - Content-Security-Policy set on the app shell
- Local file access limited to the paths the user picks
For source-based development, place these files in bin/ for your target platform:
yt-dlporyt-dlp.exe(required)ffmpegorffmpeg.exe(optional, enables merged best-quality outputs)
These binaries are not committed to git to keep repository size small.
Install from GitHub Releases for the easiest setup. Each tagged release includes:
- Windows installer (
Setup .exe) - macOS disk image (
.dmg) - Linux AppImage (
.AppImage)
MIT



