No description
  • JavaScript 52.7%
  • CSS 37.3%
  • HTML 8.3%
  • Nix 1.2%
  • Dockerfile 0.5%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-08-13 00:36:07 +08:00
public Add image and PDF previews 2026-08-13 00:36:07 +08:00
.dockerignore Add responsive project browser and media playback 2026-08-12 23:53:19 +08:00
compose.yaml Add responsive project browser and media playback 2026-08-12 23:53:19 +08:00
Dockerfile Add responsive project browser and media playback 2026-08-12 23:53:19 +08:00
flake.nix Add responsive project browser and media playback 2026-08-12 23:53:19 +08:00
package.json Add responsive project browser and media playback 2026-08-12 23:53:19 +08:00
README.md Add responsive project browser and media playback 2026-08-12 23:53:19 +08:00
server.mjs Add image and PDF previews 2026-08-13 00:36:07 +08:00

Download Shelf

A client-rendered browser for qBittorrent downloads. Every top-level directory in the mounted download root is a project. It supports card and expandable tree views, search and sorting, and browser-local shelves for merging related projects.

Run with Docker

docker compose up --build -d

The container binds only to 127.0.0.1:18080; nginx publishes it through the configured store.home.lolicon.cyou virtual host. The compose file mounts /var/lib/qBittorrent/qBittorrent/downloads read-only at /downloads.

To use another directory, change the host-side portion of the volume mount in compose.yaml. The API never exposes paths outside DOWNLOAD_ROOT.

Local development

nix develop
npm run dev

Set DOWNLOAD_ROOT when the downloads are not mounted at /downloads:

DOWNLOAD_ROOT=/var/lib/qBittorrent/qBittorrent/downloads npm run dev

The implementation deliberately has no runtime npm dependencies. The Node server scans the mounted filesystem and serves the static client; all presentation state, including shelves, stays in the browser.