Cache-first HTTP API for the traditional Roman liturgy.
  • PHP 92.4%
  • Shell 7.6%
Find a file
manlycucumber 6f9be21721
All checks were successful
release / release (push) Successful in 6s
chore(release): v0.1.0
2026-08-05 15:02:22 -04:00
.forgejo/workflows ci(release): stop the release publishing notes with commits silently missing 2026-08-05 14:34:04 -04:00
.githooks ci(release): stop the release publishing notes with commits silently missing 2026-08-05 14:34:04 -04:00
.github ci(release): port release automation off release-please to the tier-kit git-cliff flow (#149) 2026-08-05 11:44:24 -04:00
bin refactor: rename INTROIBO_* env vars to DIRECTORIUM_* (#140) 2026-07-06 13:13:37 -04:00
docs refactor: rename INTROIBO_* env vars to DIRECTORIUM_* (#140) 2026-07-06 13:13:37 -04:00
public refactor: rename platform Introibo -> Directorium (Api) (#139) 2026-07-06 13:08:44 -04:00
scripts ci(release): stop the release publishing notes with commits silently missing 2026-08-05 14:34:04 -04:00
sql refactor: rename INTROIBO_* env vars to DIRECTORIUM_* (#140) 2026-07-06 13:13:37 -04:00
src refactor: rename INTROIBO_* env vars to DIRECTORIUM_* (#140) 2026-07-06 13:13:37 -04:00
tests refactor: rename platform Introibo -> Directorium (Api) (#139) 2026-07-06 13:08:44 -04:00
.gitattributes chore: scaffold workflow-full baseline 2026-06-30 18:56:00 -04:00
.gitignore feat: service skeleton, Core wiring, and the /v1/day endpoint (#133) 2026-07-03 01:31:15 -04:00
CHANGELOG.md chore(release): v0.1.0 2026-08-05 15:02:22 -04:00
cliff.toml ci(release): port release automation off release-please to the tier-kit git-cliff flow (#149) 2026-08-05 11:44:24 -04:00
composer.json chore: point the Core composer dependency at Forgejo 2026-07-12 19:37:59 +00:00
composer.lock chore: point org references at DirectoriumApp (#141) 2026-07-06 13:43:57 -04:00
LICENSE chore: scaffold workflow-full baseline 2026-06-30 18:56:00 -04:00
phpcs.xml.dist refactor: rename platform Introibo -> Directorium (Api) (#139) 2026-07-06 13:08:44 -04:00
phpstan.neon.dist feat: static generation and the read-through cold path (#135) 2026-07-03 01:50:25 -04:00
phpunit.xml.dist refactor: rename platform Introibo -> Directorium (Api) (#139) 2026-07-06 13:08:44 -04:00
README.md refactor: rename INTROIBO_* env vars to DIRECTORIUM_* (#140) 2026-07-06 13:13:37 -04:00
renovate.json chore: enable Renovate dependency updates 2026-07-12 19:34:48 +00:00
ROADMAP.md refactor: rename platform Introibo -> Directorium (Api) (#139) 2026-07-06 13:08:44 -04:00

Directorium API

Cache-first HTTP API for the traditional Roman liturgy — Introíbo ad altáre Dei.

The Directorium API is the authoritative, versioned (/v1) HTTP service over the Directorium Core engine. Its responses are a pure function of (date, system, calendar, office, hour, language) and therefore immutable per key — pre-generated as static JSON for hot paths, computed on demand for cold dates, and fronted by Cloudflare with long, immutable TTLs, ETags, and a data-version stamp. Corrections bump the data-version and purge the edge cache.

It issues and meters API keys per tenant (quotas + rate limits) and is consumed by the directorium.app website and admin, the Ordo WordPress plugin, and future apps.

Status

Pre-release — v0.1.0 in progress. See the roadmap.

Stack

PHP + MySQL on DreamHost, Cloudflare in front, cache-first. MySQL holds only API keys, tenants, aggregate usage counters, and the search index — never a row per request. Node is build-time only; no Python.

Development

Work branches off develop, lands via squash PRs with Conventional-Commit titles, and releases are cut automatically by release-please. The engine is consumed as the directorium/core Composer dependency (pinned by composer.lock); the API adds no liturgical logic of its own. The architecture is documented in docs/design/api-architecture.md.

composer install            # pulls in directorium/core
composer check              # PSR-12 lint + PHPStan + PHPUnit — the CI gate
php -S 127.0.0.1:8080 -t public public/index.php
#   → GET /v1/day/2026-09-03?calendar=sspx
#   → GET /v1/month/2026-09
#   → GET /v1/year/2026
#   → GET /v1/meta      (supported systems, calendars, languages, range)
#   → GET /v1/health

# Pre-generate the static tier for a year range (data-version-namespaced):
php bin/generate-static.php 2024 2030 ./build/static

Access control (API keys, quotas, rate limits) is off until a key store is configured — set DIRECTORIUM_DB_DSN (schema in sql/schema.sql) and manage tenants/keys with php bin/api-key.php (tenant / issue / rotate / revoke). Health, discovery, and the policies (/v1/aup, /v1/terms) stay public. Admin actions (POST /v1/admin/purge, /rebuild) exist only when DIRECTORIUM_ADMIN_TOKEN is set; edge purge targets Cloudflare (DIRECTORIUM_CF_ZONE / DIRECTORIUM_CF_TOKEN), a no-op otherwise.

Licence

© 2026 Directorium. Licensed under AGPL-3.0-or-later (see LICENSE). The compiled calendar dataset is released under CC0.