Documentation pages

REFERENCE

Configuration

The configuration lives in ~/.tether/config.toml. It syncs, encrypted, so all machines share it. A sync merges changes from two machines. See Config merge.

Terminal
tether config get packages.min_release_age_days
tether config set packages.brew.trusted_taps '["oven-sh/bun"]'
tether config edit

tether config set reads the value as TOML, so arrays work. It refuses a key that the config does not have. The dashboard Config tab edits the same settings.

Example

~/.tether/config.toml
[backend]
url = "git@github.com:you/dotfiles.git"

[security]
encrypt_dotfiles = true
scan_secrets = true

[dotfiles]
files = [".zshrc", ".gitconfig"]
dirs = [".config/nvim"]

[packages]
min_release_age_days = 7          # 0 turns the limit off
allow_scripts = ["esbuild"]       # packages that may run install scripts
auto_install_from_trusted = true  # false holds other machines' packages until you approve them

[packages.brew]
enabled = true
sync_casks = true
trusted_taps = ["oven-sh/bun"]    # taps outside homebrew/*

[packages.npm]
enabled = true

Keys

KeyMeaning
backend.urlGit repository URL of the personal sync repo
security.encrypt_dotfilesEncrypt dotfiles with AES-256-GCM. Default true
security.scan_secretsScan team dotfiles for secrets. See Secret detection for the commands that scan. Default true
dotfiles.filesDotfiles to sync
dotfiles.dirsFolders to sync
profiles.<name>.dotfilesDotfiles of a profile. An entry can be a table with path and on_conflict
profiles.<name>.dirsFolders of a profile
profiles.<name>.packagesPackage managers of a profile, such as ["brew", "npm"]. Empty means all enabled managers
machine_profilesThe profile of each machine. Set it with tether machines profile set
project_configs.enabledSync project configs, such as .env files
project_configs.search_pathsFolders to search for projects
project_configs.patternsFile patterns to sync in each project
packages.<manager>.enabledSync this manager: brew, npm, pnpm, bun, gem or uv
packages.min_release_age_daysInstall only releases at least this many days old. Default 7. 0 turns it off. Homebrew has no limit
packages.allow_scriptsnpm, pnpm and bun packages that may run their install scripts
packages.auto_install_from_trustedInstall packages from trusted machine records without a question. Default true
packages.brew.trusted_tapsHomebrew taps outside homebrew/* that Tether may install from
packages.brew.sync_casksSync Homebrew casks. Tether never installs casks on Linux
merge.command, merge.argsThe merge tool for conflicts. See Conflicts
dashboard.themeDashboard colors: auto, mocha, latte or ansi

Tether also writes keys that you do not edit: config_version, config_writer, and sync_versions for each manager, which 1.x builds need. A new config gets sync_versions = false, and an existing value stays.

Settings for one machine

~/.tether/local.toml holds settings for this machine only. Tether never syncs it. Its values override config.toml on this machine. It takes these keys:

~/.tether/local.toml
[packages]
min_release_age_days = 14

[merge]
command = "vimdiff"
args = ["{local}", "{remote}", "{merged}"]   # the default when args is missing

Feature toggles

Terminal
tether config features                   # list the toggles
tether config features enable <FEATURE>
tether config features disable <FEATURE>
FeatureDefaultMeaning
personal_dotfilestrueSync personal dotfiles
personal_packagestrueSync personal package manifests
collab_secretsfalseShare project secrets with GitHub collaborators

Example, team sync only:

Terminal
tether config features disable personal_dotfiles
tether config features disable personal_packages