Files
rely/docs/client-audit-relationship-app.md
2026-05-17 00:17:03 +02:00

8.0 KiB

Client Audit: Relationship Assistant App

Date: 2026-04-01

Current implementation summary

The client is a Flutter app using Riverpod for state management and a single MaterialApp rooted at lib/main.dart. Authenticated users land in a custom shell with index-based navigation across dashboard, people, moments, signals, ideas, reminders, sync, and settings.

The app is already local-first in practice. Product state lives in LocalRepository and is persisted through a LocalDataStore abstraction with Hive as the default backend and shared preferences as a fallback/migration path. There is also background sync scaffolding, notification scheduling, and a fake backend mode for offline development.

Share intake exists, but the implementation is narrow. Flutter-side logic supports a WhatsApp-oriented share parser, source-link resolution, and a manual share inbox. Native platform wiring is incomplete for production-grade cross-app sharing, especially on iOS and likely also on Android for text share intents.

A. Current implementation inventory

Feature Area Current State
Client technology Flutter
State management Riverpod (Notifier, AsyncNotifier, provider overrides in tests)
Navigation Single MaterialApp, custom shell, route pushes for secondary flows
Local persistence Hive by default, shared preferences fallback/migration
Auth Local/fake-friendly sign-in flow with token-store abstractions
People list/detail Implemented, responsive, searchable, editable
Person creation/editing Implemented with validation and duplicate-name warning
Notes/profile context Implemented as a single freeform notes field plus tags
Moments/captures Implemented
Ideas Implemented
Reminders Implemented with local notification scaffold
Shared message history Implemented per profile
Share intake Implemented in Flutter, but WhatsApp-specific and not fully generalized
Share inbox Implemented for unresolved profile matching
Source linking Implemented for repeated source-to-profile matching
Preference inference Implemented locally from shared chat text
Search/filtering Implemented for people; limited elsewhere
Theming/design system Implemented via AppTheme, custom frosted cards, responsive layouts
Tests Good targeted widget/unit coverage, no true end-to-end native share tests
Backend sync readiness Good scaffolding, still fake/offline-friendly
Privacy/trust UX Limited; local-first behavior exists more in code than in user-facing copy
Cross-platform share viability Partial; Flutter layer exists, native integration incomplete

B. Grading

Feature Area Status Grade Notes Risk / Missing Pieces Recommended Next Step
App architecture Present B Clear enough separation between UI, local repository, sync, and integrations Some large UI files, especially PeopleView Add smaller share/fact modules instead of broad refactors
Local-first persistence Present A- Hive-backed state with migration path and test coverage Still JSON-in-Hive rather than richer queryable store Keep current approach for this iteration
People management Present B Good responsive UI, editing, duplicate warning, merge flow Person model is too thin for relationship intelligence Extend model with aliases, facts, dates, timestamps
Moments / history Present B Useful local activity log History is not yet strongly typed for preferences/dates/fact provenance Add structured facts on top rather than replacing moments
Ideas / reminders Present B Solid founder-mode utility already Not tightly connected to share capture Reuse future share classification to feed these areas later
Share intake pipeline Partial C Flutter-side ingest and inbox exist WhatsApp-specific, no generic text/URL pipeline, native wiring incomplete Generalize payload normalization and improve clarification UX
Person resolution Partial B- Exact/near-match logic and source links already exist Resolution is tied to sender matching and not broader share assignment Add explicit assign/create/save-to-inbox review flow
Inbox / triage Partial C+ Resolves ambiguous source matching Cannot yet classify into structured facts/dates/preferences Add fact classification and later reassignment/edit support
Search / discoverability Partial C+ People search/filter exists No real inbox/fact/date search Keep scope limited; prepare data for later search expansion
Privacy / trust UX Weak D Local-first architecture exists App does not clearly explain on-device storage or future AI sharing controls Add clear local-first settings copy and sensitive-data affordances
Cross-platform share readiness Weak D Plugin added, listener implemented Android manifest missing share intent filters; iOS share extension not configured Fix Android now, document iOS as deferred native work
Test posture Present B+ Good unit/widget coverage for local repo and share inbox Missing tests for generalized share parsing and structured triage Add targeted parser/repository/widget tests

C. Product readiness assessment

Solo founder daily use

Current usefulness is moderate. The app already supports keeping people, captures, reminders, and ideas locally, which is enough for founder testing. However, the most important real-world capture path, sharing snippets from other apps, is not yet strong enough to rely on daily.

Friction of data entry

Manual entry is acceptable. Cross-app capture still has too much friction because it is optimized around one parser path instead of a general intake flow. Ambiguous content can be saved, but not yet shaped into structured, reviewable facts.

Trust / privacy feel

The implementation is local-first, but the UX does not communicate that clearly enough. For a relationship app, trust is part of the product. The app should say what stays on device, what is not yet shared, and how users can correct or delete imported facts.

Extensibility for future LLM support

Reasonably good. The repository pattern, fake backend mode, and local inferred preference signals create a workable foundation. The main gap is data shape: profile context is still too flat, and shared content is not normalized into a recommendation-ready structure.

Cross-platform viability

Good at the Flutter layer, incomplete at the native share-entry layer. Android needs explicit share intent wiring. iOS still lacks a real share extension.

Likely adoption blocker

The biggest blocker is not “AI quality”; it is capture friction. If sharing a snippet from WhatsApp, Safari, Notes, or Messages into the app is unreliable or too manual, the product will not accumulate enough high-value context to become habit-forming.

D. Top implementation priorities

  1. Generalize share capture into a platform-aware text/URL pipeline with a clear internal payload model and Android native entry wiring.
  2. Add an inbox-first clarification flow that lets the user assign to an existing person, create a new person quickly, or save unresolved data for later.
  3. Extend the local person knowledge model with aliases, structured facts, important dates, timestamps, and source traceability.
  4. Upgrade the inbox from “resolve person only” to “triage into note / like / dislike / date / idea-ish fact”.
  5. Improve privacy/trust wording and make correction paths more obvious.

Implement a disciplined client-only slice:

  • generic shared text / URL normalization
  • Android text share intent support
  • share clarification sheet for assign/create/inbox
  • richer local fact/date models with provenance
  • inbox triage into structured facts or important dates
  • person detail UI for reviewing captured facts/dates
  • targeted tests

Explicitly defer:

  • native iOS share extension target work
  • real backend sync of new fact/date entities
  • real LLM or recommendation calls
  • large navigation or persistence rewrites