Skip to content

Releases: Wewoc/Garmin_Local_Archive

v1.6.5.7 — Reliability & Silent-Failure Investigation

Choose a tag to compare

@Wewoc Wewoc released this 31 Jul 13:12

Part 1 — What changed, in plain terms

This release is about trust in the archive, not new features. It closes a
chain of investigation triggered by a real bug: the Silo-Repair tool's
"source without raw" fix used a command that cannot work at all in the
Standalone build — meaning that specific repair path silently failed in
Garmin_Local_Archive_Standalone.exe. Tracing that one bug turned into a
broader look at where else the app could fail without telling you.

What's more robust now:

  • Interrupted imports no longer leave invisible gaps. If a Bulk Import or
    a Mirror Import is interrupted partway through (crash, forced close, power
    loss), the days already processed before the interruption are now correctly
    recorded — previously, an interrupted run could leave already-written data
    "invisible" to the app's own bookkeeping until the whole import finished.
  • Silo-Repair works properly in every build, including the Standalone
    EXE — the bug that started this investigation is fixed at the root, not
    patched around.
  • A repair step could retry a failed field patch (used for retroactively
    adding new data fields to already-archived days) once automatically, and
    logs clearly if it still fails, instead of failing quietly.
  • A subtle timing bug in the repair logic itself was found and fixed
    during this release's own internal review — a rare, unlikely-but-real race
    condition around how the quality registry is locked during repairs.

What's new under the hood (no visible change, but worth knowing):

  • A self-test now runs automatically as part of every build, verifying that
    every single module actually loads correctly in the frozen EXE — not just
    that the files are present.
  • Several previously-silent error paths (backup, mirror import, token
    security, file writer) now log clearly instead of failing without a trace
    — useful if you ever need to report a problem.
  • New automated checks catch a handful of classes of bugs before they ever
    reach a release (missing files in a build, accidentally-reintroduced
    silent error handling, forbidden internal dependencies).

No changes to dashboards, data formats, or anything you interact with day to
day. Existing archives are fully compatible — nothing to migrate.


Part 2 — Details, for the technically curious

Investigated via a four-part concept ("Netz 0–4" internally) plus a
structural extraction that turned out to be a blocker for all of it:

Trigger: Silo-Repair's "source without raw" fix called
subprocess.run([sys.executable, ...]) directly. In any frozen build,
sys.executable is the EXE itself, not a Python interpreter — the call
could never have worked in a built EXE. Worse in the Standalone build:
it has no subprocess execution model for scripts at all.

Fix: the repair logic was extracted into its own, GUI-independent module
(garmin_silo_repair.py) and the "source without raw" path now runs the
fix in-process instead of shelling out — works identically in every build
target.

Crash-resilience (quality_log.json): Bulk Import and Mirror Import
previously wrote their quality/tracking data to disk only once, after the
entire run finished. Both now persist after every single processed day,
matching the pattern the regular daily sync already used. An interrupt
mid-run now loses at most the one day in progress, not the bookkeeping for
everything already written.

Error visibility, four modules: Mirror Import, Backup/Restore, Token
Security, and the file Writer each had at least one place where a failure
was caught and silently discarded (or logged to a file nobody was pointed
to). These now surface a reason — through log lines, structured return
values, or a clearer message in the GUI — instead of returning generic
empty results.

A genuine timing bug found late, before this write-up: the extracted
repair module held its internal lock only for the initial read of the
quality registry, then released it and re-acquired it separately for each
day's save. In the (rare, but real) case of another part of the app writing
to the same registry during that window, the repair's own save could have
silently overwritten those changes with its own stale copy. Fixed by
holding the lock for the entire read-modify-write cycle, matching the
pattern already used everywhere else in the pipeline.

New automated safeguards (test_static.py, four new checks): every file
listed in the build manifest is verified to exist, and every file that
should be in the manifest is verified to be listed (catches both a typo
in the list and a forgotten new file); a small set of previously-cleaned-up
error handlers is now guarded against silently regressing back to swallowing
exceptions; two "leaf" modules are verified to never accidentally import
other project code; and dynamically-loaded modules are tracked against a
baseline so a new one doesn't slip in unnoticed.

Full technical changelog: see CHANGELOG.md.

v1.6.5.6 — Intraday Timestamp Timezone Bug

Choose a tag to compare

@Wewoc Wewoc released this 28 Jul 17:32

Intraday charts (heart rate, stress, SpO2, Body Battery, respiration, steps)
were showing timestamps in GMT/UTC instead of local time — a 9 AM activity
during summer time could show up two hours early on the curve. This release
fixes it by deriving each day's real device offset from the data itself, no
system clock involved, and adds detection for the two calendar days a year
where that offset changes mid-day.

What's new:

  • Intraday timestamps now shown in the recording device's local time, derived per day from Garmin's own archived data
  • Days that cross a clock-change are now detected and flagged internally, rather than silently rendered wrong
  • A short note now appears in the header of dashboards showing intraday data, explaining the time basis
  • Test suite grew from 445 to 453 checks to cover this directly — the previous suite never actually exercised the affected code path

Downloads:

  • Garmin_Local_Archive_Standalone.zip — recommended, no Python required
  • Garmin_Local_Archive.zip — standard, Python 3.10+ required

Full changelog

v1.6.5.5 — Hidden-Import Consolidation + Build Fixes

Choose a tag to compare

@Wewoc Wewoc released this 22 Jul 16:26

Internal build-system cleanup — no user-facing feature changes. Consolidates
duplicated PyInstaller hidden-import lists into a single source of truth,
adds test coverage that was missing before, and fixes a packaging gap where
one maintenance script wasn't being included in built releases.

What's new:

  • Hidden-import lists for both build targets now come from one place —
    no more manually keeping two lists in sync
  • New automated checks catch a missing hidden-import before it ships
  • regenerate_raw.py (source-replay repair tool) is now correctly packaged
    in both the Standard and Standalone builds

Downloads:

  • Garmin_Local_Archive_Standalone.zip — recommended, no Python required
  • Garmin_Local_Archive.zip — standard, Python 3.10+ required

Full changelog

v1.6.5.4 — Frozen-Path Centralization

Choose a tag to compare

@Wewoc Wewoc released this 19 Jul 15:24

Internal cleanup: the logic that figures out "where are my files" when
running as a packaged EXE was scattered across six near-identical copies
plus a few smaller variants, and one of them was missing entirely — which
silently broke the Live Tracking dashboard update in the Standalone
version. Everything now goes through one shared module. No user-facing
feature changes, but one real bug fixed along the way.

What's new:

  • Fixed: Live Tracking dashboard failed to refresh silently in the
    Standalone (no-Python-required) build after a sync — now updates
    correctly.
  • Fixed: the "→ Open README" link on the Outputs screen did nothing when
    running from source (development mode) — now opens the file.
  • Internal: consolidated all frozen-build path resolution into a single
    frozen_paths.py module, closing four related findings from the
    standalone-parity audit.

Downloads:

  • Garmin_Local_Archive_Standalone.zip — recommended, no Python required
  • Garmin_Local_Archive.zip — standard, Python 3.10+ required

Full changelog

v1.6.5.2 — Token Lifecycle Log

Choose a tag to compare

@Wewoc Wewoc released this 16 Jul 13:23

A behind-the-scenes addition, no visible change to how the app works. The app now
quietly tracks when your Garmin login token was created and why it stopped working
(expired, rate-limited, encryption key lost, manually reset) — useful for
understanding how long a token actually lasts over time, instead of guessing.

What's new:

  • New file garmin_data/log/garmin_token_log.json — records timestamp, event
    type, and reason whenever your token is created or invalidated. Contains no
    passwords, no credentials, no token content — metadata only.
  • No change to login behaviour, no new buttons, no new settings.

Downloads:

  • Garmin_Local_Archive_Standalone.zip — recommended, no Python required
  • Garmin_Local_Archive.zip — standard, Python 3.10+ required

Full changelog

v1.6.4 — Custom Dashboard Builder

Choose a tag to compare

@Wewoc Wewoc released this 05 Jul 17:09

Pick any Garmin health field and any weather/pollen/air-quality field, set a date range, and build a one-off dashboard — no fixed dashboard list needed. Save your field selection as a named preset for reuse. Optional password-protected export for the HTML output.

What's new:

  • 🎛 Custom Dashboard button — free field picker (Garmin + Context), fixed or relative date range, HTML/Excel output
  • Named presets — save, reload, or delete a field selection
  • 🔒 Optional AES-256 encryption for the Custom Dashboard HTML output

Downloads:

  • Garmin_Local_Archive_Standalone.zip — recommended, no Python required
  • Garmin_Local_Archive.zip — standard, Python 3.10+ required

Full changelog

v1.6.3.1 — Heatmap Dashboard

Choose a tag to compare

@Wewoc Wewoc released this 03 Jul 13:37

New Heatmap dashboard visualizing six metrics (Heart Rate, Steps, Stress,
Body Battery, SpO2, Respiration) as time-of-day × date grids.

While building it, two independent long-standing bugs surfaced and got
fixed along the way:

  • SpO2 and Respiration intraday data was being silently dropped by the
    data broker for every dashboard, not just this new one — a structural
    mismatch between how Garmin's raw data is shaped and how it was being
    read. No data was ever lost (the raw archive was always correct), but
    none of it reached any dashboard.
  • Respiration's quality assessment was checking a key name that doesn't
    exist, so it could never be labeled as fully present.

Also: the Mirror Import dialog no longer asks you to "confirm" a password
you're just unlocking, not creating.

Full detail in CHANGELOG.md.

v1.6.3 — Steps Intraday Foundation + Backfill

Choose a tag to compare

@Wewoc Wewoc released this 02 Jul 15:59

Adds step count as a full intraday metric (15-minute resolution) alongside heart rate, stress, and Body Battery. A new background timer mode also retroactively fills this data into days you already archived — no need to wait for a fresh sync, and no risk to your existing high-quality data.

What's new:

  • Step count now archived at 15-minute intraday resolution, not just the daily total
  • New background timer mode automatically backfills step data into already-archived days from the last 140 days — runs quietly in the background, one lightweight API call per day
  • Fully additive: never overwrites or downgrades existing data, and both your raw archive and your unmodified source backup get the new field

Downloads:

  • Garmin_Local_Archive_Standalone.zip — recommended, no Python required
  • Garmin_Local_Archive.zip — standard, Python 3.10+ required

Full changelog

v1.6.2.1 — Build: T3 ZIP Structure + Docs Path

Choose a tag to compare

@Wewoc Wewoc released this 30 Jun 17:27

Hotfix for the standalone build. The Documentation button now correctly opens
Quickstart, User Guide, and README App — the files were previously missing from
the T3 package and were looked up in the wrong location after unpacking.

What's new:

  • Documentation button works in T3 (Standalone): QUICKSTART.txt, USER_GUIDE.txt,
    and README_APP.md are found and opened correctly
  • T3 ZIP structure fixed: contents are placed flat in the root after unpacking —
    no subfolder nesting

Downloads:

  • Garmin_Local_Archive_Standalone.zip — recommended, no Python required
  • Garmin_Local_Archive.zip — standard, Python 3.10+ required

Full changelog

v1.6.2 — Sleep Dashboard + Intraday Explorer

Choose a tag to compare

@Wewoc Wewoc released this 30 Jun 14:56

The Sleep Dashboard now includes an embedded intraday detail section.
Click any row in the sleep table to jump directly to that night's intraday
view — Heart Rate, Stress, Body Battery, and Respiration plotted in a
single interactive Plotly chart. No second file, no external links:
one self-contained HTML output.

What's new:

  • Sleep Dashboard rows are clickable — jumps to intraday detail for that date
  • Four intraday traces inline: Heart Rate, Stress, Body Battery, Respiration
  • Date dropdown for manual navigation within the intraday section
  • Plotly embedded only when intraday data is present (no overhead for older archives)

Downloads:

  • Garmin_Local_Archive_Standalone.zip — recommended, no Python required
  • Garmin_Local_Archive.zip — standard, Python 3.10+ required

Full changelog