Bendik Aagaard LynghaugandClaude Fable 5.1 f047e21c4a
Test / test (pull_request) Successful in 58s
Memberships: groups kept by portal itself, a person by phone number first
A membership is a case in the built-in portal_memberships bucket:
invited by a desk, a grants, the seed or the responsible pass; active
from the person's first sign-in, when the provider's subject, phone
number or address matches the record; removed by a desk, and invited
again after that. One record per group and person however it was
keyed, and at sign-in every record that matched learns what the
provider verified. The active memberships join the groups claim, so
Cedar sees the same parents as before.

PEOPLE_BACKEND picks Kanidm or memberships; unset, a KANIDM_API_TOKEN
means Kanidm. The NATS access service looks a person's groups up when
a question names them by sub, phone or email and lists none. The
sign-in asks for the phoneNumber scope and reads it from userinfo.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GT37Z1Xtfd9pUuQtMTg6Yt
2026-09-30 13:28:28 +02:00
2026-09-30 08:18:41 +02:00
2026-09-30 08:18:41 +02:00

portal

A content-driven question engine: one Rust binary that turns a Git repo of YAML into a live site — pages, forms, review desks and state machines, with a durable event-sourced record of every answer underneath.

The engine special-cases nothing. Everything a site serves is declared in its content repo, content pushes hot-reload every running instance, and the same build serves any number of sites: instances differ only by environment variables. uhhm.no and redoal.com are two faces of the same binary from the same release artifact.

It composes with the surrounding stack rather than bundling it. Gitea hosts the content, NATS JetStream stores the events and projections, Kanidm provides identity, and anything downstream — automations, newsletters, onboarding — subscribes to the answer stream.

Documentation

Everything is under docs/:

Development

cargo leptos build            # server + wasm
cargo test --features ssr     # tests/jetstream.rs needs PORTAL_TEST_NATS_URL

Content is linted by iris, which depends on this crate and carries the same version, so a content repo can check itself against the exact portal its instance runs:

iris check --path questions

Releasing

cargo release patch tags and pushes; CI builds the tarball and attaches it to the Gitea release. A site takes it by bumping PORTAL_RELEASE in its own content repo. See operations.

S
Description
A Leptos/Axum onboarding portal — question/alternative content engine with a crypto-chain audit trail, Kanidm-gated content, and NATS-backed resources.
Readme
2.6 MiB
v0.6.23
Latest
2026-10-07 09:25:08 +00:00
Languages
Rust 92.6%
JavaScript 4.2%
CSS 3%
Shell 0.2%