Kontextbezogen
Projekt-Aliase werden automatisch geladen, wenn du in ein Verzeichnis wechselst, und entladen, wenn du es verlässt.
Mehr erfahren
Wie direnv, aber für Aliase. Definiere Aliase pro Projekt, pro Toolchain oder global — sie werden automatisch geladen.
brew install sassman/tap/amoxide sassman/tap/amoxide-tuicurl -fsSL https://github.com/sassman/amoxide-rs/releases/latest/download/amoxide-installer.sh | sh
curl -fsSL https://github.com/sassman/amoxide-rs/releases/latest/download/amoxide-tui-installer.sh | shpowershell -ExecutionPolicy Bypass -c "irm https://github.com/sassman/amoxide-rs/releases/latest/download/amoxide-installer.ps1 | iex"
powershell -ExecutionPolicy Bypass -c "irm https://github.com/sassman/amoxide-rs/releases/latest/download/amoxide-tui-installer.ps1 | iex"cargo binstall amoxide amoxide-tuicargo install amoxide amoxide-tui Du weißt, wie ein gutes Alias-System aussehen sollte — du hast schon versucht, eines zu bauen. Ein Block in .zshrc, ein paar alias-Zeilen, vielleicht ein Makefile. Es funktioniert, bis zum dritten Projekt — oder bis ein Kollege fragt, warum l auf seinem Rechner etwas Unerwartetes tut.
Das eigentliche Problem ist der Geltungsbereich. Shell-Aliase sind standardmäßig global. Ein Kürzel, das in einem Projekt sinnvoll ist, taucht in jedem anderen Terminalfenster auf. Aufräumen bedeutet: Dotfiles bearbeiten, sourcen, prüfen. Der Alias, den du für Client A angelegt hast, feuert noch sechs Monate später im Verzeichnis von Client B.
amoxide löst das Geltungsbereich-Problem. Aliase können in einem Projektverzeichnis liegen (eine .aliases-Datei, die beim cd automatisch geladen wird), in einem benannten Profil (explizit aktiviert mit am use <name>) oder global. Jede Schicht lädt sich unabhängig und entlädt sich sauber, wenn sie den Scope verlässt. Das TUI zeigt dir jederzeit, was gerade aktiv ist — kein Rätselraten.
Das Subcommand-Alias-System macht es besonders interessant. Statt einem flachen Namensraum voller kryptischer Präfixe definierst du ein Schema, das für dich Sinn ergibt: k get po expandiert zu kubectl get pods, Tab-Completion funktioniert weiterhin, und die Abkürzungen hast du selbst gewählt.

Du arbeitest tagsüber an einem Node-Dienst und abends an einem Rust-Seitenprojekt. Der Kontextwechsel ist eigentlich klein — gleicher Editor, gleiches Terminal, gleiche Arbeitsroutine. Aber sobald du linten oder testen willst, musst du kurz nachdenken, in welcher Welt du gerade bist. Ist es npm run lint oder cargo clippy? npm run dev oder cargo run?
Die übliche Antwort sind Präfix-Aliase: nl für Node-Lint, rl für Rust-Lint. Es funktioniert, aber die Hände bauen nie echtes Muskelgedächtnis auf. Du denkst immer einen Schritt voraus — "welcher Präfix gilt hier?" — statt einfach zu tippen. Diese kleine Reibung summiert sich über den Tag.
Mit zwei amoxide-Profilen vergibst du in beiden Kontexten denselben kurzen Namen für jede Aufgabe. l ist immer Lint. t ist immer Test. b ist immer Build. r ist immer Run. Nach ein paar Tagen fühlt es sich nicht mehr wie ein Werkzeug an, sondern wie eine Gewohnheit. Der Profilwechsel — am use node oder am use rust — ist die eine Entscheidung zu Beginn einer Session.
| Alias | Node-Profil | Rust-Profil |
|---|---|---|
l | npm run lint | cargo clippy --locked --all-targets -- -D warnings |
t | npm test | cargo test |
b | npm run build | cargo build --release |
r | npm run dev | cargo run |
Alle Profile liegen in ~/.config/amoxide/profiles.toml — reines TOML, versionierbar neben deinen Dotfiles.
❯ am profile add node ❯ am add -p node l "npm run lint" ❯ am add -p node t "npm test" ❯ am add -p node b "npm run build" ❯ am add -p node r "npm run dev" ❯ am profile add rust ❯ am add -p rust l "cargo clippy --locked --all-targets -- -D warnings" ❯ am add -p rust t "cargo test" ❯ am add -p rust b "cargo build --release" ❯ am add -p rust r "cargo run"
❯ am use node am: profile node activated — 4 loaded: l, b, r, t ❯ l # npm run lint ❯ t # npm test ❯ am use rust am: profile rust activated — 4 loaded: l, b, r, t ❯ l # cargo clippy --locked --all-targets -- -D warnings ❯ t # cargo test
Euer Repo hat ein Justfile mit 30-odd Rezepten: CI-Checks, Integrationstests, Datenbank-Migrationen, Staging-Deployments. Neue Teammitglieder wissen nicht, dass just existiert. Erfahrene vergessen Rezepte, die sie seit drei Wochen nicht getippt haben. Der Befehl für Integrationstests ist cargo test --features integration -- --test-threads 1 und steht nur in der CI-Konfiguration.
Jeder hat seine eigenen Shortcuts. Manche nutzen make, manche just, manche kopieren aus Slack. Das Ergebnis: Ein Team, das technisch an derselben Codebase arbeitet, aber mit völlig unterschiedlichem Muskelgedächtnis. Neue Leute verbringen die erste Woche damit zu fragen: "Wie starte ich die Tests?"
Eine .aliases-Datei im Repo-Root löst das für alle. Wenn ein Entwickler ins Projektverzeichnis wechselt, lädt amoxide sie automatisch. am ls zeigt jeden verfügbaren Shortcut — kein Fragen, kein Raten. Ändert sich ein Befehl, aktualisiert ein Commit ihn für das gesamte Team.
Die .aliases-Datei nutzt dasselbe TOML-Format wie Profile. Teams können auch Subcommand-Aliase für komplexe Aufrufe hinzufügen, die sonst nur im Kopf einzelner Personen existieren würden.
# im Projekt-Root ❯ am add -l ti "cargo test --features integration -- --test-threads 1" ❯ am add -l ci "just ci-check" ❯ am add -l db "just db-migrate --env staging" ❯ am add -l deploy "just deploy --target production" # committen ❯ git add .aliases && git commit -m "Projekt-Aliase hinzufügen"
❯ cd ~/work/myproject am: loaded .aliases ci → just ci-check db → just db-migrate --env staging deploy → just deploy --target production ti → cargo test --features integration -- --test-threads 1 ❯ am ls 📁 project (.aliases) ├─ ci → just ci-check ├─ db → just db-migrate --env staging ├─ deploy → just deploy --target production ╰─ ti → cargo test --features integration ... ❯ ti # cargo test --features integration -- --test-threads 1
Oh-my-zsh liefert über 120 kubectl-Aliase. kgp ist get pods. kdp ist describe pod. kgpw ist get pods --watch. Das Schema wurde von jemand anderem entworfen, verwendet Abkürzungen, die du nicht gewählt hast, und lässt sich nicht anpassen, ohne das Plugin zu forken. Entweder du nimmst alle 120 oder keine.
Und die Aliase, die du wirklich brauchst, sind gar nicht dabei. kubectl logs deployment/api --since=10m --tail=100 — den du bei jedem Incident tippst — hat keinen Alias. Also tippst du ihn vollständig, oder du fügst klogs-api zu deiner .zshrc hinzu und vergisst ihn drei Wochen später, begraben neben den anderen Einzel-Shortcuts.
amoxide-Subcommand-Aliase lassen dich das Schema selbst definieren. Ein Basis-Alias leitet zu einem Befehl weiter, und kurze Subcommand-Sequenzen expandieren zu den Flags, die für dich sinnvoll sind. k get po wird zu kubectl get pods. k logs api wird genau zu dem Aufruf, den du immer brauchst. Alles liegt an einem Ort, ist mit am ls sichtbar und gehört dir — ohne fremde Konfiguration zu berühren.
Subcommand-Aliase können in einem globalen Profil (immer verfügbar) oder in einer Projekt-.aliases-Datei leben (nur aktiv in diesem Repo).
# Basis-Alias — k leitet zu kubectl weiter ❯ am add -g k kubectl # Subcommand-Routing ❯ am add -g k:get:po "get pods" ❯ am add -g k:get:svc "get svc" ❯ am add -g k:desc:po "describe pod" ❯ am add -g k:logs:api "logs deployment/api --since=10m --tail=100" ❯ am add -g k:rr "rollout restart deployment"
❯ k get po NAME READY STATUS RESTARTS api-7d4f9b8c6-xk2pm 1/1 Running 0 ❯ k logs api 2026-04-15T09:12:44Z INFO server started on :8080 ❯ k rr api deployment.apps/api restarted # Tab-Completion funktioniert weiterhin
Du arbeitest mit drei Kunden. Jeder hat einen anderen Cloud-Provider, eine andere Staging-URL, eine andere Deployment-Pipeline, ein anderes VPN. Deine .zshrc enthält drei auskommentierte Blöcke, die du von Hand umschaltest, wenn du den Kontext wechselst. Der falsche deploy-Alias hat einmal zehn Minuten lang auf die falsche Staging-Umgebung gezeigt, bevor du es gemerkt hast.
Das eigentliche Problem: Globale Aliase gehören niemandem. Sie häufen sich an — alte Kunden-Shortcuts neben aktuellen, manche kaputt, manche überlagern sich gegenseitig. Alle paar Monate machst du ein Aufräumen, das einen Nachmittag dauert und sich trotzdem nie vollständig anfühlt.
Mit amoxide lebt jeder Kunde in seinem eigenen Verzeichnis. cd client-a/ lädt automatisch deren Aliase — ihren AWS-Shortcut, ihren Deploy-Befehl, ihren Staging-URL-Öffner. cd client-b/ entlädt alles und lädt deren Aliase. Nichts vermischt sich. Die .aliases-Datei für jeden Kunden kann im Projekt-Repo liegen — versioniert, nachvollziehbar, teilbar.
Projekt-Aliase erfordern einmalig am trust pro Repository — amoxide lädt keine Datei automatisch, die es noch nicht gesehen hat.
# einmalig hinzugefügt, ins Repo eingecheckt ❯ am add -l deploy "./scripts/deploy.sh --env staging" ❯ am add -l logs "ssh app@client-a.internal journalctl -u api -f" ❯ am add -l stage "open https://staging.client-a.internal" ❯ am add -l tf:plan "terraform plan -var-file=client-a.tfvars"
❯ cd ~/clients/client-a am: loaded .aliases deploy → ./scripts/deploy.sh --env staging logs → ssh app@client-a.internal journalctl -u api -f stage → open https://staging.client-a.internal tf:plan → terraform plan -var-file=client-a.tfvars ❯ deploy ❯ cd ~/clients/client-b am: loaded .aliases infra:plan → terraform -chdir=infra plan preview → open https://preview.client-b.internal ship → ./scripts/ship.sh ❯ preview # keine veralteten Aliase. keine Vermischung.
Acht Jahre Entwicklung, etwa 200 Aliase. gcm könnte git commit -m oder git checkout master sein, je nachdem, wann du ihn geschrieben hast. Manche beziehen sich auf Projekte, an denen du nicht mehr arbeitest. Manche sind kaputt, weil das Tool umbenannt wurde. alias | grep git gibt 40 Zeilen zurück und du findest trotzdem nicht den einen, den du suchst.
Der einzige Weg, einen Alias zu entdecken, ist, sich zu erinnern, dass man ihn erstellt hat. Der einzige Weg, sie aufzuräumen, ist, durch eine Datei zu scrollen, die man seit Jahren nicht vollständig gelesen hat. Du weißt, dass es gemacht werden muss. Du schiebst es immer wieder auf.
amoxide macht daraus einen handhabbaren Nachmittag. Verschiebe Aliase in benannte Profile — work, personal, git, rust, ops — jedes ein reiner TOML-Abschnitt, den du lesen, kommentieren und verstehen kannst. am ls zeigt genau, was gerade aktiv ist. Nichts wird geladen, außer du oder ein Projektverzeichnis haben darum gebeten. Aus dem 200-Alias-Haufen werden fünf Profile, denen du wirklich vertraust.
Profile können zusammen aktiviert werden: am use git work schichtet beide übereinander, wobei spätere Profile bei Namenskonflikten Vorrang haben.
# organisierte Profile erstellen ❯ am profile add git ❯ am add -p git gs "git status --short" ❯ am add -p git gp "git push" ❯ am add -p git gl "git log --oneline --graph -20" ❯ am add -p git gm "git commit -m" ❯ am profile add work ❯ am add -p work vpn "sudo openconnect vpn.company.com" ❯ am add -p work jira "open https://company.atlassian.net" ❯ am add -p work standup "open https://meet.google.com/xyz"
❯ am use git work am: profile git activated — 4 loaded: gl, gm, gp, gs am: profile work activated — 3 loaded: jira, standup, vpn ❯ am ls ├─● git (active) │ ├─ gl → git log --oneline --graph -20 │ ├─ gm → git commit -m │ ├─ gp → git push │ ╰─ gs → git status --short │ ╰─● work (active) ├─ jira → open https://company.atlassian.net ├─ standup → open https://meet.google.com/xyz ╰─ vpn → sudo openconnect vpn.company.com

am tui
am ls