at.happyproto.registry.publishRelease
{
"$type": "com.atproto.lexicon.schema",
"defs": {
"main": {
"description": "Publish a version of a plugin to the caller's repo. Writes a software.release.manifest carrying the artifact, the changelog as a site.standard.document when one is given, the software.release.version, and the channel named by track, moved to the new version, in that order. A record is written only once everything it points at exists, so a failure part-way leaves no dangling reference. Calling again with the same input after such a failure finishes the release rather than refusing it.",
"errors": [
{
"description": "The caller's identity could not be determined, so there is no repo to write to.",
"name": "AuthRequired"
},
{
"description": "The registry has no identity configured. An operator problem, not a caller's.",
"name": "NotConfigured"
},
{
"description": "The input breaks a rule the registry applies, so it would refuse the records. The message names the field.",
"name": "InvalidRecord"
},
{
"description": "A record could not be written to the caller's repo. Records written before the failure stay, and the same call can be made again.",
"name": "Upstream"
},
{
"description": "The caller has no project of that name, or the registry has not indexed its at.happyproto.registry.project record. Call putProject first.",
"name": "ProjectMissing"
},
{
"description": "That version is already published with a different artifact. A version never changes once published; publish a new one.",
"name": "VersionExists"
},
{
"description": "The project is unavailable or retired, so the channel cannot be moved to a new version.",
"name": "NotInstallable"
}
],
"input": {
"encoding": "application/json",
"schema": {
"properties": {
"artifact": {
"description": "The plugin. Every blob it references must already be uploaded to the caller's repo.",
"ref": "at.happyproto.plugin.v1",
"type": "ref"
},
"changelog": {
"description": "Release notes as CommonMark. The registry writes them to the caller's repo as a site.standard.document and links it from the version.",
"maxGraphemes": 20000,
"maxLength": 200000,
"type": "string"
},
"name": {
"description": "The project's name, which is the record key of its software.release.project: 1 to 64 lowercase letters, digits and interior hyphens.",
"maxLength": 64,
"minLength": 1,
"type": "string"
},
"track": {
"description": "The channel to move to the new version.",
"knownValues": [
"latest",
"beta",
"alpha"
],
"type": "string"
},
"validateOnly": {
"default": false,
"description": "Check the input against every rule the registry applies, and write nothing. Works without authentication, but only a signed-in call is also checked against the caller's existing records.",
"type": "boolean"
},
"version": {
"description": "A semver version without build metadata, with an optional lowercase prerelease, such as `1.2.0` or `1.2.0-beta.1`.",
"maxLength": 64,
"minLength": 1,
"type": "string"
}
},
"required": [
"name",
"version",
"track",
"artifact"
],
"type": "object"
}
},
"output": {
"encoding": "application/json",
"schema": {
"properties": {
"changelog": {
"description": "The changelog's site.standard.document, when a changelog was given.",
"ref": "at.happyproto.registry.defs#ref",
"type": "ref"
},
"channel": {
"description": "The software.release.channel. Absent when validateOnly was set.",
"ref": "at.happyproto.registry.defs#ref",
"type": "ref"
},
"manifest": {
"description": "The software.release.manifest. Absent when validateOnly was set.",
"ref": "at.happyproto.registry.defs#ref",
"type": "ref"
},
"resumed": {
"description": "True when the version already existed with this artifact, so this call only finished what an earlier one started.",
"type": "boolean"
},
"valid": {
"description": "Always true; invalid input is an error, not a result.",
"type": "boolean"
},
"version": {
"description": "The software.release.version. Absent when validateOnly was set.",
"ref": "at.happyproto.registry.defs#ref",
"type": "ref"
}
},
"required": [
"valid"
],
"type": "object"
}
},
"type": "procedure"
}
},
"id": "at.happyproto.registry.publishRelease",
"lexicon": 1
}
Metadata
- DID
-
did:plc:mo7vq4jbioxwafy5zkcc3eux - CID
-
bafyreidl4d7esaksxsycrzq54g5rtyf5ofjczmjyt6h72bwjjihyf4mare - Indexed At
- 2026-10-26 21:34 UTC
- AT-URI
-
at://did:plc:mo7vq4jbioxwafy5zkcc3eux/com.atproto.lexicon.schema/at.happyproto.registry.publishRelease
Version History (2 versions)
Referenced Schemas (2)
Similar Lexicons
Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.
-
at.happyproto.registry.promoteRelease procedure
Publish an existing version's artifact under a new version, such as `1.2.0-rc.1` as `1.2.0`, without uploading it again. The new software.release.version points at the existing manifest. Optionally moves a channel to it…
-
at.happyproto.registry.putProject procedure
Create or update a plugin project in the caller's repo. The first call writes the site.standard.publication, the at.happyproto.registry.project and the software.release.project, in that order, so each is indexed after w…
-
at.happyproto.plugin.release 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.
-
at.happyproto.registry.withdrawRelease procedure
Delete a release record the caller published. This is how a publisher withdraws a release: it deletes from the caller's own repo as them, where com.atproto.repo.deleteRecord sent through a HappyView instance goes wherev…
-
at.happyproto.registry.publishProfile procedure
Check a package profile against the rules the indexer applies, and optionally write it to the caller's repo. The indexer validates a record only after it is published and skips an invalid one quietly, so a publisher wri…