Create, manage, and run shell aliases from a single interface. Works cross-platform with bash, zsh, fish, PowerShell, and cmd.
Two ways to run any alias:
gs— native shell command (after one-time hook install)qwik -r gs— works anywhere, no setup needed
- Installation
- Quick Start
- Core Concepts
- Commands
- Alias Templates & Arguments
- Shell Integration
- Conflict Detection
- Storage & Backups
- Environment Variables
- Development
pipx install qwikOr with uv:
uv tool install qwikqwik add gs "git status"
qwik init zsh --install
source ~/.zshrc
gs # native shell alias
qwik -r gs # same thing, no hook needed| Way | Example | When to use |
|---|---|---|
| Native | gs |
Daily use after one-time shell hook setup |
| Via qwik | qwik -r gs |
Scripts, CI, restricted shells, or pre-setup |
Both share the same store and substitution engine — behavior is identical.
- You register aliases with
qwik add - You install a one-line shell hook with
qwik init --install - Every new shell session regenerates shell-native aliases from the store
- You type
gsjust like a normal alias — because it is one
qwik add gs "git status"
qwik add gs "git status" --tag git --description "Repo status"
qwik add gs "git status" --force # overwrite existing
qwik add # interactive modeqwik rm gs
qwik rm gs --yes # skip confirmationqwik rename gs gstat # preserves statsqwik edit gs
# Opens TOML snippet in your $EDITOR:
# command = "git status"
# tag = ["git"]
# description = ""
# enabled = true
# Save and quit to apply changes.qwik disable gs # hides from shell hook
qwik enable gs # re-enablesqwik list # all aliases
qwik -l # shortcut
qwik list --tag git # filter by tag
qwik list --search stat # filter by queryOutput:
Name Command Tag Used Last
───── ────────────────────────── ───── ───── ───────────
gs git status git 42 2 min ago
gco git checkout {1} git 18 1 hour ago
k kubectl k8s 7 yesterday
qwik show gs # full metadataqwik search "git"
qwik -s "git" # shortcutqwik # bare invocation
qwik pick- Type characters to filter matching aliases live
↑/↓navigateEnterruns the selected aliasCtrl+Eedits itCtrl+Ddeletes itEsccancels
qwik run gs
qwik run gs --short # pass extra args
qwik -r gs --short # shortcut flagqwik tag gs git
qwik tag gs work
qwik untag gs workqwik export ~/aliases.toml # share / backup
qwik import ~/aliases.toml # merge
qwik import ~/aliases.toml --overwriteqwik doctor # shell, hook, store, conflictsqwik init zsh # print hook to stdout
qwik init zsh --install # append to ~/.zshrc with backupSupported shells: bash, zsh, fish, pwsh.
qwik --version
qwik -v
qwik --help
qwik -hAliases can pass arguments through unchanged or interpolate them into the command.
Extra args are appended after quoting.
qwik add gs "git status"
gs --short # → git status --shortUse {…} markers to substitute arguments into the command.
| Placeholder | Meaning |
|---|---|
{1}, {2}, {3}… |
Nth positional argument (1-based) |
{@} |
All arguments joined with spaces |
{*} |
All arguments as a single quoted string |
{1:-default} |
Nth positional, falling back to default if missing |
Single positional:
qwik add gco "git checkout {1}"
gco main # → git checkout mainMultiple positionals:
qwik add gcm 'git commit -m "{1}: {2}"'
gcm feat "add login"
# → git commit -m "feat: add login"Default value:
qwik add gpo "git push origin {1:-main}"
gpo # → git push origin main
gpo feature/x # → git push origin feature/xAll args joined:
qwik add gc-chore 'git commit -m "chore: {@}"'
gc-chore init version
# → git commit -m "chore: init version"All args as one quoted string:
qwik add note 'echo "Note: {*}"'
note hello world
# → echo "Note: 'hello world'"Mixed — template + appended extras:
qwik add k "kubectl {1}"
k get pods -n kube-system
# → kubectl get pods -n kube-system
# {1}=get, "pods -n kube-system" appended after template{N:-default} is especially useful for aliases with a sensible fallback:
qwik add co "git checkout {1:-main}"
co feature # → git checkout feature
co # → git checkout main (default){0}is rejected at add-time — placeholders are 1-based- Missing required args produce a clear error at runtime instead of silently expanding to empty strings
Make aliases available as real shell commands.
bash:
qwik init bash --install
source ~/.bashrczsh:
qwik init zsh --install
source ~/.zshrcfish:
qwik init fish --install
source ~/.config/fish/config.fishPowerShell:
qwik init pwsh --installThe --install flag:
- Creates a timestamped backup of your rc file
- Appends the hook (idempotent — safe to run multiple times)
If you prefer to edit your rc file directly, qwik init <shell> prints the hook:
eval "$(qwik init zsh)"The hook generates native aliases/functions for each shell:
| Shell | Append mode | Template mode |
|---|---|---|
| bash / zsh | alias gs='git status' |
gs() { git checkout "$1" ; } |
| fish | alias gs 'git status' |
function gs ; … ; end |
| PowerShell | function gs { echo hi @args } |
function gs { echo "{1}" $args[0] } |
| cmd | doskey gs=git status $* |
(best-effort, no template) |
Every add and rename validates the new name:
| # | Check | Result |
|---|---|---|
| 1 | Already an alias? | Refuse unless --force |
| 2 | Shell builtin? (cd, echo, alias, …) |
Refuse unless --force |
| 3 | Binary on $PATH? |
Warn but allow |
| 4 | Valid syntax? | Refuse if it contains spaces, slashes, $, backticks, semicolons |
Example UX:
qwik add ls "ls --color=auto"
⚠ Warning: "ls" shadows /usr/bin/ls.
Continue? [y/N]
qwik add cd "echo nope"
✗ "cd" is a shell builtin. Shadowing it can break your shell.
qwik add "my alias" "echo hi"
✗ Invalid name "my alias": contains whitespace.- Linux/macOS:
$XDG_CONFIG_HOME/qwik/aliases.toml(usually~/.config/qwik/aliases.toml) - Windows:
%APPDATA%\qwik\aliases.toml - Backups: every destructive operation writes to
qwik/backups/aliases-<timestamp>.toml(last 20 kept) - Atomic writes: temp file + rename to prevent corruption
- Format: human-readable TOML, safe to edit by hand
Example store file:
[aliases.gs]
command = "git status"
tag = ["git"]
description = "Quick git status"
enabled = true
created_at = "2026-05-10T10:00:00Z"
updated_at = "2026-05-10T10:00:00Z"
last_used = "2026-05-10T11:30:00Z"
run_count = 42| Variable | Purpose |
|---|---|
EDITOR |
Editor for qwik edit (default: vi) |
QWIK_CONFIG_DIR |
Override default config directory |
QWIK_DEBUG=1 |
Enable debug logs to stderr |
NO_COLOR |
Disable colored output (also --no-color) |
# Install with dev dependencies
pip install -e ".[dev]"
# Run the test suite
pytest
# With coverage report
pytest --cov=qwik --cov-report=term-missingMIT