{
  "_readme": "LIVE Byfrost release manifest, served at https://byfrost.xyz/update.json — every copy checks it on launch. Publishing a release means uploading the binary to the dl.byfrost.xyz R2 bucket, then editing this file. An update.json next to the exe overrides this URL (test a release before publishing). Keys starting with _ are ignored. Parser: internal/update/manifest.go in the app repo.",
  "version": 1,

  "_POLICY_": "There is exactly ONE supported build at a time and updating is MANDATORY. Every release therefore sets minSupportedVersion to the SAME value as latestVersion, which makes the prompt undismissable for anyone older. `npm run check` enforces that pairing. The corollary is absolute: never bump latestVersion before the asset below is uploaded and downloadable, because a forced prompt pointing at a build that does not exist locks people out of an app that was working a minute ago.",

  "_latestVersion_comment": "Newest published build. Copies running an older version are forced to update; equal or newer means silence. Must match the app repo's VERSION file for the release you published.",
  "latestVersion": "0.1.0",

  "_minSupportedVersion_comment": "Per _POLICY_, equal to latestVersion on every real release. Stays EMPTY only while assets is empty — forcing an update toward a build nobody can download is the one way to brick a working copy.",
  "minSupportedVersion": "",

  "_notes_comment": "One short line shown in the prompt.",
  "notes": "",

  "_downloadUrl_comment": "Manual fallback page, opened in a browser when the in-app swap fails or no asset matches the platform.",
  "downloadUrl": "https://byfrost.xyz/download",

  "_assets_comment": "Installable builds, hosted on R2 at https://dl.byfrost.xyz/<version>/Byfrost.exe. EMPTY = no self-update offered, manual download only — which is the correct state until a binary is actually published. See update.example.json for the field shapes.",
  "assets": []
}
