Skip to main content
orbit is how CI and your terminal talk to Orbit. Artifacts like an .xcresult bundle or an Instruments .trace run to hundreds of megabytes, so they never go through a browser.
Do not confuse it with parsaa-cli, which is the Parsaa app’s own, unrelated CLI.

Install

Every release publishes a checksums.txt alongside per-platform archives.

Credentials

A project token is created in the console under Settings, Tokens, and shown once. In CI it belongs in a secret, read as ORBIT_TOKEN. It names exactly one project, so no command takes a project argument. A session from orbit login belongs to you, reaches every project you are a member of, and is the only way the paid MCP tools run from an editor. The two live side by side in ~/.config/orbit/config.json (mode 0600), and neither command disturbs the other’s credential. See MCP and agents.

orbit upload

There is one upload command, not one per kind.
--kind is inferred from the path when omitted.
--build-id is linkmap only. --wait blocks up to ten minutes for the server to finish parsing before exiting.

What actually happens

Your bytes never stream through Orbit’s own servers. The CLI hashes and sizes the file locally (zipping a bundle directory deterministically, so an unchanged build produces the same hash and dedups), presigns, PUTs straight to object storage, then confirms. A duplicate hash on the same project skips the transfer entirely.

orbit compliance scan

Runs entirely offline, with no network call at all unless --upload is passed, and then only the report JSON is sent, never the archive. It reads the app bundle, its frameworks and extensions, their Mach-O binaries and Info.plists, and prints a report scored out of 100: required reason API declarations, third party SDK detection against Apple’s list, entitlements, and a rule-based App Review checklist.

orbit mcp

A stdio bridge to the HTTP MCP server, for editors that speak only stdio.
It is a proxy and nothing else: it holds no tools of its own, so a tool added to the server is available through the bridge the same day without shipping a new CLI. It prefers the session over a config-file token, because a session can spend your credits and a project token never can, and a token you named yourself with --token or $ORBIT_TOKEN always wins. It renews an expired session before starting, and once on a 401 mid-run, so the editor sees the answer rather than the interruption.

orbit memory

Pull writes what the console compiled and nothing it did not: AGENTS.md and CLAUDE.md with the same bytes under a generated header, plus every active memory into .serena/memories/. It sends the ETag of the last pull, so an unchanged bundle costs one 304 and no rewrite. Deletion is bounded by a manifest in .orbit/, so a memory archived in the console leaves the repo and a file the CLI never wrote is never touched. Gitignore .orbit/; commit the generated files. Push imports the markdown a repo already has. CLAUDE.md and AGENTS.md are split on ## into one instruction memory per section, titled and slugged from the heading, which is what makes a real instruction file import at all (a memory body is capped at 8 KB). Matched by slug, so pushing twice updates instead of duplicating. Imports land as drafts unless --activate is passed, and files carrying the generated header are skipped so a compiled bundle is never re-imported as new memories.

orbit analytics query

A metric id first, a saved query by name second. Flags are --window, --unit, --breakdown and --csv. There is no copy of the metric catalogue in the binary, so a metric added in the console is queryable without a new CLI. A day the rollup has not written is written EMPTY in the CSV, never 0.

Global flags

No flag anywhere in the CLI has a short form.

Exit codes

In CI

if: always() matters. A failing test run’s .xcresult is exactly the one you want in Orbit, so the upload should run whether the prior step passed or not. In Xcode Cloud the two guards are load-bearing rather than defensive: a test-only run has no archive, and an archive-only run has no result bundle.
Do not loop retries indefinitely inside a CI step. The upload flow already retries the calls it makes internally; a CI-side retry is for the process itself not coming back clean.