Skip to main content
apsio reads Apsio from a terminal and uploads debug symbols so crashes are symbolicated. It is in development: version 0.3.0 reads issues, sessions, release health and missing symbols through the read API, and uploads dSYMs, Android R8 mappings, NDK symbols and React Native source maps. Coding agents use the same commands (see Agents).

Install

Homebrew, npm and prebuilt release binaries are not published yet. Until they are, build it from source with Rust 1.94 or later:

Sign in

--with-token reads a token from standard input, checks it against the server and stores it in your user configuration. apsio logout removes it. Today there are two kinds of token, and one APSIO_TOKEN cannot do both jobs: When you need both, store the one you use most and give the other per command, for example APSIO_TOKEN="$PROJECT_TOKEN" apsio issues. They become one project token from the console when the console ships. apsio login without a token starts a device sign-in in the browser. The Apsio sign-in server for it is not live yet; until it is, the command says so and you use --with-token.

Commands

Every command takes --help. session also works in place of sessions.

Read issues, sessions and releases

The read commands call the read API with your project token and print what the console shows, as compact tables:
  • apsio issues filters with --kind (crash, error, anr, hang, abnormal-exit), --release, --app (an app id) and sorts with --sort (last-seen, occurrences, users).
  • Time ranges: --since takes a duration ending now (30m, 24h, 7d, 2w), or give --from and --to as RFC 3339 times or dates (2026-10-01, midnight UTC). A range covers at most 90 days. Without one, each command uses the API’s default: the last 7 days, and 90 days for one issue.
  • Lists come in pages: a table ends with the --cursor value for the next page, and --limit sets the page size.
  • apsio releases compare takes the release to compare against first, then the new one. The CLI computes it from release health and the issue lists of both releases, per app: crash-free sessions and users, abnormal exits, and the candidate’s new issues and the issues that occur more often per 1000 sessions.
  • apsio perf start breaks app start down with --by (release, os, device, prewarmed, none); apsio perf screens sorts with --sort (loads, ttid, ttfd); apsio perf endpoints sorts with --sort (requests, errors, p90) and filters with --host. All three take --app and --release, and cover at most 30 days.
  • apsio issue open and apsio sessions open print a console URL to share. They need the organization id, which is in the console’s URLs (/o/<org>/...): pass --org or set APSIO_ORG.
Text written by your app and its users, such as exception messages and breadcrumbs, is shown quoted and escaped, under a note that says it is untrusted. No control character from the API reaches your terminal.

JSON for scripts and agents

JSON output escapes every control character, and -r removes them from the strings it prints.

Configuration

Flags win over the environment, which wins over the stored configuration. The upload commands send symbols to the symbol upload URL, a service of its own; the read commands use the API URL. When the API URL is on your machine (localhost), uploads default to http://localhost:18795, the local symbol service. A token given as a flag shows in shell history and the process list: in CI use APSIO_TOKEN, and on a laptop use apsio login --with-token. A project token names its project, so with one you can leave out --project. A token used on another project’s id is refused (exit code 3) with a hint naming the token’s project. The URL must use https://; plain http:// is accepted only for localhost, 127.0.0.1 and [::1], so a token never travels unencrypted. The configuration file is $APSIO_CONFIG_DIR/config.toml, else $XDG_CONFIG_HOME/apsio/config.toml, else ~/.config/apsio/config.toml, readable by its owner only.

Exit codes

The codes are stable, so scripts and agents can branch on them. Commands never prompt when they are not attached to a terminal: apsio login without a token needs a terminal, and the read commands never ask anything.