Skip to content

amoxideDie richtigen Aliase, zur richtigen Zeit

Wie direnv, aber für Aliase. Definiere Aliase pro Projekt, pro Toolchain oder global — sie werden automatisch geladen.

amoxide Logo

Installation

sh
brew install sassman/tap/amoxide sassman/tap/amoxide-tui
sh
curl -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 | sh
powershell
powershell -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"
sh
cargo binstall amoxide amoxide-tui
sh
cargo install amoxide amoxide-tui

Warum amoxide?

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.

amoxide Subcommand-Alias-Showcase
Erste Schritte →

Anwendungsfälle

01
Profile

Der Polyglot-Entwickler

Zwei Stacks. Ein Satz Aliase. Null mentaler Aufwand beim Wechsel.

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.

AliasNode-ProfilRust-Profil
lnpm run lintcargo clippy --locked --all-targets -- -D warnings
tnpm testcargo test
bnpm run buildcargo build --release
rnpm run devcargo run

Alle Profile liegen in ~/.config/amoxide/profiles.toml — reines TOML, versionierbar neben deinen Dotfiles.

einmalig einrichten
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"
danach jeden Tag
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
02
Projekt-Aliase

Das gemeinsame Team-Projekt

Repo klonen, Shortcuts bekommen. Kein README, kein Onboarding-Dokument.

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.

einmalig ins Repo einchecken
# 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"
für jeden Entwickler, automatisch
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
03
Subcommand-Aliase

Der Kubernetes-Operator

Ersetze 120 flache Aliase durch ein Schema, das du selbst entworfen hast.

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).

oh-my-zsh kubectl-Plugin ersetzen
# 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"
danach einfach tippen
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
04
Projekt-Aliase

Der Freiberufler zwischen Kunden

Jedes Kundenverzeichnis lädt seinen eigenen Kontext. Nichts vermischt sich.

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.

client-a/.aliases
# 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"
Kunden wechseln — nichts zu merken
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.
05
Profile

Das große Dotfile-Aufräumen

Acht Jahre Aliase. Ein Nachmittag, um Ordnung zu schaffen.

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.

aus .zshrc migrieren
# 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"
was gerade aktiv ist
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

In Aktion

am tui Screenshot

Interaktives TUI — am tui

am ls Screenshot

CLI-Auflistung — am ls