Releases: Wewoc/Garmin_Local_Archive
v1.6.0.4.3 — Crash Visibility
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 requiredGarmin_Local_Archive.zip— standard, Python 3.10+ required
v1.6.0.4.2 — Dashboard Output Path Fix
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 todashboards/daily_update.py— headless scheduler output path corrected todashboards/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
fix(garmin): force non-zero exit on GarminLoginError to prevent silent failures
v1.6.0.4 — Source Replay + Source Status + Source Backup
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) — rebuildsraw/andsummary/
from your localsource/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 athigh
quality are never overwritten — the original intraday capture stays intact.
Supports--dry-runand--date YYYY-MM-DD. -
Source Backup (
garmin_backup_source.py) — automatically backs up every
source file togarmin_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 requiredGarmin_Local_Archive.zip— standard, Python 3.10+ required
v1.6.0 — Home Tab & Daily Workflow Refactor
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_garminandoverview_garminload 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.tomladded;test_static.pyenforces this as a gate
Downloads:
Garmin_Local_Archive_Standalone.zip— recommended, no Python requiredGarmin_Local_Archive.zip— standard, Python 3.10+ required
v1.5.9 — Standalone EXE: --onedir + Mobile Dashboard Embed
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:
NameErrorin context collector on first location segment change - Bug fix:
NameErrorin daily update scheduler (missingjsonimport) - Code hygiene:
ruff check . → 0 errorsacross the entire project
Downloads:
Garmin_Local_Archive_Standalone.zip— recommended, no Python requiredGarmin_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.
v1.5.8.1 — Mobile Landing Page
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.htmlgenerated automatically inBASE_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 requiredGarmin_Local_Archive.zip— standard, Python 3.10+ required
v1.5.8 — In-App File Viewer
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
.xlsxfiles fromdashboards/. 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 requiredGarmin_Local_Archive.zip— standard, Python 3.10+ required
v1.5.7.1 — Mirror Import Patch
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_idanddevice_namefrom
imported raw files and stores them in the quality log — previously all
imported days landed withdevice_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 (
.glafile) and the deprecated
folder fallback.
Downloads:
Garmin_Local_Archive_Standalone.zip— recommended, no Python requiredGarmin_Local_Archive.zip— standard, Python 3.10+ required
v1.5.7 — Quality System Redefinition
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
unknownrow 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/lowentries →standard, 218highentries unchanged
Downloads:
Garmin_Local_Archive_Standalone.zip— recommended, no Python requiredGarmin_Local_Archive.zip— standard, Python 3.10+ required