One command, then open a browser.
You need a machine that can stay switched on while things download — a laptop, a home server, a Raspberry Pi, or a rented VPS — and Docker. That is the only dependency.
# grab the code and start it git clone https://github.com/luminary-dev/lumaseed.git cd lumaseed docker compose up -d
The first run takes a minute or two while it builds. Then open
http://localhost:3456. Downloads land in a
downloads folder next to the project files.
Stopping it and checking on it
docker compose down # stop docker compose logs -f # watch what it's doing docker compose ps # is it running?
Without Docker
If you would rather run it directly and you have Node.js 20 or newer:
npm install npm start
Paste a link, or drop a file.
There are two ways to start a download, and both work the moment the page loads:
- Magnet link — paste it into the box and press Add (or hit Enter).
- .torrent file — drag it onto the drop zone, or click to browse.
While a torrent runs you get a progress bar, download and upload speed, the number of peers you are connected to, and an estimated time remaining. Every torrent can be paused, resumed, or removed. Removing asks whether to delete the downloaded data too, so you can drop a torrent from the list and keep the files.
Adding the same torrent twice is refused rather than duplicated — if it is already in the list, Lumaseed tells you instead of starting a second copy.
Three ways to reach what you downloaded.
Because Lumaseed runs on your own machine, the files are already on that disk when the torrent completes. How you get to them depends on where you are sitting.
Open the folder directly
The fastest option when you are at the same computer. Every file in the interface shows its full path with a copy button next to it — click the path to select it, or the button to copy it.
Download the whole folder
Browsers cannot download a directory, so Download folder packages the
entire torrent — folder structure intact — into a single .zip
and streams it to you. It is built without compression, because video and audio are
already compressed and squeezing them again wastes time for no gain, so it moves about as
fast as your network allows. Files larger than 4 GB are handled with ZIP64.
Save one file
Each completed file has its own Save link. These support range requests, so pausing and resuming a 10 GB browser download works normally.
Three environment variables, and where files land.
Set these in the environment: block of docker-compose.yml:
| Variable | Default | What it does |
|---|---|---|
| PORT | 3456 | Port the web interface is served on |
| TORRENT_PORT | 42069 | Port other peers connect to you on (TCP and UDP) |
| DOWNLOAD_DIR | /downloads | Where files are saved inside the container |
To save downloads somewhere else — an external drive, a NAS mount — change the left-hand side of the volume line. The right-hand side stays as it is:
volumes: - /mnt/storage/torrents:/downloads
What actually makes a torrent fast.
Lumaseed ships tuned for throughput — nothing is throttled, it opens far more peer connections than a default client, keeps thirteen public trackers plus DHT and PEX active, and gives disk I/O its own widened thread pool. Three things outside the software then decide your actual speed.
How many people are sharing it
By far the biggest factor, and nothing can change it. A popular torrent with hundreds of seeders will saturate your connection. A rare one with two seeders will crawl in any client. The swarm's combined upload capacity is a hard ceiling.
Whether peers can reach you
Torrents are much faster when other people can connect to you, not only when you
reach out to them. Lumaseed tries to arrange this automatically on home routers using
UPnP and NAT-PMP. If your router has those disabled, forward port
42069 — both TCP and UDP — to the machine running Lumaseed.
On a rented server, open that port in the provider's firewall instead.
Your own connection
A wired connection beats Wi-Fi. Some VPNs deliberately slow file sharing down, so if speeds are poor, try without one — and if you keep the VPN, you need a provider that offers port forwarding or you will be outbound-only.
Running it on a server, safely.
There is no login screen. Anyone who can reach the address can add torrents and download your files. That is fine on your own machine at localhost, but do not put it directly on the public internet.
The simplest safe way to use it from your phone or laptop is a private network such as Tailscale — install it on the server and on your devices, and they can reach each other without exposing anything publicly. If you genuinely need it public, put Caddy, nginx or Cloudflare Access in front with HTTPS and a password.
It cannot run on serverless platforms
Vercel, Netlify and AWS Lambda will not work, no matter what you add. A torrent client has to hold network connections open for hours and write large files to a real disk; those platforms run short-lived functions with temporary storage. You need an actual always-on machine.
Check your provider's rules
Many hosts prohibit file sharing in their terms of service and will suspend a server that receives a copyright complaint. Providers that advertise seedbox hosting expect this traffic; most general-purpose clouds do not.
Watch the bandwidth billing
A torrent client keeps uploading after your download finishes, so you can easily use more data than you downloaded. Pick an unmetered plan where you can.
The HTTP endpoints, if you want to script it.
The interface is built entirely on these, so anything the page can do, a script can do.
| Endpoint | Does |
|---|---|
| GET /api/torrents | List every torrent with progress, speeds, peers and files |
| POST /api/torrents | Add a magnet link — JSON body {"magnet":"…"} |
| POST /api/torrents/file | Add a .torrent upload (multipart field torrent) |
| POST /api/torrents/:hash/pause | Pause a torrent |
| POST /api/torrents/:hash/resume | Resume a torrent |
| DELETE /api/torrents/:hash | Remove it — add ?deleteFiles=true to delete data too |
| GET /api/torrents/:hash/zip | Stream the whole torrent folder as a zip |
| GET /api/torrents/:hash/files/:i | Download one completed file |
| GET /api/verify/:hash | Re-hash a sample of pieces and report whether they are genuinely on disk |
| GET /api/status | Global speeds, download directory and internal error count |
# add a torrent from the command line curl -X POST http://localhost:3456/api/torrents \ -H 'Content-Type: application/json' \ -d '{"magnet":"magnet:?xt=urn:btih:..."}'
Four things that catch people out.
A dead torrent cannot be downloaded by anything
If a torrent sits on "Searching for peers" forever, nobody online has the file any more. No client can fix that, because the data is not on the network. Lumaseed keeps looking for as long as it runs, so leaving it overnight is worth a try — but after a few days with zero peers, the torrent is genuinely gone.
Torrents are not remembered across restarts
If the container restarts, your downloaded files are safe on disk, but the list of active torrents is cleared and you will need to re-add the magnet links. Re-adding verifies the existing data first, so a completed torrent jumps straight back to 100% instead of downloading again.
The zip is only offered once everything is complete
Partial files would produce a broken archive, so the folder download returns an error until every file in the torrent has finished. Individual completed files can still be saved one at a time before then.
Completed downloads are correct by design
Every piece is cryptographically verified before it is written, so a finished torrent is
intact. If you want to confirm independently, call
/api/verify/:hash — it re-reads and re-hashes a sample of the
data and reports "healthy": true.
Only download content you have the legal right to. You are responsible for what you do with this software.