A fast, multi-threaded file downloader with a dark-themed GUI and built-in breakpoint resume.
- Multi-threaded chunked downloading — splits files into up to 32 parallel chunks, each on its own HTTP range request, to saturate your bandwidth
- Breakpoint resume — cancelled or interrupted downloads save a
.flashdlsidecar file; pick up exactly where you left off next launch - Live stats — real-time speed, progress percentage, downloaded / total size, and ETA
- Auto-fallback — if the server doesn't support
Accept-Ranges, falls back to a single-stream download automatically - Smart filename detection — reads
Content-Dispositionheader first, falls back to the URL path - Duplicate guard — never overwrites an existing file; appends
(1),(2), … instead - Dark UI — built with CustomTkinter
Requirements: Python 3.12+
pip install -r requirements.txt
python flash_download.pyDownload Flash Download.exe from the dist/ folder — no Python or installation required.
- Paste a direct download URL into the Download URL field
- Choose a Save Location (defaults to your Downloads folder)
- Drag the Threads slider (1 – 32, default 16)
- Click ⚡ Download Now
- Click ⏸ Pause at any time — the partial file and progress are saved automatically
- Next time you enter the same URL, a resume dialog appears showing the saved progress
- Choose ↩ Resume to continue, or ↺ Start Fresh to re-download from scratch
When a server supports byte-range requests (Accept-Ranges: bytes), Flash Download:
- Reads the total file size from the
Content-Lengthheader - Splits the file into N equal byte ranges (one per thread)
- Sends N simultaneous
GETrequests withRange: bytes=X-Yheaders - Each thread writes directly to its pre-allocated region in the output file
This means a 16-thread download can open 16 parallel TCP connections, each receiving a different part of the file at the same time — multiplying effective throughput on high-bandwidth links.
While a download is in progress, two sidecar files sit next to the output:
| File | Purpose |
|---|---|
filename.part |
In-progress data (pre-allocated to full size) |
filename.flashdl |
JSON metadata — URL, total size, per-chunk byte offsets |
The .flashdl is updated every ~120 ms. On successful completion both files are cleaned up and the .part file is renamed to the final filename.
Example .flashdl (chunked mode):
{
"url": "https://example.com/file.zip",
"filename": "file.zip",
"total_size": 1073741824,
"mode": "chunked",
"chunks": [
{ "start": 0, "end": 67108863, "written": 67108864 },
{ "start": 67108864, "end": 134217727, "written": 41943040 }
]
}pip install pyinstaller
python -m PyInstaller --noconfirm --onefile --windowed \
--name "Flash Download" \
--collect-data customtkinter \
--collect-data darkdetect \
flash_download.pyOutput: dist/Flash Download.exe
Note: Always use
python -m PyInstallerto ensure PyInstaller runs under the same Python environment wherecustomtkinteris installed.
| Package | Purpose |
|---|---|
customtkinter |
Dark-themed GUI widgets |
requests |
HTTP downloads and HEAD requests |
MIT — free to use, modify, and distribute.