The static JSON registry of published Ikenga packages — served via GitHub Pages, consumed by the shell and the
ikengaCLI for pkg discovery, install, and update.
A machine-generated catalog of every published @ikenga/pkg-*
package: names, versions, manifests, tarball URLs, integrity hashes — plus a minisign
signature over the index.
Endpoint: https://royalti-io.github.io/ikenga-registry/index.json
index.json — root catalog: pkg names + latest version + detail pointer
index.json.minisig — minisign signature over index.json
pkgs/<short-name>.json — per-pkg detail: every published version, manifest, tarball URL, integrity
schema/ — JSON Schemas (mirrors of @ikenga/contract Zod types)
REGISTRY_PUBLIC_KEY.txt — minisign public key for verifying signatures
REGISTRY_PUBLIC_KEY.md — human-readable verify instructions
This repo is not edited by hand. The release workflow in
Royalti-io/ikenga-pkgs
runs scripts/update-registry-index.mjs after every successful Changesets
publish; that script writes/updates index.json and pkgs/<name>.json,
re-signs index.json with minisign, and pushes the changes.
The only manual edits accepted here are:
@ikenga/contract release)index.json.minisig is a minisign signature
over index.json. The shell embeds the public key and refuses to trust an unsigned
or mismatched index.
Verify locally:
minisign -Vm index.json -P RWRTqugAYXnZRgZPMyuqRNB3G41wg+AhSU2yT8nmDNNQlWQPeCfRXAvI
The current public key also lives at REGISTRY_PUBLIC_KEY.txt.
kind is a descriptive hint for catalog and discovery — it is deliberately an
open string, and the schema does not constrain it. The kernel never dispatches on
it: at load time it dispatches on which manifest blocks are present, and the CLI
does not read it at all. Adding a new kind therefore needs no schema change.
Values in use today:
kind |
What it describes |
|---|---|
bundle |
A composite package grouping several components or sub-packages |
embedded |
A package whose UI embeds in the shell (the common case for apps) |
engine |
An engine adapter — the agent runtime a pkg drives |
skill |
A capability or tool surfaced to the agent |
webview |
A package whose surface is an embedded third-party site |
kind is not what makes a package mount as a webview. That is decided by
ui.routes[].kind = "webview" plus a capabilities.webview block declaring
child_webviews: true — a package can carry kind: "embedded" and still mount a
webview route, which is exactly what the Spotify / Sentry / Notion packages do.
Constraining this field to an enum would break that, and would break the next kind
someone adds; keep it open.
The shape of index.json and pkgs/<name>.json is defined by Zod schemas
in @ikenga/contract (./registry
export). JSON Schemas are mirrored under schema/ for non-TypeScript
consumers and editor autocomplete.
ikenga-pkgs — the monorepo whose release workflow regenerates this indexikenga — the desktop shell that consumes itApache-2.0 — see LICENSE.