The canonical package tree is portmaster/minecraftbedrock/; RGDS stable
helpers live in bottomscreen/release/. Do not release from device dumps or
extracted archives.
Before tagging:
- Update the single
VERSIONsource and compatibility registry, then runpython3 scripts/generate_compat_docs.py. - Build pinned arm64/armhf clients, RGDS companions, and the context bridge with the checked-in container recipes.
- Run
bash tests/run_all.shand record the physical acceptance matrix. A testing prerelease may retain explicitly disclosed pending R36S/RGDS rows; stable publication requires every blocking physical matrix session. Confirm 1.16.221.01 remains the recommended default, the original 1.21.51.01 matches its registered no-RenderDragon library SHA-256, and an unknown/reuploaded 1.21.51.01 is visibly marked not recommended. On RGDS, transition from a mapped local world to a LAN-hosted world and confirm cached terrain/waypoints disappear, live coordinates continue,REMOTE WORLD / MAP UNAVAILABLEis shown, and the terrain worker remains paused until a local world is loaded again. Exercise both IPv4 and IPv6 LAN paths. For a local world, switch worlds without moving and confirm the open LevelDB is selected immediately; verify touch on the physical bottom panel before and after repeated SELECT swaps. Exercise all five companion tabs, verify health/hunger snapshots update, verify Chat/Items never replace their content with game pixels, the Items source/destination gesture stays local, and the Chat touch keyboard opens. - Build both editions with
scripts/build_releases.pytwice and require identical SHA-256 values. - Run
scripts/check_release_safety.pyon standard, RGDS, and source archives. Inspect SBOMs and confirm no APKs, game libraries/assets, worlds, profiles, credentials, analysis dumps, device backups, or debug binaries. - Confirm the standard archive contains no telemetry, companion, minimap,
dual-touch, OSK supervisor, or RGDS helper; confirm the RGDS archive is
arm64-only and its client and companion both contain the
mcpe_companionmarker. Confirm neither RGDS binary contains the legacy mirror writer/blit. - Verify the exact release-index edition, channel, size, SHA-256, and minimum updater version for every asset.
- Build the pinned Windows helper, run its unit tests and
--helpsmoke test, and package the EXE, WSL setup script, shortcut script, README, and generated notices asmcbedrock-get-windows-v$VERSION.zip. Scan that bundle for forbidden Minecraft content and publish its SHA-256. It must appear inSHA256SUMS.txtbut never in a port archive orrelease-index.json, because the index is consumed only by the on-device edition updater. - Confirm
README.md, the packaged README, andGETTING-BEDROCK-APKS.mdagree on edition names, shared APK path, ABI, recommended version, Windows bundle name, and legal disclaimer. Validate every local link and every release-asset URL. - Install the built archive on every reachable reference device before publishing, not after. Extract the actual zip — not a deployed code tree — run Self test on each device, and record its summary line in the release notes. Any device that could not be included is named in the notes as excluded rather than left to be inferred. rc.14 was published without ever being installed on muOS because the card had died; the notes disclosed it, which was honest and backwards. Ten minutes here would have caught the rc.12 false "Weston runtime missing" warning before players saw it.
Publish stable/testing assets only after their required gates pass. Keep code rollback directories and migration recovery manifests until the first clean launch on each migrated installation.
-
Set the release as Latest, and confirm it.
releases/latestis what the repository's own release page and every deep link resolve to. Every prerelease must carry the prerelease flag or GitHub hands that badge to the newest tag that does not — which is how rc.9 held it while rc.10 through rc.15 were published behind it. -
Download every published asset and verify its SHA-256 against the published
SHA256SUMS.txt— downloaded back from the release, not compared against the local build directory, so the check covers the upload as well as the build. -
Commit the built
release-index.jsontomain, and only now. The on-device updater fetches it fromraw.githubusercontent.com/<repo>/main/release-index.json, so the file in the repository is the published index — the copy inside the build artifact has no effect until it is committed.This step comes last on purpose. Every row carries an absolute
releases/download/<tag>/URL and the digest of a file that must already be there. Commit it before the release is published and every device on the channel is pointed at a URL that 404s, on a schedule you do not control; commit it before step 2 and a corrupted upload is published as verified.Do not hand-edit it: the build emits both channels' rows already, because a stable build is run with
--mirror-channel testing. A fresh install defaults tostable, so a stable row is required or Update port fails for everyone who never changed the setting; the mirrored testing row carries existing testers onto the same asset instead of stranding them on the last release candidate. Check before committing that there is exactly one row per edition-and-channel pair —release_select.pyfails on anything else — and that each pair's two rows carry the same asset, URL and SHA-256. -
Confirm the updater can actually see the release. Fetch the raw index URL above and run
release_select.py <index> <edition> <channel>for every edition and channel; each must resolve to the new version. This is the exact query a device makes, and it is the one that returnedexpected one minecraftbedrock.standard/stable release, found 0for the whole 2.0.0 release-candidate series.
NOT AN OFFICIAL MINECRAFT PRODUCT. NOT APPROVED BY OR ASSOCIATED WITH MOJANG OR MICROSOFT. No game files are included.