Muster v0.1.3 — the intelligent layer, live and checkable
The release that puts the intelligent layer in front of the public, and then audits every claim the project makes about itself.
Live: musterr.dev (landing + whitepaper) · app.musterr.dev (portal, read-only demo login demo@muster.dev / muster-demo)
Added
- The intelligent layer ships in the demo (#12, #13). A local RAG engine (FastAPI + Postgres + Qdrant + Redis,
fastembedrunningBAAI/bge-small-en-v1.5on CPU) plus Elk Chat, the in-portal assistant, wired to the portal over the internalelkos-ragnetwork viacompose.portal.rag.yaml(ELK_OS_WITH_INTELLIGENCE, default true). Embeddings are local and keyless: no API key, no quota, no document text leaving the box.- The load-bearing design decision: the engine is an untrusted ranking oracle. It indexes gated and unpublished pages, so
kb_searchuses/queryonly to rank candidate slugs, then re-fetches every candidate through Directus under the caller's own token and re-gates it withbuildPageFilter. Retrieval ranks; permissions decide. - Hardening: constant-time
X-API-Keycheck on/query//stats/ingest, a fail-closed startup guard (a non-development engine refuses to boot without a key),/docs+/redoc+/openapi.jsondisabled outside development, a Redis fixed-window rate limiter (default 300/min), and orphaned-vector reconciliation across both stores.
- The load-bearing design decision: the engine is an untrusted ranking oracle. It indexes gated and unpublished pages, so
- Assistant generation is now configurable on the self-host stack (#15).
ANTHROPIC_API_KEYandASSISTANT_MODELpass through.envto the portal container. Previously both were documented but reached nothing. - Privacy-respecting analytics (#9, #10, #11). Self-hosted Matomo, first-party, IP-anonymized, and skipped entirely for browsers sending Global Privacy Control, disclosed on a public privacy page.
Changed
- A full currency audit of every public claim (#15), run as a six-agent fan-out against the code and the live deployment, then adversarially verified. The corrections are the interesting part:
- The whitepaper claimed SSE streaming for Elk Chat. The shipped route is a blocking JSON POST with per-user rate limiting. Claim removed.
- The README claimed the RAG engine had no published ports. Every target publishes it on loopback (
127.0.0.1:19100), anddoctordepends on that. Now stated precisely. - "An orphaned vector can never answer" was too absolute: the engine's one-hour query cache can serve a pre-delete answer. The caveat is now in the text.
- Stale comments corrected across
compose.rag.prod.yaml("the portal does NOT consume the RAG API" — it does),.env.example, and the release-please workflow (#16).
- README: badges, a live-board hero, a six-command quickstart that matches the site and the paper, a "why not just a plain Claude Code session?" comparison, and
logs/rebuild-portaldocumented. - Whitepaper: a dated 2026-07-14 postscript covering what is now checkable from a browser, including an honest correction that the demo box currently runs always-on rather than duty-cycled.
Fixed
- Dead
LICENSE-RECOMMENDATION.mdlink in the changelog, the dead34.220.64.149.sslip.iohomepage on the GitHub About block, and apaper.htmlfooter that loaded an analytics beacon without linking the privacy disclosure.
Verified live for this release
- musterr.dev,
/paper.html,/privacy.htmland the og image are byte-identical tosite/in this tag, on real Let's Encrypt TLS; the Directus Studio stays unexposed (302 to apex). - The demo login is read-only: reads on
os_tasksreturn 200; create, update, and delete all return 403 permission-denied.
Known gaps, stated plainly
- GHCR packages are private, so
ELK_OS_USE_PUBLISHED_IMAGES=truecurrently needs adocker login ghcr.io; the published portal tag predates the intelligent layer, so build locally for the current pin. - release-please cannot open its own PR under the enterprise policy (the org forces the Actions token read-only), so releases including this one are cut by hand from the branch it computes. The recipe is documented in the workflow header; the fix is a
RELEASE_PLEASE_TOKENPAT.
Full diff: v0.1.2...v0.1.3