# com.luminframe.image

> Published by [luminframe.com](https://lexicon.garden/identity/did:plc:5mo4amsmatgfmzpeqqsuetot)

✓ This is the authoritative definition for this NSID.

## Links

- [View on Lexicon Garden](https://lexicon.garden/lexicon/did:plc:5mo4amsmatgfmzpeqqsuetot/com.luminframe.image)
- [Documentation](https://lexicon.garden/lexicon/did:plc:5mo4amsmatgfmzpeqqsuetot/com.luminframe.image/docs)
- [Examples](https://lexicon.garden/lexicon/did:plc:5mo4amsmatgfmzpeqqsuetot/com.luminframe.image/examples)

## Definitions

### `com.luminframe.image`

**Type**: `record`

An image edited in Luminframe, saved to the author's repo, together with the effect recipe used to produce it.

**Key**: `tid`

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `alt` | `string` | No | Accessibility description of the image. |
| `image` | `blob` | Yes | The rendered image. When `video` is present, this is its poster frame. |
| `title` | `string` | No | Short caption or label. |
| `video` | `blob` | No | A short looping clip of the edit, present when the recipe animates. The still `image` remains required as the poster, so viewers that only know stills keep working. |
| `recipe` | `array` | No | The ordered effect stack with parameters — the executable edit, so the look can be reconstructed or applied elsewhere. |
| `effects` | `array` | No | The effect keys applied, in order. Kept for lightweight display and backward compatibility; the executable form is `recipe`. |
| `remixOf` | `ref` → `com.atproto.repo.strongRef` | No | The record this image was remixed from, if any — its lineage. |
| `createdAt` | `string` (datetime) | Yes | When the record was created. |
| `aspectRatio` | `ref` → `#aspectRatio` | Yes | Pixel dimensions of the render, so a viewer can lay it out without decoding. |

### `com.luminframe.image#effectStep`

**Type**: `object`

One effect in the recipe: its key and the parameters it was applied with.

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `type` | `string` | Yes | The effect key. |
| `params` | `string` | No | The effect's parameters, JSON-encoded. A string rather than an object because the atproto data model has no float type and effect parameters are fractional. Records saved before v4 carry a plain object here instead. |

### `com.luminframe.image#aspectRatio`

**Type**: `object`

The width:height ratio of the image, in pixels.

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `width` | `integer` | Yes |  |
| `height` | `integer` | Yes |  |

## Raw Schema

```json
{
  "id": "com.luminframe.image",
  "defs": {
    "main": {
      "key": "tid",
      "type": "record",
      "record": {
        "type": "object",
        "required": [
          "image",
          "aspectRatio",
          "createdAt"
        ],
        "properties": {
          "alt": {
            "type": "string",
            "maxLength": 10000,
            "description": "Accessibility description of the image.",
            "maxGraphemes": 2000
          },
          "image": {
            "type": "blob",
            "accept": [
              "image/*"
            ],
            "maxSize": 1000000,
            "description": "The rendered image. When `video` is present, this is its poster frame."
          },
          "title": {
            "type": "string",
            "maxLength": 3000,
            "description": "Short caption or label.",
            "maxGraphemes": 300
          },
          "video": {
            "type": "blob",
            "accept": [
              "video/mp4"
            ],
            "maxSize": 5000000,
            "description": "A short looping clip of the edit, present when the recipe animates. The still `image` remains required as the poster, so viewers that only know stills keep working."
          },
          "recipe": {
            "type": "array",
            "items": {
              "ref": "#effectStep",
              "type": "ref"
            },
            "maxLength": 64,
            "description": "The ordered effect stack with parameters — the executable edit, so the look can be reconstructed or applied elsewhere."
          },
          "effects": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 128
            },
            "maxLength": 64,
            "description": "The effect keys applied, in order. Kept for lightweight display and backward compatibility; the executable form is `recipe`."
          },
          "remixOf": {
            "ref": "com.atproto.repo.strongRef",
            "type": "ref",
            "description": "The record this image was remixed from, if any — its lineage."
          },
          "createdAt": {
            "type": "string",
            "format": "datetime",
            "description": "When the record was created."
          },
          "aspectRatio": {
            "ref": "#aspectRatio",
            "type": "ref",
            "description": "Pixel dimensions of the render, so a viewer can lay it out without decoding."
          }
        }
      },
      "description": "An image edited in Luminframe, saved to the author's repo, together with the effect recipe used to produce it."
    },
    "effectStep": {
      "type": "object",
      "required": [
        "type"
      ],
      "properties": {
        "type": {
          "type": "string",
          "maxLength": 128,
          "description": "The effect key."
        },
        "params": {
          "type": "string",
          "maxLength": 10000,
          "description": "The effect's parameters, JSON-encoded. A string rather than an object because the atproto data model has no float type and effect parameters are fractional. Records saved before v4 carry a plain object here instead."
        }
      },
      "description": "One effect in the recipe: its key and the parameters it was applied with."
    },
    "aspectRatio": {
      "type": "object",
      "required": [
        "width",
        "height"
      ],
      "properties": {
        "width": {
          "type": "integer",
          "minimum": 1
        },
        "height": {
          "type": "integer",
          "minimum": 1
        }
      },
      "description": "The width:height ratio of the image, in pixels."
    }
  },
  "$type": "com.atproto.lexicon.schema",
  "lexicon": 1
}
```
