Peer Mentor (Likeperson)
Volunteer peer mentors are the primary end users of the application. They are individuals with lived experience of a disability or health condition who provide peer support to others. They register their activities, manage their contacts, track certifications, submit travel reimbursements, and receive encrypted assignments. They range widely in age and digital confidence — from tech-savvy younger volunteers to elderly users with cognitive or sensory impairments. Many use the app on a mobile device in the field, often immediately after a home visit or activity.
Story Priority Distribution
User Stories by Feature
Email & Password Login
View FeatureThe logout action is accessible from the app's settings menu. When triggered, the Auth Service calls Supabase Auth's sig...
When authentication fails, the user must receive actionable, localized feedback rather than a generic error. The Auth Se...
From the login screen, the user can navigate to the password reset flow by tapping a 'Forgot password?' link. The Passwo...
When the user taps the reset link in their email, the app handles the deep-link redirect via the registered URI scheme a...
After a successful email/password login, the Supabase JWT session token is securely persisted via Flutter Secure Storage...
Any registered user must be able to authenticate using their email address and password as a universal fallback authenti...
BankID & Vipps Authentication
View FeatureWithin the app's settings, users can view their current biometric authentication status and manage enrollment. Options i...
After a successful first-time BankID or Vipps authentication, the app prompts the user to enable biometric re-authentica...
On subsequent app launches, when the user has previously enrolled biometrics, the Biometric Auth Screen presents the pla...
When biometric authentication fails for any reason — hardware failure, too many failed attempts, biometric data changed...
Both BankID and Vipps can return a variety of error states: user cancellation, network timeout, provider unavailability,...
When a user authenticates with Vipps and the Vipps OIDC token contains a personnummer claim, the Vipps Integration Servi...
After successful BankID or Vipps authentication, the Auth Token Repository stores the Supabase access token and refresh...
On first login, the user selects BankID as their authentication method. The app launches an in-app browser that navigate...
On first login, the user selects Vipps as their authentication method. The app launches an in-app browser pointing to th...
Role-Based Access Control
View FeatureThe Role Config Store provides a local cache layer for role and membership data fetched from Supabase. When the device l...
When a user belongs to multiple organizations or local associations, the Organization Selection Screen is displayed imme...
When an authenticated user navigates to a route that requires permissions their current role does not grant, the Permiss...
When a user is authenticated as a Peer Mentor, the Permission Guard and Role Authorization Service enforce a data scope...
The Permission Guard is integrated into GoRouter's redirect mechanism and is evaluated on every navigation event includi...
Activity Logging Wizard
View FeatureThe Activity Registration Service implements partial save (draft persistence) throughout the wizard flow. After each ste...
The Activity Summary Screen is displayed as the final step of the wizard, presenting a read-only summary of all entered...
The Default Values Widget is an inline settings component embedded within the wizard flow and accessible from user setti...
When the wizard pre-fills fields with stored defaults, users can edit any field within the standard wizard flow to overr...
When initiating an activity registration, the user is presented with the Activity Type Selection Screen showing all acti...
The Activity Wizard Screen implements a multi-step registration flow using BLoC for step state management and GoRouter n...
Quick Registration mode is triggered when the user has stored defaults that fully satisfy the required activity fields (...
Event Creation & Management
View FeatureThe Event Detail Screen exposes an edit action (via an icon or contextual menu) that opens an inline edit mode or naviga...
The Event Detail Screen includes an 'Add Participants' action that opens the Event Participants Widget in an addition mo...
Each participant entry on the Event Detail Screen includes a remove action (swipe-to-delete or a contextual button). Tap...
The Event Detail Screen displays event title, date, time, duration, location, and summary in a structured layout, follow...
The event creation wizard walks the user through sequential steps: event title → date → time → duration → location → sum...
The Event Participants Widget renders a debounced search input that queries the Contact Repository against the user's or...
Speech-to-Text Input
View FeatureThe Speech Input Widget is implemented as a composable Flutter widget that wraps any TextEditingController. Feature team...
Speech input preferences are accessible from the app's Settings screen. Available settings include: recognition locale (...
When a peer mentor first taps the microphone icon, the Voice Recording Control checks current permission status via perm...
The Voice Recording Control renders a live animated waveform that responds to audio input levels during an active recogn...
The Voice Recording Control displays distinct Stop and Cancel actions during an active session. Tapping Stop finalizes t...
The Speech Recognition Service identifies and categorizes recognition failures into distinct error states: microphone pe...
After a successful recognition session, the Speech Input Widget injects the final transcript into the Flutter TextEditin...
The activity wizard's summary field displays an inline microphone icon rendered by the Speech Input Widget. The peer men...
Document Attachment to Activities
View FeatureThe Document Attach Widget provides remove controls (e.g., a delete icon) on each document thumbnail. Tapping the remove...
After completing an activity registration, the user sees a Document Attach Widget embedded in the activity summary scree...
Within the File Upload Screen, the user can choose the camera option to open the device camera through Flutter's image_p...
Within the File Upload Screen, users can choose the gallery or file picker option. Flutter's image_picker handles galler...
The Document Attach Widget is embedded not only in the activity summary screen during registration but also in the activ...
The File Upload Screen performs client-side validation before any network request: file size must not exceed 10 MB and t...
Contact List & Search
View FeatureThe View Switcher Widget provides a toggle control that allows users to switch between the Contacts list view and the Pe...
The Contact Filter Panel provides a slide-up or inline panel with filter controls for status (active, paused, inactive),...
The Contact Repository caches contact data locally using Riverpod with periodic background refresh when connectivity is...
All elements of the Contact List screen must meet WCAG 2.2 AA accessibility requirements. Contact Card Widgets carry sem...
Peer mentors interact with the app primarily in short, goal-directed sessions after completing a peer support visit. The...
Both coordinators and peer mentors access the Contacts screen, but the data shown is scoped to their organizational role...
The Contact Search Bar provides an inline search experience with debounced input that triggers Supabase queries filtered...
Contact Detail & Management
View FeatureThe Custom Fields Table Widget fetches the organisation's field definitions from the organisation labels system in Supab...
The Edit Contact Screen implements periodic auto-save of the current form state to SQLite on the device. The draft is ke...
The Contact Detail Screen supports deep-link navigation, meaning it can be opened directly from any screen that referenc...
The Contact Notes Repository implements a local-first caching strategy. Recent notes for each contact are cached in SQLi...
The Contact Detail Screen is the primary read view for a single contact record. It presents personal information (name,...
The Edit Contact Screen provides a guided, step-by-step reactive form built with Flutter's Form widget and custom AppTex...
The Contact Notes Widget provides inline add-note functionality accessible from the contact detail screen. When a note i...
The Contact Notes Widget renders the full notes history as a scrollable vertical timeline. Each note entry displays the...
The Edit Contact Screen applies field-level validation as part of Flutter's reactive form validation system. Validation...
Peer Mentor Profiles
View FeaturePeer mentor profiles are accessible from multiple entry points in the application: the contacts list (when filtered to s...
A peer mentor can navigate to their own profile detail screen to review all role-specific attributes that the organisati...
The peer mentor profile service uses a Riverpod provider backed by real-time Supabase subscriptions to compute derived s...
Peer Mentor Pause & Availability
View FeatureThe Pause Status Screen serves as the canonical view for a peer mentor's own availability state. Beyond the action contr...
A peer mentor who is temporarily unavailable due to personal circumstances, health challenges, or seasonal commitments c...
A peer mentor currently in paused status can navigate to the Pause Status Screen and tap a clearly labelled resume butto...
The Availability Toggle Widget is a compact inline component — rendered as a labelled switch or pill button with colour-...
Travel Reimbursement Registration
View FeatureThe Expense Repository provides a query interface to fetch the authenticated user's expense report history from the `tra...
After selecting a fixed-amount expense type (toll, parking, or public transit), the wizard renders the Expense Amount In...
The Expense Rules Riverpod Provider fetches organisation-specific reimbursement configuration from Supabase and makes it...
The expense type selector is the mandatory first step in the travel reimbursement wizard. It presents a dropdown sourced...
After selecting 'Kilometre allowance' as the expense type, the wizard renders the Mileage Calculator Widget. The user en...
The Expense Registration Screen orchestrates the full wizard flow using the Expense Registration BLoC for state manageme...
Receipt Upload & Management
View FeatureEach Receipt Thumbnail Widget exposes a delete affordance (e.g., a close button overlaid on the thumbnail). When the pee...
From the bottom sheet action menu opened by the Camera Capture Widget, the user can select 'Choose from Library' to open...
The Receipt Upload Screen renders a thumbnail grid via the Receipt Thumbnail Widget. Each thumbnail shows the compressed...
The Receipt Processing Service maintains an offline retry queue for receipt images that fail to upload due to network un...
Users can open the receipt upload screen from within the expense detail view and attach one or more receipt images to th...
When on the Receipt Upload Screen, the user can tap a camera action button that opens a bottom sheet action menu via the...
When an expense item's amount reaches or exceeds the organisation-configured threshold (e.g., 100 kr for HLF), the Recei...
Driver Honorarium & NDA Management
View FeatureThe Driver Honorarium Screen displays an interactive summary that updates in real time as the peer mentor inputs trip co...
The Driver Honorarium Screen includes a history view that lists all honorarium records submitted by the peer mentor, ord...
A peer mentor who acts as a volunteer driver or who handles sensitive assignment data needs visibility into the state of...
Peer mentors who act as volunteer drivers for their organisation (particularly Blindeforbundet, where drivers transport...
When a peer mentor is about to receive a sensitive assignment (e.g. a home visit for Blindeforbundet involving health re...
When an NDA expires the system automatically blocks access to encrypted assignments. On the next login or on attempting...
Personal Activity Statistics
View FeatureWithin the Statistics Dashboard Screen, the Statistics Calculation Service aggregates the authenticated peer mentor's ac...
On the Statistics Dashboard Screen, period-based comparisons are displayed alongside the primary statistics. When a date...
The peer mentor navigates to the statistics section of the app and is presented with a full-screen dashboard showing the...
On the Statistics Dashboard Screen, a date range filter control allows the peer mentor to switch between four preset per...
The Activity Chart Widget is embedded on the Statistics Dashboard Screen and renders a dynamic chart of the peer mentor'...
The Stats Summary Widget renders as a compact grid of stat tiles on the Statistics Dashboard Screen, positioned prominen...
Push Notifications & Scenario-Based Alerts
View FeatureEach push notification payload includes a deep-link route payload that the Push Notification Service interprets when the...
The Notification Item Widget supports three interaction patterns for notification management. Tapping a notification mar...
Beyond operational reminders, the Notification Scenario Engine supports engagement-focused milestone notifications. Conf...
The Notifications Screen provides a chronological, date-grouped list of all push notifications delivered to the authenti...
The Notification Settings Screen allows each user to control which push notification categories they subscribe to. A mas...
The Notification Scenario Engine includes an inactivity detection rule. A Supabase scheduled Edge Function runs periodic...
The Calendar Sync Service integrates with the device's native calendar using the device_calendar Flutter plugin. On firs...
When a coordinator dispatches a new encrypted assignment to a peer mentor, the Notification Scenario Engine detects the...
The Notification Scenario Engine includes a time-based follow-up rule specific to Norges Blindeforbund's workflow requir...
Encrypted Assignment Dispatch
View FeatureAfter reading the full assignment details on the Assignment Detail Screen, the peer mentor is presented with action butt...
The peer mentor's assignment inbox displays all encrypted assignments sent by coordinators. Each list item shows the ass...
When the peer mentor opens an assignment from the inbox, the Assignment Detail Screen retrieves the encrypted ciphertext...
On first BankID-authenticated login, the Key Management Service generates an asymmetric X25519 key pair. The private key...
Assignment Status Tracking
View FeaturePeer mentors need a focused, role-scoped view of their own assignments. The assignment status screen fetches only rows t...
Both peer mentors (for their own assignments) and coordinators (for any assignment in their scope) need access to the fu...
The urgency badge widget is a reusable component applied to each assignment row in the status list. It calculates elapse...
When a peer mentor has an assignment that has not progressed past a pre-completion state within the configured threshold...
Yearly Impact Summary
View FeatureWithin the impact summary sequence, individual metric slides use the Animated Stats Widget to display numbers using Flut...
In addition to the annual summary triggered on 31 December, the system generates a half-year variant on 30 June. The Yea...
Within the Impact Summary Screen, a share button invokes the Impact Share Service to generate either a static shareable...
The Impact Summary Repository caches the summary JSON payload locally on the device after the first successful load. Sub...
When the Impact Calculation Service determines that a user has zero qualifying activities for the summary period, it gen...
When a new annual impact summary is available (triggered on 31 December), the user can open a full-screen animated retro...
When the Impact Summary Trigger Service generates a new summary for a user, it dispatches a push notification via the Pu...
The Impact Summary Screen presents the retrospective as a paginated sequence of themed story slides rendered by the Year...
Achievement Badges & Recognition
View FeatureWhen the Achievement Service determines that a user has crossed a badge threshold — triggered as a background job after...
Tapping a badge on the Achievements screen expands or navigates to a detail view showing the badge's full name, category...
The Badge Repository stores badge definitions with an organisation scope field, and the Achievement Service evaluates el...
The Achievements screen displays every badge in the user's organisation-scoped catalogue, grouped by recognition categor...
Each Badge Widget renders a circular progress ring around the badge illustration indicating the user's current progress...
Every Badge Widget includes a descriptive alt text string that conveys the badge name, its unlocked/locked state, and cu...
Member Recruitment
View FeatureThe recruitment screen displays a list of referral events recorded in the member_recruitments table. For each referral,...
Each time a referred sign-up is confirmed as a successful new member, the Recruitment Service increments the peer mentor...
The peer mentor can navigate to the recruitment section of the app and view a summary of their recruitment activity: the...
The Referral Link Widget exposes a share action that triggers Flutter's Share plugin, surfacing the native iOS or Androi...
The system generates a short referral URL that encodes the peer mentor's user ID and organisation slug. The Recruitment...
Course Enrollment Management
View FeatureOn successful enrollment, the CourseEnrollmentService triggers the Push Notification Gateway to dispatch a confirmation...
The Course Catalog Screen presents all available courses in a scrollable list or grid view, showing each course's title,...
The Course Detail Screen presents comprehensive information about a selected course: description, prerequisite certifica...
The CourseEnrollmentService returns typed error states for two failure scenarios: full capacity and unmet prerequisites....
After tapping the enrollment CTA on the Course Detail Screen, the user is presented with the Enrollment Confirmation Scr...
Digital Certificate Management
View FeatureThe Certificate Storage infrastructure component manages the Supabase Storage bucket that holds digital certificate asse...
HLF's physical certification card is culturally significant — referred to as an 'adelsmerke' (badge of honour) — and the...
The Certificate Screen provides peer mentors with a centralized, at-a-glance overview of all their certifications. Each...
The Certificate Card Widget renders a detailed view of an individual certification record. For peer mentors, this provid...
The Expiry Alert Widget and Certificate Service work together to trigger push notifications via the Push Notification Se...
Mentor Program Management
View FeaturePeer mentors access the Mentor Program Screen to see a list of their active mentee pairings. Each pairing entry shows th...
Both peer mentors and coordinators can access the Pairing Detail Screen for a specific pairing by tapping an entry in th...
Mentor Workshop & Career Tools
View FeatureScreen Reader Support
View FeatureThe Accessibility Config Repository persists per-user accessibility preferences to the accessibility_preferences table i...
The Semantic Label Service is responsible for triggering live region announcements whenever dynamic UI state changes occ...
All wizard screens in the app use a step progress model that is currently communicated visually via a progress bar or st...
Every widget in the application — including AppButton, AppTextField, navigation bars, cards, dialogs, and list items — m...
Sensitive fields — including encrypted assignment details, contact personal identification numbers, epikrise content, me...
Cognitive Accessibility
View FeatureCognitiveModeService enforces a maximum-five-item constraint on all selection lists when cognitive mode is active. Lists...
The StepProgressWidget renders in all wizard screens (activity registration, event creation, bulk registration, NDA sign...
The SimplifiedNavigationScreen consumes the simplified layout flag from CognitiveModeService and conditionally renders a...
The shared PageHeader widget enforces the presence of a back button on all non-root screens via a required parameter. Sw...
AccessibilityPreferencesRepository persists the cognitive mode flag, font scale, and contrast theme as a per-user record...
Users can toggle cognitive accessibility mode on or off through the settings screen. When enabled, CognitiveModeService...
Typography & Contrast Settings
View FeatureThe Accessibility Settings screen displays a live preview area that updates in real time as the user interacts with the...
A dedicated Accessibility entry is surfaced in the main Settings screen, giving users a clear and discoverable path to f...
When a user saves font scale or contrast theme preferences, ThemeService writes the values to ThemeRepository, which per...
Users access the Accessibility Settings screen and use the Font Scale Widget to select a font scale factor. The widget r...
The Contrast Theme Widget presents three theme options with colour swatch previews: Standard (default design token set),...
The WCAG Contrast Validator service programmatically asserts minimum contrast ratios (4.5:1 for normal text, 3:1 for lar...
Navigation Shell
View FeatureThe Navigation Shell Widget includes an AppBar with a hamburger menu icon that opens a Flutter Drawer. The Drawer lists...
Using Flutter's StatefulShellRoute, each tab branch maintains its own Navigator stack and widget state independently. A...
The App Router Service is configured with go_router deep link support. When the app receives a push notification tap eve...
The Navigation Shell Widget and Bottom Navigation Bar are built using Flutter's Accessible Widget Library with semantic...
The bottom navigation bar provides persistent, one-tap access to all five primary tab destinations throughout the app. T...
The App Router Service applies role-based route guards at the shell level using Riverpod providers that reactively read...
The App Router Service uses a Riverpod provider that listens to Supabase's auth state stream. When the authentication st...
Settings & Preferences
View FeatureA language selection card in Settings allows the user to choose their preferred display language. The selection is appli...
User preferences (notification toggles, language selection, and references to accessibility settings) are stored using a...
The Settings screen provides a notifications card section where users can enable or disable individual notification cate...
The Settings screen includes an account management card containing a sign-out action. Tapping the sign-out button presen...
The Settings screen includes a dedicated accessibility card section that serves as the navigation entry point to the ful...
The Settings screen must be reachable via the hamburger menu on every tab of the bottom navigation bar. The screen displ...