Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions community/lexicon/app/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# community.lexicon.app

This set of Lexicon schemas describes apps built on or for the AT Protocol.

## Records

* `entry`: A community-submitted app listing. Any account can publish an
entry for an app, including apps they do not own.

* `profile`: An official self-published app profile. This record should be
published by the app's official account at rkey `self`.

## Official app profiles

Consumers may use `community.lexicon.app.entry` records for discovery, curation,
and third-party directories. When an official `community.lexicon.app.profile`
record exists, consumers should prefer that profile as the canonical app record.

An entry can point to an official profile with `officialProfileUri`, and can
name the app's official account with `officialAccountDid`.

## Verification

Verification is intentionally out of scope for these records. Directories and
clients can verify ownership out of band using methods such as `rel=me`,
`.well-known` resources, or other trust policies.
123 changes: 123 additions & 0 deletions community/lexicon/app/entry.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
{
"lexicon": 1,
"id": "community.lexicon.app.entry",
"defs": {
"main": {
"type": "record",
"description": "An app entry describing an app built on or for the AT Protocol. This record may be published by third parties or by the app itself. When an official self-published app profile exists, consumers should prefer that profile as the canonical record.",
"key": "tid",
"record": {
"type": "object",
"required": ["name", "url", "recordCreatedAt"],
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"maxGraphemes": 100,
"description": "The display name of the app."
},
"url": {
Comment thread
pixeline marked this conversation as resolved.
Outdated
"type": "string",
"format": "uri",
"description": "The primary URL for the app, such as its website, landing page, or install page."
},
"description": {
"type": "string",
"maxLength": 1000,
"maxGraphemes": 300,
"description": "A short description of what the app does."
},
"logo": {
Comment thread
pixeline marked this conversation as resolved.
Outdated
"type": "blob",
"accept": ["image/png", "image/jpeg", "image/webp", "image/svg+xml"],
"maxSize": 500000,
"description": "Primary logo for display. Should preferably be square."
},
"tags": {
"type": "array",
"maxLength": 10,
Comment thread
pixeline marked this conversation as resolved.
"items": {
"type": "string",
"maxLength": 64,
"maxGraphemes": 32
},
"description": "Open discovery tags for filtering and search, preferably lowercase."
},
"status": {
"type": "string",
"knownValues": [
"unreleased",
"preview",
"released",
"unmaintained",
"discontinued"
],
"description": "Current release or maintenance status of the app."
},
"officialAccountDid": {
"type": "string",
"format": "did",
"description": "The DID of the app's official AT Protocol account, if known."
},
Comment thread
pixeline marked this conversation as resolved.
Outdated
"officialProfileUri": {
"type": "string",
"format": "at-uri",
"description": "AT URI of the app's official self-published profile record, if it exists."
},
Comment thread
pixeline marked this conversation as resolved.
Outdated
Comment thread
pixeline marked this conversation as resolved.
Outdated
"links": {
"type": "array",
"maxLength": 12,
"description": "Relevant links for the app, including trust/compliance, support, and project resources.",
"items": {
"type": "ref",
"ref": "#link"
}
},
"recordCreatedAt": {
"type": "string",
"format": "datetime",
"description": "Timestamp when this entry record was created."
},
"recordUpdatedAt": {
"type": "string",
"format": "datetime",
"description": "Timestamp when this entry record was last updated."
}
}
}
},
"link": {
Comment thread
pixeline marked this conversation as resolved.
Outdated
"type": "object",
"required": ["type", "url"],
"properties": {
"type": {
"type": "string",
"knownValues": [
"privacy",
"terms",
"support",
"contact",
"docs",
"blog",
"changelog",
"source",
"status",
"other"
],
"description": "The kind of link."
},
"url": {
"type": "string",
"format": "uri",
"description": "The destination URL."
},
"label": {
"type": "string",
"maxLength": 100,
"maxGraphemes": 50,
"description": "Optional human-readable label, especially useful when type is 'other'."
}
}
}
}
}
113 changes: 113 additions & 0 deletions community/lexicon/app/profile.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
{
"lexicon": 1,
"id": "community.lexicon.app.profile",
"defs": {
"main": {
"type": "record",
"description": "The official self-published profile for an app built on or for the AT Protocol. This record should be published by the app's official account and used by consumers as the canonical record for that app.",
"key": "literal:self",
"record": {
"type": "object",
"required": ["name", "url", "recordCreatedAt"],
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"maxGraphemes": 100,
"description": "The display name of the app."
},
"url": {
"type": "string",
"format": "uri",
"description": "The primary URL for the app, such as its website, landing page, or install page."
},
Comment thread
pixeline marked this conversation as resolved.
Outdated
"description": {
"type": "string",
"maxLength": 1000,
"maxGraphemes": 300,
Comment thread
pixeline marked this conversation as resolved.
Outdated
"description": "A short description of what the app does."
},
"logo": {
"type": "blob",
"accept": ["image/png", "image/jpeg", "image/webp", "image/svg+xml"],
"maxSize": 500000,
"description": "Primary logo for display. Should preferably be square."
},
Comment thread
pixeline marked this conversation as resolved.
Outdated
"tags": {
"type": "array",
"maxLength": 10,
"items": {
"type": "string",
"maxLength": 64,
"maxGraphemes": 32
},
"description": "Open discovery tags for filtering and search, preferably lowercase."
},
"status": {
"type": "string",
"knownValues": [
"unreleased",
"preview",
"released",
"unmaintained",
"discontinued"
],
Comment thread
pixeline marked this conversation as resolved.
Outdated
"description": "Current release or maintenance status of the app."
},
"links": {
"type": "array",
"maxLength": 12,
"description": "Relevant links for the app, including trust/compliance, support, and project resources.",
"items": {
"type": "ref",
"ref": "#link"
}
},
Comment thread
pixeline marked this conversation as resolved.
"recordCreatedAt": {
Comment thread
pixeline marked this conversation as resolved.
Outdated
"type": "string",
"format": "datetime",
"description": "Timestamp when this profile record was created."
},
"recordUpdatedAt": {
Comment thread
pixeline marked this conversation as resolved.
Outdated
"type": "string",
"format": "datetime",
"description": "Timestamp when this profile record was last updated."
}
}
}
},
"link": {
"type": "object",
"required": ["type", "url"],
"properties": {
"type": {
"type": "string",
"knownValues": [
"privacy",
"terms",
"support",
"contact",
"docs",
"blog",
"changelog",
"source",
"status",
"other"
],
"description": "The kind of link."
},
"url": {
"type": "string",
"format": "uri",
"description": "The destination URL."
},
"label": {
"type": "string",
"maxLength": 100,
"maxGraphemes": 50,
"description": "Optional human-readable label, especially useful when type is 'other'."
}
Comment thread
pixeline marked this conversation as resolved.
Outdated
}
}
}
}
3 changes: 2 additions & 1 deletion community/lexicon/preference/ai.json
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,8 @@
},
"globalScope": {
"type": "object",
"description": "Account-wide default. The record at key 'self' should carry this scope."
"description": "Account-wide default. The record at key 'self' should carry this scope.",
"properties": {}
},
"entityScope": {
"type": "object",
Expand Down