# blue.moji.feed.reaction

> Published by [moji.blue](https://lexicon.garden/identity/did:plc:kmzpsik7s5y5fwu7nnkngfx4)

## Links

- [View on Lexicon Garden](https://lexicon.garden/lexicon/did:plc:kmzpsik7s5y5fwu7nnkngfx4/blue.moji.feed.reaction)
- [Documentation](https://lexicon.garden/lexicon/did:plc:kmzpsik7s5y5fwu7nnkngfx4/blue.moji.feed.reaction/docs)
- [Examples](https://lexicon.garden/lexicon/did:plc:kmzpsik7s5y5fwu7nnkngfx4/blue.moji.feed.reaction/examples)

## Definitions

### `blue.moji.feed.reaction`

**Type**: `record`

A custom-emoji reaction to a post. Analogous to app.bsky.feed.like, but the reaction glyph is a Bluemoji. Duplicate reactions (same subject + same emoji URI by the same actor) should be ignored by AppViews.

**Key**: `tid`

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `emoji` | `ref` → `#emojiRef` | Yes |  |
| `subject` | `string` (at-uri) | Yes | AT-URI of the post being reacted to. |
| `createdAt` | `string` (datetime) | Yes |  |
| `subjectCid` | `string` (cid) | No | CID of the subject post at reaction time, for strong referencing. |

### `blue.moji.feed.reaction#emojiRef`

**Type**: `object`

Denormalized reference to the Bluemoji used, mirroring blue.moji.richtext.facet: CID-only formats let consumers build blob/CDN URLs without a getRecord round-trip. AppViews should verify against the indexed item where possible.

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `alt` | `string` | No |  |
| `cid` | `string` (cid) | No | CID of the blue.moji.collection.item record, populated by AppViews at hydration time (like adultOnly) so consumers can build a com.atproto.repo.strongRef for moderation reports without a separate lookup. Not meaningful on write. |
| `uri` | `string` (at-uri) | Yes | AT-URI of the blue.moji.collection.item record. The owning DID is derived from this. |
| `name` | `string` | Yes | Colon-wrapped alias, e.g. :blobcat:. Used as fallback text. |
| `formats` | `union` | Yes |  |
| `adultOnly` | `boolean` | No | MUST be populated by AppViews from the source item's adultOnly at hydration time (the source item is the trust anchor; do not trust a reactor-supplied value on write). Consumers SHOULD warn or blur before rendering when true, consistent with how the same item's adultOnly is handled elsewhere (facets, collection views). |

## Raw Schema

```json
{
  "id": "blue.moji.feed.reaction",
  "defs": {
    "main": {
      "key": "tid",
      "type": "record",
      "record": {
        "type": "object",
        "required": [
          "subject",
          "emoji",
          "createdAt"
        ],
        "properties": {
          "emoji": {
            "ref": "#emojiRef",
            "type": "ref"
          },
          "subject": {
            "type": "string",
            "format": "at-uri",
            "description": "AT-URI of the post being reacted to."
          },
          "createdAt": {
            "type": "string",
            "format": "datetime"
          },
          "subjectCid": {
            "type": "string",
            "format": "cid",
            "description": "CID of the subject post at reaction time, for strong referencing."
          }
        }
      },
      "description": "A custom-emoji reaction to a post. Analogous to app.bsky.feed.like, but the reaction glyph is a Bluemoji. Duplicate reactions (same subject + same emoji URI by the same actor) should be ignored by AppViews."
    },
    "emojiRef": {
      "type": "object",
      "required": [
        "uri",
        "name",
        "formats"
      ],
      "properties": {
        "alt": {
          "type": "string"
        },
        "cid": {
          "type": "string",
          "format": "cid",
          "description": "CID of the blue.moji.collection.item record, populated by AppViews at hydration time (like adultOnly) so consumers can build a com.atproto.repo.strongRef for moderation reports without a separate lookup. Not meaningful on write."
        },
        "uri": {
          "type": "string",
          "format": "at-uri",
          "description": "AT-URI of the blue.moji.collection.item record. The owning DID is derived from this."
        },
        "name": {
          "type": "string",
          "description": "Colon-wrapped alias, e.g. :blobcat:. Used as fallback text."
        },
        "formats": {
          "refs": [
            "blue.moji.richtext.facet#formats_v0",
            "blue.moji.richtext.facet#formats_v1"
          ],
          "type": "union",
          "closed": false
        },
        "adultOnly": {
          "type": "boolean",
          "default": false,
          "description": "MUST be populated by AppViews from the source item's adultOnly at hydration time (the source item is the trust anchor; do not trust a reactor-supplied value on write). Consumers SHOULD warn or blur before rendering when true, consistent with how the same item's adultOnly is handled elsewhere (facets, collection views)."
        }
      },
      "description": "Denormalized reference to the Bluemoji used, mirroring blue.moji.richtext.facet: CID-only formats let consumers build blob/CDN URLs without a getRecord round-trip. AppViews should verify against the indexed item where possible."
    }
  },
  "$type": "com.atproto.lexicon.schema",
  "lexicon": 1
}
```
