Open Source · Self-Hosted · MIT Licensed

Centralized Backup
Management

A self-hosted hub for managing restic backups across all your servers. One dashboard to schedule, monitor, browse, and restore — powered by a single binary and a lightweight node agent.

terminal

$ docker run -p 4865:4865 -v valvet-data:/data valvet

[hub] listening on 0.0.0.0:4865

[hub] database ready (WAL mode)

[hub] visit /setup to create admin account

$ valvet-node enroll --hub http://hub:4865 --token <token>

[node] enrolled as server-01

[node] websocket connected, waiting for commands

Everything you need

A complete backup management platform in a single stack.

Hub + Node Architecture

Central hub manages multiple node agents over WebSocket. Nodes auto-reconnect with exponential backoff.

Restic-Powered

Battle-tested, encrypted, deduplicated backups. Restic binary is auto-downloaded and managed by the node agent.

Real-Time Monitoring

Live backup progress, node system stats, and job history. SSE-powered dashboard updates without polling.

Snapshot Browser & Restore

Browse files inside any snapshot, download individual files or folders, and restore to the same or different node.

Plan Scheduling

Cron-based backup plans with pre/post hooks, include/exclude patterns, and retention policies.

Single Binary Deploy

Hub ships as one binary with embedded web UI. Run bare metal or Docker. No external database required — SQLite with WAL.

Architecture

A hub-and-spoke model designed for simplicity.

VALVET HUB

Web UI· REST API· SSE Events· SQLite
JWT Auth· Plan Scheduler· WebSocket Server
WebSocket
WebSocket
WebSocket

Node Agent

runs restic

reports back

web-server-01

Node Agent

runs restic

reports back

db-server-01

Node Agent

runs restic

reports back

nas-01

Single Binary Hub

Axum server + embedded React UI + SQLite. No external dependencies.

Lightweight Agent

Auto-downloads restic. Connects over WebSocket with token rotation.

End-to-End Encrypted

Restic encrypts everything at rest. Tokens hashed with SHA-256, passwords with argon2id.

Quick Start

Up and running in under a minute.

1 Start the Hub
docker run -d -p 4865:4865 \ -v valvet-data:/data \ --name valvet \ ghcr.io/lindstrm/valvet
2 Create Admin Account

Visit http://localhost:4865/setup and create your admin account.

3 Enroll a Node
curl -fsSL http://hub:4865/install.sh | sh -s -- \ --hub http://hub:4865 \ --token <enrollment-token> \ --name "my-server"
4 Create a Backup Plan

Use the dashboard to create a backup plan — pick a node, repository, schedule, and paths. Your first backup runs immediately or on the next cron tick.