The marketplace catalog is plain JSON in this repo — one file per
entry at content/marketplace/<family-dir>/<slug>.json, grouped by family:
content/marketplace/
schema.ts
tools/ family: "tool" e.g. tools/issue.json
channels/ family: "channel" e.g. channels/telegram.json
skills/ family: "skill" e.g. skills/weather.json
No build step, no database.
content/marketplace/tools/issue.json for a tool or
content/marketplace/skills/weather.json for a skill.<slug>.json and place it in the folder matching its
family (see the layout above). The slug field inside the file must
equal the filename without .json, and the file must live under the
folder for its family — the loader throws a build error otherwise.pnpm dev and open http://localhost:3000/marketplace/<slug> to
check the card and detail page.pnpm lint and pnpm build must both pass.The full type lives in content/marketplace/schema.ts.
| Field | Required | Notes |
|---|---|---|
slug | ✅ | kebab-case; equals the filename and the URL segment |
name | ✅ | display name |
family | ✅ | tool | channel | skill |
type | finer label: action, query, messaging, coredash, utility, … | |
summary | ✅ | one line, shown on cards |
description | ✅ | markdown, shown on the detail page |
tags | ✅ | string array |
sourcePath | ✅ | path inside the koris repo, e.g. plugins/tools/issue |
sourceUrl | ✅ | full GitHub URL to sourcePath |
toolName | tools | the LLM-facing name, e.g. issue |
params | tools | { name, type, required, description, enum? }[] |
readWhen | skills | the read_when triggers from SKILL.md |
hints | channels | guidance strings { uninstalled?, inactive?, active?, pairing?, botNumber?, allowUnlisted?, whitelist? }; per-locale overrides go in i18n.<locale>.hints |
configFields | channels | setup-wizard form inputs { name, label, type, placeholder?, description?, required? }[]; type is text | password | boolean | number |
requiresConfirmation | true if the plugin needs explicit user confirmation | |
defaultEnabled | enablement state in a fresh koris install | |
capturedFrom | optional koris git ref this snapshot came from |
The JSON files are the source of truth — they're written and reviewed by hand. A
sketch helper, scripts/generate-catalog.ts, can re-derive params / readWhen
from a local koris checkout and merge them into the existing files without
clobbering the hand-written prose. Source parsing is brittle, so always review its
output.