Git-native workstation snapshots

Rebuild your workstation
from a commit.

Rivet records the explicit packages and the configuration you approved — and nothing else. It is not a disk imager and not a backup product. It is the shortest honest path from a fresh install back to your machine.

Git is the default because it makes every change reviewable as a diff — but snapshots go wherever you keep them: a mounted NAS, S3, B2, Drive, Dropbox, SFTP and ~70 more via rclone, or a restic repository. Configure several and every snapshot fans out to all of them. Storage backends →

Linux — and macOS, if you skip Homebrew

curl -sSf https://rivet.fobiat.workers.dev/install | sh

Read the script before piping it into a shell — same as you should for any installer.

macOS — Apple Silicon and Intel

brew install fobiat/rivet/rivet

One universal binary, and the recommended route: Homebrew attaches no quarantine flag, so there is no Gatekeeper prompt. Install details.

CI statusLatest releasePlatform: Linux and macOSLicense: MIT OR Apache-2.0

See it run

Scan, snapshot, restore.

Recorded against a throwaway VM. Nothing sped up, nothing staged.


 rivet scan
Rivet scan
  Arch Linux · x86_64
  412 native package(s) · 37 foreign package(s)
  9 supported configuration group(s) found


 rivet snapshot --repo ~/rivet-snapshots --push
Rivet snapshot
  Recorded a new snapshot.
  Pushed to origin.


 rivet restore --repo ~/rivet-snapshots
Rivet restore plan
  1,204 configuration file(s) · 318 package(s) · 0 AppImage(s) · 0 hook(s) · 4 secret(s)

This is a dry-run plan. `restore --apply --yes` installs the approved
package sources and overwrites tracked configuration only after review.

Review before you restore

The whole decision on one screen.

rivet tui puts drift, history, per-file diffs and the restore plan in one place. It is a front end, not a second implementation — every action it takes has a CLI form, and if the two disagree the CLI is right.

The snapshots level, with the working tree’s drift on the first row followed by each snapshot
The root list opens on your working tree’s drift, then every snapshot, newest first.
The files level, showing each file’s status beside the selected file’s unified diff
Every file a revision touches, with its unified diff. The pane never prints file contents — dotfiles hold credentials.
The restore plan, with selectable packages and files beside the dry-run actions they produce
Tick what to restore; the dry-run actions beside it update, warnings included.
The plugins level, listing each plugin’s origin with its roots and hooks shown in full
Where every plugin came from, and the hooks it may run — shown verbatim, because a summary of a command is not reviewable.
The capture checklist modal, listing each discovered configuration group
Capture is opt-in. Nothing enters a snapshot until you tick it here and press s.
The confirmation modal, warning that files in the home directory will be overwritten
Applying always asks first, and every replaced file is copied to the rollback directory before it is touched.

Read the terminal UI guide →

Scope, stated plainly

What Rivet captures — and what it will never touch.

A tool that reads your home directory owes you an exact answer to this question. Here is Rivet's, in full.

Captured, once you approve it

  • Explicit native packages — Pacman, APT, DNF, Zypper, XBPS, Homebrew
  • Foreign and sandboxed sources — AUR, Nix, Flatpak, Snap, AppImage, casks, Mac App Store
  • Approved dotfiles and configuration groups you selected by hand
  • dconf settings that live outside any config file (GNOME, Cinnamon)

Never captured, no flag to override

  • SSH private keys and GnuPG keyrings
  • Browser profiles, cookies, and session state
  • Caches and Flatpak application data
  • System-wide configuration under /etc

Read the full exclusion policy →

What you get

Built for machines you actually care about.

Git-native history

Every snapshot is a commit. Review the diff before anything touches your machine, and roll back to any revision with --revision.

Cross-platform restore

A Repology-derived package map translates names between families — including a brew column — so an Arch snapshot can rebuild a Fedora box, or a Mac.

Pluggable backends

git by default; fs for a mounted NAS, rclone for ~70 cloud providers, restic for deduplicated history. Snapshot fans out to all of them.

Encrypted secrets vault

age primitives with multi-recipient encryption and passphrase-wrapped identities, plus an optional sops store.

Secret-safety by default

Rivet refuses to capture credential-shaped files and warns loudly rather than silently omitting a group that vanished.

Data-driven plugins

KDE, GNOME, Cinnamon, Xfce, Hyprland, Sway, niri, i3, Kitty, VS Code, Neovim and more — declared as data, not code. Add your own in TOML.

Supported today

Six distro families and macOS, one snapshot format.

See the full support matrix →

Three commands

Quickstart.

  1. 01

    Initialise a private snapshot repository

    rivet init --repo ~/rivet-snapshots --github you/rivet-snapshots

    Always a separate private repo — never your source tree.

  2. 02

    Choose what gets captured, then snapshot

    rivet checklist --repo ~/rivet-snapshots --select
    rivet snapshot --repo ~/rivet-snapshots --push

    checklist only shows supported paths that exist. No broad home scan.

  3. 03

    Rebuild — dry run first, always

    rivet restore --repo ~/rivet-snapshots
    rivet restore --repo ~/rivet-snapshots --apply --yes

    Without --apply you get a plan and nothing else.