POROROCA OTA · DOCUMENTATION
Publisher and CI
Author, validate, sign, publish, and reproduce every release.
MENTAL MODEL
Author JSON, then sign an immutable bundle.
The publisher validates schema-v1 JSON. It does not compile an arbitrary app view. Author JSON directly,
copy a fixture, or run the Swift DSL from a small executable/test that writes
DocumentCodec.encode(document)
into .pororoca/documents.
.pororoca/
documents/ # one or more input JSON documents
assets/ # optional referenced assets
keys/ # never commit private.key
update/ # immutable signed output
02 · KEYS, VALIDATION, EXPORT
Fail locally before delivery can fail.
swift run pororoca keys generate --output .pororoca/keys
swift run pororoca validate .pororoca/documents --platform ios
swift run pororoca export .pororoca/documents \
--assets .pororoca/assets \
--output .pororoca/update \
--update-id checkout-copy-2026-09-04-1 \
--message "Clarify checkout copy" \
--git-sha "$GITHUB_SHA" \
--private-key .pororoca/keys/private.key
Omit --assets
when unused. Export refuses to replace output; use --force
only in a
disposable CI workspace. The manifest pins every file by SHA-256 and byte count.
03 · PUBLISH AND CI
Reproduce exactly what reached production.
# CI secrets: POROROCA_API_TOKEN, POROROCA_PRIVATE_KEY, POROROCA_PUBLIC_KEY
mkdir -p .pororoca/keys
printf '%s\n' "$POROROCA_PRIVATE_KEY" > .pororoca/keys/private.key
printf '%s\n' "$POROROCA_PUBLIC_KEY" > .pororoca/keys/public.key
swift run pororoca validate .pororoca/documents --platform ios
swift run pororoca export .pororoca/documents \
--output .pororoca/update --update-id "$GITHUB_SHA" \
--git-sha "$GITHUB_SHA" --private-key .pororoca/keys/private.key
swift run pororoca publish .pororoca/update \
--server https://pororoca-ota.fly.dev --app your-app-slug \
--channel production --rollout 10 \
--public-key .pororoca/keys/public.key
- Pin the repository revision and Swift toolchain.
- Require review for production publish jobs.
- Retain the signed bundle as a CI artifact.
- Publish iOS and Android as separate bundles.
TROUBLESHOOTING
Read failures literally.
| Failure | Fix |
|---|---|
| output already exists |
Use a new directory or --force only in disposable CI.
|
| invalid key | Provide raw 32 bytes or base64-encoded 32-byte key data. |
| platform mismatch | Validate/export with the document's declared platform. |
| HTTP 401/403 | Use the correct non-revoked delivery token for this app. |
| HTTP 402 | Activate the workspace subscription. |
| duplicate update ID | Create a new ID; never overwrite release history. |