at.meme-museum.meme
A single meme asset (still image, animated image, or short video clip) in a user's library.
Details · record, key tid
| Kind | record |
|---|---|
| Record key | tid |
| Authority | meme-museum.at |
| Indexed |
Record
record · key tidProperties
Accessibility alt text. Required, same convention as app.bsky.embed.images.
maxLength: 2000maxGraphemes: 1000
duration
integerVideo memes only: clip length in milliseconds, read client-side at upload time. Omitted when the browser couldn't decode metadata for the picked file.
minimum: 1
height
integerminimum: 1
image
blobThe asset, when this meme is an image. Exactly one of image/video is set -- a constraint Lexicon can't express, so it's enforced client-side. Neither is required here so that adding video didn't have to break records written before it existed. maxSize matches the atproto PDS default blob upload cap (5 MiB) rather than exceeding it: a larger ceiling here would only describe memes that are schema-valid and impossible to store, since the PDS refuses the blob with a 413 long before the record is ever written.
maxSize: 5242880accept: image/png, image/jpeg, image/webp, image/gif
isAnimated
booleanImage memes only: set client-side from frame-count inspection at upload time, since it isn't reliably inferable from mimetype alone. Not written for video, where it would be trivially true.
postVideo
blobAnimated images only: an mp4 rendition of `image`, so posting an animated GIF doesn't lose its animation. Bluesky serves post image embeds through a CDN that re-encodes to JPEG, flattening any animation, so an animated image is posted as app.bsky.embed.video with presentation=gif instead -- and that embed only plays blobs Bluesky's own video service produced. Transcoded once at save time, like `video`. Not the asset: `image` remains what the library displays and what this meme fundamentally is.
maxSize: 100000000accept: video/mp4
tags
arraymaxLength: 25
maxLength: 64
title
stringShort human label for the meme, distinct from alt text (e.g. "distracted boyfriend").
maxLength: 300maxGraphemes: 100
video
blobThe asset, when this meme is a video clip. Always mp4 regardless of what the user picked: the blob is the one Bluesky's video service transcodes and writes back to the PDS, and app.bsky.embed.video accepts nothing else.
maxSize: 100000000accept: video/mp4
visibility
stringSoft signal only, not access control -- see docs/data-model.md.
maxLength: 64default: "public"knownValues: public | unlisted
width
integerminimum: 1
#source
objectProvenance/attribution for a meme, if known.
Properties
importedFrom
string · at-uriIf copied in from another ATProto app's or user's collection, the original record's at-uri.
note
stringFree-text credit, e.g. "via @someone.bsky.social".
maxLength: 500
url
string · uriA webpage the image came from, if relevant.
Similar lexicons
semantic matchLexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.
-
place.pollen.post.gif
recordAn animated GIF post.
-
place.pollen.post.video
recordA video post.
-
at.meme-museum.collection
recordA named board/folder of memes, e.g. "reactions" or "cat pics". Membership is recorded separately via at.meme-museum.collectionItem, not inline here.
-
An immutable, public, metadata-allowlisted media rendition.
-
app.bsky.embed.video
objectA video embedded in a Bluesky record (eg, a post).