i99dash docs
Native apps

apk CLI commands

Reference for every i99dash apk subcommand, its flags, and what publish does before your APK reaches review.

The i99dash apk command group manages a native-app project end to end: scaffold it, validate it, hash the release APK, attest and upload it, and stage its rollout. The SDK does not build Android — you bring a release-signed .apk and the CLI hashes, attests, uploads, and submits it.

All commands read apk.json from the current directory. publish and promote also need an authenticated session and the can_publish_native grant; see the CI usage section below.

init

i99dash apk init my-app

Scaffolds a new native-app project: writes apk.json and .gitignore. The default directory name is my-app. By default it refuses to write into a non-empty directory.

FlagDescription
-f, --forceOverwrite a non-empty directory. Default false.

validate

i99dash apk validate

Zod-validates apk.json, checks that the .apk at apkPath exists, and checks the signer SHA. No flags. Run this first whenever you change the manifest.

build

i99dash apk build

Hashes and sizes the release .apk. There is no tarball step — an APK ships as-is, unlike a WebView mini-app. No flags.

publish

i99dash apk publish

Validates, hashes, SSH-attests, requests a presigned upload URL, PUTs the .apk direct to storage, then submits the manifest for review. See What publish does for the full sequence.

FlagDescription
--dry-runRun validation and hashing, but do not upload.
--key <path>SSH private key to attest with. Default ~/.ssh/id_ed25519.
--passphrase <pass>Passphrase for the SSH key.

A submit defaults to pending human review, not auto-approve. After approval, use promote to roll it out. See distribution.

What publish does

  1. Validate apk.json and confirm the .apk at apkPath exists.
  2. Hash and size the .apk (SHA-256 + byte size).
  3. SSH-attest (K1): sign a canonical manifest of the exact artifact — package, versionCode, versionName, sha256, size, signerSha256 — with your SSH key.
  4. Request a presigned upload URL from the platform.
  5. PUT the .apk direct to storage at that URL.
  6. Submit the manifest for review.

The attestation and the trust model behind it are documented in signing.

promote

i99dash apk promote --rollout 10

Promotes the latest approved release to a staged rollout. --rollout exposes the release to a stable per-car bucket 0..N, so --rollout 10 reaches about 10% of cars. Raise it as you gain confidence.

FlagDescription
--rollout <percent>Required. Integer 0100.
--status <status>rolling (default) or published. published is a full release that supersedes older versions.

status

i99dash apk status

Lists your native apps and their review and release state. No flags.

CI usage

The CLI logs in with an SSH key — the one CLI credential, registered per authentication. The same key attests every artifact you publish (K1). Validate first, then publish with that key.

jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm install -g i99dash
      - run: i99dash apk validate
      - run: i99dash apk publish --key ./ci_ed25519

Publishing is invite-only. Without the can_publish_native grant, the upload-URL and submit calls return 403.

On this page