How Hort is built and operated: everything here describes the architecture
as shipped in the crates/ workspace.
Organised along Diátaxis:
Start here if you want to know why the system looks the way it does.
- Overview — goals, authority hierarchy, the shape of the system.
- Layering and crate map — where code lives and who may depend on whom.
- Domain model — entities, ports, actors, content hashes.
- Event sourcing — streams, events, dual-write, projections.
- Content-addressable storage — streaming CAS and its invariants.
- Format handlers — capability taxonomy and what's compiled-in today.
- Security — trust boundaries, auth, authz, defence in depth, and what operators still own.
- The prefetch pipeline — triggers, the transitive cascade, dedup layers, and why warming never bypasses quarantine.
- Index construction — the Source → Filter → Builder spine, the no-leak filter order, and IndexMode's bounded semantics.
- The scanning pipeline — scanner/advisory ports, SBOM extraction, the scan-job lifecycle, and the externally-triggered rescan/advisory ticks.
- Event notifications — subscriptions, webhook/NATS delivery, the privileged-category gate, and the best-effort delivery contract.
- Declare configuration via
$HORT_CONFIG_DIR(gitops) - Wire secrets for
proxy.secretRef: - Tune HTTP transport timeouts
- Verify a release with
cosign verify-blob - Use
hort-clifor admin operations (--admin,--expires-in) - Install
hort-cli - Shell completions for
hort-cli - Federate k8s workload identity (preferred, no PAT at rest)
- Federate CI OIDC (GitHub Actions / GitLab) via
/auth/exchange - Rotate service-account PATs via the worker reconciler (fallback)
- Enable provenance (Sigstore/cosign) verification
- Quarantine patch-candidates and release
- Recover stranded (failed-scan) artifacts
- The curator workflow
- Third-party attribution
- Add a format handler
- Configure OCI pull-through with verified upstream
- Configure npm pull-through with verified upstream
- Configure PyPI pull-through with verified upstream
- Install
hort-serveron Kubernetes - Install
hort-server+hort-workeron a single Linux host - Helm chart — values reference
- Helm chart — edge overlays
- Install fully sovereign against
registry.hort.rs - Upgrade a running deployment (and
### Migration noticereleases) - Provision the two Postgres roles
- Trust internal or corporate CAs (
extraCaBundle) - Admin identity and the Dex bootstrap
- Enable admin-task CronJobs
- Split the control plane onto a dedicated listener
- Security hardening checklist
- Claim-based RBAC
- Provision a Prometheus scraper ServiceAccount for
/metrics - OCI image-pull secret / token
- Public supply-chain deployment
Information-oriented, exhaustive, kept in lockstep with the code.
hort-serverandhort-workerconfiguration — every env var and CLI subcommand/flag, with defaults, required-ness, and startup interlocks.- The
hort-serverHelm chart — rendered-resource matrix, install-time schema rules, hook ordering, workload wiring, and chart-vs-binary caveats. - Public event taxonomy — domain events external consumers may subscribe to, with payload fields, stream, and stability contract.
- npm format — entity reference — every npm registry entity as hort handles it: stored, derived, or discarded, and why; updated whenever an initiative changes an entity's class.
- Apply-time linter rows — coverage matrix — every named gitops apply-time lint row and what it rejects, the retirement trigger for each row that exists because a control is missing, and — separately — where the surfaces with no named row are actually validated.
Diagrams are inline fenced code blocks tagged plantuml. Render them with
any PlantUML-aware viewer (IntelliJ PlantUML plugin, VS Code PlantUML
extension, plantuml CLI, or the online server).
When this documentation and the code disagree, the code wins — but the
authoritative standing decisions live in the architecture decision
records under docs/adr/. The starting point is the
decision index and open-items register;
each ADR names the live mechanism (code, test, or gate) that enforces
it. Official protocol specifications outrank everything (see
ADR 0011).