A lightweight, self-hosted web file manager for your home network.
Nodi is a personal file hub for moving files between your own devices — laptop, phone, tablet, TV — over your home LAN. It is NOT a collaboration suite. Think of it as a private Dropbox that lives on your own hardware.
Core workflow:
- Log in securely with a bcrypt-hashed password
- Browse folders with zero-latency SPA navigation
- Upload large files with resumable chunked transfers (20 GB–100 GB+)
- Preview images, video, audio, PDF, and text files
- Share read-only links or upload dropboxes on your trusted network
- Mount storage via WebDAV from desktop and mobile file managers
Run the installer on any Linux server. It will ask you to choose Docker or Direct install, and set your own admin username and password.
bash <(curl -fsSL https://raw.githubusercontent.com/Twarga/Nodi/main/install.sh)The installer:
- Clones the latest source
- Lets you choose Docker or native (no containers)
- Asks for your admin username and password
- Generates a secure cookie secret automatically
- Starts Nodi on port 7319
- Registers a systemd service so it auto-starts on boot
Custom install directory:
INSTALL_DIR=/opt/nodi bash <(curl -fsSL https://raw.githubusercontent.com/Twarga/Nodi/main/install.sh)After install:
sudo systemctl status nodi # check status
sudo systemctl stop nodi # stop
sudo systemctl restart nodi # restartcp .env.example nodi.env
# Edit nodi.env and set QL_BOOTSTRAP_PASSWORD or QL_PASS_HASH
docker compose up -d./run.shRequires Go 1.24+ and Node.js 20+.
run.sh options:
./run.sh --no-build # skip frontend build
./run.sh --test # run tests, no server start
./run.sh --reset # wipe nodi_files and .env for clean start
./run.sh --bg # start in background
./run.sh --stop # kill background processTo completely remove Nodi:
bash <(curl -fsSL https://raw.githubusercontent.com/Twarga/Nodi/main/uninstall.sh)This removes the systemd service, Docker containers/volumes, source code, and optionally all user data. You can also run it locally:
./uninstall.shSet REMOVE_DATA=yes to also delete uploaded files:
REMOVE_DATA=yes ./uninstall.sh- Backend: Go 1.24+ (standard library +
http.ServeMux) - Frontend: Preact + Signals
- Styling: Tailwind CSS v4
- Build: Vite
- Packaging: Multi-stage Docker build + GitHub Container Registry
- Deployment: Docker Compose, Kubernetes manifests included
- Passwords hashed with bcrypt (never stored plain)
- Session cookies are signed HMAC tokens with sliding expiry
- CSRF protection with per-session tokens
- Share links use unguessable hashed tokens (never in URLs)
- Request body limits on all JSON endpoints
- Rate-limited login attempts
- Unsafe default secrets are rejected at startup
Important: Nodi is safest as a LAN-only app. If you expose it remotely, put it behind HTTPS and a firewall you understand.
| Feature | Status |
|---|---|
| Large-file uploads (stream to disk) | ✅ |
| Resumable chunked uploads | ✅ |
| Folder upload with structure preserved | ✅ |
| Mobile-friendly upload screen (Send) | ✅ |
| Image / video / audio / PDF / text preview | ✅ |
| Search across storage | ✅ |
| Share links (read-only & upload dropbox) | ✅ |
| Password-protected shares | ✅ |
| Expiring share links | ✅ |
| WebDAV endpoint | ✅ |
| Trash & restore | ✅ |
| Streaming TAR backup | ✅ |
| Dark / Light / System theme | ✅ |
| PWA support | ✅ |
| Keyboard shortcuts | ✅ |
| Drag-and-drop upload | ✅ |
| Bulk actions (move, copy, delete, compress) | ✅ |
Pre-built manifests are in deploy/kubernetes/.
cd deploy/kubernetes
# Create a secret with your credentials first
kubectl apply -k .The Kubernetes deployment uses the ghcr.io/twarga/nodi:latest image with readiness and liveness probes on /api/health.
See deploy/kubernetes/README.md for details.
MIT License. Created by Twarga.
