Caluga - Java blog

ToolTamer – Systemkonfiguration und Pakete maschinenübergreifend synchronisieren

Artikel anhoeren

ToolTamer – Systemkonfiguration und Pakete maschinenübergreifend synchronisieren

Wer auf mehreren Rechnern arbeitet, kennt das Spiel: Die .zshrc auf dem Laptop unterscheidet sich vom Desktop, auf einem Rechner fehlt ripgrep, auf einem anderen liegen noch ein halbes Dutzend Tools herum, die man einmal ausprobiert und nie aufgeräumt hat. Am besten über macOS und Linux hinweg.

Ich habe verschiedene Ansätze probiert, bevor ich ToolTamer gebaut habe.

Warum nicht Nix, chezmoi & Co.?

  • Nix / Home Manager: Klingt in der Theorie perfekt — deklaratives Systemmanagement. In der Praxis: langsam, schwer zu debuggen, und in Kombination mit nix-darwin nach jedem macOS-Update mehr oder weniger kaputt. Auf reinem Linux besser, aber der Wartungsaufwand ist erheblich.
  • Dotfile-Manager (chezmoi, stow, yadm): Die verwalten nur Konfigurationsdateien. Aber was nützt eine synchronisierte .zshrc, die Tools referenziert, die auf dem Rechner gar nicht installiert sind?
  • Ansible: Overkill für eine persönliche Workstation. Ich will keine YAML-Playbooks pflegen, nur um fzf zu installieren.

Was ich brauchte: Ein Tool, das beides kann — Pakete und Dateien, über macOS und Linux hinweg, ohne einen eigenen Paketmanager mitzubringen.

Was ToolTamer macht

ToolTamer ist ein Bash-Tool, das den vorhandenen Paketmanager nutzt — Homebrew auf macOS, apt oder pacman auf Linux. Die gesamte Konfiguration liegt in einem Git-Repository, das man auf allen Rechnern auscheckt.

Paketverwaltung

Einfache Textdateien definieren, was installiert sein soll:

# to_install.brew
fzf
ripgrep
lazygit
node
neovim

ToolTamer installiert fehlende Pakete und bietet an, nicht aufgelistete zu entfernen — abhängigkeitsbewusst, das heißt es deinstalliert niemals Pakete, die Abhängigkeiten anderer sind. Das hält das System sauber: Ein Tool ausprobieren, sich dagegen entscheiden, und ToolTamer räumt beim nächsten Lauf auf.

Dateisynchronisation

Konfigurationsdateien werden per SHA256-Prüfsumme verglichen, nicht zeilenweise. Eine files.conf definiert das Mapping:

myzshrc:.zshrc
kitty.conf:.config/kitty/kitty.conf
starship.toml:.config/starship.toml

Links steht der Dateiname in ToolTamers Verzeichnis, rechts das Ziel relativ zum Home-Verzeichnis. Wenn die Prüfsummen abweichen, fragt ToolTamer, was zu tun ist: Die Systemversion übernehmen, ToolTamers Version wiederherstellen, oder überspringen.

Hierarchische Konfiguration

Das Kernkonzept ist die Konfigurationshierarchie:

~/.config/toolTamer/configs/
├── common/          # Basis für alle Rechner
├── common_mac/      # macOS-spezifisch
└── myMacBook/       # Nur dieser konkrete Rechner
    └── includes.conf  → enthält: common_mac

Auflösungsreihenfolge: common → Includes → Host. Spezifischere Konfigurationen gewinnen. So hat man eine gemeinsame Basis (Vim-Konfiguration, Shell-Aliase) und kann pro Rechner oder Plattform ergänzen oder überschreiben.

Interaktive Menüs

ToolTamer bietet fzf-gesteuerte Menüs (mit numerischem Fallback, falls fzf nicht installiert ist):

-----> ToolTamer V1.0 - main menu
1. Update System - full system update
2. Files only - update only files
3. Snapshot System
4. Admin
5. Quit

Das Admin-Menü bietet zusätzlich: Dateien zwischen Konfigurationen verschieben, Diffs anzeigen, Duplikate bereinigen und eine integrierte lazygit-Ansicht des Konfig-Repos.

Typischer Workflow

  1. Ersten Rechner einrichten: ToolTamer installieren, tt ausführen, Konfiguration erstellen oder auf bestehendes Git-Repo verweisen.
  2. Snapshot: "Snapshot System" erfasst den aktuellen Stand — installierte Pakete und konfigurierte Dateien.
  3. Git push: Über das Admin-Menü oder direkt auf der Kommandozeile.
  4. Zweiter Rechner: ToolTamer installieren, Git-Repo-URL angeben, "Update System" — fertig.
  5. Laufend: Änderungen auf einem Rechner → Snapshot → Push → Pull → Update auf den anderen.

CLI für Automatisierung

Neben dem interaktiven Menü gibt es direkte CLI-Befehle:

tt  --syncSys              # Vollständiges Update (Pakete + Dateien + Skripte)
tt  --syncFilesOnly        # Nur Dateien
tt  --updateToolTamer      # Paket-Snapshot
tt  --updateToolTamerFiles # Paket- + Datei-Snapshot

Damit lässt sich ToolTamer auch in Skripten oder Cron-Jobs einsetzen.

Dokumentation

Vollständige Dokumentation mit Installationsanleitung, Konfigurationsreferenz und How-tos:

sboesebeck.github.io/toolTamer

Quellcode

ToolTamer ist Open Source auf GitHub:

github.com/sboesebeck/toolTamer

Fazit

ToolTamer löst ein konkretes Problem: Mehrere Rechner über verschiedene Plattformen hinweg konsistent halten, ohne ein komplexes System wie Nix zu benötigen. Es nutzt die vorhandenen Paketmanager, speichert alles in Git, und ist am Ende ein paar hundert Zeilen Bash. Kein Framework, keine Abhängigkeiten, einfach ein Tool, das seinen Job macht.