# Package Registry

The package registry lets admins browse and install packages from an external
JSON index — a lightweight alternative to manually uploading `.pkg` files.

## Registry JSON Format

The registry is a static JSON file matching the `RegistryResponse` struct:

```json
{
  "packages": [
    {
      "id": "notes",
      "title": "Notes",
      "version": "0.8.0",
      "description": "Markdown notes with backlinks and graph view",
      "author": "armature",
      "type": "extension",
      "tier": "core",
      "download_url": "https://cdn.example.com/pkg/notes.pkg",
      "size": 48200,
      "updated_at": "2026-03-20T00:00:00Z"
    }
  ]
}
```

### Required Fields

| Field          | Description                                    |
|----------------|------------------------------------------------|
| `id`           | Package identifier (matches `manifest.json`)   |
| `title`        | Display name                                   |
| `version`      | Semver version string                          |
| `description`  | Short description                              |
| `download_url` | HTTPS URL to the `.pkg` file (must be HTTPS)   |

### Optional Fields

| Field        | Description                              |
|--------------|------------------------------------------|
| `author`     | Package author                           |
| `type`       | `extension` or `library`                 |
| `tier`       | `core`, `official`, or `community`       |
| `size`       | File size in bytes                       |
| `updated_at` | ISO 8601 timestamp of last update        |

## Configuring the Registry URL

### Via Admin UI

Navigate to **Admin > Settings > Package Registry** and enter the registry URL.

### Via API

```bash
curl -X PUT /api/v1/admin/settings/package_registry \
  -H "Content-Type: application/json" \
  -d '{"value": {"url": "https://cdn.example.com/pkg/registry.json"}}'
```

## Generating a Registry

Use `scripts/generate-registry.sh` to build a `registry.json` from a
directory of `.pkg` files:

```bash
# Default: reads dist/, uses placeholder base URL
./scripts/generate-registry.sh

# Custom directory and base URL
./scripts/generate-registry.sh ./my-packages https://cdn.example.com/pkg > registry.json
```

Requirements: `jq`, `unzip`, and `stat` (GNU or BSD).

## Self-Hosting

Any HTTPS-capable file server works. Upload your `.pkg` files and the
generated `registry.json` to the same directory, then point the admin
setting to the `registry.json` URL.

Example with a static file server:

```
/var/www/packages/
  registry.json
  notes.pkg
  chat.pkg
  chat-core.pkg
```

The registry is fetched and cached for 5 minutes on each browse request.
