Skip to content

Commands

alter apps

Create, inspect, update, archive, and delete applications.

An app owns API keys, provider configuration, agents, and grants. These commands manage the app objects themselves.

alter apps list [--include-archived] [--no-include-stats]
alter apps create --name <name> [--description ...] [--website-url ...]
alter apps show <app-id>
alter apps update <app-id> [--name ...] [--description ...] [--website-url ...]
alter apps archive <app-id>
alter apps unarchive <app-id>
alter apps delete <app-id> [--confirm <name>]

Reads need dashboard_apps:read; create / update / archive need dashboard_apps:write; delete needs dashboard_apps:delete. Every command accepts --output.

List apps in the current organization.

FlagDefaultDescription
--include-archivedoffInclude archived (soft-deleted) apps. Default is active-only.
--no-include-statsstats onSkip per-app grant / key / API-call counts (faster).
Terminal window
alter apps list
alter apps list --include-archived --output json

Create a new app.

FlagRequiredDescription
--name <name>yesApp name.
--description <text>noFree-form description.
--website-url <url>noPublic website URL (http:// or https://).
Terminal window
alter apps create --name "Acme Production" --description "Customer-facing app"

Show one app by ID.

Terminal window
alter apps show <app-id>

Patch app fields. At least one of --name, --description, or --website-url is required — an empty update is rejected.

Terminal window
alter apps update <app-id> --description "Renamed for Q3"

Archiving is a reversible soft-delete: the app disappears from the default apps list view but keeps all its keys, grants, providers, and audit history. Both need only dashboard_apps:write.

Terminal window
alter apps archive <app-id>
alter apps unarchive <app-id> # 409 if the app isn't archived

Because the cascade is permanent, delete is gated behind the separate dashboard_apps:delete scope (not bundled into :admin) and a type-to-confirm check:

  • Interactive: the CLI prompts you to type the app’s exact name.
  • Non-interactive (CI): pass --confirm <name> matching the app’s name. There is no --yes shortcut — the name must be surfaced so the audit trail records the intent.
Terminal window
# Interactive — prompts for the name
alter apps delete <app-id>
# CI — name supplied explicitly
alter apps delete <app-id> --confirm "Acme Production"

A wrong --confirm value exits 2 (USAGE); declining the interactive prompt exits 8 (CANCELLED).

Provision an app in CI and pin it for later steps

Terminal window
APP_ID=$(alter apps create --name "ci-staging" --output json | jq -r '.id')
alter link "$APP_ID" # subsequent steps in this directory skip --app

Review and clean up archived apps

Terminal window
# List what's archived...
alter apps list --include-archived --output json \
| jq -r '.[] | select(.archived_at) | "\(.id)\t\(.name)"'
# ...then permanently delete one (name required as confirmation)
alter apps delete "$APP_ID" --confirm "ci-staging"