Backups
that answer
back.
Valvet is a control plane for restic — one hub that enrolls your nodes, runs plans on a schedule, and gives you a single monospace dashboard where every snapshot, byte, and failure is queryable, not inferred.
Most backup tools are a cron job and a prayer.
Valvet is the opposite. It treats every backup as a first-class record, every node as a citizen of the fleet, and every failure as a named, addressable event. You don’t remember what ran last night — you query it.
Enroll once.
Schedule anywhere.
Nodes register with a one-time token and hold a WebSocket back to the hub. Create a plan in the UI or API and the hub dispatches it over that socket — no SSH, no inbound ports on the node.
Every byte
accounted for.
Real repository stats from restic stats --mode raw-data:
stored size after dedup and compression, file count, snapshot count.
Refreshed after every successful backup.
Dense,
not busy.
A monospace dashboard that reads like a log file. Status is a dot, not a pill. Live job progress streamed over SSE. Browse a snapshot, download a file, restore to any node — without leaving the browser.
A plan is a contract, not a script.
Pick a node, a repository, the paths to back up, a cron schedule, a retention policy, optional pre/post hooks. That’s a plan. The hub schedules it; the node runs it; every run is recorded as an addressable event.
- Cron-scheduled. Standard 5-field cron, or trigger Run Now from the UI.
- Hooked. Pre-hooks for database dumps, post-hooks for notifications or cleanup.
- Retention-aware.
restic forgetruns after every backup with your keep-last/daily/weekly/monthly/yearly policy.
Answers at a glance. Proof on demand.
Job progress streams over Server-Sent Events — files counted, bytes written, ETA updated without a page refresh. Click any snapshot to walk its file tree in the browser, download a single file, or restore a whole directory to the same node or another one.
- Live job stream. SSE from the hub pushes progress the moment the node reports it.
- Snapshot browser. Walk the tree, download a file, restore a folder.
- Failure forensics. stderr, exit code, the exact file path — not a support ticket.
Four steps.
No magic, no daemons you can’t read.
Run the hub.
One Rust binary with the React UI embedded and SQLite baked in.
Start it under Docker or systemd, then visit /setup to create the admin account.
Enroll a node.
From Nodes → Add Node in the UI, generate a one-time token. Pipe the install script on the target machine; it pulls the agent, enrolls it, and registers a systemd service. The node dials out — no inbound ports required.
Add a repository.
Point at any restic-compatible backend: a local path, SFTP, S3, B2, or a REST Server. Valvet stores the repository password and the backend credentials; the repository is initialized the first time a plan runs against it.
Create a plan.
Pick a node, a repository, the paths, a cron schedule, a retention policy. The first run fires on the next cron tick — or hit Run Now and watch progress stream in live.
vs. the status quo.
| Valvet | Bare restic + cron | Enterprise suite | |
|---|---|---|---|
| Fleet-wide view | every node, one dashboard | ssh + grep | yes, behind a sales call |
| Self-hosted | single binary + SQLite | trivially | "on-prem edition" SKU |
| Restic-native format | snapshots stay portable | native | proprietary format |
| Dedup & encryption | restic-native, auditable | restic-native | black box |
| Failure forensics | stderr, exit code, file path | scroll the mail | support ticket |
| API-first | same REST API the UI uses | none | SOAP, sometimes |
| Price | free · MIT licensed | free | per TB, compounding |
Stop guessing
what ran last night.
Run the hub on one machine. Enroll one node. Schedule one plan. Read the result on a screen that respects you.