Product Architecture
Local-first by design
DashVault runs entirely on-device. Ingestion, indexing, thumbnailing, search, and rules execute against local files and a SQLite metadata store.
System Layers
Presentation — React Dashboard
LibraryTripsMapIncidents
API — FastAPI
/videos/trips/incidents/search
Services — Import • Trip Segmenter • Rules • Search
IngestSegmentRulesQuery
Workers — FFmpeg • Metadata Extractor
ThumbnailTranscodeProbe
Storage — SQLite + Local Filesystem
metadata.dbvault/videos/*vault/thumbs/*
Ingestion Pipeline
Step 1
Detect
Watches source folders & SD cards.
Step 2
Probe
FFprobe extracts codec, GPS, timing.
Step 3
Thumbnail
HW-accelerated frame capture.
Step 4
Segment
Groups clips by time gap → trips.
Step 5
Index
Writes rows to SQLite metadata.
Rules Engine
┌──────────────┐
│ New Video │
└──────┬───────┘
▼
┌──────────────────────┐
│ Extract GPS + IMU │
└─────────┬────────────┘
▼
┌──────────────────────┐ ┌──────────────────┐
│ Match Rules (yaml) │──yes──▶│ Create Incident │
└─────────┬────────────┘ └────────┬─────────┘
│no │
▼ ▼
┌──────────────────┐ ┌──────────────────┐
│ Mark Processed │ │ Notify + Flag │
└──────────────────┘ └──────────────────┘
Rules:
- id: harsh_brake when: decel > 0.5g
- id: sharp_turn when: yaw_rate > 60deg/s
- id: speeding when: speed > limit + 15
- id: lane_drift when: hdg_var > thresholdData Model
videos
- • id
- • trip_id
- • path
- • duration
- • resolution
- • recorded_at
- • status
trips
- • id
- • driver_id
- • started_at
- • ended_at
- • distance_km
- • origin
- • destination
incidents
- • id
- • video_id
- • type
- • severity
- • timestamp
- • status
- • notes
Full-text Search
SQLite FTS5 indexes filenames, tags, driver, and place.
Privacy Model
Files never leave the device. Optional encrypted export.
Extensibility
Plugin API for detectors and third-party importers.