Backup automation for self-hosters. Built on top of restic
See the code
Backup management with scheduling and monitoring
[!WARNING] Zerobyte is still in version 0.x.x and is subject to major changes from version to version. I am developing the core features and collecting feedback. Please open issues for bugs or feature requests.
Zerobyte is a backup automation tool that helps you save your data across multiple storage backends. Built on top of Restic, it provides an modern web interface to schedule, manage, and monitor encrypted backups of your remote storage.
The official documentation website is available at zerobyte.app.
It contains up-to-date setup guides, configuration reference, and usage documentation for running Zerobyte in production.
In order to run Zerobyte, you need to have Docker and Docker Compose installed on your server. Then, you can use the provided compose.yaml file to start the application.
services:
zerobyte:
image: ghcr.io/nicotsx/zerobyte:v0.43
container_name: zerobyte
restart: unless-stopped
cap_add:
- SYS_ADMIN
ports:
- "4096:4096"
devices:
- /dev/fuse:/dev/fuse
environment:
- TZ=Europe/Zurich # Set your timezone here
- BASE_URL=http://localhost:4096 # URL you will use to access Zerobyte
- APP_SECRET=94bad46...c66e25d5c2b # Generate your own secret with `openssl rand -hex 32`
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/lib/zerobyte:/var/lib/zerobyte
[!WARNING] It is highly discouraged to run Zerobyte on a server that is accessible from the internet (VPS or home server with port forwarding). If you do, make sure to change the port mapping to "127.0.0.1:4096:4096" and use a secure tunnel (SSH tunnel, Cloudflare Tunnel, etc.) with authentication.
[!WARNING] Do not try to point
/var/lib/zerobyteto a network share. You will face permission issues and strong performance degradation.
[!NOTE] TrueNAS Users: The host path
/var/libis ephemeral on TrueNAS and will be reset during system upgrades. Instead of using/var/lib/zerobyte:/var/lib/zerobyte, create a dedicated ZFS dataset (e.g.,tank/docker/zerobyte) and mount it instead:volumes: - /etc/localtime:/etc/localtime:ro - /mnt/tank/docker/zerobyte:/var/lib/zerobyteThis ensures your configuration, encryption keys, and database persist across TrueNAS upgrades.
Then, run the following command to start Zerobyte:
docker compose up -d
Once the container is running, you can access the web interface at http://<your-server-ip>:4096.
Zerobyte can be customized using environment variables. Below are the available options:
| Variable | Description | Default |
|---|---|---|
BASE_URL | Required. The base URL of your Zerobyte instance (e.g., https://zerobyte.example.com). See Authentication below. | (none) |
APP_SECRET | Required. A random secret key (32+ chars) used to encrypt sensitive data in the database. Generate with openssl rand -hex 32. | (none) |
APP_SECRET_FILE | Path to a file containing APP_SECRET, useful with Docker or Kubernetes secrets. Mutually exclusive with APP_SECRET. | (none) |
PORT | The port the web interface and API will listen on. | 4096 |
RESTIC_HOSTNAME | The hostname used by Restic when creating snapshots. Automatically detected if a custom hostname is set in Docker. | zerobyte |
GOMAXPROCS | Optional positive integer passed to Restic processes to limit CPU scheduler threads. Useful for reducing CPU pressure during backups. | Restic default |
TZ | Timezone for the container (e.g., Europe/Zurich). Crucial for accurate backup scheduling. | UTC |
TRUST_PROXY | When true, trust an existing X-Forwarded-For header from your reverse proxy. Leave false for direct deployments. | false |
TRUSTED_ORIGINS | Comma-separated list of extra trusted origins for CORS (e.g., http://localhost:3000,http://example.com). | (none) |
WEBHOOK_ALLOWED_ORIGINS | Comma-separated list of HTTP origins allowed for backup webhooks and outbound HTTP notification destinations. | (none) |
WEBHOOK_TIMEOUT | Timeout for backup webhook requests in seconds. | 60 |
LOG_LEVEL | Logging verbosity. Options: debug, info, warn, error. | info |
RCLONE_CONFIG_DIR | Path to the directory containing rclone.conf inside the container. Change this if running as a non-root user. | /root/.config/rclone |
PROVISIONING_PATH | Path to a JSON file with operator-managed repositories and volumes to sync at startup. | (none) |
If backups use too much CPU, set GOMAXPROCS on the Zerobyte container and restart it:
environment:
- GOMAXPROCS=2
This limits the Go scheduler used by Restic child processes. Existing operations are not changed; the new value applies to Restic processes started after the container restart.
Other useful Restic tuning options:
off to reduce CPU usage, or auto for the usual balance. max can save more space but uses more CPU.--read-concurrency 1, --exclude-larger-than 10G, or --no-scan.See the full guide: Performance tuning.
Backup webhooks and outbound notification destinations that can target arbitrary network hosts are restricted by WEBHOOK_ALLOWED_ORIGINS.
The allowlist matches exact origins only: scheme, host, and port must match. Paths are ignored, so https://hooks.example.com/backups allows any path on https://hooks.example.com, but it does not allow http://hooks.example.com, https://hooks.example.com:8443, or https://other.example.com.
This policy applies to:
The public ntfy.sh service and fixed-provider notification services such as Slack, Discord, Pushover, and Telegram do not need WEBHOOK_ALLOWED_ORIGINS.
Backup webhooks do not follow redirects. Add the final destination origin to WEBHOOK_ALLOWED_ORIGINS and configure that final URL directly.
Webhook headers are stored as plain text and must use one Key: Value header per line. WEBHOOK_TIMEOUT controls backup pre/post webhook request timeouts; notification delivery uses the underlying provider sender behavior.
Zerobyte can sync operator-managed repositories and volumes from a JSON file at startup. This is useful when you want credentials or connection details to live in deployment-time configuration instead of being entered through the UI.
Provisioned resources:
/run/secrets/* during startup syncThe complete provisioning documentation is available at zerobyte.app/docs/guides/provisioning.
See examples/provisioned-resources/README.md for a full example.
If you only need to back up locally-mounted folders and don't require remote share mounting capabilities, you can remove the SYS_ADMIN capability and FUSE device from your compose.yaml:
services:
zerobyte:
image: ghcr.io/nicotsx/zerobyte:v0.43
container_name: zerobyte
restart: unless-stopped
ports:
- "4096:4096"
environment:
- TZ=Europe/Zurich # Set your timezone here
- BASE_URL=http://localhost:4096 # Change this to your actual URL (use https:// for secure cookies)
- APP_SECRET=94bad46...c66e25d5c2b # Generate your own secret with `openssl rand -hex 32`
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/lib/zerobyte:/var/lib/zerobyte
- /path/to/your/directory:/mydata
Trade-offs:
If you need remote mount capabilities, keep the original configuration with cap_add: SYS_ADMIN and devices: /dev/fuse:/dev/fuse.
See examples/README.md for runnable, copy/paste-friendly examples.
Zerobyte supports multiple volume backends including NFS, SMB, WebDAV, SFTP, and local directories. A volume represents the source data you want to back up and monitor.
To add your first volume, navigate to the "Volumes" section in the web interface and click on "Create volume". Fill in the required details such as volume name, type, and connection settings.
If you want to backup a local directory on the same host where Zerobyte is running, you'll first need to mount that directory into the Zerobyte container. You can do this by adding a volume mapping in your compose.yaml file. For example, to mount /path/to/your/directory from the host to /mydata in the container, you would add the following line under the volumes section:
services:
zerobyte:
image: ghcr.io/nicotsx/zerobyte:v0.43
container_name: zerobyte
restart: unless-stopped
cap_add:
- SYS_ADMIN
ports:
- "4096:4096"
devices:
- /dev/fuse:/dev/fuse
environment:
- TZ=Europe/Zurich
- BASE_URL=http://localhost:4096 # URL you will use to access Zerobyte
- APP_SECRET=94bad46...c66e25d5c2b # Generate your own secret with `openssl rand -hex 32`
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/lib/zerobyte:/var/lib/zerobyte
+ - /path/to/your/directory:/mydata
After updating the compose.yaml file, restart the Zerobyte container to apply the changes:
docker compose down
docker compose up -d
Now, when adding a new volume in the Zerobyte web interface, you can select "Directory" as the volume type and search for your mounted path (e.g., /mydata) as the source path.

A repository is where your backups will be securely stored encrypted. Zerobyte supports multiple storage backends for your backup repositories:
/var/lib/zerobyte/repositories/ or any other (mounted) pathRepositories are optimized for storage efficiency and data integrity, leveraging Restic's deduplication and encryption features.
To create a repository, navigate to the "Repositories" section in the web interface and click on "Create repository". Fill in the required details such as repository name, type, and connection settings.
Zerobyte can use rclone to support 40+ cloud storage providers including Google Drive, Dropbox, OneDrive, Box, pCloud, Mega, and many more. This gives you the flexibility to store your backups on virtually any cloud storage service.
Setup instructions:
Install rclone on your host system (if not already installed):
curl https://rclone.org/install.sh | sudo bash
Configure your cloud storage remote using rclone's interactive config:
rclone config
Follow the prompts to set up your cloud storage provider. For OAuth providers (Google Drive, Dropbox, etc.), rclone will guide you through the authentication flow.
Verify your remote is configured:
rclone listremotes
Mount the rclone config into the Zerobyte container by updating your compose.yaml:
services:
zerobyte:
image: ghcr.io/nicotsx/zerobyte:v0.43
container_name: zerobyte
restart: unless-stopped
cap_add:
- SYS_ADMIN
ports:
- "4096:4096"
devices:
- /dev/fuse:/dev/fuse
environment:
- TZ=Europe/Zurich
- BASE_URL=http://localhost:4096 # URL you will use to access Zerobyte
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/lib/zerobyte:/var/lib/zerobyte
+ - ~/.config/rclone:/root/.config/rclone:ro
Note for non-root users: If your container runs as a different user (e.g., TrueNAS apps), mount your config to the appropriate location and set
RCLONE_CONFIG_DIR:environment: - RCLONE_CONFIG_DIR=/home/appuser/.config/rclone volumes: - ~/.config/rclone:/home/appuser/.config/rclone:ro
Restart the Zerobyte container:
docker compose down
docker compose up -d
Create a repository in Zerobyte:
backups/zerobyte)For a complete list of supported providers, see the rclone documentation.
Once you have added a volume and created a repository, you can create your first backup job. A backup job defines the schedule and parameters for backing up a specific volume to a designated repository.
When creating a backup job, you can specify the following settings:
After configuring the backup job, save it and Zerobyte will automatically execute the backup according to the defined schedule. You can monitor the progress and status of your backup jobs in the "Backups" section of the web interface.

Zerobyte allows you to easily restore your data from backups. To restore data, navigate to the "Backups" section and select the backup job from which you want to restore data. You can then choose a specific backup snapshot and select the files or directories you wish to restore. The data you select will be restored to their original location.

Zerobyte uses better-auth for authentication and session management. The authentication system automatically adapts to your deployment scenario:
Zerobyte does not currently provide fine-grained RBAC for backup operations. Authenticated organization members are trusted operators for repositories, volumes, backup schedules, restores, and notification destinations in their organization.
Organization roles mainly restrict organization-management and instance-management actions. For example, normal members cannot manage members, SSO settings, invitations, registration, or global users, but they can still operate backup resources. Only add users to an organization if you are comfortable with them using the storage, volume, and notification capabilities configured for the instance.
BASE_URL=http://192.168.1.50:4096 (or your IP). Cookies will use Secure: false, allowing immediate login without SSL.BASE_URL=https://zerobyte.example.com. Cookies will automatically use Secure: true for protected sessions.If you're running Zerobyte behind a reverse proxy (Nginx, Traefik, Caddy, etc.):
BASE_URL to your HTTPS domain (e.g., https://zerobyte.example.com)https:// prefixX-Forwarded-Proto headerBASE_URL must start with https:// for secure cookies to be enabledhttp://192.168.x.x) are not treated as secure contexts by browsers, so secure cookies are disabled automaticallyTRUSTED_ORIGINS only allows additional origins for auth-related requests. It does not disable secure cookies or make authenticated HTTP access work when BASE_URL is HTTPS.BASE_URL is HTTPS, browsers will only send Zerobyte's auth cookies over HTTPS. Plain HTTP access may still show the login page, but authenticated flows will fail because no session cookie is available.For troubleshooting common issues, please refer to the TROUBLESHOOTING.md file.
This project includes the following third-party software components:
Zerobyte includes Restic for backup functionality.
For a complete list of third-party software licenses and attributions, please refer to the NOTICES.md file.
Contributions by anyone are welcome! If you find a bug or have a feature request, please open an issue on GitHub. If you want to contribute code, feel free to fork the repository and submit a pull request. We require that all contributors sign a Contributor License Agreement (CLA) before we can accept your contributions. This is to protect both you and the project. Please see the CONTRIBUTING.md file for more details.
With Bun and Portless installed, you can run Zerobyte locally during development without Docker:
bun install
bun run dev
For local development, create a .env.local file at the repo root and override the Docker paths:
# Example
ZEROBYTE_DATABASE_URL=./data/zerobyte.db
APP_SECRET=your_app_secret_here
RESTIC_PASS_FILE=./data/restic.pass
RESTIC_CACHE_DIR=./data/restic/cache
ZEROBYTE_REPOSITORIES_DIR=./data/repositories
ZEROBYTE_VOLUMES_DIR=./data/volumes
BASE_URL=https://*.localhost
Notes:
CAP_SYS_ADMIN; on macOS they are expected to be unavailable.restic on your machine (e.g., via Homebrew). If restic is not installed, the app still starts but backup operations will fail with a clear error.(top 24 of 61)
3,475 followers · starred Jan 2026
873 followers · starred Dec 2025
8,400 followers · starred Apr 2026
436 followers · starred Nov 2025
Backup automation for self-hosters. Built on top of restic
See the code
Backup management with scheduling and monitoring
[!WARNING] Zerobyte is still in version 0.x.x and is subject to major changes from version to version. I am developing the core features and collecting feedback. Please open issues for bugs or feature requests.
Zerobyte is a backup automation tool that helps you save your data across multiple storage backends. Built on top of Restic, it provides an modern web interface to schedule, manage, and monitor encrypted backups of your remote storage.
The official documentation website is available at zerobyte.app.
It contains up-to-date setup guides, configuration reference, and usage documentation for running Zerobyte in production.
In order to run Zerobyte, you need to have Docker and Docker Compose installed on your server. Then, you can use the provided compose.yaml file to start the application.
services:
zerobyte:
image: ghcr.io/nicotsx/zerobyte:v0.43
container_name: zerobyte
restart: unless-stopped
cap_add:
- SYS_ADMIN
ports:
- "4096:4096"
devices:
- /dev/fuse:/dev/fuse
environment:
- TZ=Europe/Zurich # Set your timezone here
- BASE_URL=http://localhost:4096 # URL you will use to access Zerobyte
- APP_SECRET=94bad46...c66e25d5c2b # Generate your own secret with `openssl rand -hex 32`
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/lib/zerobyte:/var/lib/zerobyte
[!WARNING] It is highly discouraged to run Zerobyte on a server that is accessible from the internet (VPS or home server with port forwarding). If you do, make sure to change the port mapping to "127.0.0.1:4096:4096" and use a secure tunnel (SSH tunnel, Cloudflare Tunnel, etc.) with authentication.
[!WARNING] Do not try to point
/var/lib/zerobyteto a network share. You will face permission issues and strong performance degradation.
[!NOTE] TrueNAS Users: The host path
/var/libis ephemeral on TrueNAS and will be reset during system upgrades. Instead of using/var/lib/zerobyte:/var/lib/zerobyte, create a dedicated ZFS dataset (e.g.,tank/docker/zerobyte) and mount it instead:volumes: - /etc/localtime:/etc/localtime:ro - /mnt/tank/docker/zerobyte:/var/lib/zerobyteThis ensures your configuration, encryption keys, and database persist across TrueNAS upgrades.
Then, run the following command to start Zerobyte:
docker compose up -d
Once the container is running, you can access the web interface at http://<your-server-ip>:4096.
Zerobyte can be customized using environment variables. Below are the available options:
| Variable | Description | Default |
|---|---|---|
BASE_URL | Required. The base URL of your Zerobyte instance (e.g., https://zerobyte.example.com). See Authentication below. | (none) |
APP_SECRET | Required. A random secret key (32+ chars) used to encrypt sensitive data in the database. Generate with openssl rand -hex 32. | (none) |
APP_SECRET_FILE | Path to a file containing APP_SECRET, useful with Docker or Kubernetes secrets. Mutually exclusive with APP_SECRET. | (none) |
PORT | The port the web interface and API will listen on. | 4096 |
RESTIC_HOSTNAME | The hostname used by Restic when creating snapshots. Automatically detected if a custom hostname is set in Docker. | zerobyte |
GOMAXPROCS | Optional positive integer passed to Restic processes to limit CPU scheduler threads. Useful for reducing CPU pressure during backups. | Restic default |
TZ | Timezone for the container (e.g., Europe/Zurich). Crucial for accurate backup scheduling. | UTC |
TRUST_PROXY | When true, trust an existing X-Forwarded-For header from your reverse proxy. Leave false for direct deployments. | false |
TRUSTED_ORIGINS | Comma-separated list of extra trusted origins for CORS (e.g., http://localhost:3000,http://example.com). | (none) |
WEBHOOK_ALLOWED_ORIGINS | Comma-separated list of HTTP origins allowed for backup webhooks and outbound HTTP notification destinations. | (none) |
WEBHOOK_TIMEOUT | Timeout for backup webhook requests in seconds. | 60 |
LOG_LEVEL | Logging verbosity. Options: debug, info, warn, error. | info |
RCLONE_CONFIG_DIR | Path to the directory containing rclone.conf inside the container. Change this if running as a non-root user. | /root/.config/rclone |
PROVISIONING_PATH | Path to a JSON file with operator-managed repositories and volumes to sync at startup. | (none) |
If backups use too much CPU, set GOMAXPROCS on the Zerobyte container and restart it:
environment:
- GOMAXPROCS=2
This limits the Go scheduler used by Restic child processes. Existing operations are not changed; the new value applies to Restic processes started after the container restart.
Other useful Restic tuning options:
off to reduce CPU usage, or auto for the usual balance. max can save more space but uses more CPU.--read-concurrency 1, --exclude-larger-than 10G, or --no-scan.See the full guide: Performance tuning.
Backup webhooks and outbound notification destinations that can target arbitrary network hosts are restricted by WEBHOOK_ALLOWED_ORIGINS.
The allowlist matches exact origins only: scheme, host, and port must match. Paths are ignored, so https://hooks.example.com/backups allows any path on https://hooks.example.com, but it does not allow http://hooks.example.com, https://hooks.example.com:8443, or https://other.example.com.
This policy applies to:
The public ntfy.sh service and fixed-provider notification services such as Slack, Discord, Pushover, and Telegram do not need WEBHOOK_ALLOWED_ORIGINS.
Backup webhooks do not follow redirects. Add the final destination origin to WEBHOOK_ALLOWED_ORIGINS and configure that final URL directly.
Webhook headers are stored as plain text and must use one Key: Value header per line. WEBHOOK_TIMEOUT controls backup pre/post webhook request timeouts; notification delivery uses the underlying provider sender behavior.
Zerobyte can sync operator-managed repositories and volumes from a JSON file at startup. This is useful when you want credentials or connection details to live in deployment-time configuration instead of being entered through the UI.
Provisioned resources:
/run/secrets/* during startup syncThe complete provisioning documentation is available at zerobyte.app/docs/guides/provisioning.
See examples/provisioned-resources/README.md for a full example.
If you only need to back up locally-mounted folders and don't require remote share mounting capabilities, you can remove the SYS_ADMIN capability and FUSE device from your compose.yaml:
services:
zerobyte:
image: ghcr.io/nicotsx/zerobyte:v0.43
container_name: zerobyte
restart: unless-stopped
ports:
- "4096:4096"
environment:
- TZ=Europe/Zurich # Set your timezone here
- BASE_URL=http://localhost:4096 # Change this to your actual URL (use https:// for secure cookies)
- APP_SECRET=94bad46...c66e25d5c2b # Generate your own secret with `openssl rand -hex 32`
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/lib/zerobyte:/var/lib/zerobyte
- /path/to/your/directory:/mydata
Trade-offs:
If you need remote mount capabilities, keep the original configuration with cap_add: SYS_ADMIN and devices: /dev/fuse:/dev/fuse.
See examples/README.md for runnable, copy/paste-friendly examples.
Zerobyte supports multiple volume backends including NFS, SMB, WebDAV, SFTP, and local directories. A volume represents the source data you want to back up and monitor.
To add your first volume, navigate to the "Volumes" section in the web interface and click on "Create volume". Fill in the required details such as volume name, type, and connection settings.
If you want to backup a local directory on the same host where Zerobyte is running, you'll first need to mount that directory into the Zerobyte container. You can do this by adding a volume mapping in your compose.yaml file. For example, to mount /path/to/your/directory from the host to /mydata in the container, you would add the following line under the volumes section:
services:
zerobyte:
image: ghcr.io/nicotsx/zerobyte:v0.43
container_name: zerobyte
restart: unless-stopped
cap_add:
- SYS_ADMIN
ports:
- "4096:4096"
devices:
- /dev/fuse:/dev/fuse
environment:
- TZ=Europe/Zurich
- BASE_URL=http://localhost:4096 # URL you will use to access Zerobyte
- APP_SECRET=94bad46...c66e25d5c2b # Generate your own secret with `openssl rand -hex 32`
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/lib/zerobyte:/var/lib/zerobyte
+ - /path/to/your/directory:/mydata
After updating the compose.yaml file, restart the Zerobyte container to apply the changes:
docker compose down
docker compose up -d
Now, when adding a new volume in the Zerobyte web interface, you can select "Directory" as the volume type and search for your mounted path (e.g., /mydata) as the source path.

A repository is where your backups will be securely stored encrypted. Zerobyte supports multiple storage backends for your backup repositories:
/var/lib/zerobyte/repositories/ or any other (mounted) pathRepositories are optimized for storage efficiency and data integrity, leveraging Restic's deduplication and encryption features.
To create a repository, navigate to the "Repositories" section in the web interface and click on "Create repository". Fill in the required details such as repository name, type, and connection settings.
Zerobyte can use rclone to support 40+ cloud storage providers including Google Drive, Dropbox, OneDrive, Box, pCloud, Mega, and many more. This gives you the flexibility to store your backups on virtually any cloud storage service.
Setup instructions:
Install rclone on your host system (if not already installed):
curl https://rclone.org/install.sh | sudo bash
Configure your cloud storage remote using rclone's interactive config:
rclone config
Follow the prompts to set up your cloud storage provider. For OAuth providers (Google Drive, Dropbox, etc.), rclone will guide you through the authentication flow.
Verify your remote is configured:
rclone listremotes
Mount the rclone config into the Zerobyte container by updating your compose.yaml:
services:
zerobyte:
image: ghcr.io/nicotsx/zerobyte:v0.43
container_name: zerobyte
restart: unless-stopped
cap_add:
- SYS_ADMIN
ports:
- "4096:4096"
devices:
- /dev/fuse:/dev/fuse
environment:
- TZ=Europe/Zurich
- BASE_URL=http://localhost:4096 # URL you will use to access Zerobyte
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/lib/zerobyte:/var/lib/zerobyte
+ - ~/.config/rclone:/root/.config/rclone:ro
Note for non-root users: If your container runs as a different user (e.g., TrueNAS apps), mount your config to the appropriate location and set
RCLONE_CONFIG_DIR:environment: - RCLONE_CONFIG_DIR=/home/appuser/.config/rclone volumes: - ~/.config/rclone:/home/appuser/.config/rclone:ro
Restart the Zerobyte container:
docker compose down
docker compose up -d
Create a repository in Zerobyte:
backups/zerobyte)For a complete list of supported providers, see the rclone documentation.
Once you have added a volume and created a repository, you can create your first backup job. A backup job defines the schedule and parameters for backing up a specific volume to a designated repository.
When creating a backup job, you can specify the following settings:
After configuring the backup job, save it and Zerobyte will automatically execute the backup according to the defined schedule. You can monitor the progress and status of your backup jobs in the "Backups" section of the web interface.

Zerobyte allows you to easily restore your data from backups. To restore data, navigate to the "Backups" section and select the backup job from which you want to restore data. You can then choose a specific backup snapshot and select the files or directories you wish to restore. The data you select will be restored to their original location.

Zerobyte uses better-auth for authentication and session management. The authentication system automatically adapts to your deployment scenario:
Zerobyte does not currently provide fine-grained RBAC for backup operations. Authenticated organization members are trusted operators for repositories, volumes, backup schedules, restores, and notification destinations in their organization.
Organization roles mainly restrict organization-management and instance-management actions. For example, normal members cannot manage members, SSO settings, invitations, registration, or global users, but they can still operate backup resources. Only add users to an organization if you are comfortable with them using the storage, volume, and notification capabilities configured for the instance.
BASE_URL=http://192.168.1.50:4096 (or your IP). Cookies will use Secure: false, allowing immediate login without SSL.BASE_URL=https://zerobyte.example.com. Cookies will automatically use Secure: true for protected sessions.If you're running Zerobyte behind a reverse proxy (Nginx, Traefik, Caddy, etc.):
BASE_URL to your HTTPS domain (e.g., https://zerobyte.example.com)https:// prefixX-Forwarded-Proto headerBASE_URL must start with https:// for secure cookies to be enabledhttp://192.168.x.x) are not treated as secure contexts by browsers, so secure cookies are disabled automaticallyTRUSTED_ORIGINS only allows additional origins for auth-related requests. It does not disable secure cookies or make authenticated HTTP access work when BASE_URL is HTTPS.BASE_URL is HTTPS, browsers will only send Zerobyte's auth cookies over HTTPS. Plain HTTP access may still show the login page, but authenticated flows will fail because no session cookie is available.For troubleshooting common issues, please refer to the TROUBLESHOOTING.md file.
This project includes the following third-party software components:
Zerobyte includes Restic for backup functionality.
For a complete list of third-party software licenses and attributions, please refer to the NOTICES.md file.
Contributions by anyone are welcome! If you find a bug or have a feature request, please open an issue on GitHub. If you want to contribute code, feel free to fork the repository and submit a pull request. We require that all contributors sign a Contributor License Agreement (CLA) before we can accept your contributions. This is to protect both you and the project. Please see the CONTRIBUTING.md file for more details.
With Bun and Portless installed, you can run Zerobyte locally during development without Docker:
bun install
bun run dev
For local development, create a .env.local file at the repo root and override the Docker paths:
# Example
ZEROBYTE_DATABASE_URL=./data/zerobyte.db
APP_SECRET=your_app_secret_here
RESTIC_PASS_FILE=./data/restic.pass
RESTIC_CACHE_DIR=./data/restic/cache
ZEROBYTE_REPOSITORIES_DIR=./data/repositories
ZEROBYTE_VOLUMES_DIR=./data/volumes
BASE_URL=https://*.localhost
Notes:
CAP_SYS_ADMIN; on macOS they are expected to be unavailable.restic on your machine (e.g., via Homebrew). If restic is not installed, the app still starts but backup operations will fail with a clear error.(top 24 of 61)
3,475 followers · starred Jan 2026
873 followers · starred Dec 2025
8,400 followers · starred Apr 2026
436 followers · starred Nov 2025