A post on Craftsky. May be a general post or a craft project post; when the optional 'project' field is present the post is a project post. The optional open embed union supports quoted records, standard external cards, and standard video.
tid
Timestamp-based ID
Properties
createdAt
string
datetime
Required
Client-declared creation timestamp.
embed
union
Optional
Optional embedded content. Open union supporting local quote embeds, standard external cards, and standard video.
externalImport
ref
#externalImport
Optional
Optional self-asserted provenance for content created by an external-history importer. This metadata does not verify ownership of an external account or grant trust.
facets
array
of
ref
app.bsky.richtext.facet
Optional
Byte-range annotations over 'text' for mentions, links, and inline hashtags. Reuses app.bsky.richtext.facet so existing renderers Just Work. Inline hashtag facets are composer-merged into project.common.tags on project posts; see the post lexicon fields spec.
images
array
of
ref
#image
Optional
Images attached to the post. Top-level (not inside 'embed') — a post may carry images alongside a quote embed without needing a wrapper variant.
maxLength: 4 itemslangs
array
of
string
language
Optional
Indicates human language of post primary text content.
maxLength: 3 itemsproject
ref
social.craftsky.project.defs#project
Optional
If present, this post is a craft project post. Absence means it's a general social post.
reply
ref
#replyRef
Optional
If present, this post is a reply to another post.
sponsored
boolean
Required
Whether the author declares that this post was created with sponsorship or other commercial consideration. Disclosure metadata only; it does not affect distribution.
text
string
Required
The primary text content of the post. Plain text; rich-text annotations live in 'facets'. Craftsky allows longer posts than Bluesky (2000 graphemes vs 300) because crafters write fuller project write-ups.
maxLength: 20000 bytesmaxGraphemes: 2000 graphemesView raw schema
{
"description": "A post on Craftsky. May be a general post or a craft project post; when the optional 'project' field is present the post is a project post. The optional open embed union supports quoted records, standard external cards, and standard video.",
"key": "tid",
"record": {
"properties": {
"createdAt": {
"description": "Client-declared creation timestamp.",
"format": "datetime",
"type": "string"
},
"embed": {
"description": "Optional embedded content. Open union supporting local quote embeds, standard external cards, and standard video.",
"refs": [
"#quoteEmbed",
"app.bsky.embed.external",
"app.bsky.embed.video"
],
"type": "union"
},
"externalImport": {
"description": "Optional self-asserted provenance for content created by an external-history importer. This metadata does not verify ownership of an external account or grant trust.",
"ref": "#externalImport",
"type": "ref"
},
"facets": {
"description": "Byte-range annotations over 'text' for mentions, links, and inline hashtags. Reuses app.bsky.richtext.facet so existing renderers Just Work. Inline hashtag facets are composer-merged into project.common.tags on project posts; see the post lexicon fields spec.",
"items": {
"ref": "app.bsky.richtext.facet",
"type": "ref"
},
"type": "array"
},
"images": {
"description": "Images attached to the post. Top-level (not inside 'embed') — a post may carry images alongside a quote embed without needing a wrapper variant.",
"items": {
"ref": "#image",
"type": "ref"
},
"maxLength": 4,
"type": "array"
},
"langs": {
"description": "Indicates human language of post primary text content.",
"items": {
"format": "language",
"type": "string"
},
"maxLength": 3,
"type": "array"
},
"project": {
"description": "If present, this post is a craft project post. Absence means it's a general social post.",
"ref": "social.craftsky.project.defs#project",
"type": "ref"
},
"reply": {
"description": "If present, this post is a reply to another post.",
"ref": "#replyRef",
"type": "ref"
},
"sponsored": {
"description": "Whether the author declares that this post was created with sponsorship or other commercial consideration. Disclosure metadata only; it does not affect distribution.",
"type": "boolean"
},
"text": {
"description": "The primary text content of the post. Plain text; rich-text annotations live in 'facets'. Craftsky allows longer posts than Bluesky (2000 graphemes vs 300) because crafters write fuller project write-ups.",
"maxGraphemes": 2000,
"maxLength": 20000,
"type": "string"
}
},
"required": [
"text",
"sponsored",
"createdAt"
],
"type": "object"
},
"type": "record"
}