Skip to content
CAI
Software that uses CAICheck a score

peregin/gps-overlay-on-video

62.2

Adequate · 20 September 2026

4k

lines of production code

Scala

primary language

1

measurement over time

CAI band scale
CAI lens gauges

What this system is

This system is a desktop application for creating video overlays of GPS telemetry data, designed primarily for sports and outdoor activities. It synchronizes video playback with GPS tracks to render customizable dashboards featuring gauges, maps, and elevation charts. The tool supports various activity-specific layouts, unit conversions, and project persistence, allowing users to generate video files with integrated telemetry visualizations.

How it got here

2014 — video overlay and telemetry integration

16 changes.

The project established its core infrastructure by migrating to SBT and Java 17, then focused on building a video playback engine synchronized with GPS telemetry. This period introduced comprehensive features for overlaying gauges, maps, and elevation charts onto video, supported by a robust data model for parsing and aligning track points.

2019–2024 — Dashboard customization and CI setup

5 changes.

This period focused on enhancing the user interface with customizable, activity-specific dashboards and adding GPS and time formatting utilities for data presentation. Concurrently, the project established an automated CI pipeline using CircleCI and expanded test coverage for core formatting and mapping components.

Features

Add GPS and time formatting utilities

New formatter classes have been added to the GPX processing pipeline: GpsFormatter handles the conversion of latitude and longitude coordinates into a degree-minute-second string format with directional indicators, while TimeFormatter converts time durations (in seconds) into a human-readable HH:MM:SS string, including support for negative time offsets.

src/main/scala/peregin/gpv/format · high confidence

Added sample GPS telemetry data for chart visualization

A new sample GPS data file (sample.gpx) has been added to the resources directory to serve as default telemetry data. This dataset includes elevation, time, and cadence information, enabling the application to demonstrate and draw different chart types, such as elevation profiles, using realistic sample data.

src/main/resources/gps · high confidence

Initial CircleCI configuration for SBT builds

Added a new CircleCI configuration (\.circleci/config.yml\) and a helper script (\cachekey.sh\) to automate the build and test process for SBT projects. The pipeline uses a custom Docker image, performs a blobless checkout, generates checksums for build files to optimize caching, and executes compilation and tests.

.circleci · high confidence

Introduce customizable and activity-specific dashboards

Users can now select from predefined dashboard layouts tailored for specific activities, including Cycling, Skiing, Motorbiking, and Sailing, each displaying relevant gauges like speed, elevation, heart rate, and azimuth. Additionally, the system supports fully customizable dashboards defined via YAML configuration, allowing users to specify gauge positions, sizes, and colors through the new DynamicResourceDashboard and YamlResourceDashboardLoader components.

src/main/scala/peregin/gpv/gui/dashboard · high confidence

Introduces video playback and GPS telemetry overlay capabilities

The application now supports loading and playing video files (mp4) alongside GPS data (gpx). Users can view telemetry gauges (speed, elevation, cadence, etc.) and map overlays synchronized with the video timeline. The interface includes a video player with play/pause/step controls, a progress slider, and a dashboard template selector to choose different gauge layouts (e.g., Cycling, Skiing). Users can also switch between time-based and distance-based elevation views and select map tile providers.

src/main/scala/peregin/gpv/gui · high confidence

New SVG-based and digital gauge components for video overlay

The gauge rendering system has been expanded with a new family of SVG-based gauges (SvgGauge, SvgDigitalGauge) and specific implementations for cadence, elevation, heart rate, temperature, and distance. These components use cached SVG images for rendering and provide alternative visual styles to the existing radial and linear gauges. Additionally, new chart-based painters like ElevationChart and CaptionGauge have been added to display elevation profiles and synchronized video captions, while supporting classes like ChartPainter and DigitalFont provide the necessary infrastructure for these new display modes.

src/main/scala/peregin/gpv/gui/gauge · high confidence

New telemetry model and Garmin extension parsing

The application now parses Garmin-specific GPX extensions (cadence, temperature, heart rate, power) via a new GarminExtension model and computes derived metrics like speed, grade, and bearing using the haversine formula for geographic distance. This change introduces a new data model (Sonda, TrackPoint, Telemetry) that stores track points in a Vector for efficient random access and calculates boundaries for UI gauges, while also supporting video captions and slope segmentation for the elevation profile.

src/main/scala/peregin/gpv/model · high confidence

New utility library for image processing, data conversion, and telemetry alignment

This change introduces a new set of utility classes in the \peregin.gpv.util\ package to support core application features. \ImageConverter\ and \Io\ provide capabilities for loading, rotating, and manipulating SVG and raster images, including handling missing resources with a placeholder. \UnitConverter\ adds support for switching between standard, marine, and metric units for distance, speed, and elevation. \VideoGpxAlignment\ automatically aligns video playback with GPX telemetry by reading video creation timestamps. Additionally, \JsonConverter\ and \YamlConverter\ enable serialization/deserialization for configuration and data, while \TimePrinter\ and \SeqUtil\ offer helper functions for time formatting and sequence operations.

src/main/scala/peregin/gpv/util · high confidence

Video conversion capability and project management overhaul

The application now includes a dedicated Converter dialog that allows users to generate video overlays from existing video files and GPS telemetry, featuring real-time progress tracking, bitrate adjustment, and automatic codec fallback (H.264) for unsupported sources. This change introduces a new project-based workflow where video paths, GPS data, dashboard templates, transparency settings, unit preferences (Metric, Marine, Standard), and video-GPS timestamp shifts are saved and loaded via JSON project files. The main interface has been restructured to include a unit chooser, a transparency slider for dashboard overlays, and a status bar, replacing the previous ad-hoc configuration with a persistent, saveable state.

src/main/scala/peregin/gpv · high confidence

Behavioural changes

Refactored map and altitude panels with new tile providers

The map and altitude display components have been refactored into separate, dedicated panels (MapPanel and AltitudePanel) to improve code organization. The map view now defaults to Microsoft tiles instead of the previous provider, with support for MapQuest tiles also included. The altitude panel now renders an elevation chart that can switch between time-based and distance-based modes, and the map overlay uses a new KnobPainter to display Points of Interest and current progress with distinct colored markers.

src/main/scala/peregin/gpv/gui/map · high confidence

Video player now supports seeking and accurate playback timing

The video playback engine has been refactored to support seeking to specific positions within a video and to maintain accurate synchronization between audio and video streams. This change introduces a new actor-based architecture (SeekableVideoPlayer) that manages play, pause, step, and seek commands, replacing the previous linear processing model. A new DelayController component calculates and applies timing adjustments to handle frame lags, ensuring smoother playback. Additionally, the player now exposes a 'playing' status query, allowing the UI to accurately reflect the current state of the video stream.

src/main/scala/peregin/gpv/video · high confidence

Test coverage

Added GPS test data resources; Added initial test suite for PlayerControllerActor; Added manual test applications for UI components; Added test configuration for verbose FSM event logging; Added test coverage for GPV utility classes; Added tests for MapGauge coordinate scaling and edge cases; Added unit tests for GPS coordinate formatting; Added unit tests for GPS telemetry model components.

Dependencies

Migrate build system from Maven to SBT

The project has switched its build tool from Maven (pom.xml) to SBT (build.sbt). This change updates the compilation target to Java 17, upgrades the Scala version to 2.13.18, and refreshes numerous dependencies to their latest versions, including Jackson 2.21.1, Logback 1.6.3, Akka 2.8.8, and GeoTools 34.1. The new build configuration also includes an assembly plugin for creating a runnable JAR and integrates GitHub release automation.

(dependencies) · high confidence

Housekeeping

Initial project setup and documentation

The repository has been initialized with the core project structure, including the build configuration (version 2.5.0), CI integration via Travis CI, and standard open-source governance files such as the MIT License, Code of Conduct, and .gitignore. The README provides comprehensive documentation on how to download, run, and use the application, including prerequisites (Java 17+) and usage examples.

(repo-wide) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Baseline

  • First survey — no prior run to compare against. CAI 62.

Lenses

  • Code Health 97
  • Architecture 100
  • Maturity 52
  • Readiness 50
  • Security 92

Changes since last survey

  • 300 commits — 298 feature/other, 2 fixes

By area

  • (repo) — 129 commits
  • (root) — 110 commits
  • project/build.properties — 30 commits
  • project/plugins.sbt — 18 commits
  • src/main — 10 commits
  • src/test — 2 commits
  • .circleci/config.yml — 1 commit

Notable commits

  • fix: - revert default color to yellow - control mainColor of the dashboard (mostly text) via yaml param - added new SvgDigital gauges group - added black outline for SvgGauges for better visibility over gray tarmac - fixed unit of DigitalSpeedGauge - new SvgDigitalGauge group and gauges - change elevation min/max range
  • fix: revert
  • change: Added new cycling dashboard Added digital cadence gauge
  • change: Allow negative times when GPX starts later in the video
  • change: Automatically rotate videos based on displayRotation
  • change: Captions on video
  • change: Correctly calculate and interpolate circular units - longitude and azimuth
  • change: Disable display when points or values are missing in GPX
  • change: Fall back to H264 when original video has unsupported codec for encoding
  • change: Include getools META-INF in assembly
  • change: Make TemperatureGauge more area responsive, use more common unicode degree character
  • change: Merge branch 'master' into update/specs2-core-4.20.9
  • change: Merge branch 'master' of https://github.com/peregin/gps-overlay-on-video
  • change: Merge pull request #220 from kvr000/correctly-calculate-wrapped-units
  • change: Merge pull request #221 from kvr000/include-geotools-meta-inf
  • change: Merge pull request #223 from scala-steward/update/logback-classic-1.5.7
  • change: Merge pull request #224 from scala-steward/update/guava-33.3.0-jre
  • change: Merge pull request #225 from scala-steward/update/sbt-scoverage-2.1.1
  • change: Merge pull request #226 from kvr000/temperature-area-improvement
  • change: Merge pull request #227 from kvr000/fallback-from-unsupported-video-codecs
  • …and 280 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

peregin/gps-overlay-on-video was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 20 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 21c5879a579c15c1b02b9b597f62e64683911f49 — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-b51f968c9b10.