A fast, open-source download manager with parallel segments and resume support
Project description
fetchy
A fast, open-source CLI download manager — a free alternative to IDM.
fetchy splits files into parallel segments using HTTP Range Requests, giving you faster downloads and the ability to resume interrupted transfers — right from your terminal.
Features
- Parallel downloads — splits files into N segments downloaded simultaneously
- Resume support — interrupted downloads continue from where they left off
- Live progress — per-segment bars with speed and ETA
- Retry logic — transient errors are retried automatically with exponential backoff
- Cross-platform — works on Windows, macOS, and Linux
- Zero config — sensible defaults, fully configurable via flags
Installation
pip install fetchy
Or install from source:
git clone https://github.com/yourusername/fetchy.git
cd fetchy
pip install -e .
Usage
# Basic download (4 segments by default)
fetchy get https://example.com/largefile.zip
# Save to a specific directory or filename
fetchy get https://example.com/largefile.zip -o ~/Downloads/
fetchy get https://example.com/largefile.zip -o ~/Downloads/myfile.zip
# Use 8 parallel segments
fetchy get https://example.com/largefile.zip -s 8
# Disable resume (start fresh even if a state file exists)
fetchy get https://example.com/largefile.zip --no-resume
# Show version
fetchy --version
Resuming: if you press Ctrl+C during a download, fetchy saves a .fetchy state file next to the output file. Run the same command again to resume automatically.
How it works
- fetchy sends a
HEADrequest to check the file size and whether the server supportsRangerequests. - If supported, the file is split into N equally-sized byte ranges.
- Each segment is downloaded in parallel using async HTTP (httpx).
- Segments are written directly to their correct offset in the pre-allocated output file — no temp files to merge.
- Progress and speed are tracked per segment and shown in a live Rich display.
- On completion the
.fetchystate file is deleted automatically.
Options
| Flag | Default | Description |
|---|---|---|
-o, --output |
. (current dir) |
Output file or directory |
-s, --segments |
4 |
Number of parallel segments |
-r, --retries |
5 |
Max retries per segment |
--resume / --no-resume |
--resume |
Resume interrupted downloads |
Development
# Install with dev dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Run a local download test
fetchy get https://speed.hetzner.de/100MB.bin -s 8
Project structure
fetchy/
├── src/
│ └── fetchy/
│ ├── __init__.py # version
│ ├── cli.py # Typer CLI entry point
│ ├── downloader.py # core engine (segments, resume, retry)
│ └── progress.py # Rich progress display
├── tests/
│ └── test_downloader.py
├── pyproject.toml
└── README.md
Contributing
Contributions are welcome! Please open an issue first to discuss what you'd like to change.
- Fork the repo
- Create a feature branch (
git checkout -b feature/your-feature) - Commit your changes
- Open a pull request
License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyfetchy-0.1.0.tar.gz.
File metadata
- Download URL: pyfetchy-0.1.0.tar.gz
- Upload date:
- Size: 37.5 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bc07ac4b1a80af89930d57986091b165a5533b992990e7a5f9b2ef444577e242
|
|
| MD5 |
27ac14b700b9ac838a193c3c85f20eef
|
|
| BLAKE2b-256 |
960ba721189840139f7cb0c33b3a73c5f6b36470ceea995e1c549c4149c43a35
|
File details
Details for the file pyfetchy-0.1.0-py3-none-any.whl.
File metadata
- Download URL: pyfetchy-0.1.0-py3-none-any.whl
- Upload date:
- Size: 3.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aa96e48110dabb434b638ff5c8ff531b805eced5ccc348df9a939c3c83e97021
|
|
| MD5 |
210e308cb624d7050303e06d6dd61cf1
|
|
| BLAKE2b-256 |
5795fbc84c9b958779134c9b4c1e8e65d73e31840a1388cb43c5ebf1ffb7f901
|