Releases: dekiller82/telemetry-studio
Releases · dekiller82/telemetry-studio
Release list
v0.1.25
Fixed
- Export could hang indefinitely (or worse) when the trim range fell entirely within a middle
clip of a multi-clip project — e.g. exporting a short highlight from partway through a long
multi-chapter session. The ffmpeg filter graph only ever applied trim to the array's first and
last clip, on the assumption trim could only shave time off the very start/end of the whole
sequence; a trim window set inside a middle clip fell through that assumption entirely, silently
including every OTHER clip in the project untrimmed and forcing ffmpeg to decode and concatenate
the whole session merely to discard almost all of it. Confirmed as the cause of this project's own
"hangs on frame 10, Cancel takes forever" report on a trimmed multi-clip export. Does not
appear to be the same failure as the 5.3K "crash" originally reported on GitHub — that export
looks to have been full/untrimmed, a code path this bug never touched — so that report remains
open; see Known limitations below (this replaces the unconfirmed native-rendering-crash theory
0.1.24 originally listed there, which is also not confirmed). - A smaller version of the same class of bug remained even for a correctly-selected single clip:
the trim's own start point (however deep into that one clip) was still applied as a filter-graph
trim, which decodes and discards every frame from the clip's own beginning up to the trim point
before any real output can start — confirmed directly to take ~19s for a 144s throwaway prefix on
a real 4K clip. Switched to an ffmpeg input seek (-ssbefore that clip's own-i) instead, which
decodes only from the nearest preceding keyframe — confirmed to produce byte-identical output
frames in ~0.4s instead. This is what remained as a brief (rather than indefinite) pause a few
frames into export after the first fix above. Both fixes verified directly against the same real
4-clip project end to end: the export that previously never finished now completes in under 90
seconds with no perceptible pause, and the output's actual duration matches the requested trim
window exactly.
Known limitations
- The original 5.3K export crash reported on GitHub is still open. Both Fixed entries above were
investigated specifically because they produce a very similar symptom (export stalls a few frames
in), but the reporter's own export appears to have been a full, untrimmed multi-clip session —
verified directly that a full/untrimmed multi-clip export (no trim at all) has no equivalent stall
on the hardware available for testing here, so these two fixes don't explain their crash. Root
cause still unconfirmed; needs either their real project file, or a reproduction on similar
(Apple Silicon, 5.3K source) hardware.
Full Changelog: v0.1.24...v0.1.25
v0.1.24
Added
- Automatic GoPro chapter ordering and validation on import — clips are now put in the correct
chapter order automatically (GH01/GH02/... or the olderGOPR/GP01/... naming) instead of
relying on whatever order the file picker happens to return, and a selection that mixes clips from
two different recordings, or is missing a chapter, is rejected with a clear message instead of
silently producing a broken timeline. - Automatic GPS noise filtering — a physically-implausible GPS position jump (inconsistent with
the speed the camera itself reported at that moment) is now detected and removed before it reaches
the map/track widgets. Short isolated spikes are bridged (both good sides kept, stitched together);
a longer bad stretch is only discarded outright when a clearly dominant, trustworthy segment
remains, so a genuinely ambiguous recording is left intact rather than guessed at. - GPS-dependent widgets blank out outside the trustworthy GPS range — the speedometer, compass,
elevation, distance, and map dot now go blank for any moment the GPS filtering above discarded,
instead of showing a frozen, misleadingly "current" value from before the gap. - Adjustable start/finish detection radius, and manual lap delete/restore — if your track's own
layout passes close to the line somewhere that isn't the actual line (a pit lane, a hairpin), a
false lap could get detected. The detection radius is now adjustable per project (Property Panel,
3–40m), and any detected lap can be deleted directly from its timeline marker if one still slips
through — excluded from lap/sector timing everywhere (preview and export alike), and kept visible
(dimmed) so it can be restored if deleted by mistake. - GPS Track widget: "Crop map to trimmed range" (on by default) — draws only the GPS between
your trim start/end points instead of the whole recording, so a bad-GPS stretch outside the
exported range (e.g. parked under cover before heading out) doesn't show up on the map, without
needing to also cut it out of the exported video. - Warning before exporting a very high native resolution source — a banner (with a one-click
switch to the YouTube 4K preset) appears when the source is above 4K and "Source quality" export
is selected, since a very high native resolution (5.3K+) has been reported to crash export
outright on some systems. This is a warning, not a fix for the underlying crash, which is still
unresolved — see Known limitations.
Fixed
- Rapid timeline scrubbing could overwhelm the video decoder and make the app lag behind the
mouse. Dragging the scrub bar now updates the playhead and every widget instantly, but the
actual (expensive) decoder seek is throttled to the latest position you dragged to, waiting for
the decoder to actually be ready before issuing the next one. - Reimporting a project whose first clip happened to share a file path with the previous project
didn't reset playback state, leaving stale seek/proxy data from the old project active in the
new one. - Importing multiple clips failed outright if just one of them (commonly the first chapter,
recorded before the GPS module had locked on) had no GPS fix yet, rejecting the whole batch even
when every other clip's GPS was fine. That one clip now just contributes a blank stretch instead.
Known limitations
- Export can crash on very high native resolution (5.3K+) source video on some systems,
reported on a Mac mini M4 (Apple Silicon) as an outright crash with no error dialog; downscaling
via a delivery preset (e.g. YouTube 4K) works around it. Root cause not yet confirmed — frame
rendering runs in the app's own main process, so a native rendering crash there would take the
whole app down with it, but this hasn't been reproduced/profiled on the affected hardware. A
warning now appears before this situation (see Added, above); the underlying crash itself is
still open.
Pull requests merged in this release
- Fix GoPro chapter ordering and implausible GPS tracks by @Michael-Han0608 in #2
- Bound preview seeks during rapid timeline scrubbing by @Michael-Han0608 in #3
New Contributors
- @Michael-Han0608 made their first contribution in #2
Full Changelog: v0.1.23...v0.1.24
v0.1.23
Fixed
- VideoToolbox export silently fell back to CPU on real Apple Silicon hardware. Confirmed by
a real tester and by extracting the actual mac binary from a shipped release: ffmpeg-static
bundles ffmpeg 6.0 for macOS, and the quality-mode flag (-q:v) the previous release used for
VideoToolbox wasn't added until ffmpeg 6.1 — the startup smoke test correctly detected this
didn't work and fell back to CPU exactly as designed, it just meant the GPU path never actually
ran. Switched to plain bitrate-mode rate control instead, which VideoToolbox has supported since
ffmpeg first wrapped it. - Documented the macOS "is damaged and can't be opened" Gatekeeper message — this app isn't
signed with a paid Apple Developer ID, and recent macOS versions show this (misleading) message
instead of an "unidentified developer" bypass button. See the README's
Installing section for the one-line Terminal
fix (xattr -cr).
Full Changelog: v0.1.22...v0.1.23
v0.1.22
Fixed
- Export was completely broken on Intel Macs. Both mac release builds (Intel and Apple
Silicon) were shipping the exact same single-architecture ffmpeg binary, because the packaging
step downloads one binary matching whichever machine builds it and had no way to tell it needed
both. On this project's build machine that meant an Apple-Silicon-only binary got bundled into
the Intel build too, and Intel Macs can't run it at all — export would have failed outright,
independent of and unrelated to the new VideoToolbox change in the last release. Each
architecture is now packaged as its own pass with the correct binary swapped in first.
Full Changelog: v0.1.21...v0.1.22
v0.1.21
Added
- GPU-accelerated export on macOS (Apple VideoToolbox) — exports on Mac were silently falling
back to CPU encoding, since the encoder selection list only knew about NVIDIA/Intel/AMD GPUs,
none of which exist on Apple Silicon. Added VideoToolbox as a candidate, tried before falling
back to CPU, following the same "verify with a real throwaway ffmpeg run before trusting it"
approach as every other encoder here. Not yet verified on real Apple Silicon hardware — if
export behaves worse than before on Mac after updating, that's the first thing to suspect;
reports welcome.
Full Changelog: v0.1.20...v0.1.21
v0.1.20
Fixed
- In-app update failed with a 404 on Windows and Linux — the installer/AppImage filename is
derived from the app's display name ("Telemetry Studio"), which contains a space. That one space
got sanitized two different, incompatible ways: electron-builder's own update-metadata file
recorded it as a hyphen, while GitHub's release-asset upload recorded it as a dot, so the
in-app updater downloaded a URL that never matched an actual asset. The installer/AppImage
filenames no longer derive from the display name, so there's no space left for either side to
mangle differently.
Full Changelog: v0.1.19...v0.1.20
v0.1.19
Fixed
- macOS build failed to launch with "Cannot find native binding" — the mac release packages
both Intel (x64) and Apple Silicon (arm64) builds from a single CI runner, but the canvas library
used for rendering (@napi-rs/canvas) ships a separate native binary per architecture, and npm
only installs the one matching the runner's own arch. Whichever architecture didn't match the
runner ended up packaged with no native binary at all, and the app crashed on launch on that
arch. CI now force-installs both architectures' binaries before packaging, so both mac builds
ship with a working binary regardless of which arch actually builds them.
Full Changelog: v0.1.18...v0.1.19
v0.1.18
If you're updating from v0.1.14 or earlier: please use the link below to download this release
manually one last time. Starting with this version, the app can update itself in-app — but that
requires metadata that only exists on releases published after this one, so this specific jump
has to be manual. Every update after this point can be done from inside the app.
Added
- Keyboard shortcuts & getting-started panel — a "?" button in the toolbar (or just pressing
?) opens a reference panel listing every keyboard shortcut (undo/redo, select all, delete,
arrow-key nudge/frame-step, play/pause, shift-click multi-select) alongside a short written
walkthrough of the core workflow (import → add widgets → set start/finish → style → export).
Also reachable from the welcome screen before importing anything. - Widgets now lock during export, and a real OS notification fires when it finishes — widget
drag/resize and every property-panel edit are disabled (visually dimmed, and genuinely
non-interactive via the browser'sinertmechanism) for the duration of an export, so there's no
more ambiguity about whether moving something mid-export changes the output. For the record: it
never did — the export pipeline already works from a one-time snapshot of your widgets copied over
IPC the instant you click Export, so this is purely about removing that uncertainty, not a
correctness fix. A native desktop notification (only when the window isn't already focused) lets
a long export run in the background without babysitting the progress bar. - Cancel an in-progress export — a Cancel button on the export progress bar stops ffmpeg
outright (not a graceful finish-then-discard) and cleans up the truncated partial file, instead
of only being able to wait it out. - In-app updates on Windows and Linux — the existing "a new version is available" banner now has
an Update button: click it to download in the background with a visible progress bar, then Restart
& Install when it's ready, instead of only linking out to the Releases page. macOS keeps the
link-out banner unchanged — Apple's Gatekeeper requires a paid Developer ID to auto-update at all,
which this project doesn't have. Windows updates work without a certificate too (no SmartScreen
changes from what the installer already shows today).
Fixed
- The toolbar's new "?" (shortcuts/help) button didn't match the other toolbar buttons — it had
its own circular styling instead of the same rectangular ghost-button look as Undo/Redo/File. - Dragging a trim handle didn't move the video — only the trim marker itself updated, so you
couldn't see where the start/end point would actually land until you released the mouse. Dragging
either trim handle now seeks the video live, the same way scrubbing the playhead already does.
v0.1.14
Added
- Elevation widget — current altitude readout and/or a distance-based elevation profile graph
for the whole session (toggleable independently), from the GPS altitude reading every GoPro clip
already carries. Most useful for hillclimbs/rally; a flat closed circuit will understandably look
close to a flat line. - G-Force Diagram: numeric readout — a combined-G value ("0.8G") now shows above the friction
circle by default, so the widget actually tells you how many G's you're pulling instead of only
showing where on the circle you are. - G-Force Diagram: toggleable axis labels — the ACCEL/BRAKE/LEFT/RIGHT text can now be turned
off independently of the ring/grid, for a cleaner look. - Distance widget — a live running total of GPS arc-length covered since the start of the
recording, for a distance counter you can keep on screen the whole session (previously only
visible as a final total on the Session Summary card). - Compass/Heading widget — a digital "047° NE" readout of direction of travel from GPS
course-over-ground. GoPro cameras have no magnetometer, so this reflects which way you're moving,
not which way the camera physically faces, and reads meaninglessly while stationary. - Acceleration Timer widget — a Dragy-style launch timer. Auto-detects a genuine stop followed
by acceleration (not just any slow corner) and times how long it takes to reach each of your own
configured target speeds, keeping a session-best per target alongside the live current run. Target
speeds are user-configurable rather than Dragy's fixed highway splits (0-60mph, 1/4 mile), since
karts run a much lower, track-specific speed range. - Global + per-widget font picker — a "Project Settings" panel (File menu) sets a project-wide
default font, picked from your real OS-installed fonts alongside the bundled Formula1 look. Any
widget can override this with its own font via a "Font family" dropdown in its Style panel,
defaulting to "Inherit from global". Renders identically in live preview and export. The two
bundled Formula1 weights (Bold/Regular) are individually selectable too, alongside an "Auto" option
that mixes them per element the way each widget always internally has. - Property panel reorganized into two tabs: "Widgets" (start/finish line, add/arrange widgets,
layouts, color themes) and "Style" (alignment tools plus the selected widget's own controls).
Selecting any widget now jumps straight to its Style tab instead of requiring a scroll past every
global section first — the panel had grown long enough (18 widget types) that this was becoming a
real navigation cost.
Fixed
- Roll/Lean Angle widget always read a frozen 0° — root-caused on a real HERO8 Black clip: its
GRAV (gravity vector) stream is structurally present (right sample count, right cts spacing) but
every single sample is exactly{0,0,0}— the metadata slot exists on this camera/firmware but
isn't populated with real sensor-fusion output. The app trusted "stream present" as "gravity data
available," which froze Roll/Lean at a permanent 0° and silently corrupted the G-Force widget's
axis calibration too (both share the same vertical-axis detection, which picks whichever axis has
the largest mean magnitude — meaningless when every axis is identically zero). An all-zero GRAV
stream is now treated as absent, the same as a camera that never had one, falling back to the
accelerometer-tilt estimate like the app already does for older cameras.
v0.1.10
Changed
- Renamed the app from "GoPro Overlay" to "Telemetry Studio" — the app has grown well past a
GoPro-specific tool (F1-style timing towers, G-force/lean-angle analysis, delivery presets...),
and "GoPro" is someone else's trademark to begin with. Project files still use the.gpo
extension unchanged, and video import is still GoPro-only for now (see the CHANGELOG entries
above for what that actually covers) — this is a branding change, not a functional one.
Added
- Widget-to-widget alignment/snapping — dragging a widget now also snaps to other widgets' own
left/center/right and top/middle/bottom edges, not just the frame's own edges/center. Whichever
candidate is closest wins, and a live guide line shows exactly where. - Per-lap start/finish crossing nudge — the automatic lap-crossing detection can register a
crossing a few frames early or late on a given lap (GPS noise, an off-angle pass near the line).
Click a lap marker on the timeline to select it, then nudge it ±1 frame at a time with a live
offset readout and a Reset button — every widget, the export, and "Export Best Lap" all pick up
the correction immediately. - Delivery presets for export — a dropdown next to Export Video bundles resolution + bitrate for
YouTube (4K/1080p), Instagram/TikTok/Reels, and Twitter/X, alongside the existing default "Source
quality" (unchanged CRF-based, native-resolution) export.