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 issuesfilters with--kind(crash,error,anr,hang,abnormal-exit),--release,--app(an app id) and sorts with--sort(last-seen,occurrences,users).- Time ranges:
--sincetakes a duration ending now (30m,24h,7d,2w), or give--fromand--toas 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
--cursorvalue for the next page, and--limitsets the page size. apsio releases comparetakes 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 startbreaks app start down with--by(release,os,device,prewarmed,none);apsio perf screenssorts with--sort(loads,ttid,ttfd);apsio perf endpointssorts with--sort(requests,errors,p90) and filters with--host. All three take--appand--release, and cover at most 30 days.apsio issue openandapsio sessions openprint a console URL to share. They need the organization id, which is in the console’s URLs (/o/<org>/...): pass--orgor setAPSIO_ORG.
JSON for scripts and agents
-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.