A user-curated collection (folder) of Zeens posts and articles. Visibility controls whether anyone other than the owner can see it via the AppView. The cover is the owner's chosen `coverPhoto` when set, otherwise the most recently added item, resolved at render time.
tid
Timestamp-based ID
Properties
animation
string
Optional
Story-layout scroll animation. 'alternate' fades photos in from alternating sides as they enter the viewport. Respects prefers-reduced-motion. Default 'none'.
none, alternateapp.zeens.v
integer
Optional
Zeens marker so the firehose / lua filters can identify our records.
autoApprove
boolean
Optional
Community collections only: approve every submission at once, whatever the photographer's standing.
community
boolean
Optional
A community collection: owned by the Zeens account, open to submissions. Only honoured on collections in the configured community account's repo; anyone else setting it changes nothing.
coverImage
blob
Optional
Legacy user-uploaded cover image, resolved against the OWNER's DID. Superseded by `coverPhoto`; still honoured for records written before it existed. Readers should prefer `coverPhoto` when both are set.
maxSize: 4.0 MBcoverPhoto
ref
#coverPhoto
Optional
Optional pointer to one photo already in this collection, chosen by the owner as its cover. When unset, readers fall back to the most recently added photo.
coverPhotos
array
of
object
Optional
Community collections only: up to four photos from the collection shown together as its cover, in order. Each carries the photo's image blob cid and author DID so it resolves on the CDN, like coverPhoto.
maxLength: 4 itemscreatedAt
string
datetime
Required
An RFC 3339 formatted timestamp.
description
string
Optional
Optional long-form description shown in the story layout's left rail and used as the collection's meta description for share previews.
maxLength: 2000 bytesgridColumns
integer
Optional
Number of columns when gridLayout='grid'. Allowed: 2 or 3. Default 2.
minimum: 2maximum: 3gridGap
integer
Optional
Gap in pixels between photos when gridLayout='grid'. Allowed: 0, 4, 8, or 16. Default 8.
minimum: 0maximum: 16gridLayout
string
Optional
How photos stack in the portfolio view. Both options preserve natural aspect ratio (no cropping). 'single' = one column at full width. 'grid' = masonry grid; column count + gap are controlled by `gridColumns` and `gridGap`. Default 'single'.
single, gridname
string
Required
Display name for the collection.
maxLength: 100 bytespublication
ref
#publication
Optional
Set once this collection has been published to the ATmosphere as a site.standard.document. Absent means never published. Cleared (and the document deleted) if the collection is later made private.
rules
string
Optional
Community collections only: the theme and rules a photo has to meet. Shown on the collection page; a declined submission means the photo did not meet them.
maxLength: 3000 bytesshowCredit
boolean
Optional
Show each photo's photographer credit. Defaults to TRUE when absent. Only ever written as false.
showExif
boolean
Optional
Show each photo's camera settings (or its film stock) beneath it in the single-column story layout. Defaults to TRUE when absent: attribution is opt-out, so a record written before this field existed keeps its full caption. Only ever written as false.
showLicense
boolean
Optional
Show each photo's licence label. Defaults to TRUE when absent. Only ever written as false.
subtitle
string
Optional
Short tagline shown under the title in the story layout.
maxLength: 200 bytestheme
string
Optional
Background palette for the story layout. Default 'light'.
light, darktitle
string
Optional
Long-form display title shown in the story layout. Falls back to `name` when unset.
maxLength: 200 bytesvisibility
string
Required
public = visible to anyone via the AppView. private = only the owner can fetch it via getCollection. Records remain readable from the user's PDS by anyone who knows the URI; treat 'private' as obscurity-level, not cryptographic.
public, privateView raw schema
{
"description": "A user-curated collection (folder) of Zeens posts and articles. Visibility controls whether anyone other than the owner can see it via the AppView. The cover is the owner's chosen `coverPhoto` when set, otherwise the most recently added item, resolved at render time.",
"key": "tid",
"record": {
"properties": {
"animation": {
"description": "Story-layout scroll animation. 'alternate' fades photos in from alternating sides as they enter the viewport. Respects prefers-reduced-motion. Default 'none'.",
"knownValues": [
"none",
"alternate"
],
"type": "string"
},
"app.zeens.v": {
"description": "Zeens marker so the firehose / lua filters can identify our records.",
"type": "integer"
},
"autoApprove": {
"description": "Community collections only: approve every submission at once, whatever the photographer's standing.",
"type": "boolean"
},
"community": {
"description": "A community collection: owned by the Zeens account, open to submissions. Only honoured on collections in the configured community account's repo; anyone else setting it changes nothing.",
"type": "boolean"
},
"coverImage": {
"accept": [
"image/jpeg",
"image/png",
"image/webp"
],
"description": "Legacy user-uploaded cover image, resolved against the OWNER's DID. Superseded by `coverPhoto`; still honoured for records written before it existed. Readers should prefer `coverPhoto` when both are set.",
"maxSize": 4000000,
"type": "blob"
},
"coverPhoto": {
"description": "Optional pointer to one photo already in this collection, chosen by the owner as its cover. When unset, readers fall back to the most recently added photo.",
"ref": "#coverPhoto",
"type": "ref"
},
"coverPhotos": {
"description": "Community collections only: up to four photos from the collection shown together as its cover, in order. Each carries the photo's image blob cid and author DID so it resolves on the CDN, like coverPhoto.",
"items": {
"properties": {
"cid": {
"description": "Image blob CID.",
"type": "string"
},
"did": {
"format": "did",
"type": "string"
},
"uri": {
"format": "at-uri",
"type": "string"
}
},
"required": [
"uri",
"cid",
"did"
],
"type": "object"
},
"maxLength": 4,
"type": "array"
},
"createdAt": {
"format": "datetime",
"type": "string"
},
"description": {
"description": "Optional long-form description shown in the story layout's left rail and used as the collection's meta description for share previews.",
"maxLength": 2000,
"type": "string"
},
"gridColumns": {
"description": "Number of columns when gridLayout='grid'. Allowed: 2 or 3. Default 2.",
"maximum": 3,
"minimum": 2,
"type": "integer"
},
"gridGap": {
"description": "Gap in pixels between photos when gridLayout='grid'. Allowed: 0, 4, 8, or 16. Default 8.",
"maximum": 16,
"minimum": 0,
"type": "integer"
},
"gridLayout": {
"description": "How photos stack in the portfolio view. Both options preserve natural aspect ratio (no cropping). 'single' = one column at full width. 'grid' = masonry grid; column count + gap are controlled by `gridColumns` and `gridGap`. Default 'single'.",
"knownValues": [
"single",
"grid"
],
"type": "string"
},
"name": {
"description": "Display name for the collection.",
"maxLength": 100,
"type": "string"
},
"publication": {
"description": "Set once this collection has been published to the ATmosphere as a site.standard.document. Absent means never published. Cleared (and the document deleted) if the collection is later made private.",
"ref": "#publication",
"type": "ref"
},
"rules": {
"description": "Community collections only: the theme and rules a photo has to meet. Shown on the collection page; a declined submission means the photo did not meet them.",
"maxLength": 3000,
"type": "string"
},
"showCredit": {
"description": "Show each photo's photographer credit. Defaults to TRUE when absent. Only ever written as false.",
"type": "boolean"
},
"showExif": {
"description": "Show each photo's camera settings (or its film stock) beneath it in the single-column story layout. Defaults to TRUE when absent: attribution is opt-out, so a record written before this field existed keeps its full caption. Only ever written as false.",
"type": "boolean"
},
"showLicense": {
"description": "Show each photo's licence label. Defaults to TRUE when absent. Only ever written as false.",
"type": "boolean"
},
"subtitle": {
"description": "Short tagline shown under the title in the story layout.",
"maxLength": 200,
"type": "string"
},
"theme": {
"description": "Background palette for the story layout. Default 'light'.",
"knownValues": [
"light",
"dark"
],
"type": "string"
},
"title": {
"description": "Long-form display title shown in the story layout. Falls back to `name` when unset.",
"maxLength": 200,
"type": "string"
},
"visibility": {
"description": "public = visible to anyone via the AppView. private = only the owner can fetch it via getCollection. Records remain readable from the user's PDS by anyone who knows the URI; treat 'private' as obscurity-level, not cryptographic.",
"knownValues": [
"public",
"private"
],
"type": "string"
}
},
"required": [
"name",
"visibility",
"createdAt"
],
"type": "object"
},
"type": "record"
}