Atari ST track
Step 10 ยท Atari ST

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

Terminal
uuidgen
# or, if you would rather not care which tools are installed:
python3 -c "import uuid; print(uuid.uuid4())"

Windows (PowerShell)

PowerShell
[guid]::NewGuid().ToString()
Write it down somewhere permanent.

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

Terminal
./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.

Leave three placeholders alone.

<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:

desc/app.json
{
  "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.

build.sh refuses to run without it.

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.json
{
  "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:

  1. You host your own files. The .uf2 and an apps.json listing 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.
  2. 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.
Come off the Development channel now.

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.

A custom URL sidesteps the channels entirely.

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.

One step left.

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.