# com.pipobscure.bundle.suite

> Published by [pipobscure.com](https://lexicon.garden/identity/did:plc:rwypz6edxmzyhob2k3rsl2fw)

✓ This is the authoritative definition for this NSID.

## Links

- [View on Lexicon Garden](https://lexicon.garden/lexicon/did:plc:rwypz6edxmzyhob2k3rsl2fw/com.pipobscure.bundle.suite)
- [Documentation](https://lexicon.garden/lexicon/did:plc:rwypz6edxmzyhob2k3rsl2fw/com.pipobscure.bundle.suite/docs)
- [Examples](https://lexicon.garden/lexicon/did:plc:rwypz6edxmzyhob2k3rsl2fw/com.pipobscure.bundle.suite/examples)

## Definitions

### `com.pipobscure.bundle.suite`

**Type**: `record`

A set of listed bundles the repository's owner makes available to install together, under a name: the record key. Installing the suite installs each member as it would be installed by itself, and an update follows the suite as members are added and taken out. The suite vouches for none of them: each member is reviewed and verified on its own. What it can do is set a minimum — a signer and attesters a member must carry — below which that member is refused.

**Key**: `any`

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `createdAt` | `string` (datetime) | Yes | When the suite was first published, by the publisher's clock. |
| `description` | `string` | No | What the suite is for, in a sentence or two. |
| `members` | `array` | Yes | The listings installed together. |
| `subject` | `string` (uri) | Yes | 'sha256:44d3324ff44da0b4d3efde1810c8cb88bdad5e673d99b011d9072714d884670d', the sha256 of this lexicon's NSID, the same in every suite, so that a backlink index can enumerate every suite on the network. |
| `title` | `string` | No | A display name; the record key stands in when it is absent. |

### `com.pipobscure.bundle.suite#member`

**Type**: `object`

One listed bundle in a suite, where it goes, and what it must carry.

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `for` | `string` | No | Install it as a plugin, rather than onto the PATH: for the app installed from the listing at this at:// address, or into this scope — a package name, such as a suite's shared scope. Without it, an app's listing installs onto the PATH, and a plugin's for the app its listing names. |
| `listing` | `string` (at-uri) | Yes | The at:// address of a com.pipobscure.bundle.listing record, with the publisher's DID. It may be anyone's. |
| `require` | `ref` → `#require` | No |  |

### `com.pipobscure.bundle.suite#require`

**Type**: `object`

What a member must carry to be installed at all: the suite's minimum, checked at install and at every update. Meeting it vouches for nothing; whoever installs still decides whom to accept.

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `attesters` | `array` | No | Who must have attested it, each as '[kind@]<did>'. |
| `identity` | `string` | No | The sigstore identity that must have signed it. |
| `issuer` | `string` (uri) | No | The OIDC issuer that must have vouched for that identity: an https URL. |
| `quorum` | `integer` | No | How many of the attesters must have attested it (default: all of them). |

## Raw Schema

```json
{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "main": {
      "description": "A set of listed bundles the repository's owner makes available to install together, under a name: the record key. Installing the suite installs each member as it would be installed by itself, and an update follows the suite as members are added and taken out. The suite vouches for none of them: each member is reviewed and verified on its own. What it can do is set a minimum — a signer and attesters a member must carry — below which that member is refused.",
      "key": "any",
      "record": {
        "properties": {
          "createdAt": {
            "description": "When the suite was first published, by the publisher's clock.",
            "format": "datetime",
            "type": "string"
          },
          "description": {
            "description": "What the suite is for, in a sentence or two.",
            "maxGraphemes": 300,
            "maxLength": 3000,
            "type": "string"
          },
          "members": {
            "description": "The listings installed together.",
            "items": {
              "ref": "#member",
              "type": "ref"
            },
            "maxLength": 64,
            "minLength": 1,
            "type": "array"
          },
          "subject": {
            "description": "'sha256:44d3324ff44da0b4d3efde1810c8cb88bdad5e673d99b011d9072714d884670d', the sha256 of this lexicon's NSID, the same in every suite, so that a backlink index can enumerate every suite on the network.",
            "format": "uri",
            "maxLength": 2048,
            "type": "string"
          },
          "title": {
            "description": "A display name; the record key stands in when it is absent.",
            "maxGraphemes": 64,
            "maxLength": 640,
            "type": "string"
          }
        },
        "required": [
          "subject",
          "members",
          "createdAt"
        ],
        "type": "object"
      },
      "type": "record"
    },
    "member": {
      "description": "One listed bundle in a suite, where it goes, and what it must carry.",
      "properties": {
        "for": {
          "description": "Install it as a plugin, rather than onto the PATH: for the app installed from the listing at this at:// address, or into this scope — a package name, such as a suite's shared scope. Without it, an app's listing installs onto the PATH, and a plugin's for the app its listing names.",
          "maxLength": 2048,
          "type": "string"
        },
        "listing": {
          "description": "The at:// address of a com.pipobscure.bundle.listing record, with the publisher's DID. It may be anyone's.",
          "format": "at-uri",
          "maxLength": 2048,
          "type": "string"
        },
        "require": {
          "ref": "#require",
          "type": "ref"
        }
      },
      "required": [
        "listing"
      ],
      "type": "object"
    },
    "require": {
      "description": "What a member must carry to be installed at all: the suite's minimum, checked at install and at every update. Meeting it vouches for nothing; whoever installs still decides whom to accept.",
      "properties": {
        "attesters": {
          "description": "Who must have attested it, each as '[kind@]<did>'.",
          "items": {
            "maxLength": 2048,
            "type": "string"
          },
          "maxLength": 32,
          "type": "array"
        },
        "identity": {
          "description": "The sigstore identity that must have signed it.",
          "maxLength": 2048,
          "type": "string"
        },
        "issuer": {
          "description": "The OIDC issuer that must have vouched for that identity: an https URL.",
          "format": "uri",
          "maxLength": 2048,
          "type": "string"
        },
        "quorum": {
          "description": "How many of the attesters must have attested it (default: all of them).",
          "minimum": 1,
          "type": "integer"
        }
      },
      "type": "object"
    }
  },
  "id": "com.pipobscure.bundle.suite",
  "lexicon": 1
}
```
