Theme
Last updated: 2026-10-20
A build is one immutable version of an app. Change version in app.json before uploading new code. Use create for the first build and upload for later versions.
Commands that target an app read its package ID from app.json, or accept --package-id <id>. The exceptions are ls <package_id> and rm --app <package_id>, which take the ID directly.
evenhub pack
Run your project's build script, then package its output:
bash
npm run build
evenhub pack app.json dist -o my-app.ehpk| Argument or option | Description |
|---|---|
<manifest> | Path to app.json |
<project> | Built output directory, such as dist |
-o, --output <file> | Package path; defaults to out.ehpk |
--no-ignore | Include hidden files |
-c, --check | Check whether the package ID is available; requires login |
--sdk-ver <version> | SDK release used to derive the minimum app version |
--enforce-manual-version | Use the manifest's minimum app version, even below the SDK floor |
Ordinary packing needs no credentials. The optional --check makes an authenticated availability request. A failed pack exits non-zero.
Minimum app version
The CLI reads the SDK release's minAppVersion from npm and stamps it into the packaged manifest. It keeps a higher value from app.json and raises a lower value to the SDK floor. The source app.json is unchanged.
Without --sdk-ver, the lookup uses the SDK's npm latest tag. Pass the release your project uses to make the selection explicit:
bash
evenhub pack app.json dist --sdk-ver 0.0.16If npm is unavailable, the CLI warns and uses its bundled mapping. An SDK absent from that mapping falls back to a default floor, which may be wrong. Inspect the warning and repack online before distribution if the floor could not be verified.
--enforce-manual-version requires min_app_version in the manifest. A value below the SDK requirement can allow installation on a phone app that lacks APIs your build needs.
See Packaging & Deployment for the manifest schema.
evenhub upload
Adds a version to an existing app. Update the manifest version, build and pack before uploading.
bash
evenhub upload my-app.ehpk -m "Swipe up restores the last entry"| Option | Description |
|---|---|
-m, --changelog <text> | Required changelog, up to 500 characters |
--package-id <id> | Override the package ID read from app.json |
--new-draft | Upload again instead of reusing a cached draft |
An existing version exits 4. Each new build starts Private. The owner can install it from Me → Apps → Private builds in the Even Realities app; see Private Testing.
evenhub promote and evenhub delist
Assign an uploaded build to beta, or remove a channel assignment:
bash
evenhub promote 1.0.1 --to beta
evenhub delist --from beta| Option | Command | Description |
|---|---|---|
--to beta | promote <version> | Point beta at this version |
--from <channel> | delist | Clear beta or public |
--package-id <id> | Both | Override the package ID read from app.json |
Promotion to public is refused locally. Submit for review and publish in the portal. delist --from public can remove the public channel assignment; it keeps the builds.
A tester can install a beta build when their membership is Active. See Testers for invitation and installation checks.
evenhub ls for builds
bash
evenhub ls com.example.myapp
evenhub ls com.example.myapp --verboseReplace the package ID with your own. Read STATUS for review state and CHANNEL for distribution. Use --verbose to include review details.
Build states
| Status | Meaning |
|---|---|
| Private | Uploaded; available to its owner and to Active testers when assigned to beta |
| In review | Submitted in the portal and awaiting a decision |
| Approved | Review passed; ready to publish |
| Published | Published to the store |
| Rejected | Review declined; use --verbose for the reason |
Status and channel are separate fields. A Private build can be assigned to beta.
evenhub download
Download a version's package:
bash
evenhub download 1.0.1 -o ./build.ehpk| Option | Description |
|---|---|
-o, --output <path> | Output file; defaults to <package_id>-<version>.ehpk |
--package-id <id> | Override the package ID read from app.json |
The CLI requests a fresh signed storage URL, then downloads from it without forwarding account credentials to the storage host.
evenhub rm
Remove one version, or an entire app:
bash
evenhub rm 1.0.1
evenhub rm --app com.example.myapp| Option | Description |
|---|---|
--package-id <id> | App containing the version to delete |
--app <package_id> | Delete the whole app, its builds and memberships |
--yes | Skip the app-deletion confirmation |
A version still assigned to a channel cannot be deleted. Exit 5 identifies the channel; delist it first.
App deletion is permanent. Use --app by itself with the package ID; do not combine it with a version or --package-id. In scripts, add --yes only after verifying the target.
Resuming an interrupted upload
create and upload upload a package into a draft, then commit that draft. The CLI attempts to save the draft ID, package hash, API base and account identity in state.yaml in the config directory.
| Situation | Behaviour |
|---|---|
| Same package, account and environment; draft still valid | Reuse the cached draft |
| Draft older than 30 minutes, or identity/manifest changed | Upload the package again |
--new-draft supplied | Upload again |
| Cache unavailable or unsafe to use | Warn on stderr and continue without reuse |
Cache failures alone do not change the API result or exit code. A failure's draft_cached: false means automatic reuse is unavailable.
Check server state before retrying a write with an uncertain outcome. Use the exit-code guidance to distinguish unchanged state, partial completion and network failures.