at.happyproto.plugin.release

happyproto.at

Documentation

One version of a package. The record key is '<slug>:<version>'. A release at a given version is never modified: a registry that later sees a different CID at this key keeps the first and flags the conflict.

main record

One version of a package. The record key is '<slug>:<version>'. A release at a given version is never modified: a registry that later sees a different CID at this key keeps the first and flags the conflict.

Record Key any Any valid record key

Properties

artifacts ref #artifacts Required

No description available.

extensions unknown Required

Keyed by NSID. MUST carry 'at.happyproto.plugin.releaseExtension', which is the manifest.

notes string Optional

What changed in this release, as Markdown. A client renders this to tell an operator what an upgrade brings, so it is publisher-supplied text shown to someone else: a renderer MUST NOT render embedded HTML, and MUST refuse a link scheme it does not recognise. Long enough for a changelog and no longer; `repo` is where the full history lives.

maxLength: 30000 bytesmaxGraphemes: 3000 graphemes
package string Required

The profile's slug. MUST equal the pre-':' portion of the record key.

maxLength: 512 bytes
repo string uri Optional

Source repository for this release.

requires unknown Optional

Dependencies, as a map lexicons cannot type. Every key is 'env:happyview' or an 'at://<did>/at.happyproto.plugin.profile/<slug>' URI; every value is a semver range. Keyed by AT URI rather than by DID because identity here is (publisher, slug) and one publisher may hold many packages. Validated by the registry and the installer. An unrecognised 'env:' key counts as unfulfilled, which warns rather than refuses.

version string Required

Semver 2.0 without build metadata, since '+' is not a legal record-key character. MUST equal the post-':' portion of the record key. Dropping build metadata also means it can never affect version precedence, which semver says it should not.

maxLength: 256 bytes
View raw schema
{
  "description": "One version of a package. The record key is '<slug>:<version>'. A release at a given version is never modified: a registry that later sees a different CID at this key keeps the first and flags the conflict.",
  "key": "any",
  "record": {
    "properties": {
      "artifacts": {
        "ref": "#artifacts",
        "type": "ref"
      },
      "extensions": {
        "description": "Keyed by NSID. MUST carry 'at.happyproto.plugin.releaseExtension', which is the manifest.",
        "type": "unknown"
      },
      "notes": {
        "description": "What changed in this release, as Markdown. A client renders this to tell an operator what an upgrade brings, so it is publisher-supplied text shown to someone else: a renderer MUST NOT render embedded HTML, and MUST refuse a link scheme it does not recognise. Long enough for a changelog and no longer; `repo` is where the full history lives.",
        "maxGraphemes": 3000,
        "maxLength": 30000,
        "type": "string"
      },
      "package": {
        "description": "The profile's slug. MUST equal the pre-':' portion of the record key.",
        "maxLength": 512,
        "type": "string"
      },
      "repo": {
        "description": "Source repository for this release.",
        "format": "uri",
        "type": "string"
      },
      "requires": {
        "description": "Dependencies, as a map lexicons cannot type. Every key is 'env:happyview' or an 'at://<did>/at.happyproto.plugin.profile/<slug>' URI; every value is a semver range. Keyed by AT URI rather than by DID because identity here is (publisher, slug) and one publisher may hold many packages. Validated by the registry and the installer. An unrecognised 'env:' key counts as unfulfilled, which warns rather than refuses.",
        "type": "unknown"
      },
      "version": {
        "description": "Semver 2.0 without build metadata, since '+' is not a legal record-key character. MUST equal the post-':' portion of the record key. Dropping build metadata also means it can never affect version precedence, which semver says it should not.",
        "maxLength": 256,
        "type": "string"
      }
    },
    "required": [
      "package",
      "version",
      "artifacts",
      "extensions"
    ],
    "type": "object"
  },
  "type": "record"
}
artifact object

The installable WASM module. It must carry 'blob', 'url', or both; lexicons cannot express that, so publishing and indexing enforce it.

Properties

blob blob Optional

The module, stored as a blob in the publisher's PDS.

maxSize: 16.8 MB
checksum string Required

Lowercase base32 multibase-encoded multihash of the artifact bytes; sha2-256 (code 0x12) must be supported. For a blob it MUST equal the multihash inside blob.ref's CID. Where both sources are present, both must serve bytes matching it. A client rejects an unsupported hash function rather than skipping verification.

maxLength: 256 bytes
contentType string Optional

No description available.

maxLength: 128 bytes
url string uri Optional

A valid URI.

View raw schema
{
  "description": "The installable WASM module. It must carry 'blob', 'url', or both; lexicons cannot express that, so publishing and indexing enforce it.",
  "properties": {
    "blob": {
      "accept": [
        "application/wasm"
      ],
      "description": "The module, stored as a blob in the publisher's PDS.",
      "maxSize": 16777216,
      "type": "blob"
    },
    "checksum": {
      "description": "Lowercase base32 multibase-encoded multihash of the artifact bytes; sha2-256 (code 0x12) must be supported. For a blob it MUST equal the multihash inside blob.ref's CID. Where both sources are present, both must serve bytes matching it. A client rejects an unsupported hash function rather than skipping verification.",
      "maxLength": 256,
      "type": "string"
    },
    "contentType": {
      "maxLength": 128,
      "type": "string"
    },
    "url": {
      "format": "uri",
      "type": "string"
    }
  },
  "required": [
    "checksum"
  ],
  "type": "object"
}
artifacts object

Map of artifact type to artifact. 'package' is the installable module and is required; 'manifest' is its manifest.json, which is what says how to load a module published as a blob, since such a module has no directory beside it to hold a sibling file; the rest are presentation assets a browser renders from the index without fetching anything. A custom type takes an 'x-' prefix, so a type added here later cannot collide with someone's extension; such keys travel as extra properties and are validated out of band, as 'requires' is.

Properties

package ref #artifact Required

No description available.

screenshots array of ref#imageArtifact Optional

No description available.

maxLength: 8 items
View raw schema
{
  "description": "Map of artifact type to artifact. 'package' is the installable module and is required; 'manifest' is its manifest.json, which is what says how to load a module published as a blob, since such a module has no directory beside it to hold a sibling file; the rest are presentation assets a browser renders from the index without fetching anything. A custom type takes an 'x-' prefix, so a type added here later cannot collide with someone's extension; such keys travel as extra properties and are validated out of band, as 'requires' is.",
  "properties": {
    "banner": {
      "ref": "#imageArtifact",
      "type": "ref"
    },
    "icon": {
      "ref": "#imageArtifact",
      "type": "ref"
    },
    "manifest": {
      "ref": "#manifestArtifact",
      "type": "ref"
    },
    "package": {
      "ref": "#artifact",
      "type": "ref"
    },
    "screenshots": {
      "items": {
        "ref": "#imageArtifact",
        "type": "ref"
      },
      "maxLength": 8,
      "type": "array"
    }
  },
  "required": [
    "package"
  ],
  "type": "object"
}
imageArtifact object

A presentation asset. SVG is deliberately absent: it carries script and renders in an operator's dashboard.

Properties

alt string Optional

No description available.

maxLength: 3000 bytesmaxGraphemes: 300 graphemes
blob blob Optional

No description available.

maxSize: 1.0 MB
checksum string Required

No description available.

maxLength: 256 bytes
contentType string Optional

No description available.

maxLength: 128 bytes
height integer Optional

No description available.

minimum: 1
url string uri Optional

A valid URI.

width integer Optional

No description available.

minimum: 1
View raw schema
{
  "description": "A presentation asset. SVG is deliberately absent: it carries script and renders in an operator's dashboard.",
  "properties": {
    "alt": {
      "maxGraphemes": 300,
      "maxLength": 3000,
      "type": "string"
    },
    "blob": {
      "accept": [
        "image/png",
        "image/jpeg",
        "image/webp",
        "image/gif",
        "image/avif"
      ],
      "maxSize": 1048576,
      "type": "blob"
    },
    "checksum": {
      "maxLength": 256,
      "type": "string"
    },
    "contentType": {
      "maxLength": 128,
      "type": "string"
    },
    "height": {
      "minimum": 1,
      "type": "integer"
    },
    "url": {
      "format": "uri",
      "type": "string"
    },
    "width": {
      "minimum": 1,
      "type": "integer"
    }
  },
  "required": [
    "checksum"
  ],
  "type": "object"
}
manifestArtifact object

The module's manifest.json. A module published as a blob has no directory beside it to hold a sibling file, so this is the only thing that says how to load it. It must carry 'blob', 'url', or both; lexicons cannot express that, so publishing and indexing enforce it.

Properties

blob blob Optional

The manifest, stored as a blob in the publisher's PDS.

maxSize: 1.0 MB
checksum string Required

As '#artifact.checksum': the multihash of the bytes, which whichever source serves them is verified against.

maxLength: 256 bytes
contentType string Optional

No description available.

maxLength: 128 bytes
url string uri Optional

A valid URI.

View raw schema
{
  "description": "The module's manifest.json. A module published as a blob has no directory beside it to hold a sibling file, so this is the only thing that says how to load it. It must carry 'blob', 'url', or both; lexicons cannot express that, so publishing and indexing enforce it.",
  "properties": {
    "blob": {
      "accept": [
        "application/json"
      ],
      "description": "The manifest, stored as a blob in the publisher's PDS.",
      "maxSize": 1048576,
      "type": "blob"
    },
    "checksum": {
      "description": "As '#artifact.checksum': the multihash of the bytes, which whichever source serves them is verified against.",
      "maxLength": 256,
      "type": "string"
    },
    "contentType": {
      "maxLength": 128,
      "type": "string"
    },
    "url": {
      "format": "uri",
      "type": "string"
    }
  },
  "required": [
    "checksum"
  ],
  "type": "object"
}

Lexicon Garden

@