Apps
Create, list, and manage apps within projects from the CLI.
Apps represent a specific platform build within a project. Each app has a platform (apple, android, web, backend) and an optional bundle identifier — required for non-backend platforms, immutable after creation. Creating an app auto-generates a client_secret API key for SDK use.
Locale demand. Each user carries two locale signals captured by the SDK: their wanted language (Locale.preferredLanguages.first, e.g. fr-FR) and the shown locale (Locale.current, constrained to what the app already ships). The SDK also reports the languages the app binary ships (Bundle.main.localizations), so the localization gap — demand for a language the app doesn't ship yet — is computed automatically: a language is flagged shipped: false when its base language isn't in the app's shipped set. The country breakdown works for every user today; the language breakdown fills in as users upgrade to the SDK that reports preferred language. Like user listings, locale demand respects the data_mode filter (production default, development, or all), so test installs don't skew which languages your real users want.
List apps
owlmetry apps list [--project-id <id>]Lists all apps accessible to the authenticated team. Optionally filter by project.
| Flag | Required | Description |
|---|---|---|
--project-id <id> | No | Filter results to a specific project UUID |
# All apps
owlmetry apps list
# Apps in a specific project
owlmetry apps list --project-id 550e8400-...View an app
owlmetry apps view <id>Shows app details including platform, bundle ID, client key, and latest_app_version (with the source it was resolved from — App Store or computed). See Latest Version Detection.
| Argument | Description |
|---|---|
<id> | App UUID |
Create an app
owlmetry apps create --project-id <id> --name <name> --platform <platform> [--bundle-id <bundleId>]| Flag | Required | Description |
|---|---|---|
--project-id <id> | Yes | Parent project UUID |
--name <name> | Yes | Display name for the app |
--platform <platform> | Yes | One of: apple, android, web, backend |
--bundle-id <bundleId> | Conditional | Required for apple, android, and web platforms. Not used for backend. |
Platforms
| Platform | Description | Bundle ID |
|---|---|---|
apple | iOS, iPadOS, macOS apps | Required (e.g., com.example.myapp) |
android | Android apps | Required (e.g., com.example.myapp) |
web | Web applications | Required (e.g., com.example.webapp) |
backend | Server-side services | Not applicable |
# iOS app
owlmetry apps create \
--project-id 550e8400-... \
--name "My iOS App" \
--platform apple \
--bundle-id com.example.myapp
# Backend service
owlmetry apps create \
--project-id 550e8400-... \
--name "API Server" \
--platform backendA client API key (owl_client_*) is automatically generated when an app is created. The key is returned in the response and stored as a row in the api_keys table — there is no separate column on the app record.
Update an app
owlmetry apps update <id> --name <name>Only the app name can be updated. Bundle IDs are immutable after creation.
| Argument / Flag | Required | Description |
|---|---|---|
<id> | Yes | App UUID |
--name <name> | Yes | New app name |
Deleting apps
The CLI does not expose an apps delete command. App deletion is user-only — agent API keys receive a 403 from the delete endpoint. To delete an app, use the web dashboard while signed in as a user.
Locale demand
owlmetry locales --project-id <id>
owlmetry locales --app-id <id>
owlmetry locales --team-id <id>Shows where your localization demand is: users grouped by their wanted language (e.g. fr-FR, pt-BR) with a NOT SHIPPED flag for languages the app doesn't ship yet, plus a country breakdown that works for every user today.
| Flag | Required | Description |
|---|---|---|
--project-id <id> | No | Narrow to a project (enables the shipped/gap flags) |
--app-id <id> | No | Narrow to an app (enables the shipped/gap flags) |
--team-id <id> | No | Filter to a team |
--data-mode <mode> | No | production (default), development, or all — filters users by their dev/prod flag |
The shipped/gap flags only appear when a single app or project is in scope. The language breakdown fills in as users upgrade to the SDK that reports preferred language; until then the country breakdown is your signal. Supports --format json.
JSON output
All app commands support --format json for machine-readable output:
owlmetry apps list --format json
owlmetry apps view <id> --format json