Vaze is a self-hosted, local-first file storage and hosting service built with Next.js. Run it easily as a Docker container on your own server or home network. It provides a clean web interface for managing your files and a powerful API to use as a backend for your other applications.
- File & Folder Management: Create, rename, and delete files and folders directly from the web UI, including multi-select for deleting many files at once.
- Path-addressed storage: Files keep the name you upload them with, so you choose the public URL —
https://your-vaze/api/hosting/projects/demo/photo.png. - Streaming uploads: Upload bodies go straight to disk, so file size is bounded by your volume rather than by memory.
- Download & Public Hosting: Download files directly, or embed them from a public hosting URL that serves untrusted content sandboxed.
- Private files & signed URLs: Mark any file (or a whole folder) private so it stops being world-readable, then hand out time-limited signed links that work without an API key.
- Range requests & caching: Byte-range support means audio and video seek properly, and
ETag/Last-Modifiedrevalidation keeps repeat embeds down to a bodiless304. - API Key Management: Generate and manage API keys from a dedicated dashboard to securely interact with your storage from other apps.
- Powerful API: Use Vaze as a backend service for any application that needs file hosting or storage, with simple RESTful endpoints.
- Dockerized: Get up and running in minutes with the official Docker image.
Not built yet: moving files between folders, folder upload and drag-and-drop, zip download of a folder, and API-key scopes.
All you need is Docker with the Compose plugin.
One command sets up everything — it checks Docker, downloads compose.prod.yaml,
generates your AUTH_SECRET into a .env, and starts the container:
curl -fsSL https://raw.githubusercontent.com/darseen/vaze/main/scripts/install.sh | shThe only thing it asks for is the URL you'll open Vaze on, and it defaults to this machine's LAN address. Pass it in to skip the prompt entirely:
curl -fsSL https://raw.githubusercontent.com/darseen/vaze/main/scripts/install.sh \
| BASE_URL=https://files.example.com shRe-run it from the same directory to upgrade: it refreshes the compose file,
pulls the newer image, and recreates the container — while never overwriting a
value already in your .env and never touching the volume your uploads and
database live in. Skip to Initial setup once
it finishes.
Options: --dir=PATH to choose the install directory (default ./vaze), and
--no-start to write the config without starting. BASE_URL, VAZE_PORT,
VAZE_VERSION, VAZE_BIND_ADDR and TZ can all be set in the environment or
edited in .env afterwards.
Prefer to read a script before piping it to a shell? Download it first, or follow the manual steps below.
Grab compose.prod.yaml, put a .env next to it:
AUTH_SECRET=generate-with-openssl-rand-base64-32
BASE_URL=http://your-server-ip-or-domain:3000
VAZE_PORT=3000
VAZE_VERSION=latestthen start it:
docker compose -f compose.prod.yaml up -ddocker run -d \
-p 3000:3000 \
-v vaze_data:/app/data \
-e BASE_URL="http://your-server-ip-or-domain:3000" \
-e AUTH_SECRET="$(openssl rand -base64 32)" \
--restart unless-stopped \
--name vaze \
ghcr.io/darseen/vaze:latest-p 3000:3000maps port 3000 on your host to the container's port 3000.-v vaze_data:/app/datapersists uploads and the SQLite database outside the container, so they survive updates and removals.
- Open
http://<your-server-ip>:3000in your browser. - You will be prompted to register — the first user to register becomes the admin.
- Log in with your new credentials.
That's it! You can now start uploading and managing your files.
Run these from your install directory (./vaze by default):
docker compose -f compose.prod.yaml logs -f # follow logs
docker compose -f compose.prod.yaml ps # status and health
docker compose -f compose.prod.yaml restart # restart
docker compose -f compose.prod.yaml down # stop (keeps your data)To upgrade, re-run the installer from that directory — or do it by hand:
docker compose -f compose.prod.yaml pull && docker compose -f compose.prod.yaml up -dWarning
docker compose -f compose.prod.yaml down -v also deletes the vaze_vaze_data
volume — every uploaded file and account goes with it.
Everything lives in the .env the installer writes next to compose.prod.yaml.
Edit it and apply with docker compose -f compose.prod.yaml up -d.
| Variable | Required | Description |
|---|---|---|
BASE_URL |
Yes | Public base URL of your instance, e.g. https://files.example.com. Public file links are built from it. |
AUTH_SECRET |
Yes | Long random string signing session tokens and signed URLs. Replacing it logs everyone out and invalidates every outstanding signed link. |
VAZE_PORT |
No (3000) |
Host port published by the container. |
VAZE_BIND_ADDR |
No (0.0.0.0) |
Host address to bind to. Set 127.0.0.1 when a reverse proxy fronts Vaze. |
VAZE_VERSION |
No (latest) |
Image tag to run — pin it for reproducible deploys. |
TZ |
No (UTC) |
Container timezone. |
MAX_UPLOAD_SIZE |
No (5gb) |
Largest single file accepted by an upload, e.g. 500mb. |
MAX_FILES_PER_REQUEST |
No (100) |
Cap on files in one multipart request. |
API_REQUEST_RETENTION_DAYS |
No (90) |
How long API request-log rows are kept. |
DEFAULT_FILE_VISIBILITY |
No (public) |
Visibility for uploads that don't specify one. Set private for a private-first instance. |
DEFAULT_PRESIGN_TTL_SECONDS |
No (3600) |
Lifetime of a signed URL when the caller doesn't specify one. |
MAX_PRESIGN_TTL_SECONDS |
No (604800) |
Longest lifetime a signed URL may be minted with. |
HOSTING_CACHE_MAX_AGE |
No (0) |
max-age for public hosted responses. Zero revalidates every time via ETag. |
The installer generates AUTH_SECRET for you. To make one by hand:
openssl rand -base64 32All data lives at /app/data inside the container, backed by the vaze_data
volume. Keep it on a volume or you will lose every file and account when the
container is removed.
Vaze can be used as a file-hosting backend for your other projects. You can use Vaze's official NPM package to interact with the API.
Here are a few screenshots of the Vaze interface.
Contributions are welcome! If you'd like to help improve Vaze, please feel free to fork the repository, make changes, and submit a pull request.
This project is licensed under the MIT License. See the LICENSE file for details.




