How the local stack runs: infrastructure in Docker and application services natively with hot reload.
The development stack runs infrastructure in Docker and application services natively with hot reload:
Run once per machine after cloning:
It installs the mold linker (a hard
requirement; the dev recipes won’t link without it) plus sccache, and points
every git worktree at a single shared cargo target-dir so a new worktree
reuses the already-built dependency graph instead of cold-building from scratch.
When the repo is on a slow mount (9p/NFS/SMB, e.g. a WSL2 or Docker-Desktop
dev container backed by a Windows drive), it relocates that target dir to fast
local storage under ~/.cache/regelrecht/, which is usually the biggest
build-time win. sccache is installed but left off locally (it disables
incremental compilation, which hurts the hot-reload loop); CI uses both.
This command:
When you only need to work on a frontend, just dev-frontend starts just the
components that frontend needs (its backend, PostgreSQL, the engine WASM, and
the Vite dev server with HMR) and skips Grafana, Prometheus, and the workers.
| App | URL | Backend | DB | Notes |
|---|---|---|---|---|
| editor | http://localhost:7300 | editor-api :8000 | yes | real SSO, needs .env.sso-local; hosts the Corpusinwinning section |
| harvester-admin | API only (UI is the editor’s Corpusinwinning section) | admin API :8000 (:8001 when all run together) | yes | in all, editor-api proxies /api/harvest-admin/* here |
| lawmaking | http://localhost:7500 | none | no | static, no backend |
Notes:
cargo run (not cargo watch); Vite keeps HMR for
the frontend. Restarts after the first build are near-instant because the
Rust artifacts are reused (see One-Time Setup)..env.sso-local (copy .env.sso-local.example and fill in the values, see
Auth and roles). Use Chrome or Firefox: the session cookie
is Secure and only those send it over http://localhost. The default port
7300 (and 7500) are the redirect URIs already registered on the
regelrecht-local Keycloak client. Override ports with EDITOR_PORT /
LAWMAKING_PORT.just dev-frontend and just dev are mutually exclusive: they share
.dev-pids and ports, so run one at a time. just dev-down stops either.localhost, set DB_HOST=host.docker.internal in .env (admin / just dev
paths); the editor takes that host from DATABASE_URL in .env.sso-local.For running everything in Docker without hot reload:
Create a .env file in the project root:
Five binaries read these variables: editor-api, admin, and the three pipeline
binaries (harvest worker, enrich worker, pipeline API). The harvester CLI builds
its own subscriber and reads only RUST_LOG.
| Variable | Values | Default | Effect |
|---|---|---|---|
RUST_LOG | tracing filter | info (harvester CLI: warn) | Which events are emitted |
LOG_FORMAT | text (plain), json | text | Output format |
LOG_SPAN_EVENTS | none, close, new, active, full | per service: close for editor-api, none elsewhere | Per-span timing lines |
LOG_FORMAT=json writes one JSON object per event. The event’s own fields are
flattened to the top level; the enclosing spans are added as nested span and
spans keys, so a log backend can search per field. Set it per deployment in
ZAD; locally the text lines read better, so leave the variable unset. An
unrecognized value falls back to text and warns on stderr, so a typo never
silences logging.
Install pre-commit hooks:
Hooks run automatically on commit:
just format)just lint)just validate)An exploration by Bureau Architectuur of the Dutch Ministry of Economic Affairs and Climate Policy into the possibilities of transparent, executable legislation.
GitHub repository
How it works
Stay informed
Roadmap (Dutch)
Documentation
Research
Bureau Architectuur
Ministry of Economic Affairs and Climate Policy