> ## Documentation Index
> Fetch the complete documentation index at: https://www.openpmm.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Bluesky media guidelines

> See the image and video limits that OpenPMM applies to Bluesky Destinations and uploads.

Bluesky accepts text with up to four images or one video. Do not mix a video with other media.

## Text

A post can contain at most 300 graphemes and 3,000 UTF-8 bytes. OpenPMM checks both limits before it contacts Bluesky.

Links, hashtags, and resolvable mentions become Bluesky rich-text facets. If a mention cannot resolve, publication stops before OpenPMM creates the post.

Repeat the Post `body` value to publish a self-reply chain. Each reply points to
the opening record as its root and to the previous record as its parent. Media
can attach to each body item. Any body item can contain media without text.

## Images

| Property  | Limit                                        |
| --------- | -------------------------------------------- |
| Count     | Up to four images.                           |
| File type | JPEG, PNG, or WebP.                          |
| File size | 2,000,000 bytes after metadata removal.      |
| Alt text  | Required for each attached image in OpenPMM. |

OpenPMM removes image metadata before upload. This step can change the file size. If the sanitized image is too large, OpenPMM does not create the Bluesky post.

Use a JPEG, PNG, or WebP image that stays below the size limit after metadata
removal. Bluesky shows a still image, so use a non-animated image.

## Video

| Property  | Limit                          |
| --------- | ------------------------------ |
| Count     | One video without other media. |
| File type | MP4.                           |
| File size | 100,000,000 bytes maximum.     |
| Duration  | 180 seconds maximum.           |
| Alt text  | Optional.                      |

OpenPMM can convert a compatible MOV or WebM file to MP4. It keeps the original Asset.

Bluesky processes the video before OpenPMM creates the Post. The Post can show a processing state during this step.

An old Bluesky connection can lack the video permission. Connect the Destination again when OpenPMM requests authorization.

## Content labels

You can add the `porn`, `sexual`, `nudity`, or `graphic-media` self-label. Add every label that applies before publication.

Use `destination_options.bluesky` on the draft Post. Each key in
`alt_text_by_asset_id` must match an attached Asset ID.

Add alt text for every image. Video alt text is optional.

```json theme={null}
{
  "bluesky": {
    "languages": ["en"],
    "content_labels": [],
    "alt_text_by_asset_id": {
      "ast_01JABCDEF": "A laptop showing the OpenPMM post editor."
    }
  }
}
```

## Retry behavior

OpenPMM derives one Bluesky record key for each body item. A retry checks each
exact record and resumes at the first missing reply instead of creating a
second post.

## Provider references

* [Bluesky post schema](https://github.com/bluesky-social/atproto/blob/main/lexicons/app/bsky/feed/post.json)
* [Bluesky image schema](https://github.com/bluesky-social/atproto/blob/main/lexicons/app/bsky/embed/images.json)
* [Bluesky video upload guide](https://docs.bsky.app/docs/tutorials/video)
