Skip to content
Registry stack docs v0 · draft

Registry Lab reference

Use this page to look up port numbers, credential names, and script entry points when setting up or debugging the topology.

This reference is hand-maintained; the source links in each table are the authoritative check.

Full Compose file: compose.yaml.

ServiceImage / buildRoleHost port
civil-registry-relayregistry-relay:demo (local build)Registry Relay for civil domain; serves CSV-backed civil registry data4311
social-protection-registry-relayregistry-relay:demo (local build)Registry Relay for social protection domain; serves XLSX-backed data4312
health-registry-relayregistry-relay:demo (local build)Registry Relay for health domain; serves Parquet-backed data4313
postgrespostgres:16-alpine (pulled)Live Postgres service for Relay database-source scenarios54329
zitadelghcr.io/zitadel/zitadel:v2.66.4 (pulled)Live Zitadel identity provider for Relay OIDC scenarios4380
zitadel-seed-initalpine:3.20 (pulled)One-shot volume permission initializer for Zitadel bootstrap stateNone
zitadel-initalpine:3.20 (pulled)One-shot Zitadel bootstrap script that writes output/zitadel.env via scripts/check-relay-zitadel.shNone
civil-notaryregistry-notary:demo (local build)Registry Notary for civil claims; reads civil facts from civil-registry-relay over HTTP4321
social-protection-notaryregistry-notary:demo (local build)Registry Notary for social protection claims; reads social facts from social-protection-registry-relay over HTTP4322
shared-eligibility-notaryregistry-notary:demo (local build)Registry Notary for cross-authority claims spanning civil, social, and health registries4323
openfn-mock-registryregistry-notary-openfn-sidecar:demo (local build)Private registry-like HTTP API used by the OpenFn sidecar smoke pathNone
openfn-civil-sidecarregistry-notary-openfn-sidecar:demo (local build)Private OpenFn adaptor sidecar that exposes a Registry Data API-shaped lookup surface to NotaryNone
openfn-civil-notaryregistry-notary:demo (local build)Registry Notary for civil claims sourced through openfn-civil-sidecar4324
static-metadata-publisherpython:3.12.3-slim-bookworm (pulled)Python HTTP server serving the portable metadata static bundle at /srv/static4331
demo-clientpython:3.12.3-slim-bookworm (pulled)Narrated demo client (one-shot, --profile client only); runs scripts/demo-flow.pyNone

Relay and Notary build contexts include vendor/registry-platform plus the owning service source submodule, vendor/registry-relay or vendor/registry-notary. All core Relay and Notary services use env_file: .env, RUST_LOG: info, and restart: unless-stopped. Relay services have a healthcheck (registry-relay --help, 30 s interval, 10 s timeout, 3 retries). Core Notary services have no healthcheck in the compose file. openfn-civil-sidecar has an HTTP readiness healthcheck, and openfn-civil-notary waits for that healthcheck before starting. Inside the compose network, services reach each other via DNS names on port 8080. The OpenFn sidecar and mock registry are attached only to the private openfn-internal network.

Named volumes: civil-registry-cache, social-protection-registry-cache, health-registry-cache, postgres-data, and zitadel-seed.

Source: scripts/generate-fixtures.py. Run with uv run scripts/generate-fixtures.py from the repo root. Output lands under data/. The directory is gitignored; only data/.gitignore is committed.

FileFormatDomainContents
data/civil/civil_registry.csvCSVCivilChildren, caregivers, living adults, and deceased adults across five districts
data/social-protection/social_protection_registry.xlsxXLSXSocial protectionHouseholds, household members, and enrollments with active, inactive, suspended, and review-required cases
data/health/health_registry.parquetParquetHealthActive, suspended, pending-renewal, and partially-serviceable facilities

All timestamps are deterministic (2026-01-01). The generator validates that a successful subject, failed predicates, deceased-member cases, cross-source subjects, and health-linked support cases are all present before writing.

Run scripts/smoke.sh after docker compose -f compose.yaml up -d to confirm the topology is healthy. All smoke requests use the correlation ID decentralized-demo-correlation-001 (overridable via DEMO_CORRELATION_ID).

Source: scripts/smoke.sh

More than 30 checks:

  • Health and ready endpoints on all Relay services
  • Discovery endpoints on all Notary services with bearer-token and x-api-key credentials
  • OpenAPI endpoints on all services
  • Evidence-offering endpoints
  • Authorization scope denial (403 auth.scope_denied)
  • Positive row-read and aggregate-read on social Relay
  • Claim evaluation on civil, social, and shared Notaries
  • Cross-authority source_count >= 2
  • Credential-bound SD-JWT VC evaluation
  • Demo-client artifact presence
  • Audit event log entries
  • Absence of generated raw secrets in service logs

Source: scripts/release-check.sh

Full release wrapper that runs in sequence: fixture generation, secret generation, static metadata publication, compose build, compose up, core smoke run, demo client run, live Postgres check, live Zitadel check, OIDC Relay smoke, OpenFn smoke, live-service story runner, and compose down with -v.

Set REGISTRY_LAB_CHECK_RELAY_POSTGRES=0, REGISTRY_LAB_CHECK_RELAY_ZITADEL=0, REGISTRY_LAB_CHECK_OIDC_RELAY=0, REGISTRY_LAB_CHECK_OPENFN=0, or REGISTRY_LAB_RUN_LIVE_STORIES=0 to skip the matching release-check phase. The cleanup trap removes named volumes; run the focused scripts when you want to keep local state.

ScriptSource pathWhat it verifies
scripts/smoke-openfn.shscripts/smoke-openfn.shopenfn-civil-notary can issue evidence from a one-item OpenFn sidecar lookup while the sidecar and mock registry remain off host ports
scripts/check-relay-postgres.shscripts/check-relay-postgres.shRelay’s ignored live Postgres integration tests pass against the lab Postgres service
scripts/check-relay-zitadel.shscripts/check-relay-zitadel.shRelay’s ignored Zitadel OIDC integration test passes against the lab Zitadel service
scripts/smoke-oidc-relay.shscripts/smoke-oidc-relay.shA temporary OIDC-protected Relay verifies a real Zitadel access token, then returns either row access or a scope denial
scripts/demo-live-stories.shscripts/demo-live-stories.shNarrated Postgres, Zitadel/OIDC, and OpenFn stories write artifacts under output/live-stories/

Source: scripts/generate-demo-secrets.py. Run directly as an executable (scripts/generate-demo-secrets.py). Output is written to .env (gitignored). The committed .env.example contains inert placeholder values only.

Credential classEnv var patternUsed by
Metadata client token (civil)CIVIL_METADATA_CLIENT_RAW / CIVIL_METADATA_CLIENT_HASHSmoke checks (/health, /ready, /openapi.json, /metadata/* on civil Relay)
Metadata client token (social)SOCIAL_METADATA_CLIENT_RAW / SOCIAL_METADATA_CLIENT_HASHSmoke checks on social protection Relay
Metadata client token (health)HEALTH_METADATA_CLIENT_RAW / HEALTH_METADATA_CLIENT_HASHSmoke checks on health Relay
Evidence source token (civil)CIVIL_EVIDENCE_SOURCE_RAWcivil-notary when fetching civil facts from civil-registry-relay (config/notary/civil-notary.yaml L29)
Evidence source token (social)SOCIAL_EVIDENCE_SOURCE_RAWsocial-protection-notary when fetching social facts (config/notary/social-protection-notary.yaml L29)
Evidence source token (civil, shared)SHARED_CIVIL_EVIDENCE_SOURCE_RAWshared-eligibility-notary civil source reads (config/notary/shared-eligibility-notary.yaml L33)
Evidence source token (social, shared)SHARED_SOCIAL_EVIDENCE_SOURCE_RAWshared-eligibility-notary social source reads (config/notary/shared-eligibility-notary.yaml L36)
Evidence source token (health, shared)SHARED_HEALTH_EVIDENCE_SOURCE_RAWshared-eligibility-notary health source reads (config/notary/shared-eligibility-notary.yaml L39)
Evidence-only token (civil)CIVIL_EVIDENCE_ONLY_RAWScope denial proof: has evidence scope, no row or aggregate scope
Evidence-only token (social)SOCIAL_EVIDENCE_ONLY_RAWScope denial proof: has evidence scope, no row or aggregate scope
Evidence-only token (health)HEALTH_EVIDENCE_ONLY_RAWScope denial proof: has evidence scope, no row or aggregate scope
Row-reader token (social)SOCIAL_ROW_READER_RAWProtected row read in scenario 2 and scope denial checks
Aggregate-reader token (social)SOCIAL_AGGREGATE_READER_RAWAggregate consultation in scenario 2 and scope denial checks
OpenFn sidecar caller tokenOPENFN_SIDECAR_TOKEN_RAW / OPENFN_SIDECAR_TOKEN_HASHopenfn-civil-notary authenticates to openfn-civil-sidecar with the raw token; the sidecar config reads only the hash
OpenFn mock registry tokenOPENFN_MOCK_REGISTRY_TOKEN_RAWPrivate target token injected into the OpenFn sidecar credential JSON for openfn-mock-registry
Notary client API key (civil)CIVIL_EVIDENCE_CLIENT_TOKEN / CIVIL_EVIDENCE_CLIENT_TOKEN_HASHSmoke checks x-api-key auth on civil-notary
Notary client API key (social)SOCIAL_EVIDENCE_CLIENT_TOKEN / SOCIAL_EVIDENCE_CLIENT_TOKEN_HASHSmoke checks x-api-key auth on social-protection-notary
Notary client API key (shared)SHARED_EVIDENCE_CLIENT_TOKEN / SHARED_EVIDENCE_CLIENT_TOKEN_HASHSmoke checks x-api-key auth on shared-eligibility-notary
Notary client bearer (civil)CIVIL_EVIDENCE_CLIENT_BEARERDemo client and smoke: discovery and evaluation on civil-notary
Notary client bearer (social)SOCIAL_EVIDENCE_CLIENT_BEARERDemo client and smoke: discovery and evaluation on social-protection-notary
Notary client bearer (shared)SHARED_EVIDENCE_CLIENT_BEARERDemo client and smoke: discovery and evaluation on shared-eligibility-notary
Audit hash secret (Relay)REGISTRY_RELAY_AUDIT_HASH_SECRETRelay audit redaction and keyed hashes
Audit hash secret (Notary)REGISTRY_NOTARY_AUDIT_HASH_SECRETNotary audit redaction and keyed hashes
Issuer JWK (all Notaries)REGISTRY_NOTARY_ISSUER_JWKSD-JWT VC signing key; Notary configs use issuer_key_env: REGISTRY_NOTARY_ISSUER_JWK (config/notary/civil-notary.yaml L43)

Source: scripts/publish-static-metadata.sh, manifest at config/static-metadata/metadata.yaml, served by static-metadata-publisher at 127.0.0.1:4331. No authentication is required for any of these endpoints.

PathContentFormat
/metadata/index.jsonStatic publication index listing all produced artifactsJSON
/metadata/catalog.jsonDCAT (Data Catalog Vocabulary) catalog for the demo registryJSON
/metadata/cpsv-apCore Public Service Vocabulary Application Profile (CPSV-AP) service catalogue for Atlas service-first discoveryJSON-LD
/metadata/cpsv-ap.jsonldCPSV-AP service catalogue for clients that require a file extensionJSON-LD
/metadata/evidence-offerings.jsonEvidence offering descriptors pointing to Notary servicesJSON
/metadata/forms/health_linked_child_support_form/schema.jsonJSON Schema for the linked demo formJSON Schema
/metadata/policies.jsonldODRL (Open Digital Rights Language) policy documentsJSON-LD

The bundle is produced by registry-manifest-cli publish from the portable manifest. It does not include any Relay runtime details (source paths, table identifiers, scopes, cache paths). The static manifest identifier decentralized-demo-static-publication is an intentionally stable value set in config/static-metadata/metadata.yaml and is not renamed when the repository moves to registry-lab.

Source: config/.

FileConfigures
config/relay/civil-registry-relay.yamlCivil Relay: source binding to data/civil/civil_registry.csv, scope definitions, entity routes
config/relay/social-protection-registry-relay.yamlSocial protection Relay: source binding to data/social-protection/social_protection_registry.xlsx, separate row and aggregate scopes
config/relay/health-registry-relay.yamlHealth Relay: source binding to data/health/health_registry.parquet, entity routes
config/relay/civil-registry-relay.metadata.yamlPortable metadata for the civil Relay (separate from runtime binding)
config/relay/social-protection-registry-relay.metadata.yamlPortable metadata for the social protection Relay
config/relay/health-registry-relay.metadata.yamlPortable metadata for the health Relay
config/openfn/openfn-civil-sidecar.yaml.templateOpenFn sidecar manifest with hashed sidecar auth, pinned OpenFn runtime/adaptor versions, target allowlist, and smoke lookup
config/postgres/init.sqlPostgres database initialization for lab database-source scenarios
config/zitadel/zitadel-init.shZitadel bootstrap script for OIDC Relay scenarios
config/zitadel/zitadel-bootstrap.mdOperator notes for the Zitadel bootstrap process
config/notary/civil-notary.yamlCivil Notary: hashed client auth, claim definitions, source connector URL, private-network source opt-in, disclosure policy
config/notary/social-protection-notary.yamlSocial protection Notary: hashed client auth, claim definitions, source connector URL, private-network source opt-in, disclosure policy
config/notary/shared-eligibility-notary.yamlShared eligibility Notary: hashed client auth, cross-authority claim definitions, multiple private-network source connectors
config/notary/openfn-civil-notary.yamlOpenFn-backed civil Notary: uses registry_data_api against the private OpenFn sidecar
config/static-metadata/metadata.yamlPortable metadata manifest (registry-manifest/v1) used by the static publisher