Developer Portal Guide
This public guide is for external game developers. The BodyLink developer portal is the only supported entry to validation, staging, human review, and the production catalog. Developers never receive catalog-write credentials.
If you use a coding agent—or cannot program—start with the External Developer Agent Release Runbook. Paste it unchanged. The agent performs the technical work and shows one exact human action at a time.
Current external release workflow
There are two deliberately separate submissions today:
DIRECT AGENT EVIDENCE
build + validate + export
-> one-shot OAuth authorization + exact-digest confirmation
-> direct agent upload
-> automated validation
-> staging evidence
-> productionEligible=false (cannot be promoted)
EXTERNAL PRODUCTION
new higher immutable version
-> authenticated Portal /submit upload
-> automated validation
-> staging launcher
-> a distinct BodyLink human reviewer plays the game
-> approve or reject
-> production catalog verification
The direct agent flow proves the exact bytes reached validation/staging. It does
not prove production provenance and cannot be upgraded into a production
release. Because <slug>@<version> is immutable, the later production submission
uses the same slug and a new higher semantic version.
Never describe a direct OAuth upload as production-ready, production-eligible,
approved, published, or live. It must report source=agent-upload and
productionEligible=false.
1. Account and onboarding
Registration is email + password (at least 12 characters). Enter credentials only in the official Portal browser; never give a password, session cookie, token, or authorization code to an agent or command.
For direct agent submission, the BodyLink platform team currently provisions:
- your account's organization/game membership;
- a public OAuth client ID;
- the organization ID;
- the game ID.
These IDs are not secrets, but the agent must verify them against the onboarding
information you received. If any are missing, the agent may finish local tests
and export, then must stop with BODYLINK PLATFORM ONBOARDING REQUIRED. It must
not invent IDs or ask you to use a database or terminal.
Your account is a submitter account. External developers cannot approve their own production submission. Reviewer authority belongs to designated BodyLink humans.
2. Build, preflight, and size limits
Use the game repository's actual scripts. A typical project runs:
npm install
npm test
npm run build
npm run validate
npm run export:zip
npm run release:preflight
Proceed only when all applicable gates pass. release:preflight prints a final
PREFLIGHT: PASS or PREFLIGHT: FAIL; every ✗ includes a concrete fix. Never
upload “to see what happens” after a failed preflight.
The public external lane enforces:
| Bound | Limit |
|---|---|
| ZIP archive | 50 MiB (52,428,800 bytes) |
| Single asset | 25 MiB |
| Total uncompressed bundle | 512 MiB |
| ZIP entries | 2000 files |
If the ZIP exceeds 50 MiB, reduce assets, rebuild, revalidate, and recompute the digest before OAuth or browser upload. Contact BodyLink when a game cannot fit; do not look for an undocumented submission lane.
3. Freeze the exact artifact
Before authorization, the agent must verify:
- stable slug and a new semantic version in both manifests;
- the exact exported ZIP and PKZIP format;
- exact byte count;
- SHA-256 in 64-character hexadecimal;
- SHA-256 in 43-character unpadded base64url (the Portal display form);
- repository, branch, exact source commit, and worktree state;
- test/build/validation/gameplay results as PASS, FAIL, or honestly SKIPPED.
The agent then shows APPROVE OAUTH RELEASE <slug>@<version>. A blank, vague,
misspelled, partial, stale, or different reply is not approval. Approval applies
only to the displayed artifact and staging-only effect.
4. One-shot OAuth authorization
The installed BodyLink CLI starts Authorization Code + S256 PKCE. It opens the
official Portal in your browser and listens temporarily on a random
http://127.0.0.1:<port>/oauth/callback on the same computer.
Security rules:
- Sign in only in the Portal browser. The agent never reads or types credentials.
- Never copy the callback URL, authorization code, token, cookie, or browser storage into chat or a terminal.
- On the consent page, verify the displayed client, organization ID, game ID,
device label,
release:read/release:submitpermissions, expiry, and current loopback callback. - If any field differs from onboarding evidence, deny and stop.
- Approve only after the agent shows the exact reply
AUTHORIZE AGENT <org-id> <game-id>.
The browser briefly reaches the loopback callback and returns control to the CLI. The one-shot credential remains in memory and is revoked/discarded when the command finishes.
5. Exact-digest confirmation
After authorization, the Portal shows a separate “Confirm release upload” page. It must match the frozen candidate's slug, version, exact bytes, and base64url SHA-256, and must say the upload is for validation only—not production.
Approve only after the agent shows:
CONFIRM EXACT RELEASE <slug>@<version> <base64url-digest>
Any mismatch means deny and stop. Exact-digest confirmation authorizes only the displayed direct upload; it is not reviewer approval and does not authorize the later production submission.
6. Direct validation/staging evidence
A successful direct result must include:
- a safe submission ID;
source=agent-upload;- state
validatedorstaged; productionEligible=false;- the exact artifact digest.
The correct conclusion is:
DIRECT AGENT EVIDENCE COMPLETE — NOT PRODUCTION ELIGIBLE
If validation rejects the bundle, read the named public check codes, apply the recommended fixes, create a new version when the prior one was consumed, rebuild, and repeat with a new exact approval. See the Validation Reference.
7. Separate production submission
Only after the direct evidence succeeds should the agent ask whether to prepare production. It must:
- keep the same slug and create a new higher semantic version;
- update both manifests together;
- rerun tests, build, validation, gameplay, and export;
- compute and display the new exact bytes and SHA-256 values;
- stop for
APPROVE EXTERNAL PRODUCTION <slug>@<new-version>.
After that exact approval, the agent may drive the visible authenticated Portal
/submit form. If browser control cannot choose the local file, the only human
file action is selecting the exact named ZIP and clicking Upload. Credentials
remain browser-only.
The production submission moves through received -> validating -> staged or a
fail-closed rejection. Staging is not production.
8. Distinct human review and publish
At staged, a reviewer plays your game in the real staging launcher with the
real launcher UX and available camera/tracking. The reviewer—not the developer's
agent—approves or rejects it with a separate Portal account.
- External developers cannot approve their own submission.
- The direct-upload digest confirmation is not this decision.
- An optional inline preview is not the review gate; the staged launcher is.
- Every decision records who, when, version, and validation evidence.
- On approval, the immutable version becomes the production pointer and the catalog is rebuilt.
Say LIVE only after the production catalog exposes the exact approved
<slug>@<version>. An upload, validation PASS, or staged game is never LIVE.
9. Failures and recovery
| Failure | Safe recovery |
|---|---|
| Sign-in does not resume | Stop the stale CLI, start one fresh request, and approve only the new request. Never reuse callback/code data. |
| Loopback callback fails | Ensure browser and CLI are on the same computer; retry once with a fresh random port. Remote/headless authorization is unsupported. |
| ZIP over 50 MiB | Stop before OAuth, reduce assets, rebuild, revalidate, recompute the digest. |
| Immutable version conflict | Bump both manifests to a new version; rebuild and request approval again. |
| Service unavailable | Preserve safe artifact evidence, discard the one-shot credential, record the public code/timestamp, and contact BodyLink. Do not work around the Portal. |
Response omits source=agent-upload or productionEligible=false |
Fail closed and contact the BodyLink platform team. |
| Inline preview unavailable | Use the staged launcher; do not lower the human review requirement. |
10. Evidence the agent returns
The final report should contain repository/branch/commit/worktree state; slug@version; ZIP path/name, exact bytes, SHA-256 hex/base64url; every test/build/ validation/gameplay result; safe authorization/confirmation timestamps; safe submission IDs; source/state/production eligibility; credential cleanup; the production submission and reviewer next step when requested; and exactly one next human action.