Your repo. Your history.
Use your own Git repository. Track changes and restore earlier versions when you need them.
Explore the workflow↗YOUR MACHINES. ONE ENVIRONMENT.
Your shell, your packages, your familiar shortcuts. Tether keeps them in sync through a Git repo you control.
Open source · macOS · Linux
LESS SETUP. MORE BUILDING.
Use your own Git repository. Track changes and restore earlier versions when you need them.
Explore the workflow↗Tether encrypts dotfiles before they reach Git. Your passphrase unlocks them on your machines.
Read about encryption↗Sync global packages and project configs. Keep your tools and settings together across machines.
See what you can sync↗THE RIGHT SETUP FOR EACH MACHINE
Your work laptop and your server do different jobs. Use profiles to choose the files and packages each machine receives.
Keep your shell consistent. A package goes only to the profiles that have it, so the desktop apps stay on your desktop.
Explore machine profilesSUPPLY-CHAIN CHECKS
A line in a manifest does not install on its own. Each machine signs a record of its packages. Your machine installs a package on its own only when a machine you trust lists it.
For npm, pnpm, bun, uv and gem, Tether installs only releases at least 7 days old, and checks them against OSV for known malware. It installs npm, pnpm and bun packages with scripts off. Homebrew gets neither check: Tether installs only from Homebrew taps you trust. A package that fails a check waits in the Inbox. You can approve it, unless OSV lists it as malware.
See how the checks workFROM ONE MACHINE TO THE NEXT
Install Tether. Select your Git repository and set an encryption passphrase.
tether init Run setup on your next machine. Select the same repo and enter your passphrase. Then trust each machine’s key once.
tether init The daemon syncs every five minutes. Run a sync yourself whenever you need one.
tether sync tether initMACHINE STATE BACKUP
Tether keeps a record of your dotfiles and global packages in Git. Replace or reformat a machine, then run setup.
Tether restores your files. Once your machines trust each other, it installs your packages at the versions your machines use, when each release is past the release-age limit.
See how setup worksBETTER TOGETHER
Sync team dotfiles and encrypted project secrets. Give each teammate access through their own age key.
A FEW THINGS TO KNOW
No. Tether uses your existing Git repository and Git authentication. You do not need a separate Tether account.
Tether encrypts personal dotfiles by default. Package manifests remain readable in Git. Team secrets use age public-key encryption.
Read the security model ↗Yes. Add --on to install or uninstall a package, set a profile or trust a new machine on other machines. Tether signs the command, and each machine runs it on its next sync only when it trusts your machine's key.
Yes. Select your dotfiles and package managers. Use machine profiles and feature toggles to control each machine.
See configuration options ↗Run tether init on the new machine. Select the same repo and enter your passphrase. Tether restores your dotfiles. Trust the new machine on your other machines, and the other way round. Tether then installs your packages, when each release is past the release-age limit.
Not with a manifest change alone. A synced package installs only when a signed record from a machine you trust lists it. Other packages for this machine's profile wait in tether packages inbox. You can approve them, unless OSV lists them as malware.
Yes. Install it with the install script, Homebrew or a release download. tether daemon install sets up a systemd user service. Tether skips Homebrew casks on Linux.
Tether lets you keep the local version, use the remote version, merge the files, or skip the conflict.
Learn about conflict resolution ↗READY WHEN YOU ARE
Install Tether, then run tether init to connect your Git repo.
curl -fsSL https://tether-cli.com/install.sh | sh brew tap paddo-tech/tap
brew install tether-cli