- Shell 60.8%
- TypeScript 39.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
All checks were successful
Publish trust registry / lint-and-sign (push) Successful in 2s
|
||
| .forgejo/workflows | ||
| .githooks | ||
| scripts | ||
| .gitignore | ||
| publishers.json | ||
| publishers.json.sig.json | ||
| README.md | ||
Limedoc trust registry
Vetted publisher public keys for Limedoc pack verification. The app syncs this
file (lazy, max age 24h) and verifies it with the trust-root key baked into
release-trust.json.
Files
| File | Purpose |
|---|---|
publishers.json |
Publisher ids, tiers (core | partner), Ed25519 public keys |
publishers.json.sig.json |
OpenBao Transit signature over the canonical hash (written by CI) |
scripts/canonical_hash.ts |
Offline hash helper (sorted-key JSON + trailing LF) |
Raw URLs (baked into Limedoc images)
https://git.belowtoxic.cloud/belowtoxic.eu/limedoc-trust/raw/branch/main/publishers.json
https://git.belowtoxic.cloud/belowtoxic.eu/limedoc-trust/raw/branch/main/publishers.json.sig.json
OpenBao
| Item | Value |
|---|---|
| JWT role | limedoc-registry-trust |
| Bound repo | belowtoxic.eu/limedoc-trust (ref refs/heads/main) |
Transit key / keyId |
limedoc-registry-trust-2026 |
| Sign input | UTF-8 bytes of the 64-char lowercase hex hash |
Sign encoding matches Limedoc lib/trust/signature.ts (strip vault:vN: prefix
from Transit output before writing signature).
CI
On push to main (or manual Run workflow on main), .forgejo/workflows/publish.yml:
- Lint
publishers.json(schema + fingerprint check via limedoc-dev when available) - Hash via
/limedoc/scripts/trust_hash_registry.ts(schema-normalized; matches app verify) - JWT login → Transit sign
- Commit/push
publishers.json.sig.jsonso the raw URL stays current
Secret: PACKAGE_TOKEN — Forgejo token with write access to this repo
(same convention as pack publish workflows).
PRs only lint; they do not sign or commit. Manual runs on main sign and commit like a push.
Rotation
- Add the new public key to
publishers.json(keep the old key during grace). - Merge to
mainso CI resigns. - After grace, remove the old key and merge again.
See Limedoc docs/security/TRUST_ROLES_AND_ROTATION.md and
docs/security/OPENBAO_SIGNING.md.
Local hash
Authoritative hash (matches app verify) requires the Limedoc tree / limedoc-dev image:
deno eval '
import { assertPublishersRegistry } from "/limedoc/lib/trust/registry_schema.ts"
import { hashRegistry } from "/limedoc/lib/trust/registry.ts"
const r = assertPublishersRegistry(JSON.parse(await Deno.readTextFile("publishers.json")))
console.log(await hashRegistry(r))
'
scripts/canonical_hash.ts hashes the raw file as-is (useful for catalogs /
sanity). It can differ from hashRegistry after schema normalization — CI signs
the normalized hash.