# tmtygnz/corvette-core architecture

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

- Interactive diagram: https://gitdiagram.com/tmtygnz/corvette-core
- Repository: https://github.com/tmtygnz/corvette-core

## Overview

Corvette Core is a residential/small-business network video recorder. Its principal workflow loads configured camera records, starts RTSP recording and AI-frame processing, tracks generated segments in SQLite, and exposes camera and playback APIs. The graph also preserves the documented AI-detection capability. Source excerpts support the startup wiring and recording flow; camera HTTP routing and some playback cleanup behavior are visible only at subsystem level, so uncertain internal links are omitted.

Main entry points: [`cmd/main.go`](https://github.com/tmtygnz/corvette-core/blob/main/cmd/main.go) (Application startup), [`internal/services/camera_service.go`](https://github.com/tmtygnz/corvette-core/blob/main/internal/services/camera_service.go) (Camera service), [`internal/services/recording_service.go`](https://github.com/tmtygnz/corvette-core/blob/main/internal/services/recording_service.go) (Recording service), [`internal/camera/handler.go`](https://github.com/tmtygnz/corvette-core/blob/main/internal/camera/handler.go) (Camera runner)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_runtime["Runtime and API"]
  node_main["Application startup<br/>[main.go]"]
  node_config["Configuration<br/>[config_io.go]"]
  node_http["HTTP server<br/>[http.go]"]
  node_camera_api["Camera API<br/>[camera_http.go]"]
  node_playback_api["Playback API<br/>[playback_http.go]"]
end

subgraph group_camera["Camera operation"]
  node_camera_service["Camera service<br/>[camera_service.go]"]
  node_vendor_map["Camera vendor mapping<br/>[vendor.go]"]
  node_streamer_map["RTSP streamer mapping<br/>[streamer.go]"]
  node_camera_registry["Camera registry<br/>[registry.go]"]
  node_camera_handler["Camera runner<br/>[handler.go]"]
  node_rtsp_streamer["RTSP recording and frames<br/>[rtsp.go]"]
end

subgraph group_recording["Recording and playback"]
  node_segment_watchdog["Segment watchdog<br/>[watchdog.go]"]
  node_playback_cleanup["Playback cleanup<br/>[cleanup.go]"]
  node_recording_service["Recording service"]
end

subgraph group_persistence["Persistence and models"]
  node_camera_domain["Camera domain<br/>[camera.go]"]
  node_recording_domain["Recording domain<br/>[recording.go]"]
  node_database[("SQLite queries<br/>[recording.sql.go]")]
  node_sqlite_provider[("SQLite provider<br/>[sqlite.go]")]
end

subgraph group_detection["AI detection"]
  node_object_model["Detection model<br/>[model.go]"]
  node_object_handler["Inference handler<br/>[handler.go]"]
end

node_operator(("NVR operator"))

node_operator -.->|"manages cameras"| node_camera_api
node_operator -.->|"requests playback"| node_playback_api
node_main -->|"loads"| node_config
node_main -->|"creates"| node_sqlite_provider
node_main -->|"creates"| node_camera_service
node_main -->|"creates"| node_recording_service
node_main -->|"runs cleanup"| node_playback_cleanup
node_main -->|"creates"| node_object_model
node_main -->|"loads camera vendors"| node_vendor_map
node_main -->|"creates streamers"| node_streamer_map
node_main -->|"starts watcher"| node_segment_watchdog
node_main -->|"creates and starts"| node_camera_registry
node_main -->|"starts"| node_http
node_main -->|"registers routes"| node_camera_api
node_main -->|"registers routes"| node_playback_api
node_vendor_map -->|"lists cameras"| node_camera_service
node_camera_registry -->|"runs registered cameras"| node_camera_handler
node_camera_handler -->|"starts recording and frames"| node_rtsp_streamer
node_camera_handler -->|"passes frames"| node_object_handler
node_camera_handler -->|"updates status"| node_camera_service
node_rtsp_streamer -.->|"writes video segments"| node_segment_watchdog
node_segment_watchdog -->|"creates and updates metadata"| node_recording_service
node_playback_cleanup -->|"cleans metadata"| node_recording_service
node_recording_service -->|"queries recordings"| node_database
node_camera_service -->|"queries cameras"| node_database
node_recording_service -->|"maps records"| node_recording_domain
node_camera_service -->|"maps cameras"| node_camera_domain
node_object_handler -->|"runs inference"| node_object_model

click node_main "https://github.com/tmtygnz/corvette-core/blob/main/cmd/main.go"
click node_config "https://github.com/tmtygnz/corvette-core/blob/main/internal/config/config_io.go"
click node_http "https://github.com/tmtygnz/corvette-core/blob/main/internal/platform/handler/http.go"
click node_camera_api "https://github.com/tmtygnz/corvette-core/blob/main/internal/platform/handler/handlers/camera_http.go"
click node_playback_api "https://github.com/tmtygnz/corvette-core/blob/main/internal/platform/handler/handlers/playback_http.go"
click node_camera_service "https://github.com/tmtygnz/corvette-core/blob/main/internal/services/camera_service.go"
click node_vendor_map "https://github.com/tmtygnz/corvette-core/blob/main/internal/vendors/vendor.go"
click node_streamer_map "https://github.com/tmtygnz/corvette-core/blob/main/internal/streamer/streamer.go"
click node_camera_registry "https://github.com/tmtygnz/corvette-core/blob/main/internal/camera/registry.go"
click node_camera_handler "https://github.com/tmtygnz/corvette-core/blob/main/internal/camera/handler.go"
click node_rtsp_streamer "https://github.com/tmtygnz/corvette-core/blob/main/internal/streamer/rtsp.go"
click node_segment_watchdog "https://github.com/tmtygnz/corvette-core/blob/main/internal/playback/watchdog.go"
click node_playback_cleanup "https://github.com/tmtygnz/corvette-core/blob/main/internal/playback/cleanup.go"
click node_recording_service "https://github.com/tmtygnz/corvette-core/blob/main/internal/services/recording_service.go"
click node_camera_domain "https://github.com/tmtygnz/corvette-core/blob/main/internal/domains/camera.go"
click node_recording_domain "https://github.com/tmtygnz/corvette-core/blob/main/internal/domains/recording.go"
click node_database "https://github.com/tmtygnz/corvette-core/blob/main/internal/database/recording.sql.go"
click node_sqlite_provider "https://github.com/tmtygnz/corvette-core/blob/main/internal/platform/provider/sqlite.go"
click node_object_model "https://github.com/tmtygnz/corvette-core/blob/main/internal/object_detection/model.go"
click node_object_handler "https://github.com/tmtygnz/corvette-core/blob/main/internal/object_detection/handler.go"

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_main,node_config,node_http,node_camera_api,node_playback_api toneBlue
class node_camera_service,node_vendor_map,node_streamer_map,node_camera_registry,node_camera_handler,node_rtsp_streamer toneAmber
class node_segment_watchdog,node_playback_cleanup,node_recording_service toneMint
class node_camera_domain,node_recording_domain,node_database,node_sqlite_provider toneRose
class node_object_model,node_object_handler,node_operator toneIndigo
```

## Components

### Runtime and API

- [Application startup](https://github.com/tmtygnz/corvette-core/blob/main/cmd/main.go): `cmd/main.go`
- [Configuration](https://github.com/tmtygnz/corvette-core/blob/main/internal/config/config_io.go): `internal/config/config_io.go`
- [HTTP server](https://github.com/tmtygnz/corvette-core/blob/main/internal/platform/handler/http.go): `internal/platform/handler/http.go`
- [Camera API](https://github.com/tmtygnz/corvette-core/blob/main/internal/platform/handler/handlers/camera_http.go): `internal/platform/handler/handlers/camera_http.go`
- [Playback API](https://github.com/tmtygnz/corvette-core/blob/main/internal/platform/handler/handlers/playback_http.go): `internal/platform/handler/handlers/playback_http.go`

### Camera operation

- [Camera service](https://github.com/tmtygnz/corvette-core/blob/main/internal/services/camera_service.go): `internal/services/camera_service.go`
- [Camera vendor mapping](https://github.com/tmtygnz/corvette-core/blob/main/internal/vendors/vendor.go): `internal/vendors/vendor.go`
- [RTSP streamer mapping](https://github.com/tmtygnz/corvette-core/blob/main/internal/streamer/streamer.go): `internal/streamer/streamer.go`
- [Camera registry](https://github.com/tmtygnz/corvette-core/blob/main/internal/camera/registry.go): `internal/camera/registry.go`
- [Camera runner](https://github.com/tmtygnz/corvette-core/blob/main/internal/camera/handler.go): `internal/camera/handler.go`
- [RTSP recording and frames](https://github.com/tmtygnz/corvette-core/blob/main/internal/streamer/rtsp.go): `internal/streamer/rtsp.go`

### Recording and playback

- [Segment watchdog](https://github.com/tmtygnz/corvette-core/blob/main/internal/playback/watchdog.go): `internal/playback/watchdog.go`
- [Playback cleanup](https://github.com/tmtygnz/corvette-core/blob/main/internal/playback/cleanup.go): `internal/playback/cleanup.go`
- [Recording service](https://github.com/tmtygnz/corvette-core/blob/main/internal/services/recording_service.go): `internal/services/recording_service.go`

### Persistence and models

- [Camera domain](https://github.com/tmtygnz/corvette-core/blob/main/internal/domains/camera.go): `internal/domains/camera.go`
- [Recording domain](https://github.com/tmtygnz/corvette-core/blob/main/internal/domains/recording.go): `internal/domains/recording.go`
- [SQLite queries](https://github.com/tmtygnz/corvette-core/blob/main/internal/database/recording.sql.go): `internal/database/recording.sql.go`
- [SQLite provider](https://github.com/tmtygnz/corvette-core/blob/main/internal/platform/provider/sqlite.go): `internal/platform/provider/sqlite.go`

### AI detection

- [Detection model](https://github.com/tmtygnz/corvette-core/blob/main/internal/object_detection/model.go): `internal/object_detection/model.go`
- [Inference handler](https://github.com/tmtygnz/corvette-core/blob/main/internal/object_detection/handler.go): `internal/object_detection/handler.go`

### Other components

- **NVR operator**

## Connections

- NVR operator → Camera API: manages cameras (evidence: `README.md`)
- NVR operator → Playback API: requests playback (evidence: `README.md`)
- Application startup → Configuration: loads (evidence: `cmd/main.go`)
- Application startup → SQLite provider: creates (evidence: `cmd/main.go`)
- Application startup → Camera service: creates (evidence: `cmd/main.go`)
- Application startup → Recording service: creates (evidence: `cmd/main.go`)
- Application startup → Playback cleanup: runs cleanup (evidence: `cmd/main.go`)
- Application startup → Detection model: creates (evidence: `cmd/main.go`)
- Application startup → Camera vendor mapping: loads camera vendors (evidence: `cmd/main.go`)
- Application startup → RTSP streamer mapping: creates streamers (evidence: `cmd/main.go`)
- Application startup → Segment watchdog: starts watcher (evidence: `cmd/main.go`)
- Application startup → Camera registry: creates and starts (evidence: `cmd/main.go`)
- Application startup → HTTP server: starts (evidence: `cmd/main.go`)
- Application startup → Camera API: registers routes (evidence: `cmd/main.go`)
- Application startup → Playback API: registers routes (evidence: `cmd/main.go`)
- Camera vendor mapping → Camera service: lists cameras (evidence: `internal/vendors/vendor.go`)
- Camera registry → Camera runner: runs registered cameras (evidence: `internal/camera/handler.go`)
- Camera runner → RTSP recording and frames: starts recording and frames (evidence: `internal/camera/handler.go`)
- Camera runner → Inference handler: passes frames (evidence: `internal/camera/handler.go`)
- Camera runner → Camera service: updates status (evidence: `internal/camera/handler.go`)
- RTSP recording and frames → Segment watchdog: writes video segments
- Segment watchdog → Recording service: creates and updates metadata (evidence: `internal/playback/watchdog.go`)
- Playback cleanup → Recording service: cleans metadata
- Recording service → SQLite queries: queries recordings (evidence: `internal/services/recording_service.go`)
- Camera service → SQLite queries: queries cameras (evidence: `internal/services/camera_service.go`)
- Recording service → Recording domain: maps records (evidence: `internal/services/recording_service.go`)
- Camera service → Camera domain: maps cameras (evidence: `internal/services/camera_service.go`)
- Inference handler → Detection model: runs inference (evidence: `internal/object_detection/handler.go`)
