# bryceliu17/dashcam-diary architecture

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

- Interactive diagram: https://gitdiagram.com/bryceliu17/dashcam-diary
- Repository: https://github.com/bryceliu17/dashcam-diary

## Overview

Dashcam Diary records video and audio on Android, retaining local copies until uploads succeed, then manages the shared archive through an ASP.NET API and browser dashboard. The main workflow is record and segment media, preserve metadata and GPS locally, queue/retry uploads, store media and metadata on the server, and browse or export it. Separate product branches provide live camera and device telemetry, archive migration, and audio transcription. The README documents these capabilities; sampled source confirms API, dashboard, migration, and transcription responsibilities, but does not expose all Android internals or endpoint wiring.

Main entry points: [`server/Dashcam.Api/Program.cs`](https://github.com/bryceliu17/dashcam-diary/blob/main/server/Dashcam.Api/Program.cs) (API and routes), [`web-dashboard/src/App.jsx`](https://github.com/bryceliu17/dashcam-diary/blob/main/web-dashboard/src/App.jsx) (Archive dashboard), [`android-app/app/src/main/java/com/example/dashcam/recording`](https://github.com/bryceliu17/dashcam-diary/tree/main/android-app/app/src/main/java/com/example/dashcam/recording) (Media recording), [`server/Dashcam.Api/Services/ArchiveMigrationService.cs`](https://github.com/bryceliu17/dashcam-diary/blob/main/server/Dashcam.Api/Services/ArchiveMigrationService.cs) (Archive migration)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_mobile["Android clients"]
  node_android["Dashcam app"]
  node_recording["Media recording"]
  node_location["GPS tracking"]
  node_mobiledata[("Local media data")]
  node_upload["Upload queue<br/>[UploadWorker.kt]"]
end

subgraph group_server["Server archive"]
  node_api["API and routes<br/>[Program.cs]"]
  node_models["Archive models<br/>[Models]"]
  node_db[("Server metadata")]
  node_devicehub["Device live control"]
  node_migrationupload["Migration uploads"]
  node_migration["Archive migration"]
  node_storage[("Media archive<br/>[Dashcam.Api]")]
  node_audiofiles["Audio files<br/>[Dashcam.Api]"]
end

subgraph group_dashboard["Web dashboard"]
  node_dashboard["Archive dashboard<br/>[App.jsx]"]
end

subgraph group_services["Archive services"]
  node_transcription["Transcription worker<br/>[app.py]"]
end

node_driver(("Phone operator"))
node_externaluser(("Archive user"))

node_driver -->|"operates"| node_android
node_android -->|"starts recording"| node_recording
node_recording -->|"saves segments"| node_mobiledata
node_location -->|"stores GPS tracks"| node_mobiledata
node_recording -.->|"records location"| node_location
node_mobiledata -->|"queues finished media"| node_upload
node_upload -->|"uploads media"| node_api
node_api -->|"stores media"| node_storage
node_api -->|"reads and writes metadata"| node_db
node_db -->|"maps records"| node_models
node_dashboard -->|"requests archive operations"| node_api
node_externaluser -->|"browses and manages"| node_dashboard
node_dashboard -.->|"requests live control"| node_api
node_api -.->|"dispatches device control"| node_devicehub
node_dashboard -->|"sends migration chunks"| node_migrationupload
node_migrationupload -->|"completes upload session"| node_migration
node_migration -->|"imports metadata"| node_db
node_migration -->|"imports media"| node_storage
node_api -.->|"requests transcription"| node_transcription
node_transcription -->|"reads audio"| node_audiofiles
node_dashboard -->|"requests transcript"| node_api

click node_android "https://github.com/bryceliu17/dashcam-diary/tree/main/android-app/app/src/main/java/com/example/dashcam"
click node_recording "https://github.com/bryceliu17/dashcam-diary/tree/main/android-app/app/src/main/java/com/example/dashcam/recording"
click node_location "https://github.com/bryceliu17/dashcam-diary/tree/main/android-app/app/src/main/java/com/example/dashcam/location"
click node_mobiledata "https://github.com/bryceliu17/dashcam-diary/tree/main/android-app/app/src/main/java/com/example/dashcam/data"
click node_upload "https://github.com/bryceliu17/dashcam-diary/blob/main/android-app/app/src/main/java/com/example/dashcam/upload/UploadWorker.kt"
click node_api "https://github.com/bryceliu17/dashcam-diary/blob/main/server/Dashcam.Api/Program.cs"
click node_models "https://github.com/bryceliu17/dashcam-diary/tree/main/server/Dashcam.Api/Models"
click node_db "https://github.com/bryceliu17/dashcam-diary/blob/main/server/Dashcam.Api/Data/DashcamDbContext.cs"
click node_devicehub "https://github.com/bryceliu17/dashcam-diary/blob/main/server/Dashcam.Api/Services/DeviceWebSocketHub.cs"
click node_dashboard "https://github.com/bryceliu17/dashcam-diary/blob/main/web-dashboard/src/App.jsx"
click node_migrationupload "https://github.com/bryceliu17/dashcam-diary/blob/main/server/Dashcam.Api/Services/MigrationUploadService.cs"
click node_migration "https://github.com/bryceliu17/dashcam-diary/blob/main/server/Dashcam.Api/Services/ArchiveMigrationService.cs"
click node_storage "https://github.com/bryceliu17/dashcam-diary/tree/main/server/Dashcam.Api"
click node_transcription "https://github.com/bryceliu17/dashcam-diary/blob/main/transcription-worker/app.py"
click node_audiofiles "https://github.com/bryceliu17/dashcam-diary/tree/main/server/Dashcam.Api"

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,node_recording,node_location,node_mobiledata,node_upload,node_externaluser toneBlue
class node_api,node_models,node_db,node_devicehub,node_migrationupload,node_migration,node_storage,node_audiofiles toneAmber
class node_dashboard toneMint
class node_transcription toneRose
class node_driver toneIndigo
```

## Components

### Android clients

- [Dashcam app](https://github.com/bryceliu17/dashcam-diary/tree/main/android-app/app/src/main/java/com/example/dashcam): `android-app/app/src/main/java/com/example/dashcam`
- [Media recording](https://github.com/bryceliu17/dashcam-diary/tree/main/android-app/app/src/main/java/com/example/dashcam/recording): `android-app/app/src/main/java/com/example/dashcam/recording`
- [GPS tracking](https://github.com/bryceliu17/dashcam-diary/tree/main/android-app/app/src/main/java/com/example/dashcam/location): `android-app/app/src/main/java/com/example/dashcam/location`
- [Local media data](https://github.com/bryceliu17/dashcam-diary/tree/main/android-app/app/src/main/java/com/example/dashcam/data): `android-app/app/src/main/java/com/example/dashcam/data`
- [Upload queue](https://github.com/bryceliu17/dashcam-diary/blob/main/android-app/app/src/main/java/com/example/dashcam/upload/UploadWorker.kt): `android-app/app/src/main/java/com/example/dashcam/upload/UploadWorker.kt`

### Server archive

- [API and routes](https://github.com/bryceliu17/dashcam-diary/blob/main/server/Dashcam.Api/Program.cs): `server/Dashcam.Api/Program.cs`
- [Archive models](https://github.com/bryceliu17/dashcam-diary/tree/main/server/Dashcam.Api/Models): `server/Dashcam.Api/Models`
- [Server metadata](https://github.com/bryceliu17/dashcam-diary/blob/main/server/Dashcam.Api/Data/DashcamDbContext.cs): `server/Dashcam.Api/Data/DashcamDbContext.cs`
- [Device live control](https://github.com/bryceliu17/dashcam-diary/blob/main/server/Dashcam.Api/Services/DeviceWebSocketHub.cs): `server/Dashcam.Api/Services/DeviceWebSocketHub.cs`
- [Migration uploads](https://github.com/bryceliu17/dashcam-diary/blob/main/server/Dashcam.Api/Services/MigrationUploadService.cs): `server/Dashcam.Api/Services/MigrationUploadService.cs`
- [Archive migration](https://github.com/bryceliu17/dashcam-diary/blob/main/server/Dashcam.Api/Services/ArchiveMigrationService.cs): `server/Dashcam.Api/Services/ArchiveMigrationService.cs`
- [Media archive](https://github.com/bryceliu17/dashcam-diary/tree/main/server/Dashcam.Api): `server/Dashcam.Api`
- [Audio files](https://github.com/bryceliu17/dashcam-diary/tree/main/server/Dashcam.Api): `server/Dashcam.Api`

### Web dashboard

- [Archive dashboard](https://github.com/bryceliu17/dashcam-diary/blob/main/web-dashboard/src/App.jsx): `web-dashboard/src/App.jsx`

### Archive services

- [Transcription worker](https://github.com/bryceliu17/dashcam-diary/blob/main/transcription-worker/app.py): `transcription-worker/app.py`

### Other components

- **Phone operator**
- **Archive user**

## Connections

- Phone operator → Dashcam app: operates
- Dashcam app → Media recording: starts recording
- Media recording → Local media data: saves segments
- GPS tracking → Local media data: stores GPS tracks
- Media recording → GPS tracking: records location
- Local media data → Upload queue: queues finished media
- Upload queue → API and routes: uploads media
- API and routes → Media archive: stores media
- API and routes → Server metadata: reads and writes metadata
- Server metadata → Archive models: maps records
- Archive dashboard → API and routes: requests archive operations
- Archive user → Archive dashboard: browses and manages
- Archive dashboard → API and routes: requests live control
- API and routes → Device live control: dispatches device control
- Archive dashboard → Migration uploads: sends migration chunks
- Migration uploads → Archive migration: completes upload session
- Archive migration → Server metadata: imports metadata
- Archive migration → Media archive: imports media
- API and routes → Transcription worker: requests transcription
- Transcription worker → Audio files: reads audio
- Archive dashboard → API and routes: requests transcript
