REFERENCE
Commands
Run tether <command> --help for the options of each command. Every command takes -y. For -y, exit codes, --json, machine arguments and package ids, see Exit codes and -y.
tether / tether dashboard
Open the interactive dashboard. See Dashboard.
tether tether init
Set up Tether on this machine. It asks for the repository and the passphrase, runs the first sync, and installs the daemon. See Quick start.
tether init [--repo <URL>] [--no-daemon] [--team-only] --repo <URL>: the Git repository URL. Without it, Tether asks--no-daemon: do not install the daemon--team-only: skip personal dotfiles and packages, and use team sync only
tether sync
Sync now. See How sync works.
tether sync [--dry-run] [--rediscover] --dry-run: show what a sync would do. It ends with "Dry run: nothing changed"--rediscover: ask again about file imports that you dismissed
In a terminal, tether sync asks about conflicts and about items in the Inbox. Without a terminal, it runs as the daemon does: it records conflicts for tether resolve and holds Inbox items. On macOS, a sync in a terminal also moves an installed daemon to ~/.tether/bin/tether.
tether status
Show the sync status, the daemon state, this machine's profile and the synced files. It counts the items in the Inbox and the files with conflicts. It names each machine that still runs 1.x.
tether status [--json] tether diff
Show differences between machines.
tether diff [--machine <MACHINE>] tether daemon
Control the background daemon.
tether daemon start
tether daemon stop
tether daemon restart
tether daemon status
tether daemon logs [-f] [-n <LINES>]
tether daemon install
tether daemon uninstall status: whether the daemon runs, whether its login service is installed, and the last sync and upgradelogs: print the end of the daemon log.-nsets the number of lines (default 50).-fkeeps printing lines as the daemon writes theminstall: install the login service. On macOS, a launchd agent runs a copy of Tether at~/.tether/bin/tetherand follows upgrades by itself. On Linux, a systemd user service. See Linux and systemduninstall: remove the login service. On macOS, it also removes the copy
tether machines
List, show, trust and remove machines, and manage profiles. See Machine trust.
tether machines list [--json]
tether machines show [MACHINE]
tether machines rename <NEW>
tether machines remove <MACHINE>
tether machines trust <MACHINE> [--fingerprint SHA256:...] [--on <MACHINES|all>]
tether machines untrust <MACHINE>
tether machines profile <set|unset|create|edit|list>
tether machines profile set <PROFILE> [--on <MACHINES|all>] list: every machine with its profile, version, last sync, key fingerprint and trust. It marks machines on 1.x, and records that may be an old id of this machineshow [MACHINE]: one machine's profile, versions, record status, full key fingerprint and trust. Without a machine, it shows this machinerename <NEW>: rename this machine. Tether signs its record again under the new id. Other machines must trust the new id. The formrename <OLD> <NEW>still works in 2.0 with a warning, and fails when OLD is not this machineremove <MACHINE>: remove a machine record, and its trusted key on this machine. With-y, Tether removes it without a question and prints what it removedtrust <MACHINE> --fingerprint SHA256:...: trust a machine's signing key if its fingerprint matches. Without a fingerprint, Tether shows the current one and asks, in a terminal only. When the signed record is missing, it pulls the sync repo firstuntrust <MACHINE>: stop trusting a machine's signing keyprofile set <PROFILE>: assign a profile to this machine--on <MACHINES|all>ontrustandprofile set: send a signed command, so those machines do it on their next sync. See Fleet commandsprofile unset: remove the profile assignment of this machineprofile create <PROFILE> [--from <PROFILE>] [--managers <LIST>]: create a profile. See Profilesprofile edit <PROFILE>: edit a profileprofile list: list all profiles and assignments
tether packages
List, install, share and uninstall packages, and decide on the Inbox.
tether packages list [--json] [--other-profiles]
tether packages install <ID> [--on <MACHINES|all>]
tether packages share <ID> --to <PROFILES>
tether packages unshare <ID> --from <PROFILES>
tether packages uninstall [ID] [--on <MACHINES|all>] # alias: remove
tether packages inbox [--json]
tether packages approve <ID> [--expect <VERSION|TAP|KEY>] [--allow-signature-failed]
tether packages approve --all [--from <MACHINE>]
tether packages reject <ID> [--expect <VERSION|TAP|KEY>] list: installed packages by manager, with the profiles of each and this machine's profile. It also shows failed installs. A baretether packageslists too, but takes no flagslist --other-profiles: instead, the packages of other profiles that trusted machines list and this machine does not installinstall <ID>: install a package that another machine lists, as the dashboard's Import does. OSV checks the release first. A package that waits in the Inbox needsapproveinsteadshare <ID> --to <PROFILES>: add profiles to the package, so machines in those profiles install it. Separate profiles with commasunshare <ID> --from <PROFILES>: take profiles off the package. Nothing is uninstalleduninstall [ID]: uninstall the package here. When other profiles share the package, take this machine's profile off it. For a package that failed to install, it stops the retries on this machine. Without a package, pick packages in a terminalinstall --onanduninstall --on: send a signed command, so those machines install or uninstall the package on their next sync. See Fleet commandsinbox: list the packages, taps and machine keys that wait for your approval, grouped by source machine and reasonapprove <ID>: install the package, or trust the machine key.machine:<id>works astether machines trust <id>approve --all [--from <MACHINE>]: approve every package in the Inbox, or every package from one machine. It lists the packages and asks first. Without a terminal, it needs-y. It leaves machine keys, malicious packages, packages whose record fails its signature, and packages without a version or tap to name--allow-signature-failed: approve a package whose record fails its signature, without a terminal. It needs--expecttoo. In a terminal, Tether asks insteadreject <ID>: stop offering that version, tap or key--expect: the version, Homebrew tap or key fingerprint you reviewed, aspackages inboxshows it. Required without a terminal. Tether refuses the decision when the item changed
Older forms still work: packages remove from 1.x, and approve <ID> <EXPECTED> without --expect from the 2.0 betas.
tether upgrade
Upgrade installed packages to the newest release that the release-age limit allows.
tether upgrade [--dry-run] - Tether lists what it will change and asks first. Without a terminal, it needs
-y --dry-runlists what an upgrade would change, and which packages stay because the release-age limit allows only an older version- An upgrade never downgrades a package. It installs only a target newer than the installed version, at that exact version
- Tether checks each npm, pnpm, bun, uv and gem target against OSV. A target with a
MAL-advisory waits in the Inbox, and the installed version stays - Tether asks before it upgrades an older npm, pnpm or bun that cannot enforce the release-age limit. Without a terminal, or with
-y, it skips that manager. gem does not ask: Tether picks each gem's release from its RubyGems publish time - Homebrew upgrades include only outdated packages from trusted taps. Tether does not run
brew update
tether rollback
Roll back a package manager's installed packages to a manifest commit. The managers are npm, pnpm, bun, gem and uv. Homebrew is not supported.
tether rollback packages <MANAGER> <COMMIT> Tether lists each package and version it would install, and asks first. Without a terminal, it needs -y. A snapshot version other than the newest trusted version installs only when you confirm it in a terminal. -y does not confirm it. Packages that fail a check wait in the Inbox.
tether config
Manage configuration. See Configuration.
tether config get <KEY>
tether config set <KEY> <VALUE>
tether config edit
tether config dotfiles
tether config features [enable|disable <FEATURE>] get: read a value. Use nested keys such aspackages.brew.enabledset: set a value. Tether reads the value as TOML, so arrays work:'["azure/kubelogin"]'. A bare word stays a string. Tether refuses a key that the config does not haveedit: open the config in your editor. It needs a terminaldotfiles: pick the files, folders and patterns that syncfeatures: list, enable or disable feature toggles
tether ignore
Manage secret scanning patterns, and files this machine keeps.
# Patterns the secret scanner skips
tether ignore secrets add <PATTERN>
tether ignore secrets list
tether ignore secrets remove <PATTERN>
# Files this machine keeps: a sync does not overwrite them
tether ignore files add <FILE>
tether ignore files project <PROJECT> <PATH>
tether ignore files list
tether ignore files remove <FILE> # sync the file again The 1.x forms ignore add|list|remove and ignore dotfile|project|sync-list|sync-remove still work.
tether resolve
Resolve file conflicts: keep local, use remote, launch the merge tool, or skip. Without a file, it resolves all. See Conflicts.
tether resolve [FILE] tether unlock / tether lock
unlock decrypts the encryption key with your passphrase and caches it. lock clears the cached key. See Encryption.
tether unlock
tether lock tether history
Show the change history of a dotfile from the sync repo.
tether history <FILE> [--limit <N>] # default 20 tether restore
Restore files from a backup or from git history.
tether restore list # list backups
tether restore file # pick a file and a backup
tether restore file <FILE> --from <TIMESTAMP>
tether restore git <FILE> [--commit <SHA>] # a dotfile from git history tether identity
Manage the age identity for team secrets.
tether identity init # make a new identity
tether identity show # show your public key
tether identity unlock # unlock with your passphrase
tether identity lock # clear the cached key
tether identity reset # make a new identity; destroys the old one tether team
Manage team repositories, secrets, files and project secrets. See Teams and collab.
tether team setup
tether team add <URL> [--name <NAME>]
tether team list
tether team switch <NAME>
tether team status
tether team enable | disable
tether team remove [NAME]
tether team orgs add | list | remove <ORG>
tether team secrets add-recipient <KEY> [--name <NAME>]
tether team secrets list-recipients
tether team secrets remove-recipient <NAME>
tether team secrets set <NAME> [--value <VALUE>]
tether team secrets get <NAME>
tether team secrets list
tether team secrets remove <NAME>
tether team files list
tether team files local-patterns
tether team files diff [FILE]
tether team files reset [FILE] [--all]
tether team files promote <FILE>
tether team files ignore <FILE>
tether team files unignore <FILE>
tether team projects add <FILE> [--project <PATH>]
tether team projects list
tether team projects remove <FILE> [--project <URL>]
tether team projects migrate
tether team projects purge-personal [--history] tether collab
Share project secrets with GitHub collaborators. Needs the collab_secrets feature. See Collab secrets.
tether collab init [--project <PATH>]
tether collab join <URL>
tether collab add <FILE> [--project <PATH>]
tether collab add-project <PATH>
tether collab refresh [--project <PATH>]
tether collab list
tether collab remove [NAME]