dev.knotless.release

lexicons.knotless.dev

{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "file": {
      "description": "One file of a release.",
      "properties": {
        "name": {
          "description": "Its name, as it is downloaded: letters, digits, `.`, `_`, `+` and `-`, not first a `.`.",
          "maxLength": 255,
          "minLength": 1,
          "type": "string"
        },
        "parts": {
          "description": "The file, split over blobs in order, each no larger than its PDS takes.",
          "items": {
            "ref": "#part",
            "type": "ref"
          },
          "minLength": 1,
          "type": "array"
        },
        "sha256": {
          "description": "The lowercase hex SHA-256 of the file.",
          "maxLength": 64,
          "minLength": 64,
          "type": "string"
        },
        "size": {
          "description": "Bytes in the file.",
          "minimum": 1,
          "type": "integer"
        }
      },
      "required": [
        "name",
        "size",
        "sha256",
        "parts"
      ],
      "type": "object"
    },
    "main": {
      "description": "Kept in the repository owner's account, keyed `<repo key>.<package hash>.<version hash>`, where each hash is the first 26 characters of the lowercase unpadded base32 SHA-256 of `package` or `version`, so a listing from the cursor `<repo key>/` walks one repository's releases, and from `<repo key>.<package hash>/` one package's. Created and never updated: creating it fails if that version was published, so a version's files never change. Deleting it unpublishes the version. Readers check every file against its `sha256`.",
      "key": "any",
      "record": {
        "properties": {
          "check": {
            "description": "The dev.knotless.check, in its runner's account, of the run that built and published it. A reader trusts it only from a runner the repository names, and only once it has passed at `commit`.",
            "format": "at-uri",
            "type": "string"
          },
          "commit": {
            "description": "The hex object ID of the commit the files were built from.",
            "maxLength": 64,
            "minLength": 40,
            "type": "string"
          },
          "createdAt": {
            "format": "datetime",
            "type": "string"
          },
          "files": {
            "description": "What it publishes, by distinct names.",
            "items": {
              "ref": "#file",
              "type": "ref"
            },
            "maxLength": 64,
            "minLength": 1,
            "type": "array"
          },
          "notes": {
            "description": "What changed since the version before, in Markdown, as the changelog says.",
            "maxGraphemes": 5000,
            "maxLength": 20000,
            "type": "string"
          },
          "package": {
            "description": "The package's name, as npm's rules have it: lowercase letters, digits, `-`, `.`, `_` and `~`, after an optional `@scope/`. A repository can publish several.",
            "maxLength": 214,
            "minLength": 1,
            "type": "string"
          },
          "repo": {
            "description": "The `key` of the dev.knotless.repo that publishes it.",
            "format": "tid",
            "type": "string"
          },
          "version": {
            "description": "A Semantic Versioning 2.0 version, such as 1.4.0 or 2.0.0-rc.1. The highest version without a pre-release part is the package's latest.",
            "maxLength": 256,
            "minLength": 5,
            "type": "string"
          }
        },
        "required": [
          "repo",
          "package",
          "version",
          "files",
          "createdAt"
        ],
        "type": "object"
      },
      "type": "record"
    },
    "part": {
      "description": "One blob of a file, in order.",
      "properties": {
        "blob": {
          "accept": [
            "application/octet-stream"
          ],
          "type": "blob"
        }
      },
      "required": [
        "blob"
      ],
      "type": "object"
    }
  },
  "description": "One version of a package a repository publishes: its files, and the commit they were built from.",
  "id": "dev.knotless.release",
  "lexicon": 1
}

Validate Record

Validate a record against dev.knotless.release

Validation Options
Treat any remaining unresolved references as valid

Metadata

DID
did:plc:yqsg7znbbhfmj3a2nrpnaerk
CID
bafyreidrv6rrpkqqu64sjxskdbkfgucd4fm5v37klnezowqw7adf2tcch4
Indexed At
2026-10-28 21:21 UTC
AT-URI
at://did:plc:yqsg7znbbhfmj3a2nrpnaerk/com.atproto.lexicon.schema/dev.knotless.release

Similar Lexicons

Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.

  • 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.

  • A record representing a software release.

  • An immutable named pointer to a manifest. The record key is '{projectName}:{version}', making uniqueness per (project, version) mechanical and enabling AppView-free resolution. Version strings follow the project-name gr…

  • One published version of an agave block or connector. A version never changes: the next version is a new record, and deleting this one withdraws it.

  • An immutable collection of release artifacts. Written once and never updated: all facts (artifact digests, sizes, locations) are fixed at creation. Lifecycle changes use software.release.status records and software.rele…

Lexicon Garden

@