dev.knotless.repo
{
"$type": "com.atproto.lexicon.schema",
"defs": {
"agent": {
"description": "An account whose pulls are checked as they move, as code no one vouches for.",
"properties": {
"did": {
"format": "did",
"type": "string"
}
},
"required": [
"did"
],
"type": "object"
},
"appview": {
"description": "An appview the owner lets keep an index of a private repository.",
"properties": {
"did": {
"description": "The appview's service DID, as did:web:knotless.dev.",
"format": "did",
"type": "string"
}
},
"required": [
"did"
],
"type": "object"
},
"collaborator": {
"description": "An account that may push to the repository.",
"properties": {
"did": {
"format": "did",
"type": "string"
}
},
"required": [
"did"
],
"type": "object"
},
"label": {
"description": "A label pulls and issues may carry.",
"properties": {
"color": {
"description": "A hex color, as #d73a4a.",
"maxLength": 7,
"type": "string"
},
"description": {
"description": "What the label means, for those who put it on.",
"maxGraphemes": 200,
"maxLength": 1000,
"type": "string"
},
"exclusive": {
"description": "At most one of its scope's exclusive labels stands at a time, as priority/high and priority/low: setting one takes the others off.",
"type": "boolean"
},
"name": {
"description": "Unique among the repository's labels. Up to its last `/`, if it has one, it names the label's scope, as kind/bug's is kind.",
"maxGraphemes": 50,
"maxLength": 100,
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"main": {
"description": "Keyed by the repository's name, so a clone URL resolves with one getRecord. `key` prefixes the record keys of everything the repository holds; a rename writes a record under the new name with the same key, deletes the old one and leaves a dev.knotless.redirect under the old name.",
"key": "any",
"record": {
"properties": {
"agents": {
"description": "Accounts, such as a coding agent, whose pulls the repository's runners check as they move, as they do a collaborator's, but as code no one vouches for: given no secrets, reading caches apart, and keeping nothing they write. An account named here counts as an agent even if it is a collaborator too.",
"items": {
"ref": "#agent",
"type": "ref"
},
"maxLength": 32,
"type": "array"
},
"appviews": {
"description": "Deprecated, and no longer read: knotless.dev indexes every private repository its members read there, named here or not. Was, for a private repository, the appviews its owner let keep an index of it.",
"items": {
"ref": "#appview",
"type": "ref"
},
"maxLength": 32,
"type": "array"
},
"collaborators": {
"description": "Accounts that may push. They push through a gateway the owner has delegated writes to, which checks this list.",
"items": {
"ref": "#collaborator",
"type": "ref"
},
"maxLength": 1000,
"type": "array"
},
"createdAt": {
"format": "datetime",
"type": "string"
},
"defaultBranch": {
"description": "The branch HEAD points at, without refs/heads/.",
"maxLength": 255,
"type": "string"
},
"description": {
"maxGraphemes": 300,
"maxLength": 3000,
"type": "string"
},
"forkOf": {
"description": "The repository this one was forked from.",
"ref": "dev.knotless.defs#repoRef",
"type": "ref"
},
"gateway": {
"description": "A gateway the owner has delegated writes to. Collaborators push and commit through it; it batches concurrent commits to a branch into one write.",
"format": "did",
"type": "string"
},
"key": {
"description": "Minted when the repository is created; never reused. The `repo` of its dev.knotless.ref, dev.knotless.claim and dev.knotless.pack records.",
"format": "tid",
"type": "string"
},
"labels": {
"description": "The labels its pulls and issues may carry. The owner and collaborators put them on with dev.knotless.label records; readers show none but these.",
"items": {
"ref": "#label",
"type": "ref"
},
"maxLength": 200,
"type": "array"
},
"links": {
"description": "Links shown on the repository's pages, in display order: its website first.",
"items": {
"ref": "dev.knotless.defs#link",
"type": "ref"
},
"maxLength": 5,
"type": "array"
},
"name": {
"description": "Equal to the record key.",
"maxLength": 100,
"type": "string"
},
"rules": {
"description": "Protected branches. The gateway holds collaborators to them; the owner, who writes these records directly, is held only by their own client.",
"items": {
"ref": "#rule",
"type": "ref"
},
"maxLength": 100,
"type": "array"
},
"runners": {
"description": "Accounts that run the repository's workflows. Readers show the dev.knotless.check records these accounts write about the repository, and no one else's.",
"items": {
"ref": "#runner",
"type": "ref"
},
"maxLength": 32,
"type": "array"
},
"transfer": {
"description": "Where the owner has offered to move the repository: a record in another account, named before it exists. Once that account holds a dev.knotless.repo there whose `transferredFrom` names this one, the repository has moved, and readers follow.",
"ref": "dev.knotless.defs#repoRef",
"type": "ref"
},
"transferredFrom": {
"description": "The repository this one was moved from. Readers count records naming that one as naming this one, if its owner agreed: its `transfer`, or the redirect left in its place, leads here.",
"ref": "dev.knotless.defs#repoRef",
"type": "ref"
},
"triagers": {
"description": "Accounts, such as a triage bot, whose dev.knotless.label records readers honor for the scopes named, and below anyone's who labels as the owner or a collaborator.",
"items": {
"ref": "#triager",
"type": "ref"
},
"maxLength": 32,
"type": "array"
}
},
"required": [
"key",
"name",
"createdAt"
],
"type": "object"
},
"type": "record"
},
"reviews": {
"description": "The reviews a protected branch asks of a pull before it merges, counted from those who may write to the repository: its owner and collaborators. A review is a dev.knotless.comment with a verdict, and each reviewer's newest one stands. A standing request for changes from one of them blocks the merge. A reader that finds a field here it does not know merges into the branch only once it knows it, so a rule is never held more loosely than it was written.",
"properties": {
"approvals": {
"description": "How many approvals the pull needs, from accounts other than its author. Absent is 0.",
"maximum": 10,
"minimum": 0,
"type": "integer"
},
"codeOwners": {
"description": "Each path the pull changes that the CODEOWNERS file on the target branch gives owners needs an approval from one of them. Absent is false.",
"type": "boolean"
},
"dismissStale": {
"description": "Only an approval of the pull's head as it is now counts: one of an earlier head no longer does. Absent is false, and any standing approval counts.",
"type": "boolean"
}
},
"type": "object"
},
"rule": {
"description": "A protected branch: through a gateway it only moves forward and is never deleted, and, as its rule says, takes no merge commits, takes pulls only through the merge queue, or takes a pull only once it is reviewed.",
"properties": {
"branch": {
"description": "The branch, without refs/heads/.",
"maxLength": 255,
"type": "string"
},
"history": {
"description": "`linear`: the branch takes no merge commits, so pulls merge into it by squashing. `merges`: it takes them. Absent, or a value a reader does not know, is read as `linear`, so a rule is never held more loosely than it was written.",
"knownValues": [
"linear",
"merges"
],
"maxLength": 64,
"type": "string"
},
"queue": {
"description": "Pulls into this branch land only through the merge queue: a merge queues them instead, unless the owner forces it, and through a gateway the branch moves for no one but the owner and the runner that lands the queue. Absent is false.",
"type": "boolean"
},
"reviews": {
"description": "The reviews a pull needs before it merges into this branch. Absent, none.",
"ref": "#reviews",
"type": "ref"
}
},
"required": [
"branch"
],
"type": "object"
},
"runner": {
"description": "An account whose dev.knotless.check records about the repository readers trust.",
"properties": {
"did": {
"format": "did",
"type": "string"
}
},
"required": [
"did"
],
"type": "object"
},
"scope": {
"description": "A scope of labels a triager may put on.",
"properties": {
"name": {
"description": "As kind is kind/bug's: a label's name up to its last `/`.",
"maxLength": 100,
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"triager": {
"description": "An account that puts labels of some scopes on pulls and issues. Its labels give way to the owner's and collaborators', whenever they were set; an account named here counts as a triager even if it is a collaborator too.",
"properties": {
"did": {
"format": "did",
"type": "string"
},
"scopes": {
"description": "The scopes of the labels it may put on. None, when absent.",
"items": {
"ref": "#scope",
"type": "ref"
},
"maxLength": 50,
"type": "array"
}
},
"required": [
"did"
],
"type": "object"
}
},
"description": "A git repository hosted in this account: in its public repo, or, for a private repository, in a dev.knotless.space space keyed by the name.",
"id": "dev.knotless.repo",
"lexicon": 1
}
Metadata
- DID
-
did:plc:yqsg7znbbhfmj3a2nrpnaerk - CID
-
bafyreico7z4ap742ie5h3wk5ed44xlfjtxd3hhisy362crivthisnatznm - Indexed At
- 2026-10-29 04:59 UTC
- AT-URI
-
at://did:plc:yqsg7znbbhfmj3a2nrpnaerk/com.atproto.lexicon.schema/dev.knotless.repo
Version History (2 versions)
- 2026-10-29 04:59 UTC (current)
- 2026-10-28 21:21 UTC diff
Referenced Schemas (2)
Similar Lexicons
Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.
-
What a repository's owner sets: its description, links and default branch, protected branches, labels, collaborators and triagers, an offer to move it, and what it takes up.
-
dev.knotless.label record
The labels one account puts on a pull or issue, from those its repository defines.
-
dev.knotless.ref record
One git ref of a repository.
-
org.tangled.repo.manifest record
Git repository manifest record. This record is used for git repository discovery like how `org.tangled.actor.profile` is used to find users.
-
dev.knotless.pull record
A request to merge a branch into a repository, kept in the requester's account.