# Manifest Specification

## Sample Ring Manifests

```json
{
  "manifest": {
    "name": "Test Ring",
    "url": "http://192.168.1.113:8000",
    "description": "A ring for testing",
    "manifest_type": "ring",
    "keyset": {
      "keys": [
        {
          "kty": "OKP",
          "crv": "Ed25519",
          "x": "NjClgero69BySgTSP5dpNUOIMn7jvFEB3WqV_l_Aw2o",
          "kid": "bbfe469e489049226a5f23790e9a6df4b4d1572fc11f9a44ac26ad9ca358395b",
          "alg": "EdDSA",
          "use": "sig"
        },
        {
          "kty": "OKP",
          "crv": "X25519",
          "x": "w5I72skiVbk6xuqC4_PBtvoFww-wTJgCeamltQe9thY",
          "kid": "0d4acb3c81f53048433d7519c0f89ce08c9b0b7aaede98f8a93f95385385300a",
          "alg": "ECDH-ES",
          "use": "enc"
        }
      ]
    },
    "members": {
      "http://site1:8001": {
        "description": "Site 1",
        "keyset": {
          "keys": [
            {
              "alg": "EdDSA",
              "crv": "Ed25519",
              "kid": "fe1a7aa43cfb5d603bb4e9ed9dc4845e5686e2d8308107041ad5272c27b3f8df",
              "kty": "OKP",
              "use": "sig",
              "x": "SHR0Q1VYTnhTVkF0cmVzbFNsNTFTYTBaYl84V1ZlYzZ5TWpYYUR2a0ppYw"
            }
          ]
        },
        "name": "Site 1",
        "standing": "good",
        "url": "http://site1:8001"
      },
      "http://site2:8002": {
        "description": "Site 2",
        "keyset": {
          "keys": [
            {
              "alg": "EdDSA",
              "crv": "Ed25519",
              "kid": "176bc682fb2810b6e9970ffe82c48989a430aaa027f37cb16122a39e78da6c96",
              "kty": "OKP",
              "use": "sig",
              "x": "c3dmUU1DVWNmMmZMRUY2dmZHQ1NuUkJKVFVpdVJJTFlObW9aUm5JZGgwRQ"
            }
          ]
        },
        "name": "Site 2",
        "standing": "neutral",
        "url": "http://site2:8002"
      }
    },
    "timestamp": 1775488042
  },
  "signature": "-cGPJZtB6w5rFccjmKiK8QAVC1xTSO5sdZ6PWlUsd4GUXbFgTXdrzG9TA09xfPWB6zhxiUy2IMTnNUfQ9_WwCw"
}
```

## Sample Site Manifest

```json
{
  "manifest": {
    "name": "Site 1",
    "url": "http://site1:8001",
    "description": "Site 1",
    "manifest_type": "member",
    "manifest_version": 2,
    "keyset": {
      "keys": [
        {
          "kty": "OKP",
          "crv": "Ed25519",
          "x": "HttCUXNxSVAtreslSl51Sa0Zb_8WVec6yMjXaDvkJic",
          "kid": "9d2cb51ae91c4eb4ae582d92b3b0b18abce52816d41211ab93a9d9faa7ed0b3a",
          "alg": "EdDSA",
          "use": "sig"
        }
      ]
    },
    "rings": {
      "http://192.168.1.113:8000": {
        "description": "A ring for testing",
        "keyset": {
          "keys": [
            {
              "alg": "EdDSA",
              "crv": "Ed25519",
              "kid": "bbfe469e489049226a5f23790e9a6df4b4d1572fc11f9a44ac26ad9ca358395b",
              "kty": "OKP",
              "use": "sig",
              "x": "NjClgero69BySgTSP5dpNUOIMn7jvFEB3WqV_l_Aw2o"
            },
            {
              "alg": "ECDH-ES",
              "crv": "X25519",
              "kid": "0d4acb3c81f53048433d7519c0f89ce08c9b0b7aaede98f8a93f95385385300a",
              "kty": "OKP",
              "use": "enc",
              "x": "w5I72skiVbk6xuqC4_PBtvoFww-wTJgCeamltQe9thY"
            }
          ]
        },
        "name": "Test Ring",
        "votes": {
          "http://site2:8002": "mErgdxwJuVwgJXnzzSYwzTufNgplLlaI-GSotBWTMUXaJuHKqWsqmxYWbfd9jpskhwdAuCwIaxkywGtttZ0BJZJ3xr2qhObfqysyM2bREbwR8kPK52FHv0PKIz3FHuMb_D60zP5CYUKlvX5Tb8-67StFHAtGMoMJgH3JR0t_NnkTuEPUhfaMdhiTdUrGqKgTit8oBs--IwbGoDKBpstqEAAh7oYatMiN2d4oR_aUQE_VD7yBnI3r4UKLTEw"
        }
      }
    },
    "timestamp": 1775488091
  },
  "signature": "ES0vjngExy6MhgM4HFsj3qz1mkznx3G7-I2IZ7ZLoMuTIyzNquBz0Pp7MOi_1Ga19S9LYzLi0gREf-meyA98CA"
}
```

## Votes

Vote objects are encrypted with the ring server's public key, but they follow this structure:

```json
{
  "description": "Great stuff",
  "standing": "good",
  "timestamp": 1765492040,
  "vote_subject_url": "https://alice-zone.net"
}
```

## JWKS

Ringspace exchanges keys in [JSON Web Key Set](https://auth0.com/docs/secure/tokens/json-web-tokens/json-web-key-sets) format. Any time a `keyset` field occurs, the value is a JWKS. This allows for a more conventional, standard key exchange mechanism, and future adoption of additional ciphers/key types. The `x` field is the public key in Base64URL (URL Safe, no padding) format.
