- Python 51.9%
- Shell 41.6%
- Lua 6.5%
Beides sind fremde Repos, die als Gitlinks ohne .gitmodules im Index lagen.
Folgen: in einem frischen Klon waren die Verzeichnisse leer, und der
Commit-Zeiger wanderte bei jedem Selbstupdate ungewollt in Commits mit
(zuletzt in
|
||
|---|---|---|
| bin | ||
| boot | ||
| docker/searxng | ||
| heic-scripts | ||
| micro | ||
| nvim | ||
| oh-my-zsh/custom | ||
| zsh | ||
| .gitignore | ||
| .p10k.zsh | ||
| README.md | ||
dotfiles-rene
Dotfiles und Skripte fuer vier Umgebungen auf drei Geraeten:
| Geraet | Umgebung | $DOTFILES_OS |
|---|---|---|
| MacBook Pro M1 | macOS | macos |
| MacBook Pro M1 | Asahi Linux (Parallelinstallation) | asahi |
| MacBook Pro 13" | Ubuntu | ubuntu |
| MacBook Pro 16" | Ubuntu | ubuntu |
Wird automatisch von macbook-setup deployed.
Inhalt
bin/ Skripte (gitcheck, gitsync, gitupdate, toolbox, dotsync)
boot/ launchd- und systemd-Units fuer den automatischen Sync
zsh/ .zshrc mit Aliases, Cheatsheet, Tool-Integrationen
micro/ Micro-Editor Konfiguration
nvim/ Neovim Konfiguration
oh-my-zsh/custom/ Powerlevel10k, zsh-syntax-highlighting
heic-scripts/ HEIC-zu-JPEG Konverter (h2j)
pi/ Raspberry Pi spezifische Configs
Dotfiles synchron halten
Alle verwalteten Dateien sind Symlinks ins Repo. Sobald eine davon durch eine echte Kopie ersetzt wird, laufen die Geraete auseinander — genau das verhindert der folgende Mechanismus.
bin/install-dotfiles.sh # alles verlinken (idempotent, sichert vorher)
dotcheck # pruefen: alles verlinkt oder gibt es Kopien?
dotsync # pullen + verlinken (laeuft auch beim Booten)
bin/install-boot-hook.sh # automatischen Lauf beim Booten einrichten
Automatik beim Booten
install-boot-hook.sh erkennt die Umgebung und richtet das Passende ein:
| Umgebung | Mechanismus | Wann |
|---|---|---|
| macOS | launchd LaunchAgent | beim Anmelden + alle 4 h |
| Asahi / Ubuntu | systemd user timer | 2 min nach Boot + alle 4 h |
dotsync ist bewusst zurueckhaltend: ohne Netz, bei uncommitteten Aenderungen
oder divergierten Branches passiert nichts. Beim naechsten Shell-Start wird
gemeldet, was geschehen ist. Log: ~/.cache/dotsync.log.
Maschinenspezifisches
Nicht in die verlinkte .zshrc schreiben — sie ist auf allen Geraeten dieselbe
Datei. Stattdessen:
| Datei | Inhalt | Im Git? |
|---|---|---|
~/.zshrc.local |
Pfade und Aliase nur fuer dieses Geraet | nein |
~/.secrets |
API-Keys | nein |
$DOTFILES_OS steht in jeder Shell bereit und ist der saubere Weg fuer OS-Weichen.
oh-my-zsh: Theme und Plugin gehoeren nicht hierher
powerlevel10k und zsh-syntax-highlighting sind eigenstaendige fremde Repos.
Sie lagen frueher als Gitlinks ohne .gitmodules im Index — mit zwei Folgen: in
einem frischen Klon waren die Verzeichnisse leer, und bei jedem Selbstupdate
der beiden Repos wanderte der Commit-Zeiger ungewollt in Commits mit.
Beide sind jetzt aus dem Index entfernt und in .gitignore. Installiert werden
sie von setup-desktop.sh bzw. setup-desktop-asahi.sh direkt nach
~/.oh-my-zsh/custom/. install-dotfiles.sh fasst sie bewusst nicht an.
Git-Werkzeuge (~/bin)
Alle Skripte in bin/ werden von setup-desktop.sh automatisch nach ~/ verlinkt.
gitsync - Repositories synchronisieren
Synchronisiert alle Git-Repositories in ~/git-projekte mit dem Gitea-Server:
- Fehlende Repos werden geklont
- Repos mit Remote-Aenderungen werden gepullt (fast-forward)
- Repos mit lokalen Commits werden gepusht
- Repos mit uncommitteten Aenderungen werden markiert
gitsync # alles synchronisieren
gitsync --dry-run # nur anzeigen, nichts aendern
gitsync --path /foo # anderes Basisverzeichnis
Die Repo-Liste ist im Skript hinterlegt. Bei neuen Repos dort einen Eintrag ergaenzen.
gitcheck - Repository-Status pruefen
Zeigt den Status aller Repositories (lokale Aenderungen, ungepushte/ungepullte Commits). Bietet am Ende an, ein dirty Repo direkt in lazygit zu öffnen.
gitcheck # nur Repos mit Aenderungen
gitcheck --all # alle Repos anzeigen
gitcheck --short # kompakte Ausgabe (Standard-Alias)
gitupdate - Repositories aktualisieren
Pullt alle Repositories (ueberspringt Repos mit lokalen Aenderungen).
gitupdate # alle Repos pullen
toolbox / tools - interaktiver Tool-Launcher
Zweistufiges fzf-Menü: erst Kategorie wählen, dann Tool — mit Preview-Pane für ausführliche Beschreibung und Beispiele. Öffnet immer in einem neuen Tab (macOS: iTerm2, Linux: xfce4-terminal, gnome-terminal, kitty, alacritty) im aktuellen Verzeichnis.
tools # interaktiver Launcher
Tastenbelegung im Tool-Menü:
| Taste | Funktion |
|---|---|
Enter |
Tool in neuem Tab starten |
Ctrl-X |
Installiertes Tool deinstallieren |
Ctrl-N |
Neues Tool hinzufügen (Wizard) |
Esc |
Zurück zur Kategorieauswahl |
Nicht installierte Tools werden gedimmt angezeigt — Enter bietet die Installation an
(brew install … / sudo apt install …). Der Kategorie-Header zeigt (installiert/gesamt).
Kategorien: Git, Dateien, Anzeige, System, Netzwerk, Text/Daten, Rechnen, Produktiv, Dokumente, Bilder, KI, Spass — insgesamt ~65 vorkonfigurierte Tools.
Eigene Tools werden in ~/.config/toolbox/custom_tools.json gespeichert und
beim Start automatisch geladen. Die JSON-Datei ist auch manuell editierbar.
Mac-only Tools (z.B. temps, dog) werden auf Linux automatisch ausgeblendet.
Linux-Binaries (batcat, fdfind) werden automatisch aufgelöst.
git-notify - Update-Benachrichtigung beim Shell-Start
Läuft automatisch im Hintergrund wenn eine neue interaktive Shell geöffnet wird.
Prüft per git fetch alle konfigurierten Repos auf neue Remote-Commits und gibt eine
kompakte Meldung aus wenn Updates verfügbar sind — kein Output wenn alles aktuell ist.
📥 Git-Updates verfügbar dotfiles-rene (2), ki-agenten (1)
→ gitsync zum Aktualisieren
cb - Clipboard bereinigen
Entfernt die 2 fuehrenden Leerzeichen pro Zeile aus der Zwischenablage, die Claude Code bei der Terminal-Ausgabe einfuegt. Nuetzlich beim Kopieren mehrzeiliger Befehle oder Codeblocks.
cb # Zwischenablage bereinigen, dann mit Cmd+V einfuegen
Verwendet pbpaste/pbcopy auf macOS und xclip auf Linux.
Terminal-Tools (installiert & konfiguriert)
Alle Tools sind über tools (toolbox) erreichbar. Hier eine Auswahl der wichtigsten:
| Tool | Kategorie | Zweck |
|---|---|---|
| lazygit | Git | Git TUI: stagen, committen, rebasen |
| tig | Git | Git-Log TUI: History, Blame, Branches |
| gh | Git | GitHub CLI: PRs, Issues, Repos |
| delta | Anzeige | Schöne Git-Diffs (side-by-side) |
| yazi | Dateien | TUI-Dateimanager mit Bildvorschau |
| fzf | Dateien | Universeller Fuzzy-Finder |
| fd | Dateien | Schnelles find |
| rg | Dateien | Blitzschnelles grep (ripgrep) |
| bat | Anzeige | cat mit Syntax-Highlighting |
| eza | Anzeige | Modernes ls mit Git-Status |
| btop | System | Systemmonitor (CPU/RAM/Netz/Prozesse) |
| jq | Text/Daten | JSON-Prozessor |
| yq | Text/Daten | YAML/JSON-Prozessor |
| pandoc | Dokumente | Dokument-Konverter (md↔pdf↔docx) |
| heic2jpg / h2j | Bilder | HEIC → JPG konvertieren |
| ffmpeg | Bilder | Video/Audio konvertieren |
| tldr | Produktiv | Vereinfachte Manpages mit Beispielen |
| nmap | Netzwerk | Netzwerk-Scanner |
| zoxide | Dateien | Smart cd (lernt häufige Pfade) |
Screensaver (cmatrix, asciiquarium, pipes.sh, cbonsai) rotieren automatisch nach 5 Minuten Idle.
Installation
Automatisch (via macbook-setup)
setup-desktop.sh klont dieses Repo und verlinkt alles automatisch.
Manuell (bestehender Mac/Linux — z.B. m13, m16)
# 1. Repo klonen
git clone https://git.motocamp.de/rene/dotfiles-rene.git ~/git-projekte/dotfiles-rene
# 2. zshrc installieren
cd ~/git-projekte/dotfiles-rene/zsh && bash install-zsh-dotfiles.sh
# 3. tools-Binary verlinken
mkdir -p ~/bin
ln -sf ~/git-projekte/dotfiles-rene/bin/toolbox ~/bin/toolbox
ln -sf ~/git-projekte/dotfiles-rene/bin/toolbox ~/bin/tools
# 4. Skripte ausführbar machen
chmod +x ~/git-projekte/dotfiles-rene/bin/*.sh
Ab dem nächsten Shell-Start läuft git-notify automatisch im Hintergrund und meldet
verfügbare Updates. Mit gitsync werden alle Repos dann auf einmal aktualisiert.
Offline-KI einrichten (neuer Mac)
Lokale KI (LM Studio auf M1 Max) ueber VPN nutzen:
mac-sync # zshrc mit KI-Aliases holen
git clone https://git.motocamp.de/rene/offline-ki.git ~/git-projekte/offline-ki
cd ~/git-projekte/offline-ki && pip install -e .
Danach (VPN muss verbunden sein):
| Alias | Funktion |
|---|---|
ki-chat |
Interaktiver Chat (lokal) |
ki-agent |
Agent mit Dateizugriff (lokal) |
ki-rchat |
Chat ueber ki.motocamp.de (VPN) |
ki-ragent |
Agent ueber ki.motocamp.de (VPN) |
Voraussetzung: M1 Max zuhause laeuft mit LM Studio (Server aktiv).
claude-local — Claude Code offline (nur M1 Max)
Claude Code mit lokalem Modell statt Cloud. LM Studio spricht ab 0.4.1 nativ das
Anthropic-Protokoll (POST /v1/messages), es braucht keinen Proxy.
claude-local-up # Modell laden, meldet HTTP 200
claude-local # im Projektverzeichnis starten
| Modell | qwen3.6-35b-a3b-mlx (6-bit MLX, 27 GB), geladen als local-coder |
| Server | http://localhost:11435, Kontext 64k |
| Profil | ~/.claude-local (eigene Berechtigungen, kein sudo/curl/ssh, keine Tokens lesbar) |
| Gemessen auf M1 Max | ~50 tok/s; Datei lesen + Bug finden 47 s, Zeile aendern 69 s |
Reasoning muss AN bleiben. Mit enableThinking=false ignoriert dieser
MLX-Build den System-Prompt vollstaendig und schreibt sein Nachdenken in die
Antwort — Claude Code steuert das Modell aber ausschliesslich ueber den
System-Prompt. Einstellung in LM Studio pro Modell, nicht ueber die API.
Werkzeuge explizit verlangen. Gemessen: bei "korrigiere den Bug und zeige
den neuen Inhalt" meldete das Modell Erfolg, ohne Edit je aufzurufen — die
Datei war unveraendert. Mit "nutze das Edit-Werkzeug" lief es sauber. Nach jeder
behaupteten Aenderung git diff pruefen.
ki-agent und claude-local teilen sich dasselbe geladene Modell
(~/.config/offline-ki/config.yaml zeigt auf local-coder), der Speicher wird
also nur einmal belegt. Freigeben mit lms unload local-coder (29 GB).
Websuche fuer das lokale Modell (SearXNG)
WebSearch laeuft ueber Anthropics Server und funktioniert gegen ein lokales
Modell nicht. Ersatz ist eine eigene SearXNG-Instanz im Docker plus MCP-Server.
cd ~/docker/searxng && docker compose up -d # laeuft auf 127.0.0.1:8888
curl "http://localhost:8888/search?q=test&format=json" | head -c 200
Wichtig in ~/docker/searxng/config/settings.yml: json muss unter
search.formats stehen — sonst liefert SearXNG nur HTML und der MCP-Server
bekommt nichts Verwertbares. Ebenso limiter: false, sonst blockt SearXNG die
eigenen Anfragen als Bot.
Der MCP-Server wird nicht ueber settings.json eingebunden — der Abschnitt
mcpServers dort wird von Claude Code ignoriert. Richtig ist:
CLAUDE_CONFIG_DIR=~/.claude-local claude mcp add --scope user searxng \
-e SEARXNG_URL=http://localhost:8888 -- npx -y mcp-searxng
CLAUDE_CONFIG_DIR=~/.claude-local claude mcp list # muss "Connected" zeigen
Damit stehen mcp__searxng__searxng_web_search und mcp__searxng__web_url_read
zur Verfuegung. Die eingebauten WebSearch/WebFetch sind im Profil gesperrt,
damit das Modell keine Zuege daran verschwendet.
Kontext auf 128k, nicht 64k: Claude Codes System-Prompt, die
Werkzeugdefinitionen und die CLAUDE.md fuellen 64k bereits so weit, dass ein
einziges Suchergebnis "Prompt is too long" ausloest. Geladen wird deshalb mit
--context-length 131072, passend dazu CLAUDE_CODE_MAX_CONTEXT_TOKENS=131072.
Die ~/.claude-local/CLAUDE.md weist das Modell an, web_url_read immer mit
maxLength aufzurufen — eine GitHub-Releases-Seite sind sonst 67 KB und die
Sitzung ist unbrauchbar.
Verifiziert: Frage nach der aktuellsten Nginx-Proxy-Manager-Version → gesucht,
auf den GitHub-API-Endpunkt ausgewichen, v2.15.1 vom 2026-06-03 geliefert;
unabhaengig gegen die GitHub-API geprueft, stimmt. Dauer 71 s.
Skills und Memory (nur lesend)
claude-local-up ruft vorab claude-local-sync auf. Das verlinkt
- alle Skills aus
~/git-projekte/claude-skillsnach~/.claude-local/skills/ - jedes Memory-Verzeichnis aus
~/.claude-priv/projects/*/memoryins lokale Profil
Symlinks, also immer aktuell: schreibt claude-priv eine neue Erinnerung, sieht
claude-local sie sofort — nie umgekehrt. Write und Edit auf
~/.claude-priv/** und auf das Skills-Repo sind im Profil gesperrt; verifiziert
mit einem Schreibversuch ueber Edit, Write und Bash-Redirect (alle abgewiesen,
Pruefsumme der Datei unveraendert).
Der Aufruf ist idempotent und bleibt still, wenn es nichts zu tun gibt. Neue Projekte legen ihr Memory nur im genutzten Profil an — deshalb der Lauf bei jedem Start.
Damit das Modell die vorhandenen Kommandos kennt und nicht nachbaut, listet
~/.claude-local/CLAUDE.md das Hausinventar (gitcheck, gitupdate, gitsync,
dotcheck, tools, ki commit …) samt der Regel, vorhandene Werkzeuge
vorzuschlagen statt Schleifen zu schreiben. gitcheck, gitupdate und
dotcheck sind ohne Rueckfrage erlaubt, gitsync nicht (pusht nach aussen).
Rollout auf den anderen Geraeten
cd ~/git-projekte/dotfiles-rene && git pull
bin/install-dotfiles.sh
bin/install-boot-hook.sh
dotcheck # Kontrolle
install-boot-hook.sh erkennt selbst, ob launchd (macOS) oder systemd
(Asahi/Ubuntu) einzurichten ist.
Vor dem ersten Lauf pruefen: Liegt dort eine ~/.zshrc als echte Kopie mit
eigenen Anpassungen? Sie wird als .bak.<Zeitstempel> gesichert und durch den
Symlink ersetzt. Alles darin, was nur fuer dieses Geraet gilt, gehoert vorher
nach ~/.zshrc.local — sonst ist es nach dem naechsten dotsync weg.
Offene Punkte
- Forgejo-Token rotieren. Er wurde aus
~/.claude-{priv,work}/settings.jsonin die Keychain verschoben (security find-generic-password -s claude-forgejo), liegt aber weiterhin im Klartext in~/.claude-priv/.claude.json, in Session-Transkripten und in mehreren Dateien unter~/.claude-priv/backups/. Ein neuer Token macht alle Streukopien in einem Schritt wertlos:security add-generic-password -a rene -s claude-forgejo -w "<neu>" -U - dnf-Paketnamen in toolbox sind nicht gepflegt (Fallback auf den Binary-Namen). Irrelevant, solange Asahi Arch-basiert bleibt.
Neuen Mac einrichten (Kurzfassung)
- Auf einem bestehenden Mac:
gitsyncausfuehren (pusht alles) - Auf dem neuen Mac (noch ohne .zshrc) einmalig:
curl -fsSL https://git.motocamp.de/rene/dotfiles-rene/raw/branch/main/bin/git-sync-all.sh | bash - Danach reicht:
gitsync(lokal) odermac-sync(frisch vom Server)