peregin/gps-overlay-on-video
62.2
Adequate · 20 September 2026
4k
lines of production code
Scala
primary language
1
measurement over time
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.