Overview
GrabIt is a fast, cross-platform desktop utility for downloading online video and audio. Users paste a link, preview metadata (title, thumbnail, duration), pick a quality, and download — with live progress, pause/resume, queue management, and persistent history.
The app targets Windows, macOS, and Linux from a single codebase, shipping native installers (~10 MB) instead of bundling a full Chromium runtime.
The Problem
Most video downloaders are either CLI-only (powerful but unfriendly), web-based (privacy and reliability concerns), or Electron apps (large installers, high RAM use). Sites also change frequently, so hardcoding extractors into the app would require constant releases.
GrabIt sits in the middle: a polished native UI on top of yt-dlp (the actively maintained standard for site extraction), with engines that can be updated independently of the app.
Solution & Features
- Smart URL handling — Clipboard detection and metadata preview before download
- Quality selection — Best, 4K, 1080p, 720p, 480p, or audio-only (MP3/M4A)
- Live progress — Percentage, speed, ETA, and file size streamed to the UI
- Pause / resume / cancel — Pause stops the process but keeps
.part files; resume uses --continue with no re-download - Download queue — Configurable concurrency (default 3 simultaneous downloads)
- History — Persistent log with open file, reveal in folder, and re-download
- Playlist support — Auto-detection with one-click “download all”
- Native notifications — OS alerts when downloads finish
- Theme-aware UI — Light/dark via
prefers-color-scheme, system fonts on every platform - Self-contained setup — First-run download of yt-dlp and ffmpeg, or reuse system installs; one-click updates from Settings
Notable implementation details:
- Progress is parsed line-by-line from yt-dlp’s JSON output and throttled into
download-progress events for the UI - Pause/resume is implemented at the process level — stop child, keep partial file, restart with
--continue - Final paths come from
--print after_move:filepath so “Open” and “Show in folder” always point to the real file - Engine binaries are auto-downloaded on first run (not bundled) so yt-dlp can be updated when sites change, without waiting for an app release
- Windows builds hide console windows for engine subprocesses (
CREATE_NO_WINDOW)
Design Decisions
- Tauri over Electron — ~10 MB installers vs ~150 MB; lower RAM; native OS integration (notifications, file dialogs, clipboard)
- Engines external to the bundle — yt-dlp updates often; decoupling engine updates from app releases improves longevity
- Rust for all backend logic — Queue, history, settings, and process lifecycle in one typed, concurrent layer
- Native-feeling UI — System font stacks,
color-scheme: light dark, minimal custom chrome — utility app that feels at home on each OS
Build & Distribution
Develop with npm run tauri dev; release artifacts via npm run tauri build:
- Windows —
.msi and NSIS .exe - macOS —
.app and .dmg - Linux —
.deb, .rpm, .AppImage
Documented workaround for modern Linux AppImage strip issues (NO_STRIP=true on Fedora 40+ / Ubuntu 24.04+).
Outcomes & Learnings
GrabIt demonstrates:
- End-to-end desktop app architecture with Tauri 2 IPC (commands + events)
- Subprocess orchestration in Rust — spawning, parsing stdout, pause/resume, concurrency limits
- Cross-platform packaging and platform-specific edge cases (Windows console hiding, Linux AppImage tooling)
- Product UX for a technical tool — preview before download, queue, history, and settings without exposing CLI complexity
Legal Note
GrabIt is a tool. Users should only download content they have the right to download — their own uploads, openly licensed media, or content permitted by platform terms.