# packingproof/packingproof-mobile architecture

> Architecture diagram of the GitHub repository packingproof/packingproof-mobile, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/packingproof/packingproof-mobile
- Repository: https://github.com/packingproof/packingproof-mobile

## Overview

PackingProof Mobile is a local-first Android/iOS packing-evidence recorder, usable alone and optionally paired with a LAN desktop host. The documented workflow is to start work, record continuously, recognize shipping labels and mark tracking numbers in the footage, then search history and replay the matching evidence. Editing/export, watermarking, backup retention, and order announcements are additional capabilities. The tree contains native platform code and plugins but not the shared Flutter application source, so UI-to-native wiring and several feature links are represented only where documented or supported by the available paths.

Main entry points: [`android/app/src/main/kotlin/app/packingproof/mobile/ContinuousSegmentCamera.kt`](https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/ContinuousSegmentCamera.kt) (Camera capture), [`android/app/src/main/kotlin/app/packingproof/mobile/LanBackupPlugin.kt`](https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/LanBackupPlugin.kt) (LAN video backup), [`android/app/src/main/kotlin/app/packingproof/mobile/PigeonPlatformRegistrar.kt`](https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/PigeonPlatformRegistrar.kt) (Android platform bridge), [`ios/Runner/IosCameraPlatform.swift`](https://github.com/packingproof/packingproof-mobile/blob/main/ios/Runner/IosCameraPlatform.swift) (iOS camera capture)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_capture["Capture and identify"]
  node_android_bridge["Android platform bridge"]
  node_camera["Camera capture"]
  node_barcode["Label recognition"]
  node_ios_camera["iOS camera capture"]
end

subgraph group_evidence["Recording and evidence"]
  node_recording["Audio/video recording"]
  node_storage["Recording storage"]
  node_watermark["Video watermarking"]
  node_ios_media["iOS media processing"]
end

subgraph group_review["Review and export"]
  node_history["Tracking history<br/>[OrderInfoStore.kt]"]
  node_playback["Video playback"]
  node_export["Clip export"]
end

subgraph group_connected["Connected services"]
  node_backup["LAN video backup<br/>[LanBackupPlugin.kt]"]
  node_backup_state[("Backup job state")]
  node_ios_backup["iOS backup"]
  node_order_receiver["LAN order receiver"]
  node_order_store[("Order information<br/>[OrderInfoStore.kt]")]
  node_speech["Order voice alerts"]
end

node_operator(("Packing operator"))
node_flutter["Flutter app"]
node_desktop(("PackingProof host"))

node_operator -->|"starts work"| node_flutter
node_flutter -->|"requests capture"| node_android_bridge
node_android_bridge -->|"controls camera"| node_camera
node_camera -->|"analyzes frames"| node_barcode
node_camera -->|"records media"| node_recording
node_recording -->|"writes segments"| node_storage
node_storage -->|"watermarks video"| node_watermark
node_flutter -->|"searches tracking"| node_history
node_history -->|"selects footage"| node_playback
node_flutter -->|"exports clips"| node_export
node_flutter -->|"queues backup"| node_backup
node_backup -->|"persists jobs"| node_backup_state
node_backup -.->|"uploads on LAN"| node_desktop
node_flutter -->|"controls capture"| node_ios_camera
node_ios_camera -->|"processes recordings"| node_ios_media
node_flutter -->|"requests backup"| node_ios_backup
node_ios_backup -.->|"uploads on LAN"| node_desktop
node_desktop -.->|"sends order data"| node_order_receiver
node_order_receiver -->|"stores orders"| node_order_store
node_order_store -.->|"supplies alert text"| node_speech

click node_android_bridge "https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/PigeonPlatformRegistrar.kt"
click node_camera "https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/ContinuousSegmentCamera.kt"
click node_barcode "https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/BarcodeAnalysisGate.kt"
click node_ios_camera "https://github.com/packingproof/packingproof-mobile/blob/main/ios/Runner/IosCameraPlatform.swift"
click node_recording "https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/RecordingMuxPipeline.kt"
click node_storage "https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/RecordingStorageManager.kt"
click node_watermark "https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/VideoWatermarkPlugin.kt"
click node_ios_media "https://github.com/packingproof/packingproof-mobile/blob/main/ios/Runner/IosMediaProcessingCore.swift"
click node_history "https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/OrderInfoStore.kt"
click node_playback "https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/SystemVideoPlayerPlugin.kt"
click node_export "https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/VideoExportPlugin.kt"
click node_backup "https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/LanBackupPlugin.kt"
click node_backup_state "https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/LanBackupJobDatabase.kt"
click node_ios_backup "https://github.com/packingproof/packingproof-mobile/blob/main/ios/Runner/IosBackupPlatform.swift"
click node_order_receiver "https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/OrderInfoReceiverPlugin.kt"
click node_order_store "https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/OrderInfoStore.kt"
click node_speech "https://github.com/packingproof/packingproof-mobile/blob/main/plugins/flutter_tts/android/src/main/kotlin/com/eyedeadevelopment/fluttertts/FlutterTtsPlugin.kt"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_android_bridge,node_camera,node_barcode,node_ios_camera toneBlue
class node_recording,node_storage,node_watermark,node_ios_media toneAmber
class node_history,node_playback,node_export toneMint
class node_backup,node_backup_state,node_ios_backup,node_order_receiver,node_order_store,node_speech toneRose
class node_operator,node_flutter,node_desktop toneIndigo
```

## Components

### Capture and identify

- [Android platform bridge](https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/PigeonPlatformRegistrar.kt): `android/app/src/main/kotlin/app/packingproof/mobile/PigeonPlatformRegistrar.kt`
- [Camera capture](https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/ContinuousSegmentCamera.kt): `android/app/src/main/kotlin/app/packingproof/mobile/ContinuousSegmentCamera.kt`
- [Label recognition](https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/BarcodeAnalysisGate.kt): `android/app/src/main/kotlin/app/packingproof/mobile/BarcodeAnalysisGate.kt`
- [iOS camera capture](https://github.com/packingproof/packingproof-mobile/blob/main/ios/Runner/IosCameraPlatform.swift): `ios/Runner/IosCameraPlatform.swift`

### Recording and evidence

- [Audio/video recording](https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/RecordingMuxPipeline.kt): `android/app/src/main/kotlin/app/packingproof/mobile/RecordingMuxPipeline.kt`
- [Recording storage](https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/RecordingStorageManager.kt): `android/app/src/main/kotlin/app/packingproof/mobile/RecordingStorageManager.kt`
- [Video watermarking](https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/VideoWatermarkPlugin.kt): `android/app/src/main/kotlin/app/packingproof/mobile/VideoWatermarkPlugin.kt`
- [iOS media processing](https://github.com/packingproof/packingproof-mobile/blob/main/ios/Runner/IosMediaProcessingCore.swift): `ios/Runner/IosMediaProcessingCore.swift`

### Review and export

- [Tracking history](https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/OrderInfoStore.kt): `android/app/src/main/kotlin/app/packingproof/mobile/OrderInfoStore.kt`
- [Video playback](https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/SystemVideoPlayerPlugin.kt): `android/app/src/main/kotlin/app/packingproof/mobile/SystemVideoPlayerPlugin.kt`
- [Clip export](https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/VideoExportPlugin.kt): `android/app/src/main/kotlin/app/packingproof/mobile/VideoExportPlugin.kt`

### Connected services

- [LAN video backup](https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/LanBackupPlugin.kt): `android/app/src/main/kotlin/app/packingproof/mobile/LanBackupPlugin.kt`
- [Backup job state](https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/LanBackupJobDatabase.kt): `android/app/src/main/kotlin/app/packingproof/mobile/LanBackupJobDatabase.kt`
- [iOS backup](https://github.com/packingproof/packingproof-mobile/blob/main/ios/Runner/IosBackupPlatform.swift): `ios/Runner/IosBackupPlatform.swift`
- [LAN order receiver](https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/OrderInfoReceiverPlugin.kt): `android/app/src/main/kotlin/app/packingproof/mobile/OrderInfoReceiverPlugin.kt`
- [Order information](https://github.com/packingproof/packingproof-mobile/blob/main/android/app/src/main/kotlin/app/packingproof/mobile/OrderInfoStore.kt): `android/app/src/main/kotlin/app/packingproof/mobile/OrderInfoStore.kt`
- [Order voice alerts](https://github.com/packingproof/packingproof-mobile/blob/main/plugins/flutter_tts/android/src/main/kotlin/com/eyedeadevelopment/fluttertts/FlutterTtsPlugin.kt): `plugins/flutter_tts/android/src/main/kotlin/com/eyedeadevelopment/fluttertts/FlutterTtsPlugin.kt`

### Other components

- **Packing operator**
- **Flutter app**
- **PackingProof host**

## Connections

- Packing operator → Flutter app: starts work
- Flutter app → Android platform bridge: requests capture
- Android platform bridge → Camera capture: controls camera
- Camera capture → Label recognition: analyzes frames
- Camera capture → Audio/video recording: records media
- Audio/video recording → Recording storage: writes segments
- Recording storage → Video watermarking: watermarks video
- Flutter app → Tracking history: searches tracking
- Tracking history → Video playback: selects footage
- Flutter app → Clip export: exports clips
- Flutter app → LAN video backup: queues backup
- LAN video backup → Backup job state: persists jobs
- LAN video backup → PackingProof host: uploads on LAN
- Flutter app → iOS camera capture: controls capture
- iOS camera capture → iOS media processing: processes recordings
- Flutter app → iOS backup: requests backup
- iOS backup → PackingProof host: uploads on LAN
- PackingProof host → LAN order receiver: sends order data
- LAN order receiver → Order information: stores orders
- Order information → Order voice alerts: supplies alert text
