The catalogue

The Store reads one file, catalog.json, from the latest LedgeAddOns release. It lists each add-on and where to download its files, with a hash for each one.

Where it lives

https://github.com/Ammyy9908/LedgeAddOns/releases/latest/download/catalog.json

Every release is tagged catalog-<commit>, after the reviewed commit it was built from, and its files never change once published.

Format

catalog.json
{
  "schemaVersion": 1,
  "sourceCommit": "fee6376d70ff44c322363157ed3ec8fe7a36a51e",
  "entries": [
    {
      "id": "spotify-likes",
      "name": "Spotify Likes",
      "summary": "Like Spotify songs from your Ledge player",
      "version": "1.0.0",
      "architectures": ["arm64", "x86_64"],
      "files": {
        "executable": { "url": "https://github.com/…/spotify-likes.binary", "sha256": "…" },
        "manifest":   { "url": "https://github.com/…/spotify-likes.manifest.json", "sha256": "…" },
        "icon":       { "url": "https://github.com/…/spotify-likes.icon.png", "sha256": "…" }
      },
      "listing": {
        "developer": "Ledge",
        "category": "Media",
        "availability": "Free · macOS 14 or later",
        "description": "…",
        "feedbackURL": "https://github.com/…/issues/new",
        "screenshots": [{ "url": "https://github.com/…/spotify-likes.preview-….png", "sha256": "…" }],
        "motionDemo": { "url": "https://github.com/…/spotify-likes.preview-….mp4", "sha256": "…" }
      }
    }
  ]
}

listing comes from the add-on's listing.json, with each screenshot and demo turned into a release address and hash. Older entries have no listing; their page in the Store says what's missing rather than inventing it.

What Ledge checks

CheckRule
SchemaschemaVersion is 1, and sourceCommit is a full 40-character commit hash
EntriesAt most 100, each with a unique ID in the same format as the manifest
FilesExactly three per entry: executable, manifest and icon
ArchitecturesOnly arm64 and x86_64
AddressesPackages, screenshots and demos all on HTTPS on github.com, inside this catalogue's own release, with no query or fragment
ListingDeveloper, category and availability present; feedback address on HTTPS; at most 8 screenshots; no negative install count
HashesEach downloaded file, screenshot and demo must match its SHA-256, or it isn't used
SizesThe catalogue at most 1 MB, a manifest 64 KB, an icon 4 MB and an executable 32 MB

After the download, Ledge validates the package exactly as it does a local one, then asks you to trust it. Nothing runs before that.