PROJECT-SCOPED ALIASES
Stop memorizing context-specific commands.
Define aliases per directory. Share them with your team.
Performance of every run is locally tracked, giving insights on performance trends over time.

Installation
Release notes โbrew tap urtti/ez && brew install ezbrew update && brew upgrade ezCore Features
Project-scoped
Aliases are defined in a .ez_cli.json file per directory. They only exist where they are defined.
Team sharing
Commit the config file. New team members get all project aliases with the repository.
Keychain secrets
Secrets live in Apple Keychain and are handed to the command through its environment โ never written to disk, never printed, never visible in ps.
Parameterized
Aliases support {1} {2} placeholders. Arguments are substituted at runtime, and extra arguments append automatically.
Run history
Every run is recorded locally. ez stats reports success rate, median, p90, and a duration trend per alias.
Outlier alerts
A run that is meaningfully off its own median flags a notice directly on its timing line.
Parallel mode
Aliases added with -p run commands concurrently, each with individual timing and shared Ctrl+C handling.
Real exit codes
Aliases pass through the exit code of their driven process, ensuring ez test && ez deploy behaves in CI and scripts.
Interactive passthrough
Full terminal passthrough for interactive CLI tools like vim, less, and ssh.
Swift CLI
A single native Swift binary with instant startup and zero runtime dependencies.
Private & Local
ez itself makes zero telemetry or external network calls. Run history is stored strictly in a local SQLite file at ~/.ez/runs.db.
MIT license
Open source. Read the code, fork it, contribute, or ship it.
Usage
Create alias & use it
$ ez add deploy "./scripts/deploy.sh --env prod"๐ ez deploy now stores ./scripts/deploy.sh --env prod. Execute in this directory with ez deploy.$ ez deploy๐ Executing: ./scripts/deploy.sh --env prodDeploying to production...
๐โฑ๏ธ 47.900 s
List aliases
$ ez listAdd & use secrets
$ ez add-secret --key EZ_API_KEYEnter value for EZ_API_KEY: ๐ Secret 'EZ_API_KEY' stored in keychain.
$ ez add upload 'curl -H "Authorization: {EZ_API_KEY}" ...'๐ ez upload now stores curl -H "Authorization: {EZ_API_KEY}" ... Execute in this directory with ez upload.$ ez upload๐ Executing: curl -H "Authorization: {EZ_API_KEY}" https://api.example.comThe value is read from Keychain and passed through the environment โ it never reaches the screen, the process table, or disk.
Create alias with parameters
$ ez add tag 'git tag -a {1} -m "Release {1}"'๐ ez tag now stores git tag -a {1} -m "Release {1}". Execute in this directory with ez tag.$ ez tag v2.0.0๐ Executing: git tag -a v2.0.0 -m "Release v2.0.0"See which commands got slower
โจ NEW IN 1.3Every alias run is recorded in a local SQLite file, scoped to the directory it ran in. Only the alias definition is stored โ arguments and resolved secrets are never written to disk.
$ ez stats$ ez stats buildAutomatic Outlier Alerts
โจ NEW IN 1.3$ ez testThe note only appears when there is something to say: enough history for a trustworthy median, and a difference big enough to matter. Ordinary runs print the timing and nothing else.
Run commands concurrently
โจ NEW IN 1.3$ ez add -p checks "npm run lint" "npm run typecheck"๐ ez checks now stores npm run lint | npm run typecheck. Execute in this directory with ez checks.$ ez checks$ ez checks && ez deployAn alias exits with the code of the work it ran, so a failed check stops the chain.