Frontend ↔ engine wiring status
What the shipped UI (ui/src) talks to, and what still needs backend work to be
fully real. The UI runs fully mocked with no backend (see ui/README.md — the
fast loop); this file tracks the gaps between that mock and the live engine.
Bridge: ui/src/ipc.js → ui_server.py HTTP (loopback, token-auth) for state,
plus Tauri commands in ui-shell/src-tauri/src/lib.rs for window/OS actions.
Wired and working
| UI capability | Backend |
|---|---|
| Hydrate + live updates | GET /api/state, SSE GET /api/events |
| Model / shortcut / theme / startup / device | PATCH /api/config |
| Hotwords add/remove | POST / DELETE /api/hotwords |
| History list / clear | GET / DELETE /api/history |
| Note recording (start/stop/pause/resume/toggle) | POST /api/notes/* |
| Provider API keys | POST / DELETE /api/api-keys for advanced/BYO-key paths |
| Doctor | POST /api/doctor |
| Export note as Markdown | Tauri save_text_file (OS dialog) ← ipc.saveTextFile; browser-download fallback |
| Privacy pill (on-device ↔ online) | PATCH /api/config model swap for advanced/BYO-key paths; Dictate Pro should use entitlement-backed hosted access |
| Update check + run + restart | GET /api/update-status, POST /api/update, Tauri restart_app ← ipc.restartApp |
Needs wiring (gaps against the new UI)
-
Update background-prepare. The Update pill has a
available → preparing → readyprogression, but live mode has no prepare step — clicking runs download+pkexec+install in one go viaPOST /api/update. To match the staged UX, addPOST /api/update/prepare(download the.debin the background, report progress), have/api/updateinstall the prepared file, then the UI callsrestart_app. Optionally push download progress over the SSE/api/eventschannel so the pill can show a real bar.- Frontend marker:
App.jsxuseEffectlaunch flow has aTODO(backend): /api/update/preparenote; mock simulates the staging.
- Frontend marker:
-
Skip persistence.
App.jsxstoresskippedVersioninlocalStorage(per-webview, lost on cache clear). Move it to a server-side pref (ui-prefs.jsonvia a config route) so "Skip this version" is authoritative and survives reinstalls. "Later" (dismiss) is correctly session-only. -
Update path E2E. The download →
pkexec apt-get install→restart_appflow is unit-tested with mocks only (tests/test_update_status.py). First real exercise needs a newer published release: verify the polkit prompt, the atomic file swap, and that the new shell + engine come up together. -
Local Meeting model lanes. The capture home exposes a plain
Meetingaction and routes it to strict backend meeting endpoints. Live meeting mode now fails closed unless the selected backend supports speaker-attributed output. The remaining gap is implementing and benchmarking the local DiariZen, Sortformer, and pyannote speaker-attribution lanes fromdocs/TRANSCRIPTION_PLAN.md. -
WhisperX backend. UI metadata exists for
whisperx, butdocs/TRANSCRIPTION_PLAN.mdsays not to make WhisperX the main meeting stack. Keep it advanced/experimental unless that plan changes. -
Dictate Pro / subscriptions. Architecture exists in docs (
dictate-pro-subscription-architecture.md,msstore-in-app-subscriptions.md, archived provider cost notes) but there is no frontend surface yet. Production P0: public Upgrade to Pro on https://arcforge.au/download/dictate is live but still links to/loginuntil Stripe product + account entitlements are wired (seedocs/archive/goals-2026-07-05.mdfor the historical goal note andarc-forge-website/STATUS.mdfor website state). To wire in this repo: entitlement/subscription state inGET /api/state, a Pro affordance in the UI, checkout/portal deep links from the app, MS Store IAP (Windows) where applicable, and service-side entitlement checks before hosted meeting upload. Do not expose Arc Forge's hosted provider key or a primary switchable-backend workflow in the Pro UI.