Morphee — Progress & Next Steps
Last Updated: February 22, 2026 (V1.5 gaps closed — ready for tagging)
See also:
- V1.0 Deployment Tasklist for the release checklist
- 📊 Audits Dashboard for real-time code quality metrics and audit status
- Audit Metrics JSON for programmatic access to findings data (run
python audits/aggregate-metrics.pyto generate)
Unified Paradigm: Knowledge Pipeline + Runtime Hierarchy
IMPORTANT: The roadmap uses version-driven layers (not numbered phases). The architecture is unified by two core concepts:
Knowledge Pipeline
Every piece of knowledge in Morphee flows through a lifecycle: USE → EXTRACT → COMPILE → SHARE → INSTALL → USE. A Space (family recipes, classroom curriculum, team runbook) can be extracted, PII-stripped, compiled into an installable Integration, shared via the marketplace, and installed into another Space. Knowledge flows up the compilation chain as it matures.
Runtime Hierarchy (BaseMorphRuntime)
All execution goes through a unified BaseMorphRuntime contract. The VectorRouter tries the cheapest option first:
| Level | Runtime | What runs | Cost |
|---|---|---|---|
| — | VectorRouter | Direct memory recall (0.92 threshold) | Free |
| 0 | LLMRuntime | Raw reasoning, creative tasks | $$$ (last resort) |
| 1 | PythonRuntime | Structured skills, orchestration | $ |
| 2 | JSRuntime | Canvas components, interactive UI | $ |
| 3 | WasmRuntime | Compiled extensions (JIRA, GitHub, Notion) | ¢ |
Version layers:
- V0.9 — Product Completeness ✅ SHIPPED
- V1.0 — OpenMorph Revolution + Offline-First Data ✅ SHIPPED (git-native
.morph/directories, Knowledge Pipeline foundation) - V1.2 — Extension Ecosystem ✅ SHIPPED (WasmRuntime,
wasmer5.0, marketplace, professional integrations as WASM) - V1.3 — Multimodal Interaction ✅ SHIPPED (multi-modal identity for kids, video, gesture, interactive UI)
- V1.5 — Local AI ✅ SHIPPED (LLMRuntime local: candle/GGUF, voice channel, TTS/STT)
- V2.0 — Production Platform (monitoring, channels, browser extension)
- V2.5+ — Future/Optional (self-aware AI, crypto marketplace)
See ROADMAP.md for full details and architecture.md for the Runtime Hierarchy.
Remaining Before V2.0
Everything through V1.5 is shipped. The following items remain before V2.0:
Deferred V1.3 hardening — ✅ DONE (Feb 22, 2026):
- Liveness detection (face + voice) — multi-frame pixel variance, spectral flatness, pitch variance, challenge state machine
- Biometric template rotation — 180-day expiry, 7-day grace period, prev-template fallback, re-enroll endpoint + dialog
- Voice-only accessibility mode — VoiceOnlyMode.tsx, speech recognition, TTS, voice command parser (en/fr)
- Video frame extraction hardening — timeout, partial frames, onProgress callback, browser compat check
- Gesture → chat action polish — 3 new actions (read_last, new_conversation, toggle_chat), confidence bar, retry hint
- Cargo build verification —
--features local-llm,audio,biometricspasses (candle 0.9 API fixes) - E2E scenarios — inline-edit-card, drag-list-items, drag-kanban-cards + data-testid attributes
- CI — combined-feature cargo check step in rust-tests.yml
V0.9 tech debt (~1-2 weeks):
- 38 code quality audit items (code audit clean as of Feb 21)
- Branding/logo (
M-DESIGN-003)
V1.5 gaps — ✅ CLOSED (Feb 22, 2026):
- Whisper language selection —
languageparam in transcribe IPC, auto-detect fallback - Apple Accelerate framework —
candle-core/acceleratefeature enabled for BLAS/vDSP on Apple Silicon - Download cancellation —
llm_cancel_downloadIPC command, AtomicBool flag, partial cleanup - Docs audit (M-XREF-001, L-STD-001) — 25+ broken links fixed in audits/ and docs/
- i18n Rust errors (L-RUST-001) — 19 structured error codes (
E_LLM_*,E_AUD_*,E_BIO_*,E_VAULT_*,E_DL_*), EN+FR locales
Mobile shipping (~1-2 weeks):
- Physical device testing (iOS + Android)
- App Store + Google Play submission
SSO Tier 2 (~1 week):
- GitHub, Discord, Slack SSO providers
Total: ~5-7 weeks to V2.0-ready state
✅ Completed: Layer 2 — Product Completeness (V0.9 RC)
Status: Release Candidate — February 19, 2026 Goal: Complete remaining UX polish items and audit fixes to reach production-ready state.
✅ Completed:
- Complete Phase 3e.4 final item:
M-DESIGN-003— Branding + logo (deferred to post-V0.9) - Complete audit fixes: 252/274 items fixed (92.0%)
- Legal: 98.0% complete (1 code item fixed: multi-group DSAR)
- Security: 95.7% complete (5 items fixed: SSRF, rate limits, PII exposure, security headers, OAuth allowlist)
- Accessibility: 96.6% complete (WCAG 2.1 AA - 2 items fixed: contrast ratios, Select aria-describedby)
- Product: Deferred professional integrations to V1.2 WASM Extensions
- Code Quality: 38 items remaining (accepted as technical debt for V1.0)
- Documentation: 9 items remaining (will refresh with V1.0)
- i18n: 12 items remaining (V1.0 with full locale support)
- Performance: 7 Low items (measured, acceptable for V0.9)
- Phase 3j — Settings as Integration: Conversational settings via AI chat (Feb 18)
- Tagged V0.9.0-rc.1 — Release Candidate
Highlights:
- 5,258 total tests passing (2,014 backend + 165 Rust + 3,016 frontend unit + 63 E2E)
- 84% backend coverage, 75% frontend statement coverage
- WCAG 2.1 AA compliance (96.6%)
- GDPR-compliant (98.5%)
- Production-ready security posture (95.7%)
See V1.0 Deployment Tasklist for V1.0 release tracking.
✅ Completed: Vector-First Architecture (February 20, 2026)
Status: Implemented — active on all chat messages Goal: Use the vector database as the primary routing layer before every LLM call. Save 50–65% of Claude API calls for typical usage.
What Was Built
-
backend/chat/vector_router.py—VectorRouterwith three route types:DIRECT_MEMORY(similarity ≥ 0.92) — return stored fact/preference, zero LLM callsSKILL_EXECUTE(similarity ≥ 0.88, no required params) — run skill directly, zero LLM callsSKILL_HINT(similarity ≥ 0.83) — guide LLM to correct skill, saves tool-selection round-trip
-
VectorStore.store_if_novel()— deduplication before memory insert (threshold 0.95) -
VectorStore.delete_by_content()— cleanup for skill index entries - Skill vectorization in
SkillService:_index_skill()— embed name + description →skill_indexmemory entry on create_deindex_skill()— remove entry on update/deletereindex_all_skills()— rebuilds full index at startup
-
ConversationSummarizerupdated — usesstore_if_novel()everywhere -
_stream_orchestrator_responsewired — VectorRouter runs in parallel with RAG + user context fetch -
_execute_skill_stream— direct skill execution helper (no orchestrator) - Skill vector reindex at startup in
main.py
Pending (future phases)
- Canvas component indexing (after canvas-first redesign)
- Navigation intent indexing (after Space routing redesign, V1.0)
- LanceDB equivalents (desktop offline path, V1.5)
✅ Completed: Layer 3 — OpenMorph + Canvas-First + Offline-First (V1.0)
Timeline: ~8 weeks → DONE
Status: Complete — tagged v1.0.0 February 21, 2026
Breaking Change: All existing Spaces migrate to .morph/ format (migration script: scripts/migrate_v09_to_v10.py)
Key insight (Feb 20, 2026): Offline-first data and sync move from V1.5 → V1.0. OpenMorph's git-native architecture is the offline sync engine — no separate work. What stays in V1.5 is local LLM inference (candle/GGUF). Web client remains cloud-dependent by design (no Tauri layer for git/LanceDB/GGUF).
V1.0 Work Stream A: Canvas-First UX Redesign
Vision: Morphee is not a chat app with cards. It's a spatial canvas that fills up as you talk. The chat thread is just one integration — accessible but not the default view.
Key decisions (locked Feb 20, 2026):
- Spatial free-form canvas — components draggable and repositionable by user
- Persistent across sessions — AI can archive components to memory, but they stay by default
- Space-scoped — each Space has its own canvas (
canvas.yamlin V1.0.morph/) - AI controls:
place_component(position_hint),update_component,dismiss_component → archive to memory,minimize_component - Chat panel: collapsible right-side drawer; last AI message previewed above input
Why it cross-features with OpenMorph:
Canvas state lives in .morph/canvas.yaml — it's Git-native, portable, time-navigable. "Show me my canvas from last week" just works.
Phase A — Layout swap ✅ DONE (Feb 20, 2026)
- New
Canvas.tsxreplacesChat.tsxas the primary route at/,/chatpreserved - Chat conversation thread → collapsible right
Sheetdrawer (💬 button + LastMessagePreview click) -
LastMessagePreviewstrip — last AI message above input, click to open thread - Canvas renders
CanvasCardcomponents with absolute % positioning and auto-layout 3-column grid - Floating input bar at bottom (attach, voice, send, stop streaming)
- Bonus (Phase B/C work done early): Drag to reposition cards (mousedown/move/up on header)
- Bonus: Minimize/close per card (toggle header button)
- Bonus:
canvasPositions+minimizedComponentspersisted tolocalStoragevia Zustandpersist -
componentStoreupdated —setCanvasPosition,toggleMinimize,persistmiddleware, auto-layout
Phase B — AI spatial placement (Week 2) ✅ DONE (Feb 20, 2026)
-
ComponentSpecgets backendcanvasfield:CanvasPosition(x, y)+CanvasPositionin frontend types - Position hint mapping: 10 named slots (
top-left→bottom-right+full-width) → x/y % matching GRID_SLOTS -
FrontendIntegrationextended:_POSITION_HINT_PARAMon all 8 render actions,_resolve_canvas(),_spec_result()propagates_canvas - System prompt updated: canvas placement section with position_hint instructions
-
componentStore.renderComponentuses spec.canvas (AI hint) over auto-grid (user drag still highest priority) - Canvas component indexing in
VectorRouter(canvas_componentmemory_type) — deferred to Phase C
Phase C — Canvas persistence (Week 3) ✅ DONE (Feb 20, 2026)
-
dismiss(component_id, title, summary)— archives content tocanvas_componentmemory via_archive_dismissed_component()if context has group_id - VectorRouter
canvas_componentmemory_type — added to_check_memoryparallel search (same 0.92 threshold); dismissed cards answerable without LLM - System prompt updated — AI instructed to provide title+summary when dismissing info cards; omit for progress bars
- Canvas empty state improved — dashed card wireframe illustration + two-line hint text, EN+FR i18n keys
-
canvas.yamlserialization → deferred to V1.1 by design (component UUIDs are ephemeral per AI render; named persistent canvas objects are a V1.1 concept)
V1.0 Work Stream B: OpenMorph Revolution
Original design doc: features/archive/2026-02-16-git-native-spaces-openmorph.md Canonical spec: features/OPENMORPH_SPECIFICATION.md ✅ locked Feb 20, 2026
Phase 0 — OpenMorph Specification ✅ DONE (Feb 20, 2026)
-
docs/features/OPENMORPH_SPECIFICATION.md— canonical.morph/schema (880 lines) - All 9 file schemas defined:
config.yaml,acl.yaml,canvas.yaml, task Markdown, skill YAML, schedule YAML, conversations, memory,vault/ - Updated spec:
core.*naming for built-ins, reverse-domain for third-party, manifest.yaml required per integration directory - V1.0 PostgreSQL Schema Reset — 26 incremental migrations consolidated into single clean
supabase/migrations/20260220000000_v1_0_schema.sql. Old migrations archived tosupabase/migrations/archive/. Removed unused tables (conversation_summaries,git_commit_metadata,git_commit_embeddings). Addedspaces.morph_path+spaces.migrated_atfor OpenMorph bootstrap. Updatedmemory_vectors.memory_typeCHECK to includeskill_indexandcanvas_component. Createdsupabase/reset.sqldev helper.
Phase 1 — Generic .morph/ Protocol + Dual-Write (Feb 20, 2026) ✅ DONE
Key architectural decision (Feb 20): The
.morph/directory is modeled after Android app storage. Each integration owns a sandboxed subdirectory. Morphee.ai is the namespace authority (like IANA). Two-way communication: integrations can emit and subscribe to events AND read/write their.morph/directory.
-
GitStoregeneric entity API —save_entity,load_entity,delete_entity,list_entities(path-based, any integration uses these) -
BaseInterface.morph/protocol —morph_directory,morph_root_access,morph_capabilities,morph_write/read/list/delete,get_manifest()morph_write()auto-bootstrapsmanifest.yamlon first write to a directory- capabilities declared now (enforced in V1.2 WASM sandbox)
- All 11 integrations declare
morph_directory+morph_capabilities:- Built-ins:
core.tasks,core.skills,core.memory,core.scheduler,core.canvas,core.filesystem,core.notifications - Third-party:
com.google.calendar,com.google.gmail,com.slack,net.atlassian.jira
- Built-ins:
-
TaskServicedual-writes tocore.tasks/task-{id}.md(YAML frontmatter +linked:graph field) -
SkillServicedual-writes tocore.skills/{slug}.yaml - Serialization owned by each service layer (GitStore is pure I/O)
- 24 tests: generic entity API + TaskService serialization roundtrips
Week 2 — Schedules + Config + ACL → Git ✅ DONE (Feb 20, 2026)
-
CronIntegrationdual-writes tocore.scheduler/{slug}.yamlon create/cancel (morph_write/morph_delete) -
SpacesIntegrationevent-driven bootstrap:config.yaml+canvas.yaml+acl.yamlwritten onspace.created -
config.yamlupdated onspace.updated(canvas + acl preserved) -
SpaceService._space_to_config_yaml(),_canvas_yaml(),_acl_yaml()serialization helpers -
ScheduleService._schedule_to_yaml()+_name_to_slug()serialization helpers
Week 3 — Conversations → Git ✅ DONE (Feb 20, 2026)
-
ConversationIntegrationmirrors conversation lifecycle tocore.conversations/conv-{id}.md - Subscribed to
conversation.created/conversation.updated/conversation.deletedevents -
ChatServiceemits all three conversation events (verified wired) -
ConversationIntegrationregistered inmain.pyat startup - PostgreSQL
conversations+messages→ write-through read cache — implemented via event-driven dual-write (ChatService → EventBus → ConversationIntegration → GitStore). PostgreSQL remains source-of-truth with Git as read cache. - Full migration script —
scripts/migrate_v09_to_v10.py(372 lines, dry-run mode, idempotent) -
canvas.yamlserialization — deferred to V1.1 by design (§3.3: ephemeral cards stay in localStorage for V1.0; persistent named canvas objects are a V1.1 concept)
Phase 2 — Discovery + Sync (Weeks 4–5)
- Tauri:
morph_discovercommand (scan filesystem for.morph/directories) - Tauri:
morph_initcommand (turn any directory into a Morph Space) - Three sync modes:
local-only/morphee-hosted/git-remote - Backend:
MorphDiscoveryService+ register/sync endpoints - Frontend:
SpaceDiscoverypage,MorphInitDialog - Sync status indicator per Space in sidebar
Phase 3 — Timeline UI + Polish (Week 6)
-
TimelineRenderercomponent (visual git log) -
MemoryTimelinepage — browse any Space state at any point in time - Branch selector dropdown in Space header
- "Create experimental branch" → AI creates git branch
- Conflict resolution dialog (AI-mediated merge)
- Navigation intent indexing in
VectorRouter(nav_indexmemory_type)
V1.0 Work Stream C: Offline-First Data + Sync (Tauri)
Parallel with OpenMorph Phase 2 (Weeks 4–5) — The sync engine IS OpenMorph V1.0 Phase 3. Work Stream C adds the action queue and UX around disconnection.
Web note: The web client (
app.morphee.app) has no Tauri layer. Offline for web = Service Worker + IndexedDB cache (already shipped asM-FEAT-010). No git, no LanceDB, no local LLM on web — this is by design.
- ✅
ActionQueue— JSON-file-backed queue in Tauri for pending offline writes (send_message, create_task, etc.) —action_queue.rs, 8 tests - ✅ Tauri
queue_action/drain_queue/get_queue_status/remove_queued_action/clear_queueIPC commands —commands/queue_commands.rs(+5 commands, total 30 IPC) - ✅ Network status detector — browser
online/offlineevents + Tauri queue polling —useNetworkStatushook - ✅
networkStore(Zustand) —isOnline,pendingActionsCountreactive state - ✅ Offline indicator —
OfflineBadgecomponent in Header: "No internet" / "Working offline" + pending count badge - ✅
tauriQueueTypeScript wrappers inlib/tauri.ts - JWT grace period extension — 72-hour offline grace period; session persisted to vault; restored on startup
- E2E offline tests — 3 scenarios: offline-indicator, offline-graceful-degradation, offline-queue-and-sync; NetworkAction added to controller
What's already done (no new work needed):
- ✅ Data in
.morph/git repos — offline reads are free (OpenMorph) - ✅ Auth cached in OS keychain (keyring crate, done in Phase 2b)
- ✅ Canvas in localStorage (done Canvas Phase A)
- ✅ Sync on reconnect via
git push/pull(OpenMorph V1.0 Phase 3)
V1.0 Cross-Feature Opportunities
| Feature A | × | Feature B | = Combined Capability |
|---|---|---|---|
Canvas in .morph/canvas.yaml | × | Temporal navigation | "Show me my canvas from last week" |
| Tasks in Git | × | Canvas components | Task cards on canvas stay in sync with .morph/tasks/ |
| Skills in Git | × | Skill vectorization | Skills portable + always vector-indexed on load |
| dismiss_component → memory | × | VectorRouter DIRECT_MEMORY | Dismissed cards answerable without LLM |
| Discovery | × | Canvas per Space | Open any folder → its canvas loads immediately |
| git-remote sync | × | Existing project repos | Devs drop .morph/ into ~/Projects/TechCorp → AI context |
| ActionQueue (offline) | × | OpenMorph sync | Offline actions auto-replay on git push/pull reconnect |
| Offline-first (Tauri) | × | git-native | AI keeps working, data stays safe, syncs when back online |
V1.0 offline story (Tauri): data ✅, auth ✅, canvas ✅, sync ✅, AI responses need cloud → completed in V1.5 with local LLM.
After V1.0: Layer 4 (V1.2 WASM Extensions) and Layer 5 (V1.3 Multimodal) both shipped Feb 21-22, 2026.
✅ Completed: Layer 4 — WASM Extension System (V1.2)
Timeline: 12 weeks (6 phases)
Status: SHIPPED — Tagged v1.2.0 (February 21, 2026)
Goal: Production-grade WASM extension system. Professional integrations (JIRA, GitHub, Notion, Linear, Slack) rebuilt as portable WASM modules. Marketplace for community extensions.
Architecture: BaseMorphRuntime abstraction → WasmRuntime on both Python (wasmtime) and Rust (wasmer). Extensions use WIT interface, sandboxed with permissions, resource limits, and code signing.
V1.2 Phase 1: Foundation (Weeks 1-2) ✅ DONE
- Python backend:
backend/extensions/module (models, runtime, host_functions, manager) — 48 tests - WIT interface definition (
wit/morphee-extension.wit) - Database migration:
installed_extensionstable (supabase/migrations/20260301000000_extensions.sql) - Rust runtime:
frontend/src-tauri/src/extensions/module (models, permissions, wasm_runtime) — 20 tests - Rust SDK:
sdk/morphee-sdk-rust/withExtensiontrait +export_extension!macro — 5 tests - Echo extension:
extensions/echo/(echo + reverse actions, compiles as cdylib) - ~73 tests (48 Python + 20 Rust + 5 SDK)
V1.2 Phase 2: Security & Permissions (Weeks 3-4) ✅ DONE
-
PermissionEnforcer— per-host-function permission checks, SSRF domain blocking, manifest validation — 23 tests -
ResourceLimiter— fuel, memory, HTTP rate limits, timeout tracking, limit validation — 18 tests -
ExtensionSigner— RSA-PSS + SHA-256 code signing, sign/verify roundtrip — 15 tests -
ExtensionAuditService—extension_executionstable, buffered writes, stats queries — 8 tests - Frontend:
PermissionDialogcomponent with risk-level indicators — 5 tests - Database migration:
extension_executions+ signature fields oninstalled_extensions - Wired into
ExtensionManagerandhost_functions.py - ~69 tests (64 Python + 5 frontend)
V1.2 Phase 3: Distribution (Week 5) ✅ DONE
-
RegistryClient— OCI Distribution Spec client (search, pull, manifest, list_versions) — 15 tests - REST API: 8 endpoints (
/api/extensions/*— catalog, installed, install, uninstall, enable, disable, execute, audit) — 16 tests - Frontend API client:
extensionsobject inapi.ts(catalog, installed, install, uninstall, enable, disable, execute, audit) - CLI tool:
morphee-ext(init, build, test, sign, publish) atsdk/morphee-ext-cli/ - Router registered in
main.py, wired to app state - ~36 tests (31 Python + 5 frontend)
V1.2 Phase 4: Developer Experience (Weeks 6-7) ✅ DONE
- SDK examples:
echo.rs,hello_api.rs,task_creator.rsinsdk/morphee-sdk-rust/examples/ -
cargo-generatetemplate atsdk/templates/extension-template/(Cargo.toml, src/lib.rs, manifest.json) - Dev server with hot reload:
morphee-ext dev(mock host functions, HTTP test endpoint, file watcher) - SDK README: comprehensive guide (quick start, API, permissions, resource limits, runtime compat)
- Developer guide:
docs/features/extension-developer-guide.md(full walkthrough, manifest, permissions, host functions) - CLI
devcommand wired intomorphee-exttool - ~21 tests (16 dev server + 5 CLI init)
V1.2 Phase 5: Built-in Extensions (Weeks 8-10) ✅ DONE
- JIRA extension (6 actions: list/get/create/update/comment/transition) at
extensions/jira/ - GitHub extension (6 actions: list_issues/get_issue/create_issue/list_prs/comment/merge_pr) at
extensions/github/ - Notion extension (4 actions: create_page/update_page/get_page/search) at
extensions/notion/ - Linear extension (4 actions: create_issue/update_issue/list_issues/comment) at
extensions/linear/ - Slack extension (3 actions: send_message/list_channels/read_messages) at
extensions/slack/ -
ExtensionOAuthHandler— generic OAuth flow for WASM (authorize URL, callback, vault storage) — 14 tests - OAuth API endpoints:
POST /{id}/oauth/authorize,GET /{id}/oauth/callback,GET /{id}/oauth/status - All extensions declare OAuth config in manifest for backend-mediated flow
- ~14 tests (OAuth handler)
V1.2 Phase 6: Marketplace UI (Weeks 11-12) ✅ DONE
- Marketplace page (
frontend/src/pages/Marketplace.tsx) — catalog grid, search, browse/installed tabs - Extension components —
ExtensionCard,ExtensionDetail,InstallDialog,PermissionDialog - Settings:
ExtensionsTab— manage installed, enable/disable toggle, audit stats, uninstall -
/marketplaceroute in App.tsx, "Extensions" nav item in Sidebar (Puzzle icon) - Zustand store (
extensionStore.ts) + hooks (useExtensions,useExtensionCatalog) - i18n strings (EN + FR) for all extension/marketplace UI
- Extension auto-updater (
backend/extensions/updater.py) +GET /updates/check,POST /{id}/updateendpoints - ~30 tests (8 store + 9 card + 5 dialog + 8 updater)
Completed: Phase 1a — Minimal Chat Loop
Goal: Get a working conversation as fast as possible. User types, AI responds, streamed token-by-token. No tools, no memory, no dynamic UI — just chat.
Prerequisite: Architectural Cleanup
- Remove PostgREST — replaced with direct asyncpg connection pool (
db/client.py) - Rename
family→groupacross codebase (DB, models, routes, frontend) - Rename
project→spaceacross codebase (DB, models, routes, frontend) - Evolve BaseInterface: added
config_schemawith security levels,configdict, andvaultparam (Integration/Interface split) - Implement VaultProvider abstraction +
EnvVaultProviderdefault backend (see interfaces.md — Vault)
Backend: LLM Integration
- Create
backend/chat/llm.py— LLMIntegration class extending BaseInterface - Implement
chataction — messages in, streaming response out (Anthropic SDK) - Implement
completeaction — simple text completion - System prompt builder: inject group name, user name, basic context
- Configuration: API key from env, model configurable (default: claude-sonnet-4-20250514)
- Register LLM Integration in InterfaceManager at startup
Backend: Chat API
-
POST /api/chat/— Accept message, call LLM Integration, return SSE stream -
GET /api/chat/conversations— List conversations for current user -
GET /api/chat/conversations/{id}/messages— Get full conversation history -
DELETE /api/chat/conversations/{id}— Delete conversation - Conversation model: store metadata in PostgreSQL (id, user_id, group_id, space_id, title, timestamps)
- Message storage: PostgreSQL (move to Git + LanceDB in Phase 2)
- Conversation history management: pass last 50 messages to LLM
Frontend: Chat UI
- Chat page component — split layout with conversation list + chat area
- Make chat page the default route (
/) - Message display: user messages (right, primary) + AI responses (left, muted) with ChatBubble
- SSE streaming: render AI response token-by-token with blinking cursor
- Conversation list panel (w-64, hidden on mobile)
- Create new conversation / continue existing / delete
- Auto-scroll, loading states, error handling
- chatStore (Zustand): conversations, messages, active conversation, streaming state
Frontend: Wire Up
- API client methods: sendMessage (SSE), listConversations, getMessages, deleteConversation
- SSE client utility for consuming streaming responses (POST-based fetch + ReadableStream)
- Connect chatStore to API via useChat hook
Verification
- Backend tests for LLM Integration (mock Anthropic SDK)
- Backend tests for chat endpoints
- Frontend unit tests for chatStore and useChat hook
- E2E test: type message → see streaming response (mocked SSE)
- Build passes (604 KB JS, 32 KB CSS), no regressions in existing tests
Completed: Phase 1b — Tool Calling, Agent Loop & Onboarding
Goal: AI can take actions — call Integrations, create tasks, render UI components. Welcome new users.
Sub-Sprint 1b.1 — Tool Bridge + Agent Loop (Backend)
- Tool Bridge: convert ActionDefinition → Anthropic SDK tool format (
chat/tools.py) - Agent Orchestrator: message → LLM → tool calls → results → response loop (
chat/orchestrator.py) - LLM streaming with tools:
stream_chat_with_tools()handles text + tool_use content blocks - Extended SSE protocol:
tool_use,tool_resultevents alongsidetoken/done/error - Multi-step tool execution: agent loops until
stop_reason == "end_turn"ormax_turnsreached - Error handling: tool failures fed back to LLM, max_turns prevents infinite loops
- Message metadata: tool call data stored in JSONB
metadatacolumn - Tests: 32 new tests (tool bridge, orchestrator, LLM streaming with tools, chat API)
Sub-Sprint 1b.2 — Frontend Tool Rendering + Approval Workflow
- Evolved ActionDefinition:
ai_accessenum (execute/propose/blocked) replacesrequires_approvalboolean - Added
side_effect(read/write/delete),returns(output schema),idempotentto ActionDefinition - Added
EventDefinitionmodel +get_events()stub on BaseInterface - Added
ExecutionContext,PermissionPolicy,InterfacePermissionsmodels (defined, wired later) - Updated all integrations, tool bridge, orchestrator, tests, frontend types, docs
- Approval workflow for sensitive actions (pause/resume via asyncio.Event)
- Frontend renders tool_use/tool_result events inline in chat (ToolCallCard component)
- Approval block UI (approve/reject buttons, ApprovalCard component)
- Frontend SSE client extended for new event types (tool_use, tool_result, approval_request)
Sub-Sprint 1b.3 — Task/Space Tools + Frontend as Integration
- TasksIntegration: wrap TaskService as Integration (list, create, update_status)
- SpacesIntegration: wrap SpaceService as Integration (list, get_current)
- FrontendIntegration: show_card, show_task_list render commands
- Component registry for dynamic rendering (InfoCard, TaskListRenderer)
- Enhanced system prompt with tool usage guidance
- ExecutionContext threaded through BaseInterface → InterfaceManager → Orchestrator → chat API
- Rich component rendering in ToolCallCard (detects
_componentfield)
Sub-Sprint 1b.4 — Conversational Onboarding
- OnboardingIntegration: create_group, create_spaces, complete actions (
interfaces/integrations/onboarding.py) - Onboarding system prompt with persona detection + 9-persona space mapping (
chat/onboarding_prompts.py) - Onboarding API endpoint:
POST /api/onboarding/chatwith SSE streaming (api/onboarding.py) - Frontend: Onboarding page, useOnboarding hook, streamOnboarding SSE client
- Routing:
/onboardingreplaces/create-group, ProtectedRoute redirects users without group - Tests: 45 backend + 18 frontend (integration, prompts, API, hook, page)
- Default workflows based on persona:
PERSONA_SKILLSmapping,create_default_skillsonboarding action, auto-registers dynamic skills - Vault-aware Interface creation:
interface_configstable,InterfaceConfigService, CRUD API endpoints,InterfaceConfigCardSettings UI, vault:// secret storage
Completed: Phase 2 — Memory & Knowledge
Goal: AI remembers facts, preferences, and events across conversations. Semantic memory via embeddings + pgvector, git-backed Markdown storage, RAG context injection, auto-summarization.
Sub-Sprint 2.1 — Embedding Abstraction + pgvector Setup
-
EmbeddingProviderABC withembed(),embed_batch(),model_name(),dimensions()(memory/embeddings.py) -
OpenAIEmbeddingProvider— text-embedding-3-small (1536 dims), uses existing OpenAI SDK -
FastEmbedProvider— BAAI/bge-small-en-v1.5 (384 dims), local lightweight model -
EmbeddingManagersingleton — creates/caches active provider, validates consistency (memory/embedding_manager.py) -
VectorStore— pgvector wrapper for insert/search/delete/get_by_id/count (memory/vector_store.py) - pgvector migration:
embedding_config+memory_vectorstables with HNSW index (002_memory_vectors.sql) - Config:
EMBEDDING_PROVIDER,EMBEDDING_MODEL,MEMORY_GIT_PATHsettings - Tests: 39 tests (embeddings, embedding_manager, vector_store)
Sub-Sprint 2.2 — Memory Integration (Core)
-
MemoryIntegration(BaseInterface)with 4 actions: search, store, recall, forget (interfaces/integrations/memory.py) -
search(EXECUTE/READ): embed query → pgvector cosine search → ranked results -
store(EXECUTE/WRITE): embed content → insert vector + metadata + git save -
recall(EXECUTE/READ): semantic search by topic (delegates to search with higher limit) -
forget(PROPOSE/DELETE): delete memory by ID (requires user approval) - Three scopes: group (shared), space (context), user (personal)
- Memory types: fact, preference, event, conversation_summary, note
- System prompt guidance for memory tool usage (
chat/prompts.py) - Registered in InterfaceManager at startup (
main.py) - Tests: 17 tests (definition + execute for all 4 actions)
Sub-Sprint 2.3 — RAG Pipeline + Context Injection
-
RAGPipeline— searches memory, formats context for system prompt injection (memory/rag.py) - Multi-scope search: group + space + user memories, deduplication by content
- Conversation deduplication: don't inject what's already in chat history
- Token budget: MAX_CONTEXT_CHARS = 8000 (~2000 tokens)
- Automatic injection in
_chat_stream()between prompt build and orchestrator run (api/chat.py) - Graceful degradation: RAG failures don't block chat
- Tests: 11 tests (context retrieval, deduplication, format, error handling)
Sub-Sprint 2.4 — Git-Backed Storage + Markdown Files
-
GitStore— per-group git repos with Markdown + YAML frontmatter (memory/git_store.py) - Directory structure: conversations/, facts/, preferences/, events/, notes/, spaces/
- Async git operations via
asyncio.create_subprocess_exec("git", ...) -
MemorySyncScheduler— hourly background sync (follows TaskProcessor pattern) (memory/sync.py) - Docker:
gitinstalled,memory-datavolume,MEMORY_GIT_PATHenv var - Tests: 19 tests (git_store + memory_sync)
Sub-Sprint 2.5 — Conversation Summarization + Auto-Memory
-
ConversationSummarizer— LLM-based fact/preference/event extraction (memory/summarizer.py) - Threshold trigger: auto-summarize after 10+ messages in a conversation
- Extraction prompt: returns JSON array of
{content, type, scope} - Stores extracted memories: embed → pgvector + git (per item)
- Conversation summary: 2-3 sentence summary stored as
conversation_summarytype - Background task trigger in
_chat_stream()after assistant response (api/chat.py) - Tests: 11 tests (threshold, extraction, errors, deduplication, summary)
Completed: Phase 2b — Tauri Rust Layer
Goal: Move memory operations from Python backend to native Rust in the Tauri desktop app for local-first, offline-capable operation.
Sub-Sprint 2b.1 — Rust Scaffolding + ONNX Embeddings
-
MorpheeErrorenum withthiserror+Serializefor Tauri IPC (error.rs) -
AppStatestruct withMutex/AsyncMutexfor subsystem state (state.rs) -
EmbeddingProviderwrappingfastembedcrate (AllMiniLML6V2, 384 dims) (embeddings.rs) - Tauri commands:
embed_text,embed_batch,get_embedding_info(commands/embedding_commands.rs) - Model auto-downloads on first startup via fastembed
- Tests: 6 tests (embed, batch, empty batch, model info, unsupported model, similarity ordering)
Sub-Sprint 2b.2 — LanceDB Vector Store
-
VectorStorewith LanceDB (embedded vector DB) — insert, search, delete, get_by_id, count (vector_store.rs) - Arrow RecordBatch schema matching Python
memory_vectorstable (13 columns, 384-dim vectors) - Cosine distance search with threshold filtering and scope/type/group isolation
- Tauri commands:
memory_insert,memory_search,memory_delete,memory_get,memory_count(commands/memory_commands.rs) - Tests: 8 tests (insert/get, search, filters, similarity ordering, delete, count, group isolation)
Sub-Sprint 2b.3 — Git-Backed Markdown Storage (git2)
-
GitStoreusinggit2crate (native libgit2) — init_repo, save_conversation, save_memory, delete_memory, sync (git_store.rs) - Same Markdown + YAML frontmatter format as Python backend
- Same directory structure: conversations/, facts/, preferences/, events/, notes/, spaces/
- Tauri commands:
git_init_repo,git_save_conversation,git_save_memory,git_delete_memory,git_sync(commands/git_commands.rs) - All git operations wrapped in
spawn_blocking(git2 is synchronous) - Tests: 8 tests (init, idempotent, save conversation, save memory, space-scoped, metadata, delete, git commits)
Sub-Sprint 2b.4 — Keychain Vault Provider
-
VaultProvidertrait +KeychainVaultProviderusingkeyringcrate (vault.rs) - Cross-platform: macOS Keychain, Windows Credential Manager, Linux Secret Service
- Service name:
app.morphee.desktop, arbitrary key strings - Tauri commands:
vault_get,vault_set,vault_delete,vault_exists(commands/vault_commands.rs) - Tests: 5 tests (set/get, get nonexistent, exists, delete, overwrite)
Sub-Sprint 2b.5 — Frontend IPC Bridge + Runtime Detection
-
isTauri()runtime detection viawindow.__TAURI_INTERNALS__(lib/runtime.ts) - Typed Tauri invoke wrappers:
tauriEmbeddings,tauriMemory,tauriGit,tauriVault(lib/tauri.ts) - Unified
memoryClient— routes to Rust IPC (desktop) or Python HTTP (web) (lib/memory-client.ts) - Memory types added to frontend:
MemoryRecord,MemorySearchResult,MemoryType,MemoryScope(types/index.ts) - Tests: 12 tests (2 runtime detection + 10 memory client routing for both desktop and web modes)
Sub-Sprint 2b.6 — Integration + Initialization
- Full app initialization in
lib.rs: embeddings, git store, vault at startup -
health_checkcommand: reports status of all 4 subsystems (commands/health_commands.rs) - 18 Tauri IPC commands registered (3 embedding + 5 memory + 5 git + 4 vault + 1 health)
Verification
- 29 Rust tests pass (
cargo test) - 170 frontend unit tests pass (158 existing + 12 new)
- Frontend build clean (614 KB JS, 33 KB CSS)
Completed: Phase 3a — Core Integrations
Goal: Make Morphee proactive and connected by adding core integrations: scheduling, notifications, Google services, and filesystem access.
Sub-Sprint 3a.1 — Cron Integration (Scheduler)
-
schedulestable migration (003_schedules.sql) — once, interval, cron schedule types -
ScheduleService— CRUD + next_run calculation withcroniter(scheduler/service.py) -
ScheduleRunner— async polling loop, follows TaskProcessor pattern (scheduler/runner.py) -
CronIntegration(BaseInterface)— 4 actions: schedule, list, get, cancel (interfaces/integrations/cron.py) - Registered in InterfaceManager, system prompt guidance added
- Started/stopped in
main.pylifespan alongside TaskProcessor and MemorySyncScheduler - Tests: 30 tests (service, runner, integration)
Sub-Sprint 3a.2 — Notifications Integration
-
notificationstable migration (004_notifications.sql) — type, source, read status -
NotificationService— CRUD + unread count + EventBus publishing (notifications/service.py) -
NotificationsIntegration(BaseInterface)— 3 actions: send, list, mark_read (interfaces/integrations/notifications.py) - REST API:
GET /api/notifications,GET /api/notifications/unread-count,POST /api/notifications/{id}/read,POST /api/notifications/read-all(api/notifications.py) - WebSocket extended: subscribes to
notification.*events with user-level filtering - Registered in InterfaceManager, system prompt guidance added
- Tests: 25 tests (service, integration, API)
Sub-Sprint 3a.3 — Google OAuth Infrastructure
-
oauth_connectionstable migration (005_oauth_connections.sql) — provider, scopes, token expiry - OAuth2 helpers: HMAC-signed state, token exchange, scope mapping (
google/oauth.py) -
GoogleApiClient: authenticated HTTP client with auto token refresh (google/client.py) - REST API:
GET /api/oauth/google/authorize,GET /api/oauth/google/callback,GET /api/oauth/google/status,POST /api/oauth/google/disconnect(api/oauth.py) - Config:
GOOGLE_CLIENT_ID,GOOGLE_CLIENT_SECRET,GOOGLE_REDIRECT_URIinconfig.py - Tokens stored in VaultProvider (never in DB), metadata in
oauth_connections - Tests: 25 tests (oauth helpers, client, API endpoints)
Sub-Sprint 3a.4 — Google Calendar Integration
-
GoogleCalendarIntegration(BaseInterface)— 5 actions: list_events, create_event, update_event (PROPOSE), delete_event (PROPOSE), check_availability (interfaces/integrations/google_calendar.py) - Uses
GoogleApiClientfrom Sprint 3a.3 for authenticated Google Calendar API v3 - Registered in InterfaceManager, system prompt guidance added
- Tests: 30 tests (definition, context validation, all 5 actions, event formatting)
Sub-Sprint 3a.5 — Gmail Integration
-
GmailIntegration(BaseInterface)— 5 actions: list_emails, read_email, send_email (PROPOSE), draft_email, reply_email (PROPOSE) (interfaces/integrations/gmail.py) - MIME message construction via Python
email.mimestdlib + base64url encoding - Body extraction handles plain text, multipart, nested multipart payloads
- Registered in InterfaceManager, system prompt guidance added
- Tests: 40 tests (definition, context validation, all 5 actions, helper functions)
Sub-Sprint 3a.6 — Filesystem Integration
- Python
FileStore— sandboxed file operations per group, path traversal prevention, extension allowlist (.md/.txt/.json/.csv/.yaml), size limits (filesystem/file_store.py) -
FilesystemIntegration(BaseInterface)— 5 actions: list_files, read_file, write_file (PROPOSE), delete_file (PROPOSE), search_files (interfaces/integrations/filesystem.py) - Tauri Rust
FileStore— same sandbox logic, 5 IPC commands (src-tauri/src/file_store.rs,commands/fs_commands.rs) - Frontend
fsClient— unified client routing to Rust IPC or Python HTTP (lib/fs-client.ts) - Registered in InterfaceManager, system prompt guidance added
- Tests: 46 Python (27 store + 19 integration), 8 Rust, 12 frontend
Verification
- 766 backend tests pass (94% coverage)
- 37 Rust tests pass (29 existing + 8 file_store)
- 182 frontend unit tests pass (170 existing + 12 fs-client)
- Frontend build clean (614 KB JS, 33 KB CSS)
Completed: Phase 3a Frontend UI
Goal: Build the frontend components for Phase 3a backend features (notifications, OAuth, settings).
NotificationBell Component
-
Notificationtypes +NotificationEventWS event types (types/index.ts) - Notification API client:
list,unreadCount,markRead,markAllRead(lib/api.ts) -
notificationStoreZustand store: notifications list, unread count, mark-read actions (store/notificationStore.ts) -
useNotificationshook: store + API + WebSocket subscription (hooks/useNotifications.ts) -
NotificationBellcomponent: bell icon with unread badge, dropdown list, mark-as-read (components/layout/NotificationBell.tsx) - Added to Header between theme toggle and user menu
Settings Page
- Replaced placeholder with Tabs: Notifications + Integrations (
pages/Settings.tsx) - Notifications tab: full notification list with mark-read, unread count
- Integrations tab: Google OAuth connection card
GoogleConnect Component
-
GoogleOAuthStatus+OAuthCallbackMessagetypes (types/index.ts) - OAuth API client:
googleAuthorize,googleStatus,googleDisconnect(lib/api.ts) -
GoogleConnectcomponent: OAuth popup flow, status display, scope badges, connect/disconnect (components/settings/GoogleConnect.tsx)
Verification
- 206 frontend unit tests pass (182 existing + 24 new: 9 store + 8 hook + 7 API)
- Frontend build clean (631 KB JS, 34 KB CSS)
Completed: Phase 3b.1 — Dynamic Skills
Goal: Composable AI capabilities that combine multiple Integration calls into higher-level workflows. Skills are stored "macros" — a sequence of integration calls with variable interpolation. Once created, a Skill appears as a normal tool the AI can call, or that cron can trigger on a schedule.
Database & Models
-
skillstable migration (006_skills.sql) — group-scoped, JSONB definition, unique name per group - Pydantic models:
SkillStep,SkillDefinition,SkillParameter,SkillCreate,Skill(skills/models.py)
Skill Service (CRUD)
-
SkillService— create, get, list, update, delete, increment_run_count (skills/service.py) -
list_all_enabled()— cross-group query for startup loading - Group isolation enforced on all queries
Skill Engine (Execution)
-
SkillEngine— validate definitions + execute step sequences (skills/engine.py) - Template interpolation:
{{params.x}},{{steps.id.result.field}},{{context.user_id}} - Type preservation: whole-template strings return raw values (lists, dicts, numbers)
- Error handling: per-step
on_error(fail/continue), combined result output - Side effect inference: worst-case from constituent steps (READ < WRITE < DELETE)
Dynamic Skill Interface
-
DynamicSkillInterface(BaseInterface)— runtime-generated interface per skill (skills/dynamic.py) - Single
runaction with parameters from skill definition - Name sanitization: "My Cool Skill" →
skill_my_cool_skill
Skills Integration (AI Tool)
-
SkillsIntegration(BaseInterface)— 5 actions: create, list, get, update, delete (interfaces/integrations/skills.py) - Create validates via SkillEngine, saves to DB, dynamically registers interface
- Update/delete manages interface lifecycle (unregister + re-register)
- System prompt guidance for skill creation and scheduling
REST API
-
GET /api/skills/— list skills for current group -
GET /api/skills/{id}— get skill detail -
POST /api/skills/— create skill (validates definition) -
PUT /api/skills/{id}— update skill -
DELETE /api/skills/{id}— delete skill
Startup & Cron
- Startup loading: all enabled skills loaded from DB and registered as dynamic interfaces (
main.py) -
SKILLActionType added to scheduler (scheduler/models.py) -
_fire_skill()handler in ScheduleRunner (scheduler/runner.py) - CronIntegration extended with
"skill"action_type support
Verification
- 849 backend tests pass (91% coverage) — 83 new skill tests
- 206 frontend unit tests pass (no regressions)
- Frontend build clean (631 KB JS, 34 KB CSS)
Completed: Phase 3b.2 — Frontend as Integration (Advanced)
Goal: Transform the Frontend Integration from 2 display-only actions into a full bidirectional component protocol — the AI composes rich, interactive UI from atomic building blocks, users interact with those components, and events flow back to the AI.
Backend: Component Protocol + Actions
-
ComponentSpec,ComponentEventDeclaration,ComponentLayoutmodels added tointerfaces/models.py -
FrontendIntegrationrewritten with 10 actions: 7 semantic (show_card,show_list,show_form,show_choices,show_actions,show_progress,show_table) + 1 generic (render) + 2 lifecycle (update,dismiss) -
POST /api/chat/component-eventendpoint — handles AI_TURN events (formats as synthetic user message, returns SSE stream) - WebSocket extended:
component.*event subscription for server-push updates - System prompt updated with guidance for all 10 frontend tools
Frontend: Component System
- TypeScript types in
types/components.ts(ComponentSpec, ComponentEvent, RendererProps) -
componentStoreZustand store — tracks active components per conversation (store/componentStore.ts) - Component event dispatcher — tier classification (LOCAL/AI_TURN), HTTP dispatch (
lib/component-events.ts) -
ComponentRegistryevolved — recursive renderer,registerComponent(), self-registering pattern -
ToolCallCardupdated — detects_spec(new) vs_component(legacy), wires events, passesinteractiveflag -
useChathook extended — componentStore integration,handleComponentEventResponsefor SSE -
sse.tsextended —processComponentEventResponse()for component event SSE parsing
Tier 1 Components (10 renderers)
-
CardRenderer— info card with variant colors, action buttons, dismiss -
ListRenderer— interactive list with select, check mode, status badges -
FormRenderer— dynamic form with validation (text, number, email, textarea, select, checkbox, date) -
ChoiceSelector— pill-shaped chip selection, multi-select with confirm -
ActionButtons— button group with variant mapping, row/column layout -
ProgressBar— progress indicator with color changes by percentage -
TableRenderer— data table with column alignment, alternating rows, row click -
ConfirmDialog— yes/no prompt with destructive variant -
GridLayout— recursive column composition (1-4 columns, responsive) -
MarkdownRenderer— rich text with headings, lists, bold, italic, code, links
Verification
- 957 backend tests pass (93% coverage) — 108 net new (Phase 3b.2: 72, coverage sprint: 36)
- 481 frontend unit tests pass (355 existing + 126 new: component tests 108, renderer tests 18) — 73.6% statement coverage (up from 57.8%)
- Frontend build clean (652 KB JS, 38 KB CSS)
Completed: Phase 3c — SSO Login
Goal: Add social/SSO login via GoTrue's built-in OAuth providers. See features/sso-login.md for full design.
Step 1 — GoTrue Provider Configuration
- Add
GOTRUE_EXTERNAL_GOOGLE_*env vars to docker-compose.dev.yml (prod managed externally) - Add
GOTRUE_EXTERNAL_APPLE_*env vars to docker-compose.dev.yml - Add
GOTRUE_EXTERNAL_AZURE_*env vars to docker-compose.dev.yml - Update
GOTRUE_URI_ALLOW_LISTwith callback + Tauri URLs
Step 2 — Backend SSO Endpoints
-
GET /api/auth/providers— list enabled SSO providers from GoTrue/settings -
GET /api/auth/sso/{provider}— return GoTrue authorize URL with redirect -
POST /api/auth/sso/callback— verify token, find-or-create morphee_user, emit signup event - Name extraction from user_metadata (full_name → name → email prefix)
- Register SSO router in
main.pyunder/api/authprefix - Tests: 21 new (JWT helpers, provider discovery, authorize URL, callback flows)
Step 3 — Frontend Social Login UI + Callback
- API client:
providers(),ssoAuthorize(),ssoCallback()methods (lib/api.ts) -
ssoLogin(provider)in useAuth hook — full-page redirect to GoTrue authorize URL -
handleSSOCallback(accessToken, refreshToken)in useAuth hook — token exchange + user fetch - Tauri desktop support:
isTauri()detection forhttp://tauri.localhost/auth/callbackredirect -
/auth/callbackroute — extract tokens from URL fragment hash, error handling -
AuthCallbackpage — loading spinner, error state, back-to-login link -
SSOIconscomponent — inline SVG icons (Google, Apple, Microsoft, GitHub, Discord) -
AuthForm— dynamic provider discovery, social login buttons with "or continue with" divider - Tests: 17 new (8 AuthCallback, 5 useAuth SSO, 4 AuthForm SSO buttons)
Step 4 — User Linking + Edge Cases
- GoTrue automatic user linking (default
GOTRUE_SECURITY_MANUAL_LINKING_ENABLED=false) - Same-email-different-provider: GoTrue merges to one auth.users row → same auth_user_id
- Social login without name: falls back to email prefix
- Onboarding flow: SSO users get
group_id=null→ ProtectedRoute redirects to/onboarding
Step 5 — Tier 2 Providers (deferred)
- GitHub provider (env vars + button)
- Discord provider (env vars + button)
- Slack OIDC provider (env vars + button)
Verification
- 1013 backend tests pass (95% coverage) — 21 SSO + 35 coverage tests
- 526 frontend unit tests pass — 17 SSO + 28 coverage tests
- Frontend build clean (656 KB JS, 38 KB CSS)
Completed: Phase 3d M1 — Minimal Mobile App
Goal: Ship Morphee on iOS and Android via Tauri v2 mobile targets. Online-first (local ML unavailable on mobile). See features/2026-02-12-mobile-ios-android.md for full investigation.
Sub-Phase M1 — Minimal Mobile App
- Tauri mobile project scaffolding (
tauri ios init,tauri android init) - Conditional compilation:
#[cfg(not(any(target_os = "ios", target_os = "android")))]to gatefastembed+lancedb - Platform-specific Cargo.toml: desktop-only dependencies, per-OS keyring features
- Desktop/mobile module split:
embeddings.rs,vector_store.rswith shared types + cfg-gated implementations - Android vault stub:
KeychainVaultProviderreturns graceful errors on Android - Platform-aware health check: mobile only requires git_ready (not embeddings/vector/vault)
- Frontend
isMobile(),isDesktop(),hasLocalML(),getRuntimeEnvironment()detection - Memory client routes to Python HTTP on mobile (not Rust IPC) via
hasLocalML() - Mobile Tauri config:
tauri.ios.conf.json,tauri.android.conf.json - Viewport meta:
viewport-fit=cover,maximum-scale=1for iOS safe areas - Safe area CSS:
env(safe-area-inset-*)variables + utility classes - Touch targets: 44px minimum for
pointer: coarsedevices - Bottom tab navigation: 5-tab
BottomNavcomponent (Chat, Dashboard, Tasks, Spaces, Settings) - AppLayout: safe-top padding, bottom nav spacing, BottomNav rendered
- Header simplified: removed hamburger/MobileSidebar (replaced by BottomNav)
- CI/CD: GitHub Actions iOS build job enabled (Apple signing ready in Secrets)
- CI/CD: GitHub Actions Android build job enabled (keystore in Secrets)
- Test on physical devices + simulators
- App Store + Google Play initial submission
Verification
- 37 Rust tests pass (desktop, no regressions from conditional compilation)
- 544 frontend unit tests pass (509 existing + 35 new: 16 runtime + 4 BottomNav + 10 memory-client + 5 other)
- Frontend build clean (656 KB JS, 38 KB CSS)
Sub-Phase M2 — Native Mobile Features (L)
- Replace
fastembedwithcandle-based embeddings on mobile (pure Rust,mobile-mlfeature) - Replace
lancedbwith SQLite (rusqlite) for mobile vector search - Pure-Rust BERT WordPiece tokenizer (HF
tokenizerscrate doesn't compile for mobile) - Android vault: SQLite-based secure storage (replaces stub)
- Push notifications: APNs (iOS) + FCM (Android) backend + Tauri plugin frontend
- Deep linking for SSO callbacks (
morphee://auth/callbackscheme) - Frontend
hasLocalML()updated: returnsisTauri()(mobile + desktop) - Mobile health check expanded: embeddings + vector_store + git (was: git only)
- Test on physical devices + simulators
- App Store + Google Play submission
Verification (M2)
- 37 Rust tests pass (desktop, no regressions)
- 9 Rust mobile-ml tests pass (tokenizer:
cargo test --features mobile-ml) - 558 frontend unit tests pass (553 → 558: 5 new runtime/isIOS tests)
- Frontend build clean (662 KB JS, 38 KB CSS)
Sub-Phase M3 — Local AI Mobile (Layer 6 V1.5)
New Roadmap: Layer 6 / Version 1.5 (depends on OpenMorph) Timeline: 4 weeks (split: offline data/sync moved to V1.0 Work Stream C)
Offline data/sync/auth now lands in V1.0 Work Stream C (free with OpenMorph git-native). M3 focuses on what V1.0 can't provide: local LLM inference.
- Local LLM on mobile via
candle(Phi-4-mini Q4 — ~2.3GB, Metal GPU on iOS, CPU on Android) - Metal GPU acceleration on iOS (via
candle-core/metalfeature) - Smart routing: local model for simple tasks, cloud Claude for complex reasoning
- Model download on mobile (hf-hub + tokenizers with
unstable_wasmfor pure-Rust regex) - Model management UI (storage, switch, delete) with mobile storage/RAM warnings
- Mobile-specific LLM config (512 max tokens, 2048 context, reduced history)
- ANE acceleration on iOS (future — Metal GPU covers primary path)
- Progressive model download with background resume
✅ Completed: V1.5 — Local AI (Desktop)
Status: Gaps closed — February 21, 2026 Goal: Local LLM inference via candle/GGUF in Tauri Rust backend. Desktop-first, mobile follow-up. Design doc: docs/features/local-llm.md
Target models: Phi-4 Mini Q4 (~2.3GB), Llama 3.2 3B Q4 (~2.0GB)
✅ Completed (Foundation):
- Rust
llm.rs— candle GGUF inference provider (3-tier: desktop/mobile/stub, Metal on macOS) - Rust
model_manager.rs— HuggingFace Hub model download/storage/deletion - Rust
llm_commands.rs— 8 Tauri IPC commands (chat_stream, cancel, load/unload, list/download/delete, get_info) -
state.rs— LlmProvider + cancel flag in AppState -
error.rs— Llm error variant - Cargo.toml —
local-llmfeature flag (candle + hf-hub + tokenizers) - Frontend
llm-routing.ts— smart cloud/local routing with heuristic patterns - Frontend
llm-client.ts— local LLM streaming via Tauri events - Frontend
llmStore.ts— Zustand store for LLM state - Frontend
LocalAITab.tsx— Settings UI for model management (download/load/delete/routing) - Frontend
runtime.ts—hasLocalLlm()+refreshLocalLlmStatus() - Frontend
useMessageStreaming.ts— routes via llm-routing (local vs cloud) - i18n — EN + FR locale keys for Local AI settings
- Tests — 7 Rust + 11 frontend tests (routing logic, store, model metadata)
✅ Completed (V1.5 Gaps — February 21, 2026):
- Sprint 1 — Per-token streaming:
llm.rsgenerate()callback-based (callson_tokenper token in autoregressive loop),llm_load_modelemitsllm-load-progressevents (stages: tokenizer/weights/ready),LocalAITab.tsxshows stage-labeled progress bar - Sprint 1 — Auto-download prompt:
useMessageStreaming.tsfalls back to cloud if no local model loaded (no hard error) - Sprint 2 — Conversation sync: Already implemented —
POST /api/chat/conversations/sync-localbackend endpoint +messageApi.syncLocal()call inuseMessageStreaming.ts - Sprint 3 — LanceDB VectorRouter:
vector_router.rs+commands/vector_commands.rs— offline memory routing (DIRECT_MEMORY=0.92, SKILL_EXECUTE=0.88, SKILL_HINT=0.83), wired intouseMessageStreaming.tsoffline path - Sprint 4a — Whisper STT:
whisper.rsWhisperProvider(ONNX skeleton + full API surface),commands/audio_commands.rswhisper_transcribe,audio-client.tswith Web Speech API primary + Whisper fallback - Sprint 4b — Platform TTS:
tts.rsTtsProvider(tts0.26 crate, macOS/Win/Linux),tts_speak/stop/is_speaking/set_rateTauri commands,audio-client.tsspeakText()/stopSpeaking() - Sprint 4c — Voice Channel Mode:
VoiceModeToggle.tsx— single-shot mic + continuous voice loop (record→transcribe→send→TTS→repeat), Escape to exit, TTS toggle button - i18n —
voice.*keys (startRecording, stopRecording, enableTts, disableTts, voiceMode, exitVoiceChannel) in EN + FR - Cargo.toml —
audio = ["dep:tts"]feature added - Tests — 117 Rust tests passing (0 failures), 2214 frontend unit tests passing
Pending (future work):
- Whisper ONNX inference pipeline (currently returns stub error; Web Speech API covers primary path)
-
--features local-llm,audio,biometricsfull cargo build verification (candle 0.9 API fixes, Feb 22) - Mobile candle LLM (Phase M3) — Phi-4 Mini Q4 on iOS (Metal) + Android (CPU)
- Metal GPU acceleration on iOS
- ANE acceleration on iOS (future optimization)
Completed: Phase 3e.1 — Critical UX & Discoverability
Goal: Fix the most urgent UX blockers preventing basic product usage. Driven by Product Review 2026-02-13 — 48 findings, readiness score 4.5/10.
-
C-UX-001+C-FEAT-001— Mobile conversation access — Sheet-based left drawer with ConversationList, mobile header bar with hamburger + title + new button -
H-FEAT-001— Suggested prompts in empty chat state — 6 clickable capability chips (tasks, calendar, email, reminders, memory, help) -
M-FEAT-006— Markdown rendering in chat — ReactMarkdown + remark-gfm for assistant messages, prose styling via @tailwindcss/typography -
M-UX-003— Theme persistence — localStoragemorphee-themekey, App.tsx reads on mount before system preference fallback -
H-UX-005— Stop/cancel button for AI streaming — destructive Square button replaces Send during streaming, calls abortController -
H-UX-006— Chat input streaming indicator — placeholder changes to "Morphee is thinking..." during streaming -
L-FEAT-001— Typing indicator — bouncing dots animation before first AI token arrives -
L-DESIGN-001— Standardize page headers — Tasks and Spaces upgraded to text-2xl font-bold (matches Dashboard/Settings) -
M-DESIGN-001— Chat icon consistency — BottomNav changed from MessageSquare to MessageCircle (matches Sidebar)
Verification
- 645 frontend unit tests pass (633 existing + 12 new)
- Frontend build clean (826 KB JS, 61 KB CSS)
Completed: Phase 3e.2 — Core Product Completeness
Goal: Fill fundamental product gaps that every user-facing app needs. 10 items across 5 batches: frontend polish, confirmation/retry, conversation organization, user profiles, search/pagination/editing.
Batch 1 — Frontend-Only Polish
-
M-FEAT-004— Humanized tool call displays:humanizeToolCall()in utils.ts maps all 14 integrations' actions to human-readable text in ToolCallCard -
L-UX-001— Skeleton loaders for chat messages: 5 alternating skeleton bubbles in Chat.tsx when loading -
L-FEAT-003— Task sorting options: Sort by newest/oldest/priority/name with Select dropdown in Tasks.tsx
Batch 2 — Confirmation + Retry
-
M-UX-002— Confirmation dialogs for destructive actions: AlertDialog before deleting conversations in ConversationList -
L-FEAT-004— Retry mechanism for failed chat messages: Retry button with RotateCcw icon next to error in Chat.tsx
Batch 3 — Conversation Rename + Organization
-
H-FEAT-002— Conversation rename/pin/archive: DropdownMenu with Rename/Pin/Archive/Delete options, inline rename, pinned-first ordering. Backend:PATCH /conversations/{id}endpoint,is_pinned/is_archivedcolumns. Migration:009_phase3e2.sql
Batch 4 — User Profile Management
-
C-FEAT-003— User profiles: Profile tab in Settings with name/email/avatar. Backend:GET/PATCH /api/auth/profile,POST /api/auth/change-password. Migration addsavatar_urlto users table,edited_atto messages table.
Batch 5 — Search, Pagination, Editing
-
L-FEAT-002— Conversation pagination:offsetparam on messages endpoint,count_messagesmethod -
C-FEAT-002— Global search (Cmd+K):GET /api/search/endpoint (ILIKE across conversations/tasks/spaces), SearchDialog with cmdk -
H-FEAT-008— Message editing + regeneration:PATCH /conversations/{id}/messages/{msg_id},POST /conversations/{id}/regeneratewith SSE. ChatBubble has edit/regenerate/copy buttons.
Not Implemented (deferred)
-
M-FEAT-008— Notification dropdown (bell opens popup) — already partially exists in NotificationBell
Verification
- 646 frontend unit tests pass (645 existing + 1 new from 3e.1 correction, +13 new Phase 3e.2 tests across 53 test files)
- Frontend build clean (865 KB JS, 63 KB CSS)
Completed: Phase 3e.3 — Collaborative Foundation
Goal: Enable the multi-user promise central to Morphee's identity. Group invites, conversation-space association, onboarding polish.
Group Collaboration
-
C-FEAT-004— Group member invites + management: email invites with token-based flow (create/accept/decline/cancel), member management (list/update role/remove),group_invitestable migration, AcceptInvite page, Settings group management section with invite form + member list + role controls -
H-FEAT-003— Conversation-space association:space_idquery param onGET /api/chat/conversations, space-scoped conversation listing in frontend
Onboarding & UX Polish
-
H-UX-007— Post-onboarding feature tour: FeatureTour overlay component with step-by-step walkthrough of chat, conversations, spaces, settings -
H-UX-001— Onboarding value explanation: welcome card with feature bullets (group setup, spaces, privacy) before AI chat starts -
M-UX-006— Onboarding space summary: "Here's what I set up" display with created spaces after AI completes setup -
H-UX-002— Login page improvement: 4 feature bullets with icons (smart conversations, spaces & tasks, memory, privacy)
Task Enhancements
- Task subtask support: parent_task_id field, subtask creation and display in TaskDetail
Completed (3e.3 continuation)
-
H-FEAT-007— Task inline editing (description, priority, space assignment) — already implemented in TaskDetail.tsx -
H-UX-003— Branded loading spinner during auth check — pulsing "M" circle replaces Loader2 -
H-UX-004— Friendly error messages — network error wrapping in api.ts (status 0), Dashboard error banner
Verification
- Backend tests pass — 100% pass rate, 89% coverage (fixed all 24 failures: TestClient lifespan, database password, rate limiting) — see test-results.md for counts
- 724 frontend unit tests pass (+49 lib/utils.ts tests: 15% → 73% coverage)
- Frontend build clean (981 KB JS, 63 KB CSS)
Sub-Phase 3e.4 — Engagement & Polish (M — 3-5 days)
Completed (3e.4 quick wins)
-
M-UX-005— WebSocket reconnect button (forceReconnect method + button in ConnectionStatus) -
M-FEAT-005— Approval card timeout indicator (60s countdown, auto-reject, color urgency) -
M-DESIGN-004— Unified EmptyState component (reusable, used in ConversationList, Tasks, Spaces) -
M-FEAT-007— Breadcrumbs navigation (route-aware, hidden on mobile, in Header) -
M-UX-001— Dashboard evolution (conversations, notifications cards + empty states) -
M-UX-004— Empty state for Spaces page (already done in SpaceList)
Remaining
-
L-IDEA-004— Daily briefing skill — Added "Daily briefing" as first suggested prompt + Daily Summary skill for grandparent persona -
H-FEAT-004— Notification preferences + controls — NotificationsTab with per-type toggles, quiet hours, DND mode -
H-FEAT-005— Settings expansion — 5 tabs: Profile (with avatar upload, text size, simplified mode), Members, Notifications, Integrations, Data & Privacy -
C-FEAT-006— Data export + backup (JSON/Markdown) -
M-FEAT-009— Notification sound + desktop alerts — Browser Notification API with DND/quiet hours respect -
M-DESIGN-003— Branding + logo (app icon, favicon) -
L-IDEA-003— "What can I do?" command — Implemented as suggested prompt in empty chat state -
M-FEAT-013— Onboarding re-engagement emails — Day-2, week-1, dormancy templates with daily check loop
Verification
- 2017+ frontend unit tests (+46 Feb 19, 2026, ~60 failing spec tests for stub components)
- Frontend build clean (428 KB JS, 67 KB CSS)
Sub-Phase 3e.5 — Conversation & Context (M — 3-5 days)
- Message pinning (pin/unpin/list pinned, max 5 per conversation) — backend + frontend PinnedMessages component
- Conversation settings dialog (ConversationSettingsDialog component)
-
H-FEAT-009— Conversation context control — ConversationSettingsDialog with 4 context window sizes + message pinning -
H-FEAT-006— Keyboard shortcuts — KeyboardShortcutsDialog (press ?), arrow nav, Cmd+N, Cmd+K -
M-FEAT-001— File upload in chat — Paperclip button with file picker, file name chip, attachment metadata -
L-IDEA-001— Quick Actions floating button (FAB) — QuickActionsFAB component with 4 actions (new conversation, create task, set reminder, upload file), custom event dispatching, mobile-aware rendering -
M-FEAT-012— Integration setup wizards — SETUP_GUIDES with step-by-step guides for Google Calendar, Gmail, Slack, Anthropic LLM
Completed: Safety & Compliance Foundation
Implemented as critical safety prerequisites (pre-V0.9):
- ACL system — Generic resource-based access control (grant/revoke/check/list), user preferences (content filtering, AI personality, screen time, quiet hours), monitoring permissions (bilateral consent for parental oversight)
- Age verification — Backend age verification service (
backend/auth/age_verification.py) - Parental consent flow — Consent service + frontend pages (ParentConsentPending, ParentConsentVerify)
- i18n foundation — Backend i18n module (errors, WebSocket, integrations), frontend i18n with en/fr locales
- Haptic feedback — Mobile haptic feedback utility (
frontend/src/lib/haptics.ts) - Data export — JSON/Markdown export with download utility (
frontend/src/lib/download.ts) - Pull-to-refresh — Mobile UX hook (
frontend/src/hooks/usePullToRefresh.ts) - Encryption at rest (C-STORE-002) — Fernet symmetric encryption for chat messages, memory vectors, and Git files (
backend/crypto/encryption_service.py). Service-layer encrypt/decrypt in ChatService, VectorStore, GitStore, Summarizer, GDPR data export.ENC:prefix for gradual migration. Migration scriptscripts/encrypt_existing_data.py. 48 new tests. - Age verification (C-CONSENT-004) — Regional age thresholds (EU 16, US 13), parental consent workflow with email verification, minor login blocking. Frontend birthdate picker, ParentConsentPending/Verify pages. 99 new tests.
- PII log sanitization — Removed all PII (emails, body previews) from log output in
auth/service.py,auth/parental_consent.py,emails/email_service.py. Logs now use only opaque IDs per CLAUDE.md policy. - HTML injection in email template — Added
html.escape()to user-supplied values (child_name,child_email) in parental consent email template to prevent content injection. - Security audit — 53/53 items resolved (100%) — Initial adversarial security audit found 53 findings (1 Critical + 14 High + 21 Medium + 17 Low). All resolved. Score improved from 4.3 to 9.0/10. Key fixes: unauthenticated interfaces endpoint, JWT localStorage migration, SKIP_AUTH removal, Redis auth, rate limiting, WS origin validation, onboarding injection, markdown sanitization, ILIKE DoS, CSP hardening, password complexity, in-memory vault, generic error messages, DB pool sizing, EventBus caps, Tauri input validation, SSRF prevention. 25 new tests in
test_security_low.py. See audits/security/INDEX.md. - Accessibility audit — 10/10 items resolved (100%) — WCAG 2.1 Level AA audit found 10 findings (7 Medium + 3 Low). All resolved. Score 9.8/10. Fixes: PinnedMessages keyboard access + semantic heading + decorative icon aria-hidden, ConversationSettingsDialog radiogroup ARIA + emoji aria-hidden, landscape orientation CSS, collapsible notification list, undo pattern for archive/delete with 5s toast, text size control. See audits/a11y/INDEX.md.
- i18n audit — 20/20 items resolved (100%) — Internationalization audit found 20 findings (2 Critical + 5 High + 9 Medium + 4 Low). All resolved. Score 8.5/10. Fixes: full string externalization, locale-aware date/number formatting, RTL foundation, 6-language integration catalog, i18n completeness test suite. See audits/i18n/INDEX.md.
Verification (Safety & Compliance)
- 1865 backend tests pass (87% coverage) — +103 tests Feb 19, 2026
- 57 Rust tests pass (48 desktop + 9 mobile-ml)
- 2017+ frontend unit tests + 60 E2E tests (86 test files) — +46 tests Feb 19, 2026
- Frontend build clean (435 KB JS, 67 KB CSS)
✅ Completed: V1.3 — Interactive UI + Multimodal
New Roadmap: Layer 5 / Version 1.3 (merged with Multimodal Interaction) Timeline: 8 weeks Status: SHIPPED — February 22, 2026 Goal: Inline editing of AI components + haptic feedback. Multi-modal identity for kids. Video interaction. (Monitoring moved to Layer 7 V2.0)
Sprint 1 — Interactive UI: Editable Components (DONE Feb 21, 2026)
- Extend ComponentSpec with
editable,edit_permissions,haptic_feedback,auto_save,edit_schemafields - New FrontendIntegration actions:
enable_editing,lock_editing,apply_edits - Haptic feedback integration (haptics.ts triggers on edit start/save/error, uses existing Tauri haptic commands)
- Editable component types: card (inline field editing), list (add/remove/reorder items), table (cell editing with validation)
- Edit permission modes:
EditPermissionmodel — user (silent save), parent (requires parent role), ai_turn (triggers AI response) - i18n strings for editable components (en/fr: edit, save, cancel, reorder, validation errors)
- Backend tests: 21 new tests (enable_editing, lock_editing, apply_edits actions, EditPermission model, ComponentSpec editable fields)
- Frontend tests: 55 new tests (editable CardRenderer, ListRenderer, TableRenderer, edit permissions, haptic triggers, i18n)
Remaining (completed in Sprint 6):
- Editable calendar renderer — CalendarRenderer.tsx (Month/Week/Day views, editable mode)
- Editable kanban renderer — KanbanRenderer.tsx (drag-and-drop cards, editable mode)
Verification
- Frontend tests: editable components, edit permissions, haptic triggers (55 tests)
- Backend tests: editable component actions + EditPermission model (21 tests)
- E2E tests: inline edit card, drag list items, drag kanban cards (3 scenario YAMLs + data-testid attrs)
Sprint 2: Video1 — Camera & Image Upload ✅ (Feb 21, 2026)
- Backend:
AttachmentDatamodel +attachmentfield onMessageCreate - Backend:
image_utils.py—strip_data_url_prefix,validate_image_attachment,resize_for_vision(Pillow) - Backend: Wire image attachment through chat SSE flow → Claude Vision API multi-content blocks
- Backend:
show_imageaction on FrontendIntegration (14 total actions) - Frontend: Camera button in chat input (
capture="environment"for mobile native camera) - Frontend:
ImageRenderercomponent — image display, zoom dialog, download - i18n: EN/FR strings for camera, image zoom, download, caption
- Backend tests: 25 tests (image_utils, AttachmentData, show_image action)
- Frontend tests: 8 ImageRenderer tests (render, caption, zoom, download, interactive controls)
- Frontend build: clean
Sprint 3: Multi-Modal Identity — Phase 1: Multi-Method Login (Feb 22, 2026)
- Database migration:
authentication_methodstable,authentication_sessionstable,usersextended (auth_provider, created_by_user_id, display_name) - Backend models:
AuthMethodType(10 types),AuthenticationMethod,ChildIdentityCreate,ChildAuthRequest,MorpheeAuthResponse -
AuthUser.email→Optional[str](kids have no email),authentication_level,auth_provider,is_child_sessionproperty -
SessionService: Morphee JWT issuance/verification (iss=morphee, aud=morphee_child), session CRUD, token rotation -
IdentityService: child CRUD, PIN auth (bcrypt), parent-assisted auth, auth method management - Dual-path
verify_token: peek at JWTissclaim → route to GoTrue or Morphee verification - API: 11 endpoints at
/api/identity/*(children CRUD, child auth, methods CRUD, sessions CRUD) - Frontend:
ChildSwitchercomponent (dropdown for parent, "Back to parent" for child), PIN dialog - Frontend:
useAuthhook extended withswitchToChild/switchToParent, parent session save/restore - Frontend: types, Zod schemas, API client, auth.ts all updated for nullable email + Morphee JWT
- i18n:
identity.*keys (EN + FR) — children, switchToChild, backToParent, enterPin, childMode, etc. - email=None safety: chat.py, settings.py, service.py (get_user_profile, change_password, export_user_data)
- Backend tests: 25 new (8 identity_service, 7 session_service, 4 verify_token_dual, 6 integration/identity_api)
- Frontend tests: 5 new (ChildSwitcher: empty state, trigger button, back to parent, click handler, no fetch in child)
Sprint 4: Video2+3+4 — Visual Analysis, Gesture Recognition, Screen Capture (Feb 22, 2026)
Backend — VisualIntegration (Sprint A / Video2):
- Store resized base64 in message metadata (
data_b64field in attachment metadata) -
VisualIntegrationclass (backend/interfaces/integrations/visual.py) — 3 actions:analyze_image,transcribe_handwriting,interpret_diagram - Shared helpers:
_resolve_image(UUID / data URL / raw base64),_call_vision(focused Anthropic API call),_check_llm_consent(GDPR) -
ChatService.get_message_by_idmethod for image reference resolution - Registered in
main.py, system prompt guidance inprompts.py - Backend tests: 25 tests (definition, analyze, transcribe, diagram, resolve, consent, errors, stored attachment)
Frontend — Screen Capture + Accessibility (Sprint B / Video4):
- Tauri:
capture_screen+capture_windowcommands (xcapcrate, desktop-only with#[cfg]) -
screenshot.ts— Tauri IPC wrapper returningAttachedFile - Monitor button in Chat.tsx (desktop-only), wired to attachedFile state
-
ImageRendererenhanced: voice feedback (Volume2 + speakText), high-contrast mode (prefers-contrast media query) - i18n: EN/FR strings for screen capture, image descriptions, visual analysis, gesture detection (25+ keys)
- Frontend tests: 6 screenshot tests + 4 ImageRenderer tests
Frontend — Gesture Recognition (Sprint C / Video3):
-
@mediapipe/tasks-visioninstalled (~137KB gzipped vision_bundle) -
gestureStore.ts— Zustand store with persist (6 gesture→action mappings, sensitivity, showIndicator) -
useGestureDetection.ts— MediaPipe hook (10fps detection loop, 3-frame debounce, sensitivity thresholds) -
GestureDetector.tsx— PiP webcam preview (160x120, bottom-left, minimize button) -
GestureOnlyMode.tsx— Fullscreen accessible overlay (voice feedback, Escape to exit) - Chat.tsx wired: gesture action handler (approve/dismiss/stop/scroll_up), Hand button, GestureDetector + GestureOnlyMode
-
ProfileTab.tsx— GestureSettingsCard (enable toggle, sensitivity, indicator, 6 gesture mapping rows) - Frontend tests: 8 useGestureDetection + 5 GestureDetector + 3 GestureOnlyMode + 4 gestureStore = 20 tests
Totals: 25 backend + 30 frontend = 55 new tests
Sprint 5: Step-Up Authentication ✅ DONE
Goal: Enforce re-authentication for sensitive operations (delete account, data export, ACL changes).
- DB migration:
step_up_challengestable with nonce, expiry, attempt tracking -
StepUpService— create_challenge, verify_challenge (PIN/biometric/password), elevated JWT (15 min) -
require_auth_level(min_level)— FastAPI dependency factory, checks JWT + X-Elevated-Token header - Protected endpoints: delete_account, export_data, withdraw_consent (auth level 2), grant/revoke ACL (auth level 2), remove_member (auth level 2)
- API:
POST /api/auth/step-up/challenge,POST /api/auth/step-up/verify -
StepUpChallengeDialog.tsx— PIN pad, password input, biometric prompt -
useStepUpAuth.ts— listens for step-up-required events, manages elevated token lifecycle -
api.ts403 interceptor — dispatches step-up-required CustomEvent on auth level failure - i18n: stepUp.* keys (EN + FR)
- Backend tests: 12 tests (create challenge, verify PIN/biometric/password, expired, max attempts, elevated token roundtrip)
- Frontend tests: 8 tests (PIN form, password form, biometric prompt, verification success/error, cancel)
Totals: 12 backend + 8 frontend = 20 new tests
Sprint 6: Calendar + Kanban Renderers ✅ DONE
Goal: AI can render interactive calendar schedules and kanban project boards.
-
CalendarRenderer.tsx— Month/Week/Day views (CSS Grid), event dots, navigation, editable mode (inline edit, add) -
KanbanRenderer.tsx— Horizontal columns with draggable cards (HTML5 DnD), labels, editable mode (add card/column, inline edit) -
frontend.py—show_calendar+show_kanbanactions with editable/position_hint support -
register-renderers.ts— registered both new renderers -
prompts.py— AI guidance for when to use calendar vs kanban - i18n: components.calendar.* + components.kanban.* keys (EN + FR)
- Frontend tests: 13 CalendarRenderer + 12 KanbanRenderer = 25 tests
- Backend tests: 6 tests (show_calendar basic/editable/empty/position, show_kanban basic/editable/empty)
Totals: 6 backend + 25 frontend = 31 new tests
Sprint 7: Video Notes + AI Video Analysis ✅ DONE
Goal: Video capture, playback, and multi-frame Claude Vision analysis.
-
video-capture.ts— startVideoCapture (MediaRecorder, WebM/MP4 fallback), extractVideoFrames, getVideoThumbnail -
VideoRenderer.tsx— Native<video>with controls, thumbnail overlay, fullscreen Dialog, download -
LiveCameraPreview.tsx— PiP camera preview, "Analyze" button, continuous mode (5s auto-capture) -
Chat.tsx— Video record button with red dot indicator, elapsed time, 30s auto-stop, video MIME types -
visual.py—_call_vision_multihelper,analyze_videoaction (multi-frame, caps at 10) -
frontend.py—show_videoaction -
prompts.py— AI guidance for visual__analyze_video and frontend__show_video - i18n: video.* + liveCamera.* keys (EN + FR)
- Frontend tests: 6 VideoRenderer + 8 video-capture = 14 tests
- Backend tests: 6 tests (analyze_video success/no frames/frame cap/with question/no context, show_video)
Totals: 6 backend + 14 frontend = 20 new tests
Deferred: V2.5+ — Crypto Marketplace
New Roadmap: Layer 8 / Version 2.5+ (Future/Optional, deprioritized) Status: Deprioritized — Interesting vision but distracts from core product. Can be built as WASM extension later.
Goal: Decentralized marketplace with cryptocurrency payments, data exchange, smart contracts, DAO governance.
Reference: MyHarbor.AI (user's previous project on transaction publishing) for publisher/reader payment model.
Note: This phase is no longer a near-term priority. V1.3 Multimodal and V1.2 WASM both shipped. Focus has shifted to V2.0 Production Platform.
Smart Contracts (Solidity)
- ExtensionMarketplace contract (purchase, license management, revenue splits)
- DataMarketplace contract (list data, purchase, escrow, disputes)
- MorpheeExtensionNFT contract (ERC-721 + ERC-2981 royalties)
- MorpheeDAO contract (proposals, voting, execution, treasury)
- WalletACL contract (spending limits, parent approvals, role permissions)
- Deploy to Ethereum mainnet, Polygon, Arbitrum, Base
- Smart contract security audit (Trail of Bits or OpenZeppelin) — CRITICAL
- Hardhat/Foundry test suite (100+ tests for all edge cases)
Backend: Crypto Payment Infrastructure
- CryptoPaymentService with Web3.py (blockchain interaction)
- Blockchain event indexer (listen for ExtensionPurchased, DataPurchased, etc.)
- Transaction verification (on-chain confirmations, fraud prevention)
- IPFS integration (upload/download encrypted data)
- Price oracle integration (Chainlink for ETH/USD conversion)
- Database tables: crypto_transactions, user_wallets, data_listings, data_purchases, dao_proposals
- Web3 auth endpoints: nonce generation, signature verification, wallet linking
Frontend: Web3 Integration
- Web3Modal integration (WalletConnect v2, MetaMask, Coinbase Wallet)
- Crypto payment UI (select currency, confirm transaction, wait for confirmation)
- Data marketplace UI (browse datasets, preview, purchase, download)
- DAO governance UI (proposals list, voting interface, treasury dashboard)
- Wallet connection flow (detect wallet, sign message, auth)
- Multi-chain support (switch between Ethereum, Polygon, Base)
- Transaction status tracking (pending, confirmed, failed)
- Balance display (ETH, USDC, DAI, MorphCoin)
Data Marketplace Features
- Data anonymization pipeline (PII removal, NER model, GDPR compliance)
- Data encryption (AES-256, decryption key in vault)
- IPFS upload/download (encrypted data, metadata URIs)
- Data quality verification (AI-based review, verified badge)
- Seller reputation system (on-chain ratings, NFT badges)
- Dispute resolution (DAO arbitration, 7-day escrow)
Governance Token (MorphCoin)
- ERC-20 MorphCoin contract (100M supply, governance rights)
- Token distribution (40% treasury, 30% team vesting, 20% airdrop, 10% staking)
- Liquidity provision (Uniswap v3 pools: MorphCoin/ETH, MorphCoin/USDC)
- Staking rewards (stake MorphCoin, earn % of platform fees)
- Airdrop campaign (distribute to early users, active participants)
Verification
- Smart contract tests: 100+ tests with Hardhat/Foundry (mainnet fork testing)
- Backend tests: crypto payment flows, blockchain event handling, IPFS operations
- Frontend tests: Web3Modal connection, transaction signing, marketplace UI
- E2E tests: buy extension with ETH, sell dataset, vote on DAO proposal
- Security audit report (external auditor confirms no critical vulnerabilities)
- Gas optimization (minimize transaction costs on L1, batch operations)
Planned: V2.5+ — Self-Aware AI Development
New Roadmap: Layer 8 / Version 2.0+ (Advanced/Optional) Timeline: 4 weeks (4 phases) Goal: Enable Morphee to read, understand, and improve her own codebase through self-referential memory.
Phase 1: Read-Only Self-Awareness (1 week)
- Implement MorpheeSelfIntegration with read-only actions
- Add
morphee-selfgroup support to GitStore (points to /morphee-beta) - Implement
search_codeaction (git grep, file type filtering, context) - Implement
explain_implementationaction (searches + reads + structures explanation) - Implement
get_architecture_diagramaction (parses docs/architecture.md with code refs) - Add ENABLE_SELF_AWARENESS feature flag and config
- Create CodeExplorer frontend component (search bar, results, syntax highlighting)
- Add morphee_self_config database table
- Test searching Python, TypeScript, Rust, Markdown files
- Test reading code with context (before/after lines)
- Documentation: self-aware-development.md feature doc
- Deploy with feature flag OFF by default
Phase 2: Community Contributions (1 week)
- Implement branch creation for community contributors
- Add
review_community_branchaction (diff analysis, test check, docs check, recommendation) - Create CommunityPage in frontend (PR list, review UI, branch management)
- Add GitHub webhook integration (PR notifications)
- Add code_review_history database table
- Implement ACL roles: viewer, contributor, reviewer, maintainer, dictator
- Test full PR review workflow (create branch → commit → review → recommendation)
- Document contribution guidelines in docs/
Phase 3: Self-Improvement (1 week)
- Implement
suggest_improvementaction (search → analyze → draft → commit) - Add self_improvement_proposals database table
- Create proposal UI in frontend (list proposals, approve/reject)
- Test drafting code changes (multi-file edits)
- Test committing to feature branches (proper git author, message format)
- Add approval workflow (requires dictator role = Sebastien only)
- Implement branch naming convention:
morphee-suggests/{component}-{timestamp}
Phase 4: Polish & Governance (1 week)
- Finalize MorpheeSelfACL model (permissions by role)
- Add contributor recognition system (credits in README, UI badges)
- Create governance documentation (benevolent dictator model, workflow)
- Set up CI/CD for community branches (auto-run tests on PR)
- Add metrics dashboard (contributions, reviews, merges, accuracy)
- Implement self_awareness_audit_log for all actions
- Write blog post: "The First Self-Aware AI Agent"
Safety & Security
- Read-only by default (search/explain = EXECUTE, suggest = PROPOSE)
- File access restrictions (only allowed extensions, block .env/.key/.pem)
- Code execution prevention (no auto-merge, no self-deploy)
- Audit trail (log all self-awareness actions)
- Max file size limit (1 MB per file read)
Verification
- Backend tests: search_code, explain_implementation, review_branch, suggest_improvement
- Frontend tests: CodeExplorer, CommunityPage, proposal UI
- E2E tests: search codebase, review PR, approve proposal, merge to main
- Security tests: verify no unauthorized writes, no sensitive file access
- Performance tests: large repo search (<500ms), branch diff (<2s)
✅ Completed: V1.3 — Multi-Modal Identity (All Phases)
Timeline: 6 weeks Status: SHIPPED — February 22, 2026 Priority: Critical for core persona (Sophie, age 8). Kids without email need voice/face authentication.
Phase 1 ✅ DONE (Sprint 3 above): Multi-method login, child identities (no email), PIN auth (bcrypt), Morphee JWT issuance/verification (iss=morphee, aud=morphee_child), dual-path verify_token, IdentityService, SessionService, 11 API endpoints at /api/identity/*, ChildSwitcher UI, AuthUser.email → Optional[str]. 25 backend + 5 frontend tests.
Phase 2: Biometric Enrollment (2 weeks) — ✅ DONE
- Tauri Rust:
FaceEncoderProvider(candle MobileFaceNet, 128-dim face embeddings,biometricsfeature flag) - Tauri Rust:
VoiceEncoderProvider(candle d-vector CNN, 192-dim speaker embeddings) - Tauri commands: 7 biometric IPC commands (enroll_face, verify_face, enroll_voice, verify_voice, delete_template, has_template, download_model)
- Vault integration: templates stored as base64-encoded JSON in OS vault (never sent to backend)
- Backend:
BiometricService(register, authenticate, delete — trusts Tauri verification) - Backend API: 3 endpoints (
POST /{user_id}/biometric/register,POST /auth/child/biometric,DELETE /{user_id}/biometric/{method_type}) - Frontend:
FaceRecognitionAuthcomponent (camera capture, multi-sample enrollment, verification) - Frontend:
VoiceRecognitionAuthcomponent (mic recording, passphrase enrollment, verification) - Frontend:
BiometricEnrollDialog(parent enrollment wizard, face + voice setup per child) - Frontend:
ChildSwitcherupdated with face/voice auth buttons - Frontend:
ParentalControlsTabupdated with biometric enrollment per child - i18n: 28 new keys (EN + FR) for biometric identity flows
- 14 Rust tests (face/voice encode, compare, threshold, stub, vault roundtrip)
- 11 backend tests (register, authenticate, delete, validation)
-
ChildIdentitytype extended withhas_face,has_voiceflags -
useAuth.switchToChild()supportsbiometricMethodparameter
Phase 3: Step-Up Authentication (1 week) — ✅ DONE
- DB migration:
step_up_challengestable with nonce, expiry, attempt tracking -
StepUpService— create_challenge, verify_challenge (PIN/biometric/password), elevated JWT (15 min) -
require_auth_level(min_level)— FastAPI dependency factory, checks JWT + X-Elevated-Token header - Protected endpoints: delete_account, export_data, withdraw_consent (auth level 2), grant/revoke ACL (auth level 2), remove_member (auth level 2)
- API:
POST /api/auth/step-up/challenge,POST /api/auth/step-up/verify -
StepUpChallengeDialog.tsx— PIN pad, password input, biometric prompt -
useStepUpAuth.ts— listens for step-up-required events, manages elevated token lifecycle -
api.ts403 interceptor — dispatches step-up-required CustomEvent on auth level failure - i18n: stepUp.* keys (EN + FR)
- Backend tests: 12 tests + Frontend tests: 8 tests
Phase 4: Parent-Kid Features — ✅ DONE
- Child identity CRUD: parent creates kid (no email), optional PIN, birthdate, avatar
-
ChildSwitcher— parent switches to child session, child returns to parent session - PIN auth with brute-force protection (5 attempts × 15 min lockout)
- Biometric auth for kids: face recognition + voice recognition enrollment and verification
- Parent enrollment wizard:
BiometricEnrollDialog(multi-step: choose method → enroll face → enroll voice → complete) - Age-based auth: kids use PIN/biometrics, adults use email/OAuth + optional step-up
-
ParentalControlsTab— manage children, enroll biometrics per child -
AuthUser.emailOptional everywhere — all downstream code handles None for kids
Phase 5: Security & Polish — ✅ DONE (core items)
-
Rate limiting per auth method (5 attempts per 15 min — PIN lockout in IdentityService)
-
GDPR: biometric vault cleanup on account/child deletion (
delete_account,delete_childemituser.biometric_cleanup_requiredevent) -
Consent flow: explicit Art. 9(2)(a) opt-in for biometric enrollment (consent types + enforcement + UI checkboxes)
-
Biometric templates stored in VaultProvider (AES-256 encrypted), never in database
-
Rate limiting on identity auth endpoints (5 req/60s: PIN, biometric, refresh, switch-to-parent)
-
Biometric template rotation —
check_template_expiry()warns when templates > 6 months old,re_enrollment_recommendedflag in auth response, warning banner in ChildSwitcher -
Voice-only accessibility mode —
voiceOnlyModein authStore, toggle in ProfileTab, speechSynthesis announcements in FaceRecognitionAuth + VoiceRecognitionAuth, i18n keys (EN + FR)
Remaining (deferred to pre-V2.0 hardening):
- Liveness detection for face — multi-frame pixel variance, brightness variation (blink), center-of-mass shift (liveness.rs, LivenessChallenge.tsx)
- Liveness detection for voice — spectral flatness, HF energy ratio, pitch variance (liveness.rs)
- Biometric template rotation — 180-day expiry, 7-day grace period, prev-template fallback, BiometricReEnrollDialog.tsx, re-enroll API endpoint
- Voice-only accessibility mode — VoiceOnlyMode.tsx with speech recognition, TTS, command parser
- Security + penetration tests for biometric flows
Completed: Phase 3g — Safety, Compliance & Accessibility
See also: "Completed: Safety & Compliance Foundation" section above for ACL, age verification, parental consent, i18n, encryption at rest, data export, a11y audit, i18n audit.
-
H-FEAT-011— Privacy policy + terms — PRIVACY_POLICY.md + backend consents API + frontend consent UI (login, settings) -
H-FEAT-012— Content filtering + parental controls — ParentalControlsTab in Settings with content filter (low/medium/high), child monitoring toggles -
M-FEAT-011— Account deletion (GDPR Article 17 —POST /api/auth/delete-account) — Done -
M-UX-007— i18n foundation (en/fr locales, backend i18n module) — Done -
M-UX-008— Chat text size control — Text size selector (Small/Medium/Large/XL) in Settings > Profile, CSS data attribute -
L-UX-002— Accessibility improvements — Skip-to-content link, ARIA landmarks, prefers-reduced-motion, keyboard navigation, WCAG 2.1 AA audit (10/10 resolved) -
L-IDEA-002— Persona-specific UI modes — Simplified mode toggle with larger text, wider spacing, persistent via localStorage
Partially Done: V2.0 — Rich Content Views
New Roadmap: Layer 7 / Version 2.0 (Production Platform) Status: Some MVP features done, remaining items deferred to V2.0
-
M-FEAT-002— Calendar view —/calendarroute with day view, prev/today/next navigation, Google OAuth check, event cards -
M-FEAT-003— Email view —/inboxroute with email thread list, unread badges, Gmail OAuth check, connect CTA -
L-IDEA-005— Voice input — Microphone button with Web Speech API, continuous recognition, visual feedback -
M-FEAT-010— Offline mode — Service worker with network-first API caching, cache-first static assets, offline fallback -
M-DESIGN-002— Navigation consolidation (reduce 5-tab to 3-4) — deferred to V2.0 polish
Planned: Layer 7 (V2.0) — Production Platform
New Roadmap: Layer 7 / Version 2.0
Monitoring & Analytics
- PostHogClient wrapper (async event capture, PII scrubbing)
- Event definitions: 10+ core events (chat_message_sent, tool_call_executed, approval_requested, etc.)
- Privacy:
analytics_enabled(opt-in, default false) - Prometheus
/metricsendpoint + custom metrics (API, LLM, Memory, WebSocket) - 5 Grafana dashboards: API Health, LLM Performance, Memory System, User Activity, Errors & Alerts
- Alert rules: error rate spike, LLM timeout >10s
- Docker Compose: Prometheus + Grafana services
Channels
-
C-FEAT-005— Channels: group messaging, multi-user conversations - Channel adapters: chat, email, SMS, push, WhatsApp, Telegram
Browser Extension & SDK
- Browser extension (Chrome/Firefox): floating widget, context menu, keyboard shortcuts
- Embedding SDK (
@morphee/sdk): npm package, chat widget, task/memory API - Partnership framework: API keys, tiers, revenue sharing
Completed: CI/CD — GitHub Actions
Goal: Automated testing, coverage tracking, and desktop app builds via GitHub Actions.
CI Workflow (.github/workflows/ci.yml)
- Backend tests job: PostgreSQL + Redis service containers, pytest with coverage
- Frontend tests job: vitest with v8 coverage (lcov, html, json reporters)
- Frontend build job: TypeScript check + Vite build
- Frontend lint job: ESLint
- Coverage thresholds: 60% lines/functions/statements, 50% branches
- PR coverage comments via
vitest-coverage-report-action - Coverage artifacts uploaded (HTML report, lcov.info)
- Concurrency control: cancel in-progress runs on same branch
Release Workflow (.github/workflows/release.yml)
- Trigger: GitHub Release published (or manual dispatch)
- Cross-platform Tauri builds: macOS (universal), Windows, Linux
- macOS Apple signing + notarization (requires GitHub Secrets)
- Artifacts auto-uploaded to GitHub Release as downloadable assets
- Rust caching for faster builds
Rust Tests Workflow (.github/workflows/rust-tests.yml)
- Trigger: changes to
frontend/src-tauri/**+ weekly schedule - cargo test with Rust caching
- Combined-feature check:
cargo check --features local-llm,audio,biometrics - System dependencies auto-installed
Coverage Enhancement
- vitest reporters: text, text-summary, json-summary, json, lcov, html
- Coverage thresholds enforced (build fails if coverage drops)
-
reportOnFailure: true— reports generated even when thresholds fail - HTML report downloadable as CI artifact for line-level inspection
Pre-existing Test Fixes
- Fixed AuthForm tests:
getByText→getAllByTextfor duplicate title/button text - Fixed Dashboard tests:
getByText('1')→getAllByText('1')for duplicate stat counts - Fixed Login tests: same
getAllByTextfix for Sign In title/button
Completed: Housekeeping (Feb 12, 2026)
- Migrate Google OAuth from popup to full-page redirect (HTMLResponse+postMessage → RedirectResponse+query params, platform-aware redirect_to,
FRONTEND_URLconfig) - GoTrue upgrade: v2.99.0 → v2.185.0 + Python
gotrue→supabase_authpackage migration - Full dependency audit and upgrade (Python, npm, Rust crates, Docker images)
- Python: fastapi 0.115.8, uvicorn 0.34.0, pydantic 2.10.6, openai 1.66.3, cryptography 44.0.2, httpx 0.28.1, pytest 8.x, supabase-auth 2.28.0, and more
- Docker: Postgres 15.1.0.117 → 15.8.1.060
- npm:
npm update(minor/patch within ^ranges) - Rust:
cargo update(patch within semver ranges) - Fixed httpx 0.28 breaking change:
AsyncClient(app=...)→ASGITransport
Verification
- 1138 backend tests pass (95% coverage)
- 37 Rust tests pass (desktop)
- 633 frontend unit tests pass
- Frontend build clean (662 KB JS, 38 KB CSS)
Completed
Documentation Cleanup (Feb 11, 2026)
- Moved all docs to
docs/directory, archived old design docs - Rewrote ROADMAP.md with AI-first vision, Group/Space, everything-is-an-Integration
- Rewrote architecture.md with new system design
- Rewrote interfaces.md with LLM/Memory/Frontend as core Integrations
- Updated all docs with Group/Space terminology
- Updated README.md as concise entry point
Foundation Layer (Built)
Backend — See test-results.md for current test counts and coverage
| Component | Notes |
|---|---|
| FastAPI server | Async, hot-reload in dev |
| Supabase Auth | JWT signin/signup/refresh/signout |
| Group management | CRUD, RLS policies, group isolation |
| Task system | CRUD, state machine, parent/child tasks |
| Space system | CRUD, group-scoped queries |
| WebSocket | JWT auth, group-based event filtering |
| Interface system | MCP-style, Echo + Webhook integrations |
| Redis event bus | Pub/sub for real-time updates |
| Docker Compose | PostgreSQL, Redis, backend (asyncpg direct) |
Frontend — 2017+ unit tests + 60 E2E tests, build clean (435 KB JS, 67 KB CSS) — +46 tests Feb 19, 2026
| Component | Notes |
|---|---|
| Auth | Login/signup, token refresh, 401 interceptor |
| Onboarding | AI-guided group + space creation via chat |
| App shell | Sidebar, header, responsive, dark mode |
| Tasks | List/detail split view, CRUD, actions, WebSocket updates |
| Spaces | List/detail, CRUD, space-scoped tasks |
| Dashboard | Stats cards, recent tasks, quick create |
Audit Status Summary
Last Audit Date: February 21, 2026 (legal) Completion Rate: 179/274 items (65.3%)
| Audit Type | Total | Done | Remaining | Priority Breakdown |
|---|---|---|---|---|
| Code Quality | 72 | 34 | 38 | 0C/12H/13M/13L |
| Documentation | 9 | 0 | 9 | 0C/4H/4M/1L |
| Product | 28 | 8 | 20 | 3C/9H/6M/2L |
| Legal (GDPR) | 65 | 64 | 1 | 1C (organizational DPAs) |
| Security | 69 | 66 | 3 | 0C/0H/0M/3L |
| Accessibility | 46 | 41 | 5 | 0C/0H/3M/2L |
| Performance | 33 | 26 | 7 | 0C/0H/0M/7L (all deferred) |
| i18n | 12 | 0 | 12 | 0C/4H/5M/3L |
| TOTAL | 274 | 179 | 95 | 4C, 29H, 31M, 31L |
Key Notes:
- Legal: 98.5% complete (64/65 total items across all audits). V1.3 audit added 10 new biometric/visual findings — all 10 fixed same session. Only C-SHARE-001 (DPAs with processors) remains — requires legal team action, not code fixes.
- Security: 95.7% complete. All Critical/High items resolved. 3 Low items remain.
- Accessibility: 89.1% complete. All Critical/High items resolved. WCAG 2.1 AA compliant.
- Performance: 78.8% complete (26 fixed, 7 deferred as acceptable). Bundle 49% smaller (134 KB gzipped).
- i18n: Foundation complete (i18next, en/fr locales with 539 keys each). Frontend translation in progress.
- Code Quality: 47.2% complete. Focus on High items (WS, tests, exports, i18n coverage).
- Documentation: 78% complete (7/9 items resolved in Feb 15 audit). 2 items remain (M-XREF-001: broken SHORTCUTS.md link, L-STD-001: feature doc naming convention).
- Product: 28.6% complete. Critical UX items done (search, profiles, discoverability). Remaining: professional integrations, polish.
See audits/ for detailed findings and checklists.
Quick Commands
# Start backend
docker compose -f docker-compose.dev.yml up -d
curl http://localhost:8000/health
# Start frontend
cd frontend && npm run dev
# Run tests
docker compose -f docker-compose.dev.yml exec -T backend pytest -q --cov=. --cov-report=term-missing
cd frontend && npx vitest run
cd frontend && npm run test:e2e
Documentation
| Document | Purpose |
|---|---|
| ROADMAP.md | Vision, concepts, all phases |
| This file | Progress tracking, next steps |
| architecture.md | System architecture |
| interfaces.md | Integration/Interface system |
| api.md | API reference |
| testing.md | Testing guide |
| deployment.md | Production deployment |
| troubleshooting.md | Common issues |
| stories/ | Persona-based user stories |