Expert review · ONVP mobile · 06 October 2026

Make every screen clear.
Make every action trustworthy.

The first proposal improved composition, but left essential interactions incomplete. The next design must preserve camera, time and site context before adding visual polish.

Open revised screen prototype ↗Read all 12 screen reviews ↓

A coherent product, beyond a tidy mockup

Keep the restrained dark palette and camera-led layout. Remove the extra Operate/Maintain mode, restore the full visual time browser, and give Settings a narrow, useful purpose.

Evidence boundary. Findings combine the supplied iOS screenshots, current native source, web patterns and the first prototype. Fixes below are reasoned recommendations backed where applicable by platform/accessibility guidance—not results of user testing. The revised prototype demonstrates proposed behavior; it is not a shipped app.
P0Correctness / trustP1Core task frictionP2Refinement

One navigation model, one visual language

Observed: the native media tab changes its label and destination. V1 adds a second navigation mode and omits full Settings/Clips. Users must infer where work moved.

Fix: stable Cameras · Events · Clips · Systems · Settings destinations. Resolve Systems availability from permissions; keep the session’s tab arrangement stable. Put Map inside Systems and Live/Recordings inside a camera. Preserve each tab’s position and filters. Apple tab-bar reference.

Polish: one spacing scale, consistent rows and corner radii, fewer nested panels, one accent for selection. V1’s card text contrast measured about 3.15:1 muted, 3.05:1 accent and 4.22:1 online. Raise normal text to ≥4.5:1; preserve status words alongside colour. Use generous 44-point touch targets as an iOS design target, not a claim about WCAG’s minimum. WCAG contrast · Apple accessibility.

Review of every screen

01 / CAMERAS P1

Make the right camera obvious

Observed: V1 shares one favourite flag across cameras. Large repeated cards limit scanning.

Fix: favourites keyed by camera; searchable names; consistent 16:9 previews with site and freshness. Distinguish periodically refreshed previews from live video.

Pass when favouriting one camera affects only that camera; Back restores the list position.

02 / LIVE P1

Video first, controls second

Observed: native portrait space is inefficient; V1 promotes several competing actions.

Fix: fixed camera identity and Live/Recordings switch; uncropped video; Photo, Sound and Controls below. Expose only supported, permitted hardware actions.

Pass when returning from background shows reconnecting/retry rather than a misleading frozen live frame. #128

03 / RECORDINGS P0

Time must be dependable

Observed: V1 date/speed choices do not apply. Three thumbnails cannot replace the native visual browser.

Fix: shared playback timestamp; visible date/timezone; real seek and speed state; explicit “Browse snapshots” entry alongside the timeline.

Pass when date, timeline, snapshot and export agree on the same instant; gaps and unavailable footage are explicit.

04 / SNAPSHOT BROWSER P1

Make each control mean one thing

Observed: the oversized date block, repeated arrows and unlabeled interval compete for attention. “Every 15 min” can be mistaken for recording frequency.

Fix: one compact date selector beside a quieter “Jump to hour” action; a separate “Preview spacing” control with timezone shown as plain context. The hour sheet explains that it scrolls previews. Keep the continuous three-column grid, readable timestamps and selected border plus check.

Pass when changing the date and spacing updates the previews; Jump to hour scrolls to that hour; selecting 09:30 opens that recording paused. Date, spacing and selected tile persist on return, with no horizontal overflow.

Implementation reference: the web mobile recording browser uses a three-column grid. This adaptation keeps rows continuous across hour boundaries.

05 / EVENTS P0

An event is a precise destination

Observed: V1 event clicks lose camera and event time.

Fix: rows carry event type, camera, site, timestamp and timezone. Open that recording directly; preserve event-list filters on return.

Pass when two events from different cameras open their own camera/time; expired footage explains why playback is unavailable.

06 / CLIPS P0

Show the export’s real status

Observed: V1 has only a placeholder. Native export announces submission before its request completes.

Fix: proper list with pending/processing/ready/failed states; duration and quality; retry where supported. Validate current limits: 1 hour HD, 12 hours SD.

Pass when rejected requests never show success; accepted jobs appear once and open only when ready.

07 / SYSTEMS P1

Maintenance belongs in reach

Observed: native Systems is buried inside Settings; V1 introduces a mode switch.

Fix: permission-scoped destination with List/Map views, search and explicit fault/status filters. Separate fleet totals from filtered-result counts.

Pass when a maintainer finds an offline system without entering Settings; both views retain the same scope. #130

08 / FILTERS P1

Selections need a clear contract

Observed: V1’s filter presentation is stronger than its initial state handling.

Fix: adapt the web’s draft selection + Apply/Reset pattern; searchable error names; visible applied chips; cancel discards drafts.

Pass when opening, cancelling, applying and resetting produce predictable results; zero matches has a clear reset action.

09 / MAP P0

Selection must drive every action

Observed: V1’s Live action can open a stale camera from previous navigation.

Fix: one selected-system sheet, synchronised marker, concise faults/energy and named camera actions. Label offline readings with freshness.

Pass when selecting a different marker updates all content and routes; the sheet leaves useful map visible. #131

10 / SYSTEM DETAILS P1

Separate diagnosis from configuration

Observed: V1 reduces details to a generic overlay.

Fix: connection and freshness first, actionable faults second, energy/cameras next. Put configuration behind a permission-aware secondary action, reusing the existing web destination.

Pass when offline values cannot be mistaken for current telemetry and unavailable controls explain their restriction.

11 / SETTINGS P1

A small page with a real job

Observed: oversized nested panels, warning styling for an ordinary time preference, technical JPEG/WebRTC labels, and an unrelated Systems shortcut. Changing stream mode can unexpectedly open the last camera.

Time displaySite time / Device time, with both labelled examples. Preserve the existing saved preference.
Live viewingSmooth video (WebRTC) / Compatibility mode (JPEG). Explain the effect; respect device support.
Updates & versionAccurate check status and version. An in-app update check does not prove the latest store binary is installed.
AccountIdentity and explicit sign out. Team/site switching remains contextual in screen headers.

Fix: compact grouped rows, neutral preference states, technical detail secondary. Keep task controls in the player and system configuration in details. No invented language, theme or storage settings. Apple Settings reference.

Pass when changing a preference keeps Settings open, survives restart and has a visible effect across relevant screens.

12 / TEAM & SITE P0

Switch data, not just the label

Observed: V1 relabels unchanged content and returns to Cameras regardless of origin.

Fix: searchable authorised choices; current selection; deliberate Apply. Fetch the selected scope, clear incompatible camera/system selections and return to the originating screen.

Pass when new scope never displays previous-site data as current; cancellation changes nothing; empty/no-access states are explicit.

Critical states are part of the design

  • P0 · Time integrity: screenshot labels show 16:17 MSK versus 13:17 BST. Those labels imply 14:17 BST for the same instant on 6 October. Investigate the source/zone mismatch; the screenshot alone does not establish its cause. Use one instant and IANA timezone across playback, events and exports; test midnight, DST and repeated hours.
  • P0 · Authentication: current startup error handling clears the token even for non-authentication failures. Preserve sessions on transient failures; show Retry. Separate expired session from no access.
  • P1 · Recovery: design loading, empty, offline, reconnecting, permission-denied and failed-save states on each affected screen. Keep existing content visible only when clearly marked stale.
  • P1 · Updates: distinguish failed check, no compatible in-app update and required native upgrade. A blocking upgrade needs a real store action and retry path. #125

Delivery order and proof

1 · Trust

Camera/context identity, shared timestamps, truthful export/auth/update states.

2 · Core journeys

Stable navigation, full snapshot browser, useful Settings and Clips.

3 · Consistency

Systems/Map, shared components, contrast, touch and accessibility checks.

Release checks: test 100% of the acceptance criteria above on iOS and Android; verify small phones, larger text, screen-reader names/order and landscape playback. Prototype success alone is insufficient.

Usability check: run five moderated sessions spanning operators and maintainers. Tasks: find a camera, locate 13:45 footage via snapshots, export it, investigate an offline system, change time display. Target ≥4/5 unaided completions per task, zero wrong-camera/time outcomes, and no navigation dead ends. These are proposed acceptance targets, not measured results.

Evidence pointers

Screenshots supplied 6 October, the reviewed V1 prototype, and current local source underpin the observations. Platform guidance supports design choices; it does not validate this particular implementation.

Native implementation · exact local references/Users/philippovdev/WebstormProjects/mobile/src/navigation/MainTabNavigator.tsx:177/Users/philippovdev/WebstormProjects/mobile/src/presentation/screens/SettingsScreen/SettingsScreen.tsx:47/Users/philippovdev/WebstormProjects/mobile/src/components/TimezoneIndicatorBanner.tsx:82/Users/philippovdev/WebstormProjects/mobile/src/presentation/screens/RecordingPlayerScreen/components/RecordingsSnapshots.tsx:138/Users/philippovdev/WebstormProjects/mobile/src/presentation/screens/RecordingPlayerScreen/components/RecordingsSnapshots.tsx:409/Users/philippovdev/WebstormProjects/mobile/src/presentation/screens/RecordingPlayerScreen/components/ExportControl.tsx:242/Users/philippovdev/WebstormProjects/mobile/src/presentation/screens/AuthLoadingScreen/AuthLoadingScreen.tsx:145
Web patterns available for reuse/Users/philippovdev/WebstormProjects/app/src/components/systems/SystemErrorsFilter.vue/Users/philippovdev/WebstormProjects/app/src/application/Live/presentation/components/LiveMobileDetailSheet.vue/Users/philippovdev/WebstormProjects/app/src/application/Live/infrastructure/live-map.mappers.ts

Reuse selection/apply semantics, responsive detail-sheet behavior and current-status fields; adapt their density and touch layout for native mobile.