Phase 4: Web UI. Rust/Axum AppView that indexes document/grant/keyring records from the PDS for search and browsing. SPA frontend (React or Yew, TBD) with client-side crypto via opake-web (opake-core compiled to WASM via wasm-pack). The opake-core Transport trait is injected with a FetchTransport that uses browser fetch via web_sys. Architecture is already designed: opake-web crate exposes flat wasm_bindgen async functions, React calls them directly. All crypto stays in WASM, never in JS.
Phase 4: Web UI. Rust/Axum AppView that indexes document/grant/keyring records from the PDS for search and browsing. SPA frontend (React or Yew, TBD) with client-side crypto via opake-web (opake-core compiled to WASM via wasm-pack). The opake-core Transport trait is injected with a FetchTransport that uses browser fetch via web_sys. Architecture is already designed: opake-web crate exposes flat wasm_bindgen async functions, React calls them directly. All crypto stays in WASM, never in JS.