Skip to content

0xheycat/pounce

Repository files navigation

Pounce β€” self-hostable download manager, downloads pounced.

🐾 Pounce

Downloads, pounced.

A download engine you host and fully own β€” permanent resume, multi-connection acceleration, live speed control, an immersive 3D dashboard, and optional browser capture. Run it on your laptop, home server, or NAS and drive it from any browser. 100% open source (MIT).

Verified status engine dashboard license project


πŸ“Έ Dashboard

Pounce dashboard showing the URL composer, device pairing, settings, live counters, and 3D download scene

The screenshot is captured from the actual Vite dashboard at the repository's verified public-readiness head. The dashboard works without a paid service; API and live-download data come from the self-hosted Go engine.

Why Pounce?

Most of us still lose downloads to a dropped connection, a closed tab, or a reboot β€” and the tools that fix that are often desktop-only or tied to a single machine. Pounce takes a different angle: it's a small engine you run yourself that does the real downloading β€” splitting files across many connections, persisting per-segment progress to disk, and resuming exactly where it left off, even after a restart β€” controlled from a beautiful 3D web dashboard you can open from any device on your network.

Think of it less as "an app" and more as your own personal download service: self-hosted, always-on if you want it, and entirely yours.

What makes Pounce different

  • 🏠 Self-hostable by design β€” one engine, reachable from your laptop, phone, or another machine. Your files and history never leave your hardware.
  • πŸͺΆ Single static binary, zero runtime deps β€” the engine is pure Go standard library. No Electron, no JVM, no background bloat. Drop it on a Raspberry Pi or a NAS and go.
  • 🌐 Browser, not a desktop install β€” the UI is a web dashboard, so the same Pounce works on every OS and every screen.
  • πŸ”Œ Hackable & extensible β€” a clean REST + SSE API and a small codebase meant to be read and forked.
  • 🎨 Actually nice to look at β€” a full-3D, themeable dashboard, because tools you use daily should feel good.

These aren't reinventions β€” they're a combination aimed at one goal: a download manager anyone can run, own, and trust, for free.

Built on the shoulders of giants

Pounce exists thanks to the people who pioneered this space. Tools like aria2, yt-dlp, JDownloader, and others shaped what a download manager can be β€” and Pounce is our open contribution back to that lineage, not a replacement for any of them. Where it helps, Pounce is designed to cooperate (for example, resolving media via yt-dlp) rather than compete. If another tool serves you better, use it β€” and we'd love to learn from it. 🐾

πŸ“± Pounce Anywhere β€” your downloads, on every device

Because Pounce is a service you host, you can drive it from anywhere β€” your phone on the couch, a laptop in another room, or across the internet through your own tunnel. This is the part most download managers can't do.

  • One-command remote mode: pounce --remote binds every interface and requires a token (auto-generated and printed at startup).
  • One-tap phone pairing: the engine prints a ready-to-open link with the token baked in, and the dashboard's πŸ“± Pair device panel shows a QR code β€” scan it and you're in.
  • Install it like an app: the dashboard is a PWA β€” "Add to Home Screen" for a full-screen, offline-aware Pounce.
  • Secure by default: remote access always needs a bearer token; for internet exposure, put Pounce behind HTTPS (Caddy/nginx) or a private tunnel (Tailscale/Cloudflare Tunnel).

Full setup, including reverse-proxy and tunnel recipes: docs/REMOTE.md.

Features

Working today (v0.1)

  • ⚑ Multi-connection, segmented downloads β€” HTTP Range requests, up to 32 parallel streams.
  • πŸ” Permanent resume β€” per-segment progress is persisted; resume survives app/PC restarts.
  • ⏸️ Pause / resume / cancel β€” partial data is never thrown away on pause.
  • πŸŽ›οΈ Live speed limiting β€” token-bucket throttle, adjustable per download on the fly.
  • πŸ“ Choose save location β€” the engine has real filesystem access (unlike a browser).
  • πŸ“‘ Range/Accept-Ranges detection β€” gracefully falls back to single-stream when a server won't cooperate.
  • 🌌 Full 3D dashboard β€” orbiting progress orbs, glow that tracks throughput, live stats, glassmorphism UI.
  • πŸ”Œ Zero-dependency engine β€” pure Go standard library; builds to a single binary.

On the roadmap (scaffolded β€” great first contributions)

  • 🎬 Video/stream capture via yt-dlp
  • πŸ₯² Torrent / magnet support via aria2
  • πŸ—“οΈ Scheduler + bandwidth profiles, auto-shutdown
  • 🧩 Browser extension link capture (MV3 scaffold included)
  • πŸ“± Remote access from phone + auth
  • πŸ—„οΈ SQLite store backend, checksum verification, mirror/multi-source

See docs/ROADMAP.md.

Architecture

Browser ─► 3D Dashboard (React + R3F)
            β”‚  REST + Server-Sent Events
            β–Ό
     Local Engine (Go daemon, :7766)
     segmented β”‚ resume β”‚ throttle β”‚ queue β”‚ SSE
            β”‚
     ~/.pounce/meta/*.json   (+ .pdownload part files)

Full write-up: docs/ARCHITECTURE.md.

Quick start

0. Docker β€” zero local toolchain (easiest way to test)

No Go or Node installed? Build and run everything with just Docker:

docker compose up --build      # then open http://localhost:7766
# ...or without compose:
docker build -t pounce:local . && docker run --rm -p 7766:7766 pounce:local

Prefer make? Run make docker && make docker-run. For contributors with Go + Node, make build / make test / make run cover the rest.

1. Run the engine

cd engine
go run ./cmd/pounce            # listens on http://127.0.0.1:7766

2. Run the dashboard (dev)

cd dashboard
npm install
npm run dev                    # http://localhost:5173 (proxies to the engine)

3. Production (single process)

Build the dashboard, then let the engine serve it:

cd dashboard && npm install && npm run build
cd ../engine && go run ./cmd/pounce --static ../dashboard/dist
# open http://127.0.0.1:7766

Engine flags

Flag Default Description
--addr 127.0.0.1:7766 Listen address
--data ~/.pounce State directory (resume metadata)
--static (none) Path to built dashboard dist to serve
--auth-token (none) Require this bearer token on /api routes
--remote false Bind all interfaces + require a token (auto-generated if unset); prints device-pairing links

REST API (brief)

Method Path Body Description
GET /api/downloads β€” List downloads
POST /api/downloads { url, dir?, connections?, speedLimit? } Add + start
POST /api/downloads/{id}/pause β€” Pause
POST /api/downloads/{id}/resume β€” Resume
POST /api/downloads/{id}/cancel β€” Cancel + delete partial
POST /api/downloads/{id}/speed { limit } Set speed limit (bytes/s, 0 = unlimited)
DELETE /api/downloads/{id} β€” Remove from list
GET /api/events β€” SSE live updates

Contributing

PRs welcome! Pounce is intentionally small and modular so it's easy to extend. Start with CONTRIBUTING.md and the roadmap's β€œgood first issue” ideas.

License

MIT Β© Pounce contributors.

⚠️ Use responsibly. Only download content you have the right to access; respect copyright, site terms, and local law.

About

Self-hosted download manager with resumable segmented downloads, speed control and a 3D web dashboard.

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Packages

 
 
 

Contributors