Setup
Clone the repository, then from its root:
make install # uv sync --all-packages
make test # uv run --all-packages pytest -q — the wrapper, converter and web packages
cd frontend && bun install && bun run test # the campaign browser
The repository is a uv workspace: the root pyproject.toml declares
members = ["packages/*"], the single root uv.lock pins every member, and
the shared virtualenv lives at the repository root. Always sync with
--all-packages — a plain uv sync prunes the venv back to the virtual root
plus the dev dependency group and drops the members. uv manages the
virtualenv and the lockfile; there is no separate pip install -e . step.
The frontend is a separate Bun/SvelteKit project under frontend/
(Web front & read API).
make check runs ruff format and ruff check --fix; make typecheck runs
ty on the wrapper, converter and web packages against the workspace venv;
make ci runs the type check and then the dagger checks and test
functions, which is what CI runs — a green make ci locally is a strong
signal that a pull request passes (CI). Constants for a dev cluster
(registry, S3 endpoint, namespace, release) come from .env
(Dev cluster).
The repository
| Path | What it is |
|---|---|
packages/wrapper |
The in-pod wrapper: IIIF fetch, streaming, resume, verify, publish, live run log, warm-up entrypoint, ALTO provenance |
packages/converter |
htrflow-campaigns: validate, render and apply a campaigns repo |
packages/web + frontend |
The read API and the SvelteKit campaign browser, one image |
charts/htrflow-batch |
The Helm chart: Kueue queues, RBAC, NetworkPolicies, Kyverno policies, the web front |
charts/htrflow-devstack |
S3, an image registry and the NVIDIA device plugin for a disposable dev cluster |
examples/campaigns |
The shape of a campaigns repository, with its CI |
.docker/ |
The image recipes and the Quickstart compose stack |
docs/ |
This site. docs/features/ holds one story per deliverable, kept out of the site |
scripts/ |
The line budgets (scripts/loc-budget.sh, a CI step), the generated configuration reference, the docs lint |
Each version lives next to what it versions: the charts' Chart.yaml
files, the packages' pyproject.toml files, and KUEUE_VERSION and
KYVERNO_CHART_VERSION in the Makefile (Releasing).
Tests first
New behaviour gets a failing test before the implementation that makes it pass, and every bug found on a real cluster becomes a regression test, not only a fix. Testing has the four test levels and how to run each one.