info
date: 2026-02-27 20:00:00
tags:
logged in
ADMIN
ToolTamer β Sync System Configuration and Packages Across Machines
Anyone working on multiple machines knows the drill: your .zshrc on the laptop differs from the desktop, one machine is missing ripgrep, another still has half a dozen tools you tried once and never cleaned up. Ideally across macOS and Linux.
I tried several approaches before building ToolTamer.
Why not Nix, chezmoi & friends?
- Nix / Home Manager: Sounds perfect in theory β declarative system management. In practice: slow, hard to debug, and when combined with nix-darwin, more or less broken after every macOS update. Better on pure Linux, but the maintenance overhead is significant.
- Dotfile managers (chezmoi, stow, yadm): They handle config files only. But what good is a synced
.zshrcthat references tools that aren't installed on the machine? - Ansible: Overkill for a personal workstation. I don't want to maintain YAML playbooks just to install
fzf.
What I needed: a tool that handles both β packages and files, across macOS and Linux, without bringing its own package manager.
What ToolTamer does
ToolTamer is a Bash tool that leverages your existing package manager β Homebrew on macOS, apt or pacman on Linux. The entire configuration lives in a Git repository that you check out on all your machines.
Package management
Simple text files define what should be installed:
fzf
ripgrep
lazygit
node
neovim
ToolTamer installs missing packages and offers to remove unlisted ones β dependency-aware, meaning it never uninstalls packages that are dependencies of others. This keeps your system clean: try a tool, decide not to keep it, and ToolTamer cleans up on the next run.
File synchronization
Config files are compared using SHA256 checksums, not line-by-line. A files.conf defines the mapping:
kitty.conf:.config/kitty/kitty.conf
starship.toml:.config/starship.toml
Left side is the filename in ToolTamer's directory, right side is the target relative to your home directory. When checksums differ, ToolTamer asks what to do: take the system version, restore ToolTamer's version, or skip.
Hierarchical configuration
The core concept is the configuration hierarchy:
βββ common/ # Base for all machines
βββ common_mac/ # macOS-specific
βββ myMacBook/ # This specific machine only
βββ includes.conf β contains: common_mac
Resolution order: common β includes β host. More specific configs win. This way you have a shared base (vim config, shell aliases) and can add or override per machine or platform.
Interactive menus
ToolTamer offers fzf-powered menus (with numeric fallback if fzf isn't installed):
1. Update System - full system update
2. Files only - update only files
3. Snapshot System
4. Admin
5. Quit
The Admin menu adds: moving files between configs, viewing diffs, fixing duplicates, and an integrated lazygit view of the config repo.
Typical workflow
- Set up first machine: Install ToolTamer, run
tt, create config or point to existing Git repo. - Snapshot: "Snapshot System" captures the current state β installed packages and configured files.
- Git push: Via the Admin menu or directly on the command line.
- Second machine: Install ToolTamer, provide Git repo URL, "Update System" β done.
- Ongoing: Make changes on any machine β Snapshot β Push β Pull β Update on others.
CLI for automation
Besides the interactive menu, there are direct CLI commands:
tt --syncFilesOnly # Files only
tt --updateToolTamer # Package snapshot
tt --updateToolTamerFiles # Package + file snapshot
This makes ToolTamer usable in scripts or cron jobs.
Documentation
Full documentation with installation guide, configuration reference, and how-tos:
sboesebeck.github.io/toolTamer
Source code
ToolTamer is open source on GitHub:
github.com/sboesebeck/toolTamer
Conclusion
ToolTamer solves a specific problem: keeping multiple machines across different platforms consistent, without needing a complex system like Nix. It uses your existing package managers, stores everything in Git, and at the end of the day is a few hundred lines of Bash. No framework, no dependencies, just a tool that does its job.