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. |
||
|---|---|---|
| .forgejo/workflows | ||
| ca | ||
| crates | ||
| docs | ||
| examples/tab-two-member | ||
| scripts | ||
| web | ||
| .gitignore | ||
| Cargo.toml | ||
| Dockerfile | ||
| ims.db | ||
| ims.db-shm | ||
| ims.db-wal | ||
| README.md | ||
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.