No description
Find a file
Espen M de70708b27 docs(draft): WS-15 guilds scratch — optional hub extension design sketch (Option B)
Explicit DRAFT: flat room URIs preserved + hub-side guild catalog +
client grouping (no new MLS objects; interop-safe). Nested URIs rejected
for now (mimi-core upstream, external); preauth-claims hook and Home
pseudo-guild recorded. NOT for execution — parked pending design.
2026-11-03 00:11:40 +01:00
.forgejo/workflows feat: WS8 client usable — wasm surface + app.js + KTB v1 recovery + deploy scaffolding 2026-10-24 17:37:00 +02:00
ca feat: WS-10 — self-leave (proposal+peer-commit), founder remove, room rename 2026-11-01 21:32:11 +01:00
crates feat: WS-13a — content-ops layer (replies/reactions/edits/retracts/attachments/markdown-native) 2026-11-02 21:58:59 +01:00
docs docs(draft): WS-15 guilds scratch — optional hub extension design sketch (Option B) 2026-11-03 00:11:40 +01:00
examples/tab-two-member chore: initial project commit 2026-07-18 22:01:08 +02:00
scripts feat: WS-10 — self-leave (proposal+peer-commit), founder remove, room rename 2026-11-01 21:32:11 +01:00
web test: WS-1b smoke stages — silent unlock, QR pairing, fallback, legacy migration 2026-10-25 20:09:15 +01:00
.gitignore feat: WS-4 shell — server groundwork + in-repo browser harness; static client retired 2026-10-25 18:07:31 +01:00
Cargo.toml feat: WS8 client usable — wasm surface + app.js + KTB v1 recovery + deploy scaffolding 2026-10-24 17:37:00 +02:00
Dockerfile build: pin wasm-bindgen crate =0.2.126 to match wasm-bindgen-cli 2026-10-24 19:05:35 +02:00
ims.db feat: WS-10 — self-leave (proposal+peer-commit), founder remove, room rename 2026-11-01 21:32:11 +01:00
ims.db-shm feat: WS-10 — self-leave (proposal+peer-commit), founder remove, room rename 2026-11-01 21:32:11 +01:00
ims.db-wal feat: WS-10 — self-leave (proposal+peer-commit), founder remove, room rename 2026-11-01 21:32:11 +01:00
README.md feat: WS-4 shell — server groundwork + in-repo browser harness; static client retired 2026-10-25 18:07:31 +01:00

mimi-ims

A self-hosted MIMI/MLS-based end-to-end encrypted messaging service. Backend embeds mimi-core (Apache-2.0) + openmls (RFC 9420). Browser client loads an OpenMLS engine compiled to wasm32-unknown-unknown.

Status: Phase 1 (deployed PoC). The S5 PoC runs at https://ims.mime.org (Keycloak OIDC, real CA, short-lived certs); the acceptance definition — two users, external-commit join, E2E-decrypted message with display names, recovery-code restore — was demonstrated in production on 2026-10-24. The client is still the discardable test client; Phase 1 (S6) replaces it with a persistent one — session-unlock design in docs/s2-decision-note.md. History on a new device is not recovered by design (MLS forward secrecy; identity-only roaming).

Layout

crates/
  ims-engine/   pure MIMI/MLS engine; builds for native AND wasm
  ims-wasm/     wasm-bindgen browser bindings over ims-engine
  ims-server/   BFF: OIDC session gate, CA + transparency log, claim-once
                keymaterial, profile, recovery/blob, fanout, groupinfo
web/            wasm bundle (pkg/, served via IMS_WEB_DIR) + dev tools
                (bench.html, debug.html). The client UI lives in the web
                monorepo: ~/src/web/apps/ims (Astro + React + @mime/ui).
docs/           decision notes, build plan, conformance matrix
scripts/        build-client.sh (wasm bundle), check.sh (CI gates)
examples/
  tab-two-member/   S1 spike: two tabs, one MLS group, one message

Why MIMI / MLS, not Matrix

MIMI is built around MLS (RFC 9420) end-to-end. Matrix's MLS support is still incomplete. MIMI is pre-standard (draft-ietf-mimi-protocol-06, expires Oct 2026); this project tracks the drafts and accepts the churn.

Build & gates

# Native server (smoke):
cargo build -p ims-server

# Browser client bundle (wasm + wasm-bindgen -> web/pkg):
scripts/build-client.sh

# All CI gates before pushing: tests, engine dep-hygiene (ring/rcgen/openssl
# absent), wasm32 checks, bundle-size gate (<= 1.5 MiB gzipped):
scripts/check.sh

Run locally: set IMS_* env (see crates/ims-server/src/config.rs) and serve with IMS_WEB_DIR=web (the UI shell: pnpm --filter @mime/ims dev in the web monorepo, which proxy-loads /v1, /auth and /pkg from here). Two-profile browser smoke: scripts/smoke_browser.py (playwright; needs a local Keycloak realm — see its docstring). Production compose lives in the infra repo (ims/ directory); image builds via .forgejo/workflows/build-image.yml.