Multi-format artifact repository with verified upstreams and a tamper-evident, event-sourced artifact lifecycle.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Hort is a secure, self-hostable, multi-format artifact repository and supply-chain registry — one server that proxies, stores, scans, and governs packages across your package ecosystems, so you don't have to trust an upstream registry with your build pipeline's integrity.
If you're evaluating it alongside Artifactory, Nexus, or Harbor, here's what's structurally different, not just configurable:
The name captures the first four of these as a mnemonic:
HORT = Hashed · Origin · Repository · Trail
Hort is pre-1.0 and under active development, approaching a v1.0 release. The shipped format surface (OCI, npm, PyPI, Cargo, Maven/Gradle — see Supported formats) is exercised by an end-to-end test suite against real client tooling on every release, but the project has not yet had a stable major version or a wide production install base. Evaluate accordingly; see Releases for what's tagged today.
# Linux / macOS
curl -fsSL https://hort.rs/install-cli.sh | sh
# Windows (PowerShell)
irm https://hort.rs/install-cli.ps1 | iex
The installer is fail-closed — it verifies each download's SHA-256 and keyless cosign signature before installing (bootstrapping a pinned cosign if you don't have one), with no option to skip verification. See docs/architecture/how-to/install-cli.md.
The fastest way to a fully sovereign install — the chart's registry.hort.rs
flavor pulls every image (server, worker, and cold-start dependencies) from
Hort's own registry, never ghcr.io or Docker Hub directly:
helm install hort oci://registry.hort.rs/hort-charts/hort-server \
-f my-values.yaml
See self-contained-registry-install.md for the two chart flavors and what resolves from where, and install.md for cluster prerequisites, the Postgres role setup, and OIDC configuration.
PostgreSQL is an external dependency (filesystem storage is the default; S3 is
optional). Apply the schema first with the least-privilege migrate
subcommand — the runtime itself never runs DDL:
docker run --rm \
-e DATABASE_URL="postgresql://hort:hort@db:5432/hort" \
ghcr.io/project-hort/hort-server:latest migrate
Then run the server with the serve subcommand (it is also the default if no
subcommand is given; shown explicitly here, matching the Helm/CI invocation):
docker run --rm -p 8080:8080 \
-e DATABASE_URL="postgresql://hort:hort@db:5432/hort" \
ghcr.io/project-hort/hort-server:latest serve
Talk to it with the hort-cli client (a pure HTTP client — no database access):
hort-cli auth login
hort-cli whoami
Point a native client at a repository — for example PyPI:
pip install --index-url http://localhost:8080/<repo>/simple/ <package>
| Ecosystem | Client |
|---|---|
| OCI / Docker | docker, skopeo, cosign |
| npm | npm, yarn, pnpm |
| PyPI | pip, uv |
| Cargo | cargo |
| Maven / Gradle | mvn, gradle |
Roadmap (not yet shipped): additional ecosystems (Helm, RPM/YUM,
Debian/APT, …), and loading format handlers as sandboxed, deploy-time WASM
modules rather than today's compiled-in per-format adapters. See
docs/architecture/ for the design.
Hort is layered hexagonally (onion):
domain (pure Rust, zero I/O)
→ application (use cases, orchestration)
→ outbound port traits
→ adapters (PostgreSQL, object storage, scanners)
inbound HTTP adapters (one crate per format) → composition root
ArtifactIngested, ArtifactQuarantined, ScanCompleted,
ArtifactReleased, ArtifactPromoted, …). Repository config, users, and
RBAC stay CRUD.StoragePort::put(stream) → ContentHash — streaming
SHA-256, no buffering, no caller-supplied keys.$WASM_PLUGIN_DIR, each
declaring its capability groups in a manifest. Today's format handlers are
compiled-in per-format adapters./api/v1 (auth, admin, repository management,
discovery)./v2/..., which is orthogonal to the first-party
/api/v1 and is not a Hort API version.explanation/, how-to/, reference/, tutorial/),
covering deployment, gitops configuration, auth, and scanning.crates/ has its own
README.md describing its layer, ports, and governing rules; start at
docs/architecture/explanation/layers.md
for the overall shape, and CONTRIBUTING.md for the
workflow.docs/adr/ — Architecture Decision Records; ADR 0000
indexes the historical decision trail.docs/auth-catalog.md,
docs/metrics-catalog.md — the authoritative
auth and metrics catalogs.Rust 1.94+ workspace:
cargo build --workspace
cargo test --workspace
See CONTRIBUTING.md for the full development workflow, including the regression-test contract and the security-issue reporting process.
Dual-licensed under either of
at your option. This means you may select the license of your choice when using this software.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this project, as defined in the Apache-2.0 license, shall be dual-licensed as above, without any additional terms or conditions.
Built primarily with Claude Code.