Hurtle

Every connection, busy until the last byte.

24 MB file · server allows 512 KB/s per connection
1 connection 0.0 smeasured 48.2 s 0.0 MB of 24 MB · 0 KB/s
Hurtle, 8 connections 0.0 smeasured 6.6 s 0.0 MB of 24 MB · 0/8 connections · 0 KB/s
a cut: an idle connection took over half of the slowest segment Simulation of the README benchmark, played at 4× speed

Hurtle splits a download into segments over parallel connections. When a connection finishes, it takes over half of the slowest remaining segment, so all of them finish together. It also saves video from the browser through yt-dlp. Free and open source for Windows, macOS and Linux.

or paste into a terminal
curl -fsSL https://arafays.github.io/hurtle/install.sh | sh

Free and open source · Windows · macOS · Linux · Chrome, Brave, Edge, Firefox, Zen

Get Hurtle

Install the app, then add the extension to your browser. The first time the app runs, it registers itself with every Chrome-family browser and Firefox it finds.

All files and SHA-256 checksums are on the releases page.

Or install from a terminal

Linux and macOS

curl -fsSL https://arafays.github.io/hurtle/install.sh | sh

Installs without sudo, into ~/.local on Linux, or /Applications on macOS (~/Applications if that is not writable; override with HURTLE_APPDIR). It checks the download against the release's SHA-256 sums and registers the browser host. Remove it with the same command plus sh -s -- --uninstall.

Windows (PowerShell)

irm https://arafays.github.io/hurtle/install.ps1 | iex

Per user, no admin rights, checksum verified. Prefer a wizard? Use the setup.exe above. Remove it with & ([scriptblock]::Create((irm https://arafays.github.io/hurtle/install.ps1))) -Uninstall.

First launch. Windows builds are unsigned, so SmartScreen may say “Windows protected your PC”: choose More info, then Run anyway. macOS builds are not notarized: if macOS blocks the app or calls it damaged, run xattr -dr com.apple.quarantine /Applications/Hurtle.app, or use System Settings → Privacy & Security → Open Anyway.

No slow straggler at the end

Many servers cap each connection. Hurtle opens several, each fetching its own byte range of the file, and keeps them all busy until the download is done.

  • Dynamic segmentation

    An idle connection first picks up an orphaned segment, then takes over a stalled one (no data for 10 s), and otherwise splits the segment with the longest time left. The cut is weighted so both halves finish together.

  • Ramps up, backs off

    A download starts with up to 4 connections and adds more while throughput keeps rising, up to your limit. A 429, 503 or connection error halves the count.

  • HTTP/1.1 on purpose

    HTTP/2 would carry every segment over one TCP connection, and the per-connection cap would apply again.

  • Resumes where it stopped

    Data is written in place into a preallocated file, with no merge step. State is saved every 2 seconds, so after a pause, quit or crash the download continues from the same position. Size and ETag are checked first.

  • Speed limits that change live

    One limit per download, shared by its connections, and one global limit across all downloads. Change either while a download runs.

Hurtle window with download rows expanded. Big Buck Bunny.mkv shows 6 connections receiving, each with its byte range, progress and speed of about 157 KB/s.

An expanded row lists every connection: its byte range, progress and speed.

It catches downloads where you start them

The extension for Chrome-family browsers and Firefox pauses the browser's own download and opens one dialog. Rename the file, pick connections and a speed limit, choose the folder, and start. Cookies and the Referer are forwarded, so downloads behind a login still work.

A Download video button above a playing video, with a menu listing this page via yt-dlp, the playing clip at 360p, and an HLS stream with 720p and 360p chips.

Hover a video

A button appears above any video. Its menu lists the page, the files it found and the stream qualities, with thumbnails, length and size.

The Download file info dialog: file name, Save to folder, quality, audio language, Save as type MP4, connections 8, speed limit.

Choose what to save

Quality, audio language, file type, folder, connections and speed limit. Then Start, Download later, or hand it back to the browser.

The extension popup listing media on the page and the download folder settings.

Or open the popup

Everything found on the page, plus your download folders. It works even while the app is closed.

Hurtle window with five downloads: a failed nightly build, a completed Product Demo.mp4 from an HLS stream, Big Buck Bunny.mkv at 900 KB/s over 6 connections, a completed PDF, and a Fedora ISO over 8 connections.

Plain files and streams in one list. Product Demo.mp4 came from an HLS stream through yt-dlp.

Video sites and streams, without the command line

YouTube and most video sites serve many small pieces, often with audio and video apart. HLS and DASH work the same way. Hurtle hands these to yt-dlp, and ffmpeg merges the result into one file.

The original audio

YouTube adds auto-dubbed tracks to many videos. Hurtle picks the original language and lists the others.

Your format

MP4 that plays everywhere, MKV, the original container, or audio only as MP3, M4A or Opus.

Real titles

Files are named after the video, not videoplayback?id=….

Paste a link

Paste a page link in the app. If the server answers with a page or a stream, Hurtle switches to yt-dlp.

Looks like the rest of your desktop

On Linux, Hurtle reads your system theme: Omarchy, Noctalia, pywal, wallust, Stylix, GTK and KDE colors, and re-themes live when they change. Everywhere else, pick light, dark or a preset.

Hurtle in Gruvbox Dark

More ways to install

Packages

  • Debian and Ubuntu: download hurtle_<ver>_amd64.deb (or arm64) from the releases page, then sudo apt install ./hurtle_*.deb. It also registers the browser host for Chrome, Chromium, Edge and Firefox system-wide.
  • Arch Linux: a hurtle-bin PKGBUILD is in packaging/linux/aur. It is not on the AUR yet, so build it with makepkg -si.
  • Homebrew: a cask file is in packaging/macos. It is not in a tap yet, so there is no brew install line to copy.

For video sites and streams

Nothing to install. Hurtle uses yt-dlp, ffmpeg and deno if you have them, and otherwise fetches them from their official releases the first time you save a video (checksums verified). If you'd rather install them yourself:

winget install yt-dlp.yt-dlp Gyan.FFmpeg DenoLand.Deno
brew install yt-dlp ffmpeg deno
pacman -S yt-dlp ffmpeg deno

Good to know

  • The tray icon is Linux-only for now. On Windows and macOS, closing the window quits Hurtle, and the next browser download starts it again.
  • Flatpak and Snap browsers can't start programs outside their sandbox. Use your distro's browser package.
  • The Firefox add-on is signed by Mozilla but not listed on addons.mozilla.org. Firefox checks this site for new versions about once a day, and you can check now under about:addons → ⚙ → Check for Updates.

Build from source

Tooling is pinned with mise.

git clone https://github.com/arafays/hurtle
cd hurtle && mise install
mise run install