Any HTTP/1.1 server can host a registry. Because Cyrnel fetches everything
as plain GET requests and verifies content by hash, a registry can even be
a static file tree served by a CDN or object-storage bucket.
Layout
A registry must expose these URLs (see the linked pages for exact shapes):
Rules that govern you as a host
- Same-origin catalog. Capability URLs and entry
source URLs must
resolve to the same origin as the well-known document (after
redirects are followed). You cannot point catalog URLs at a different
CDN host.
- Artifacts may be off-origin. Version descriptor
downloadUrl URLs
face no same-origin rule - you may host archives on separate storage as
long as they remain reachable under Cyrnel’s egress guard (public
unicast addresses by default).
- Redirects are fine but limited. Cyrnel follows up to 5 redirect hops
and re-validates the address on every hop.
304 Not Modified is not
supported - it is treated as a download error.
- Honor
limit. Cyrnel always sends limit on browse requests
(default 50, server caps at 200). Clamp it as you like within that
range.
- No persistence of state. Cyrnel never POSTs catalog data to you.
OAuth2 token endpoints are the only write-ish endpoint Cyrnel calls.
Integrity matters
Advertise a hash for every versioned artifact (and for icons). Cyrnel
downloads the bytes, hashes them, and refuses to install on mismatch.
Missing hashes are allowed but make installs less safe - and updates
repeatedly re-download mutable URLs. Keep artifact URLs immutable per
version and keep descriptor URLs stable forever (updates re-resolve the
stored source URL).
Reference implementation
The repository ships a self-contained reference registry under
apps/api/scripts/dev-registry.ts (the “dev fixture”), used by local
development and the API test suite. It demonstrates every mechanism in
this specification - including auth, scopes, drift, and pagination.
The fixture’s advertisement and behavior are controlled by environment
variables:
Fixture gotchas
The fixture’s definitions entries use a bare hash string for
icon (not the required {url, hash} object) whenever an icon file
exists in ~/.cache/cyrnel-dev-registry-icons/: that shape is invalid
and makes the whole definitions browse page fail with a 400. Delete
the cached icon files (or serve icons that match the
entry schema) to browse
definitions cleanly.
- The fixture’s browse
limit defaults to 10 internally and clamps to
[1, 200]: Cyrnel sends limit=50 by default, so expect 50 rows in
practice, but pass an explicit limit to be sure.
- Unknown fixture paths return
404 {"error": "Not found: <path>"} and
unauthorized requests (when auth is on) return 401 {"error":"unauthorized"}.
Missing capabilities
Registering a registry whose well-known document offers no supported
capability fails with a 400:
Last modified on August 25, 2026