---
title: The catalog
description: The template catalog index, its entries, how it is built with pack catalog, and how pack list reads it.
sidebar:
  order: 4
---

> Since 0.6.0.

## What it is

The catalog is a static index of packs (`routineos.catalog.v1`) built from the bundled templates into `site/templates/`: one `<id>.json` pack file per template and an `index.json` listing them.

## Why it exists

People need to see what packs exist, what each does and needs, and get a file they can verify, without running anything. A static index does that, and the [RoutineOS MCP](/mcp) serves the same index to Claude.

## How it works

```
routineos.py pack catalog [--check]
routineos.py pack list <index-file-or-url>
```

- `pack catalog` writes `site/templates/<id>.json` and `site/templates/index.json`. `--check` fails when they are stale.
- `pack list` prints the entries of an index from a file or an https URL. The index is at most 1 MiB.

The index is `{format, templates: [entry]}`, sorted by id. Each entry:

| Field | Notes |
|---|---|
| `id`, `version`, `title`, `summary` | From the pack |
| `category`, `maturity` | From the pack |
| `type`, `schedule` | From `routine.routine` |
| `path` | The pack file, relative to the index |
| `bytes`, `sha256` | Size and hash of the pack file, to verify a download |
| `connectors` | `[{id, label, required}]` |
| `inspiration` | URLs |

JSON Schemas (draft 2020-12) are published next to it: `site/templates/schema/pack.v1.schema.json` and `site/templates/schema/catalog.v1.schema.json`.

## Worked example

The `jobs-watch` entry in the built index, shortened:

```json
{"format": "routineos.catalog.v1", "templates": [
  {"id": "jobs-watch", "version": "1.0.0", "title": "Jobs watch", "category": "sales", "maturity": "piloted",
   "type": "watch", "schedule": "0 22 * * 1,4", "path": "jobs-watch.json", "bytes": 15882, "sha256": "0b7576988a579f12...",
   "connectors": [{"id": "web-search", "label": "Web search", "required": true},
                  {"id": "web", "label": "Web fetch", "required": true},
                  {"id": "mail", "label": "Mail", "required": false}]}
]}
```

`summary` and `inspiration` are left out above, and the hash is cut short. `bytes` and `sha256` change whenever the pack changes.

## Common pitfalls

- **Installing without checking `sha256`.** Compare it when the pack came from somewhere other than the index's own host.
- **Editing `site/templates/` by hand.** Rebuild with `pack catalog`.

## Related

- [Install a pack](/templates/install)
- [The RoutineOS MCP](/mcp)
