Publish to the store.
Your microfirmware works on your board. This last step makes it something other people's boards can find, which closes the loop back to the catalogue you are reading this on.
Give it a real UUID
Everything so far used the shared development UUID. That has to change before anything leaves your desk. Two published apps with the same UUID fight over the same settings sector, and the catalogue cannot tell them apart.
Generate a UUIDv4 and keep it. It identifies this app for the rest of its life.
macOS / Linux
uuidgen
# or, if you would rather not care which tools are installed:
python3 -c "import uuid; print(uuid.uuid4())"
Windows (PowerShell)
[guid]::NewGuid().ToString()
Every future release of this app must use the same UUID. That is how an update is recognised as an update rather than a different app. Losing it means your users get a stranger instead of a new version. Put it in your README.
Make a release build
./build.sh pico_w release <YOUR UUID4 HERE>
Note both changes from step 6: release instead of debug, and
your own UUID instead of the development one. You get the same three files in
dist/, now named after your UUID:
<uuid>-<version>.uf2, the firmware people download and install.<uuid>.json, your app's descriptor, filled in and ready to publish.rp.uf2.md5sum, the checksum, already copied into the descriptor.
Flash this build and test it once more. A release build is not identical to a debug build, and "it worked in debug" has surprised people before.
Describe your app in desc/app.json
That <uuid>.json in dist/ is not written by hand. It is
generated from desc/app.json in your repository, and if you have not edited
that file yet then what you just built still describes itself as the template.
The template ships two files in
its desc/ folder .
app.json.template is the blank form. app.json is the working
copy that build.sh actually reads, and the one you edit.
<APP_UUID>, <APP_VERSION> and
<BINARY_MD5_HASH> are filled in by build.sh every time
it runs. Hard-code them and they go stale the moment you cut a new version, which is
exactly when a wrong checksum does the most damage.
| Field | Who fills it |
|---|---|
name, description |
You. This is what a visitor reads in the store. |
image |
You. A 256x256 PNG works well. Optional. |
tags |
You. Short words a visitor might filter by, such as
Emulation or Utility. |
devices |
You. ST, STE, MegaST,
MegaSTE. The store normalises the spelling. |
binary |
You, but write it with the placeholders. See below. |
uuid, version, md5 |
build.sh. The version comes from version.txt, the
checksum from the binary it just built. |
The binary URL is templated too
The built firmware is named <uuid>-<version>.uf2, so the URL that
points at it has to carry the version. Write the placeholders and let the build fill them,
and the URL stays correct across every release without you touching it:
{
"uuid": "<APP_UUID>",
"name": "My Microfirmware",
"description": "What it does, in one sentence.",
"image": "https://example.com/my-app-256.png",
"tags": [
"Utility"
],
"devices": [
"ST",
"STE",
"MegaST",
"MegaSTE"
],
"binary": "https://example.com/downloads/<APP_UUID>-<APP_VERSION>.uf2",
"md5": "<BINARY_MD5_HASH>",
"version": "<APP_VERSION>"
}
Bump version.txt, rebuild, and both the filename and the URL follow.
If desc/app.json is missing, the build stops and tells you to create one.
It never invents a descriptor for you.
From one descriptor to a catalogue
Your apps.json is a list of descriptors under an apps key. One
app, one entry, exactly as build.sh produced it:
{
"apps": [
{ ... the contents of dist/<uuid>.json ... }
]
}
Publish more than one app and they sit side by side in that array. The store adds the
creator attribution when it folds your listing into the public catalogue, so
leave that out of your own file.
Host it
Publishing is two separate things, and keeping them apart in your head helps:
-
You host your own files. The
.uf2and anapps.jsonlisting it live somewhere you control: a GitHub release, a web host, anywhere reachable. You keep ownership of your own listing, and you update it without asking anyone. - This store points at them. One pull request adds your origin to the registry, and from then on a build job folds whatever is at your URL into the catalogue every device downloads. That is step 11.
Two rules on the hosting itself. Keep the URL stable and update the file
in place, because the registry stores that URL and nothing else. And while the
apps.json URL may be HTTP or HTTPS, the image and
binary URLs inside it must be HTTPS, since a visitor's browser loads
those directly.
Pick a channel to publish to
Both this store and Booster have three channels, and since Booster v2.3.0 they are the same three files on this site. What you publish here is what the Config page on somebody's device fetches.
| Booster Config page | Fetches from this site | Publish here when |
|---|---|---|
Stable - Tested release (default) |
/atari-st/apps.json |
It is finished and you are happy for anyone to install it. |
Testing - unstable releases |
/atari-st/apps-test.json |
You want testers on it before it goes out to everyone. |
Development - Local development only |
/atari-st/apps-dev.json |
Never, for a finished app. This is the channel you have been developing on. |
You have been on it since step 4, because the development UUID's slot only exists there. Your app has its own UUID now, so it no longer needs that slot, and staying on Development leaves the unauthenticated deploy API open on your network.
Switch the Config page to Stable or Testing, and confirm the red DEVELOPMENT MODE banner has gone.
Custom apps catalog URL on the Config page takes any address you like,
and an upgrade never rewrites it. Point it at the exact file you published to see your
own listing before anybody else does, or to run a catalogue that is not in this store
at all. Running your own is documented under unofficial firmwares ,
and installing apps day to day is in the user guide .
The loop closes
Since v2.3.0, Booster fetches its catalogue from
https://md-store.sidecartridge.com/atari-st/apps.json. That is not a copy of
this site or a mirror of it. It is this site, the same file behind the listing
you can browse right now, built from the registry your pull request
edits.
So the thing you publish is the thing the device downloads. Somebody with a SidecarTridge , an Atari ST and no idea who you are opens Booster, sees your app in the list, installs it.
Right now that catalogue does not know about you. Step 11 is the pull request that adds your origin to the registry it is built from, and it is the last thing you have to do.