Skip to content

Releases: Wewoc/Garmin_Local_Archive

v1.6.0.4.3 — Crash Visibility

19 Jun 16:58

Choose a tag to compare

This release makes a previously invisible class of crash visible. If the app
ever closed unexpectedly without any error message, it now writes a crash log
before shutting down — so the problem can actually be diagnosed instead of
disappearing without a trace.

What's new:

  • The app now catches unexpected internal errors that previously caused a
    silent, untraceable crash — a short crash log is written before closing
  • Crash logs are saved to a fixed local folder (%LOCALAPPDATA%\GarminLocalArchive\crash\)
    independent of your configured archive location, so they're still written
    even if that location is temporarily unreachable
  • Minor cleanup: removed a harmless lint warning in the source backup script

Downloads:

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

Full changelog

v1.6.0.4.2 — Dashboard Output Path Fix

18 Jun 14:35

Choose a tag to compare

Bug fix — Daily Sync wrote dashboards to the wrong directory, causing the Dashboard viewer to show stale data.

What happened

After a Daily Sync (GUI or headless daily_update), the Dashboard tab still showed yesterday's data — the most recent day was missing. The sync itself ran correctly and all data was fetched, but the generated dashboard files ended up in garmin_data/dashboards/ while the viewer reads from dashboards/.

What changed

  • panel_outputs.py — Daily Sync output path corrected to dashboards/
  • daily_update.py — headless scheduler output path corrected to dashboards/
  • garmin_app_base.py — docstring corrected

Manual cleanup

After updating, delete the folder garmin_data/dashboards/ inside your data directory — it contains stale files and is no longer written to.

No data affected

This fix changes only where generated HTML/XLSX dashboards are written. No archive data (garmin_data/raw/, summary/, source/) is touched.

v1.6.0.4.1 — Login Failure Masking Fix

17 Jun 17:26
ecf805e

Choose a tag to compare

fix(garmin): force non-zero exit on GarminLoginError to prevent silent failures

v1.6.0.4 — Source Replay + Source Status + Source Backup

15 Jun 17:48

Choose a tag to compare

Closes the source archive triad started in v1.6.0.2. The source/ directory
is now fully protected, operationally visible, and replayable.

What's new:

  • Source Replay (export/regenerate_raw.py) — rebuilds raw/ and summary/
    from your local source/ archive without any API call or re-authentication.
    Run this after updating the normalizer to reprocess all historical days from
    the immutable source record. Downgrade protection: days already at high
    quality are never overwritten — the original intraday capture stays intact.
    Supports --dry-run and --date YYYY-MM-DD.

  • Source Backup (garmin_backup_source.py) — automatically backs up every
    source file to garmin_data/backup/source/ after each write. Includes a
    one-time backfill for source files that existed before this version.

  • Source Status — the Archive Status panel now shows Source: N days · M/180d
    inline with the other status info. Total source files on disk + how many fall
    within the 180-day window where Garmin still delivers full intraday resolution.

Downloads:

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

Full changelog

v1.6.0 — Home Tab & Daily Workflow Refactor

13 Jun 16:25

Choose a tag to compare

The main window layout has been redesigned around daily use instead of internal module structure. A fixed top area is now always visible — connection status, archive stats, and the device table stay in view regardless of which tab is active. Daily actions (Sync, Mirror, Timer) are permanently accessible without switching tabs.

What's new:

  • Fixed top area — connection indicators, archive status (fail / recheck / missing / range / coverage / last sync), device table, and Daily Actions always visible
  • Daily Sync button — one click runs Garmin Sync → Context Sync → Create All in sequence; gap detection included
  • Mirror button — context-aware: shows path setup dialog if no mirror is configured, export/import dialog if one is set
  • Tab order — Home (dashboard viewer) / Files (Excel viewer) / Settings; health_garmin and overview_garmin load as defaults
  • Settings tab redesigned — two-column layout: Settings panel left (fixed width), action panels right; cleaner separation of configuration and controls
  • Device table — width now auto-adjusts to content; no more horizontal scrolling or empty space to the right
  • Settings sidebar removed — all panels consolidated into the scrollable Settings tab; full window width now available for dashboard content
  • Log height reduced — less screen space consumed; session log files retain full detail
  • ruff linting — codebase cleaned to 0 errors; ruff.toml added; test_static.py enforces this as a gate

Downloads:

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

Full changelog

v1.5.9 — Standalone EXE: --onedir + Mobile Dashboard Embed

11 Jun 17:03

Choose a tag to compare

The standalone build (T3.1) now uses PyInstaller --onedir instead of --onefile — the app launches significantly faster because it no longer extracts to %TEMP% on every start. All files sit permanently in the Garmin_Local_Archive_Standalone/ folder next to the EXE. The daily sync EXE (daily_update.exe) stays as a single file — startup time doesn't matter for a scheduled background task.

Two real NameError bugs found via ruff are fixed, and the entire codebase now passes ruff check . → 0 errors.

The mobile landing page (index.html in your dashboards folder) now embeds both dashboards directly — no more broken links when opening from OneDrive on Android.

What's new:

  • T3.1 standalone EXE launches faster (no temp extraction on start)
  • Mobile landing page: dashboards embedded inline — works on OneDrive mobile
  • Bug fix: NameError in context collector on first location segment change
  • Bug fix: NameError in daily update scheduler (missing json import)
  • Code hygiene: ruff check . → 0 errors across the entire project

Downloads:

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

Note for existing Standalone users: after extracting, the app is now inside a subfolder Garmin_Local_Archive_Standalone/ — double-click Garmin_Local_Archive_Standalone.exe inside that folder to launch.

Full changelog

v1.5.8.1 — Mobile Landing Page

10 Jun 17:31

Choose a tag to compare

Adds a local mobile landing page (index.html) that is automatically
generated in your dashboards folder after every sync and on app start.
Open it on any device in the same local network — or copy it to your
phone — to see your current archive status and jump directly to the
two main dashboards.

What's new:

  • index.html generated automatically in BASE_DIR/dashboards/ — no configuration needed
  • Shows archive status: date range, coverage, fail/recheck/missing counts, device table
  • Direct links to Mobile Dashboard and Sleep Dashboard
  • Works with any browser via local file access (file://) — no server required
  • Data embedded inline — no network request needed to display

Downloads:

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

Full changelog

v1.5.8 — In-App File Viewer

09 Jun 13:48

Choose a tag to compare

Excel dashboards are now viewable directly inside the app — no Excel required. A new Files tab renders your .xlsx output via a built-in viewer with sheet selection and smart column sizing. The Sleep Dashboard Excel output also gets a visual upgrade: phase bar cells now carry letter labels (D/L/R/A) in contrast color, readable both in Excel and in the viewer.

What's new:

  • Files tab — third tab in the app, shows all .xlsx files from dashboards/. Sheet selector appears automatically for multi-sheet files. Chart sheets are filtered out — only data sheets shown. File list refreshes on tab switch and after every dashboard build
  • Open File button — opens the selected file in your system default (Excel, LibreOffice, WPS)
  • Sleep phase labels — each phase-bar cell in the Sleep Dashboard Excel now shows D / L / R / A in matching contrast color

Downloads:

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

Full changelog

v1.5.7.1 — Mirror Import Patch

08 Jun 17:05

Choose a tag to compare

Small patch fixing two gaps in the mirror import pipeline discovered
during the v1.5.7 architecture review. No new features, no user-visible
behaviour changes — imported data is now more complete from the start.

What's new:

  • Mirror import now correctly reads device_id and device_name from
    imported raw files and stores them in the quality log — previously all
    imported days landed with device_id = None. The backfill on the next
    regular Garmin sync would have resolved this automatically, but the import
    now sets it directly.
  • Applies to both the container path (.gla file) and the deprecated
    folder fallback.

Downloads:

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

Full changelog

v1.5.7 — Quality System Redefinition

07 Jun 18:29
ad29a83

Choose a tag to compare

The quality label system has been rebuilt from the ground up. The old medium / low labels were fundamentally miscalibrated — archive analysis showed that 92% of all days were classified as medium, which was factually wrong. The new standard label accurately describes what those days actually contain: complete daily data, just without intraday resolution. Device identity is now tracked per day, and a new device breakdown table in the app shows exactly which device covered which period and how many days each contributed.

What's new:

  • Quality labels simplified: high (intraday present) / standard (full daily, no intraday) / failed (nothing usable)
  • Device tracking: each day now records which Garmin device recorded it (device_id + device_name), sourced automatically from the raw files
  • Device table in the archive status panel: date range, High / Standard / Total per device — double-click the unknown row to assign a name to vívoactive-era entries
  • Startup integrity check now correctly reads from the configured data folder instead of the default path — eliminates the false "1900+ days missing" warning on non-default setups
  • One-time migration ran automatically before build: 2509 medium/low entries → standard, 218 high entries unchanged

Downloads:

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

Full changelog