# social.coves.community.postv2

> Published by [coves.social](https://lexicon.garden/identity/did:web:coves.social)

✓ This is the authoritative definition for this NSID.

## Links

- [View on Lexicon Garden](https://lexicon.garden/lexicon/did:web:coves.social/social.coves.community.postv2)
- [Documentation](https://lexicon.garden/lexicon/did:web:coves.social/social.coves.community.postv2/docs)
- [Examples](https://lexicon.garden/lexicon/did:web:coves.social/social.coves.community.postv2/examples)

## Definitions

### `social.coves.community.postv2#bridgedStats`

**Type**: `object`

Aggregate vote counts asserted by the bridge for content federated from an origin platform (e.g. Lemmy). These supplement, and are kept separate from, native atproto votes.

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `asOf` | `string` (datetime) | Yes | Timestamp the origin-platform counts were sampled; used to discard stale updates |
| `downvotes` | `integer` | Yes | Number of downvotes on the origin platform as of asOf |
| `upvotes` | `integer` | Yes | Number of upvotes on the origin platform as of asOf |

### `social.coves.community.postv2`

**Type**: `record`

A post authored by a user, living in the author's repository. Successor to the deprecated social.coves.community.post: authorship is derived from the repository the record lives in, so there is no in-record author field. A post claiming a community is not visible in it until the community writes a social.coves.community.acceptance for it - community surfaces render from acceptance records only. Repo placement attributes authorship as vouched for by a verifying relay or a direct DID-resolved PDS fetch; firehose events themselves carry no commit-signature proof.

**Key**: `tid`

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `bridgedStats` | `ref` → `#bridgedStats` | No | Bridge-asserted aggregate of origin-platform votes for federated/bridged content. Set by the bridge that materialized this record; absent for natively-authored posts. |
| `community` | `string` (did) | Yes | DID of the community this was submitted to. Immutable across updates: consumers MUST ignore the entire update event that changes it - discard the whole event, not merely retain the old community value - since retargeting a post means writing a new post record. |
| `content` | `string` | No | Post content - supports rich text via facets |
| `createdAt` | `string` (datetime) | Yes | Timestamp of post creation |
| `crosspostChain` | `array` | No | Full chain of crossposts with version pinning. First element is original, last is immediate parent. |
| `crosspostOf` | `ref` → `com.atproto.repo.strongRef` | No | If this is a crosspost, strong reference to the immediate parent post |
| `embed` | `union` | No | Embedded media, external links, or quoted posts |
| `facets` | `array` | No | Annotations for rich text (mentions, links, formatting, block structure) |
| `federatedFrom` | `unknown` | No | The origin platform or instance this post was federated from, for bridged content. Unconstrained for the same reason as originalAuthor. |
| `labels` | `ref` → `com.atproto.label.defs#selfLabels` | No | Self-applied content labels (NSFW, spoilers, etc.) |
| `langs` | `array` | No | Languages used in the post content (ISO 639-1) |
| `location` | `unknown` | No | Optional place this post is about or was authored from. Unconstrained pending a geo vocabulary; absent for the overwhelming majority of posts. |
| `originalAuthor` | `unknown` | No | The author on the origin platform, for content a bridge materialized here. Deliberately unconstrained: no bridge has fixed this shape yet, and pinning one now would be inventing a contract the first real bridge would contradict. Consumers MUST tolerate any object here and MUST NOT treat it as an authorship claim about this repo - authorship is the repository the record lives in. |
| `tags` | `array` | No | User-applied topic tags |
| `title` | `string` | No | Post title (optional for media-only posts) |

## Raw Schema

```json
{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "bridgedStats": {
      "description": "Aggregate vote counts asserted by the bridge for content federated from an origin platform (e.g. Lemmy). These supplement, and are kept separate from, native atproto votes.",
      "properties": {
        "asOf": {
          "description": "Timestamp the origin-platform counts were sampled; used to discard stale updates",
          "format": "datetime",
          "type": "string"
        },
        "downvotes": {
          "description": "Number of downvotes on the origin platform as of asOf",
          "minimum": 0,
          "type": "integer"
        },
        "upvotes": {
          "description": "Number of upvotes on the origin platform as of asOf",
          "minimum": 0,
          "type": "integer"
        }
      },
      "required": [
        "upvotes",
        "downvotes",
        "asOf"
      ],
      "type": "object"
    },
    "main": {
      "description": "A post authored by a user, living in the author's repository. Successor to the deprecated social.coves.community.post: authorship is derived from the repository the record lives in, so there is no in-record author field. A post claiming a community is not visible in it until the community writes a social.coves.community.acceptance for it - community surfaces render from acceptance records only. Repo placement attributes authorship as vouched for by a verifying relay or a direct DID-resolved PDS fetch; firehose events themselves carry no commit-signature proof.",
      "key": "tid",
      "record": {
        "properties": {
          "bridgedStats": {
            "description": "Bridge-asserted aggregate of origin-platform votes for federated/bridged content. Set by the bridge that materialized this record; absent for natively-authored posts.",
            "ref": "#bridgedStats",
            "type": "ref"
          },
          "community": {
            "description": "DID of the community this was submitted to. Immutable across updates: consumers MUST ignore the entire update event that changes it - discard the whole event, not merely retain the old community value - since retargeting a post means writing a new post record.",
            "format": "did",
            "type": "string"
          },
          "content": {
            "description": "Post content - supports rich text via facets",
            "maxGraphemes": 50000,
            "maxLength": 500000,
            "type": "string"
          },
          "createdAt": {
            "description": "Timestamp of post creation",
            "format": "datetime",
            "type": "string"
          },
          "crosspostChain": {
            "description": "Full chain of crossposts with version pinning. First element is original, last is immediate parent.",
            "items": {
              "ref": "com.atproto.repo.strongRef",
              "type": "ref"
            },
            "maxLength": 25,
            "type": "array"
          },
          "crosspostOf": {
            "description": "If this is a crosspost, strong reference to the immediate parent post",
            "ref": "com.atproto.repo.strongRef",
            "type": "ref"
          },
          "embed": {
            "description": "Embedded media, external links, or quoted posts",
            "refs": [
              "social.coves.embed.images",
              "social.coves.embed.video",
              "social.coves.embed.external",
              "social.coves.embed.post"
            ],
            "type": "union"
          },
          "facets": {
            "description": "Annotations for rich text (mentions, links, formatting, block structure)",
            "items": {
              "ref": "social.coves.richtext.facet",
              "type": "ref"
            },
            "maxLength": 200,
            "type": "array"
          },
          "federatedFrom": {
            "description": "The origin platform or instance this post was federated from, for bridged content. Unconstrained for the same reason as originalAuthor.",
            "type": "unknown"
          },
          "labels": {
            "description": "Self-applied content labels (NSFW, spoilers, etc.)",
            "ref": "com.atproto.label.defs#selfLabels",
            "type": "ref"
          },
          "langs": {
            "description": "Languages used in the post content (ISO 639-1)",
            "items": {
              "format": "language",
              "type": "string"
            },
            "maxLength": 3,
            "type": "array"
          },
          "location": {
            "description": "Optional place this post is about or was authored from. Unconstrained pending a geo vocabulary; absent for the overwhelming majority of posts.",
            "type": "unknown"
          },
          "originalAuthor": {
            "description": "The author on the origin platform, for content a bridge materialized here. Deliberately unconstrained: no bridge has fixed this shape yet, and pinning one now would be inventing a contract the first real bridge would contradict. Consumers MUST tolerate any object here and MUST NOT treat it as an authorship claim about this repo - authorship is the repository the record lives in.",
            "type": "unknown"
          },
          "tags": {
            "description": "User-applied topic tags",
            "items": {
              "maxGraphemes": 64,
              "maxLength": 640,
              "type": "string"
            },
            "maxLength": 8,
            "type": "array"
          },
          "title": {
            "description": "Post title (optional for media-only posts)",
            "maxGraphemes": 300,
            "maxLength": 3000,
            "type": "string"
          }
        },
        "required": [
          "community",
          "createdAt"
        ],
        "type": "object"
      },
      "type": "record"
    }
  },
  "id": "social.coves.community.postv2",
  "lexicon": 1
}
```
