Skip to content

Muster v0.1.3 — the intelligent layer, live and checkable

Choose a tag to compare

@mikewalliser mikewalliser released this 15 Jul 18:29
0b6b4cb

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, fastembed running BAAI/bge-small-en-v1.5 on CPU) plus Elk Chat, the in-portal assistant, wired to the portal over the internal elkos-rag network via compose.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_search uses /query only to rank candidate slugs, then re-fetches every candidate through Directus under the caller's own token and re-gates it with buildPageFilter. Retrieval ranks; permissions decide.
    • Hardening: constant-time X-API-Key check on /query//stats/ingest, a fail-closed startup guard (a non-development engine refuses to boot without a key), /docs+/redoc+/openapi.json disabled outside development, a Redis fixed-window rate limiter (default 300/min), and orphaned-vector reconciliation across both stores.
  • Assistant generation is now configurable on the self-host stack (#15). ANTHROPIC_API_KEY and ASSISTANT_MODEL pass through .env to 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), and doctor depends 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-portal documented.
  • 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.md link in the changelog, the dead 34.220.64.149.sslip.io homepage on the GitHub About block, and a paper.html footer that loaded an analytics beacon without linking the privacy disclosure.

Verified live for this release

  • musterr.dev, /paper.html, /privacy.html and the og image are byte-identical to site/ 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_tasks return 200; create, update, and delete all return 403 permission-denied.

Known gaps, stated plainly

  • GHCR packages are private, so ELK_OS_USE_PUBLISHED_IMAGES=true currently needs a docker 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_TOKEN PAT.

Full diff: v0.1.2...v0.1.3