Shipside

Ship your iOS app.
From the command line.

Shipside drives the App Store Connect API with your own key: version, listing text, screenshots, age rating, review contact, build attach โ€” and the actual submit for review. When Apple's API says no, Shipside prints the exact recovery steps instead of a stack trace.

$pipx install git+https://github.com/rorshopping/shipside
Start 14-day free trial Source & docs โ†—

Born from five apps in one day

On 2026-09-30 this exact pipeline submitted five apps to App Review end-to-end โ€” and hit every wall App Store Connect has. The walls became playbooks; the playbooks became the CLI.

Adhera: the age-rating questionnaire turned out to be scriptable โ€” one attribute per error, ten round trips, automated. REM Sleep Alarm: the build went INVALID mid-flight โ€” only the build dies, the version survives. Quilly: APP_IPHONE_69 is not a real enum; the 6.7″ set takes the 1320ร—2868 files. Every scar is now a shipside playbook. Read the full story โ†—

One command per mile-marker

Your build is still your job (Xcode / altool). Shipside takes the last mile โ€” and tells you exactly what it can't do for you.

commandwhat it doeswrites?
shipside initConfig wizard โ€” bundle id, your ASC API key (referenced by path, never uploaded), review contact โ†’ shipside.tomllocal file
shipside stateFull ASC status report: versions, builds, screenshots, IAPs, review submissions + the next actionno
shipside planThe submission dry-run: every step marked ok / fix / blocked, nothing writtenno
shipside metadataPush listing text (fastlane-deliver-compatible folders) into the editable version, char limits enforcedyes
shipside screenshotsUpload 1320ร—2868 / 1290ร—2796 PNGs into the 6.7″ set โ€” enum trap handledyes
shipside submit --yesCreates the version (two API routes, 405 playbook), sets age rating + review details, attaches the newest VALID build, submits for reviewirreversible

retry with a spine

429/5xx back off respecting Retry-After; a 409 on a retried write means the first one landed โ€” treated as success.

your keys, your machine

The .p8 is referenced by path and stays put. Shipside's servers never see your ASC credentials โ€” the license check is separate.

playbooks, not traces

13 known failure modes โ€” the 405 deadlock, INVALID_BINARY, ITMS-91055, the 640ร—920 trap โ€” each with its exact recovery steps. Browse them โ†—

Watch it work a real app

Recorded 2026-10-01, dogfooding the packaged CLI against a real app in this portfolio (AprilReady v1.0 โ†’ App Review staging). Real output, no cuts โ€” MP4 here.

Shipside terminal demo: trial, doctor, state, plan

Pricing

Per developer. 14-day free trial with every feature โ€” no card. Activate with the email you buy with.

$19 /month
All commands, all features, one developer. Cancel anytime.
Subscribe monthly
$149 /year
Everything in monthly, two months free, one invoice.
Subscribe yearly
Launch week: code SHIPDAY at checkout takes 40% off your first year.

After checkout, run:
shipside license activate --email you@used-to-buy.com
Your license provisions automatically from the payment โ€” usually instantly, always within a minute.

Try it on a real app in 5 minutes

$shipside trial --email you@example.com
$shipside init
$shipside plan

plan is read-only: it shows every blocker between your app and App Review โ€” missing screenshots, empty description, no age rating, no VALID build โ€” and what Shipside will do about each. You lose nothing by looking.