Installing swizzin
On a fresh Debian 12 server, the swizzin installer produces a working seedbox (nginx, qBittorrent and the swizzin web panel) in about 18 minutes of wall-clock time, dialogs included, and right after the install, with no torrent added, the whole server used 395 MiB of RAM. swizzin itself, an open-source (GPL-3.0) set of bash scripts, is described on the Swizzin page: its history, design and app catalogue. Everything here was recorded by Pulsed Media on 29 October 2026 in a single install on a 6 vCPU VM on a shared test host; the gotchas come from that run, the installer's source and the swizzin README.
Requirements
| Item | Requirement |
|---|---|
| Operating system | Debian 12 (Bookworm), the version tested here. The project's full list is under Supported systems; Debian 13 is not on it. |
| Access | A full root login shell: log in as root, or use su - or sudo -i. Not plain su and not sudo -s (see Gotchas).
|
| Internet | The installer runs apt and clones swizzin and its panel during the install. |
| Hostname | Optional. On the test VM the self-signed TLS certificate came out issued for the fully qualified name the server resolved for itself (see Step 1), so set the name before the install. |
| Tested on | VM with 6 vCPU, 3 GB RAM and a 32 GB disk, Debian 12, swizzin master (README version 3.15.0) fetched from s5n.sh on 29 October 2026
|
Step 1: Prepare the server
Start from a fresh Debian 12 install with SSH. The test VM got its name this way before the install: a short hostname, plus an /etc/hosts line giving the full name. Its certificate then showed CN = seedbox.example.com.
hostnamectl set-hostname seedbox # and in /etc/hosts: 127.0.1.1 seedbox.example.com seedbox
Then become root with a full login environment:
su - # or: sudo -i
Step 2: Download the installer and read it
The swizzin README offers a one-liner, bash <(curl -sL s5n.sh) && . ~/.bashrc. Downloading the script first leaves it on disk to read before it runs as root; unlike the one-liner, it does not reload ~/.bashrc at the end:
curl -fsSL -o swizzin-setup.sh https://s5n.sh less swizzin-setup.sh
The script is 427 lines, but it only bootstraps: it clones the master branch of the swizzin repository and runs that as root, so what you read is the loader, not the install. A minimal Debian install may not have curl; apt install curl adds it. The README also gives a wget form of the one-liner.
Step 3: Run it and wait for the first dialog
bash swizzin-setup.sh
Expect a long silence before the first question: on the test VM the first dialog appeared after 540 seconds (9 minutes). Before asking anything, the installer installs git, clones swizzin, runs apt update and a full apt upgrade, enables the contrib and non-free repositories and installs its base packages. An excerpt of the console output:
... Performing apt upgrade
108 packages to upgrade.
✔ Apt upgrade complete
...
INFO Enabling contrib repo
INFO Enabling non-free repo
...
... Performing installation of 11 apt packages
(sudo rsyslog vnstat tcl tcl-dev build-essential apt-transport-https bc gnupg2 cracklib-runtime ccze)
The installer writes its log to /root/logs/swizzin.log, which is the first place to look if a step fails.
Step 4: Answer the dialogs
The dialogs come in this order: welcome, master user name, password, password confirmation, core features, optional apps, qBittorrent version. Inside a checklist, move with the arrow keys, tick with Space and confirm with Enter.


The password dialog says "Leave empty to generate." The next dialog asks for the same password again. The installer checks the password's strength when it creates the master user; on the test run the console showed "Password passed".



The test run kept the default, so everything measured on this page is with qBittorrent 4.5.2; the 5.1 option was not tested.
Step 5: Let the install finish
After the last dialog (on this run, the qBittorrent version) swizzin asks nothing more. On the test VM, package installation took 7 minutes 47 seconds by the installer's own count, and the whole run took about 18 minutes from bash swizzin-setup.sh.
Two lines like sed: can't read /srv/fancyindex/header.html: No such file or directory (and the same for footer.html) appear during the nginx step. On the test run the next line was "Fancyindex installed", the install completed and the panel worked.
The end of the output (excerpt):
SUCCESS Panel installed
INFO Package installation took 7 minutes and 47 seconds
SUCCESS Swizzin installation complete!
INFO Seedbox can be accessed at https://<server-ip>
INFO You can now use the box command to manage swizzin features, e.g. `box install nginx panel`
...
INFO Shell completions for the box command have been installed. They will be applied the next time you log into a
bash shell
Step 6: Log in to the panel and qBittorrent
Open https://seedbox.example.com/ (or the server's IP) and accept the self-signed certificate warning; the panel then redirects to /login. Plain HTTP on port 80 redirects to HTTPS.

qBittorrent's web UI is at /qbittorrent/, behind nginx basic authentication. As a smoke test, the Debian 13.7.0 netinst torrent was added through qBittorrent's web API and reached 60% at about 10 MiB/s from 73 seeds. The speed says more about the test VM's connection than about swizzin.
Step 7: Manage it with box
Open a new login shell first (see Gotchas):
exec bash -l box list
box list prints the installable apps, which the swizzin page groups by use; add one with box install followed by its name. The full command syntax is under The box command.
swizzin's own documentation covers each app: box basics and the per-app pages linked from the installer log.
What the install produced
Numbers taken straight after the installer finished, with no torrent loaded yet.
| Measure | Result |
|---|---|
| Debian packages | 468 before, 671 after (+203) |
| RAM in use, whole VM | 395 MiB |
| qbittorrent-nox (v4.5.2, the default) | 37 MiB resident |
| swizzin panel (Python) | 66 MiB resident |
| php-fpm (main process) | 29 MiB resident |
| Root filesystem used | 2.7 GiB |
| Service accounts | panel runs as user swizzin, qBittorrent as the master user, not as root
|
| Master user's home directory | mode 750 |
| TLS certificate | self-signed, valid until October 2036 |
What ss -tlnp showed listening over TCP (UDP not checked):
| Listening on | Service |
|---|---|
| All addresses, ports 80 and 443 | nginx (HTTP redirects to HTTPS) |
| All addresses, port 22 | SSH |
| Every interface address, peer port (59730 on the test VM) | qBittorrent, for BitTorrent peers |
| 127.0.0.1 only (port 8333 on the test VM) | swizzin panel, reached through nginx |
| 127.0.0.1 only (port 10317 on the test VM) | qBittorrent web UI, reached through nginx |
What the installer leaves to you
swizzin finishes with a working seedbox, but four things on the test VM were left for the admin to decide:
| Area | State on the test VM | What to do |
|---|---|---|
| Firewall | No rules: iptables policies ACCEPT, ufw inactive | Work from the console or with a way back in. Check ss -tulnp for what listens, allow loopback, established connections, SSH, 80, 443 and qBittorrent's peer port (TCP and UDP), then drop the rest. Not tested on this run.
|
| /proc | Mounted without hidepid. Without it, Linux lets every user list every other user's processes and their command lines |
With more than one account (box adduser), consider hidepid=2; test it on the server before relying on it.
|
| TCP | Congestion control cubic, qdisc fq_codel, net.core.rmem_max 212992 |
Measure throughput before changing them. |
| Panel assets | The dashboard HTML references scripts and styles on ajax.googleapis.com, cdnjs.cloudflare.com, cdn.jsdelivr.net and stackpath.bootstrapcdn.com | The viewer's browser fetches them from those hosts; host copies locally if that matters to you. |
Gotchas and troubleshooting
Run it as root, but not through sudo -s
The script's first check, read from its source (the test itself ran as root), stops a non-root user with "Swizzin setup requires user to be root. su or sudo -s and run again". The README says the opposite: do not use plain su or sudo -s, because without a full root login the environment is not root's, and the mandatory cracklib password check can fail to find its binary. Follow the README and use su - or sudo -i.
The password dialog offers a generated password (not tested)
The password dialog says "Leave empty to generate." The test run typed its own password, so this path and where a generated password is shown were not checked. Type your own.
The qBittorrent version default is the older build
The version dialog highlights Debian's repository build, 4.5.2 on Debian 12. Pressing Enter out of habit installs that; move the selection first if you want another branch.
bash: box: command not found right after the install
On the test VM, running box list in the shell that had run the installer returned bash: box: command not found. exec bash -l (or logging out and back in) fixed it. The cause was not traced; the README one-liner ends with . ~/.bashrc, which the download-first method skips.
A second software screen follows the checklist
After "Choose your clients and core features" a second list, "Make some more choices", asks about optional apps. Its entries are mostly different (autobrr appears in both). Enter with nothing ticked skips it.
FAQ
How do I replace the self-signed certificate?
The box list catalogue includes a letsencrypt app. This guide did not test it.
Can the install run without the dialogs?
The README documents an unattended mode (--unattend with the app names plus --user and --pass) and an --env file option. This guide did not test either. A password given on the command line ends up in the shell history.
Rather not run the server?
The steps above, plus the firewall and the hidepid decision, are a one-time job; keeping swizzin and Debian patched afterwards is not. A Pulsed Media seedbox skips both: PM Software Stack (PMSS) comes installed, with updates, monitoring and support handled by Pulsed Media, which has run seedboxes since 2010 and operates its own datacenters in Finland. PMSS is open source too, if you would rather install it on your own Debian 12 server.
See also
- Swizzin — the swizzin project: QuickBox origins, licence, releases, app catalogue
- Installing PM Software Stack — the self-hosted install of Pulsed Media's own open-source seedbox platform
- PM Software Stack — architecture and feature list of PMSS
- QBittorrent — the BitTorrent client this install sets up
- Build Your Own Seedbox — choosing hardware for a self-hosted seedbox
- Seedbox — Pulsed Media seedbox plans