# at.happyproto.registry.project

> Published by [happyproto.at](https://lexicon.garden/identity/did:plc:mo7vq4jbioxwafy5zkcc3eux)

✓ This is the authoritative definition for this NSID.

## Links

- [View on Lexicon Garden](https://lexicon.garden/lexicon/did:plc:mo7vq4jbioxwafy5zkcc3eux/at.happyproto.registry.project)
- [Documentation](https://lexicon.garden/lexicon/did:plc:mo7vq4jbioxwafy5zkcc3eux/at.happyproto.registry.project/docs)
- [Examples](https://lexicon.garden/lexicon/did:plc:mo7vq4jbioxwafy5zkcc3eux/at.happyproto.registry.project/examples)

## Definitions

### `at.happyproto.registry.project#author`

**Type**: `object`

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `email` | `string` | No |  |
| `name` | `string` | Yes |  |
| `url` | `string` (uri) | No |  |

### `at.happyproto.registry.project#contact`

**Type**: `object`

A security contact. It must carry a url, an email, or both.

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `email` | `string` | No |  |
| `url` | `string` (uri) | No |  |

### `at.happyproto.registry.project`

**Type**: `record`

The HappyView facts about a software.release.project that make it a plugin. The record key is the project's name, and the record lives in the same repo as the project. The registry indexes a project's releases only while this record exists and is valid.

**Key**: `any`

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `authors` | `array` | Yes |  |
| `keywords` | `array` | No |  |
| `pluginType` | `string` | Yes | What the plugin is. Every release must be of this type. |
| `project` | `string` (at-uri) | Yes | The software.release.project this describes: the one in the same repo, under the same record key. |
| `publication` | `ref` → `com.atproto.repo.strongRef` | Yes | The site.standard.publication that holds the plugin's display name, description and icon, in the same repo under the same record key. Pinned by CID, so a change to the publication takes effect only when this record is updated to point at it. |
| `security` | `array` | Yes | Where to report a vulnerability. At least one is required, because a plugin runs inside an operator's HappyView. |

## Raw Schema

```json
{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "author": {
      "properties": {
        "email": {
          "maxLength": 320,
          "type": "string"
        },
        "name": {
          "maxGraphemes": 128,
          "maxLength": 1280,
          "type": "string"
        },
        "url": {
          "format": "uri",
          "maxLength": 2048,
          "type": "string"
        }
      },
      "required": [
        "name"
      ],
      "type": "object"
    },
    "contact": {
      "description": "A security contact. It must carry a url, an email, or both.",
      "properties": {
        "email": {
          "maxLength": 320,
          "type": "string"
        },
        "url": {
          "format": "uri",
          "maxLength": 2048,
          "type": "string"
        }
      },
      "type": "object"
    },
    "main": {
      "description": "The HappyView facts about a software.release.project that make it a plugin. The record key is the project's name, and the record lives in the same repo as the project. The registry indexes a project's releases only while this record exists and is valid.",
      "key": "any",
      "record": {
        "properties": {
          "authors": {
            "items": {
              "ref": "#author",
              "type": "ref"
            },
            "maxLength": 20,
            "minLength": 1,
            "type": "array"
          },
          "keywords": {
            "items": {
              "maxGraphemes": 32,
              "maxLength": 320,
              "type": "string"
            },
            "maxLength": 20,
            "type": "array"
          },
          "pluginType": {
            "description": "What the plugin is. Every release must be of this type.",
            "knownValues": [
              "auth",
              "library",
              "interpreter"
            ],
            "type": "string"
          },
          "project": {
            "description": "The software.release.project this describes: the one in the same repo, under the same record key.",
            "format": "at-uri",
            "type": "string"
          },
          "publication": {
            "description": "The site.standard.publication that holds the plugin's display name, description and icon, in the same repo under the same record key. Pinned by CID, so a change to the publication takes effect only when this record is updated to point at it.",
            "ref": "com.atproto.repo.strongRef",
            "type": "ref"
          },
          "security": {
            "description": "Where to report a vulnerability. At least one is required, because a plugin runs inside an operator's HappyView.",
            "items": {
              "ref": "#contact",
              "type": "ref"
            },
            "maxLength": 20,
            "minLength": 1,
            "type": "array"
          }
        },
        "required": [
          "project",
          "publication",
          "pluginType",
          "authors",
          "security"
        ],
        "type": "object"
      },
      "type": "record"
    }
  },
  "id": "at.happyproto.registry.project",
  "lexicon": 1
}
```
