carnet-de-route #
Garmin Explore waypoint and collection sync into a local GeoPackage.
The tool runs a small localhost bridge that pairs with a userscript inside your normal Garmin-authenticated browser. Through that bridge it reads Garmin Explore waypoints and collections, stores them with sync metadata in a SQLite/GeoPackage file, and can push reviewed local changes back to Garmin.
The GeoPackage, browser profile, and approvals file contain private location and account data. Do not share them.
Install / build #
Requirements: Go 1.24+, a Chromium-based browser, and the Tampermonkey userscript manager.
go build ./cmd/carnet-de-route
Running a session #
carnet-de-route # start the bridge session
carnet-de-route --db /path/to.gpkg # use a non-default GeoPackage
On first run:
- The CLI prints the bridge URL (defaults to
http://127.0.0.1:43117) and a path to the userscript at/userscript.user.js. Install or update it in Tampermonkey. - Open https://explore.garmin.com/Map in your regular Garmin-authenticated browser. The userscript pairs with the bridge and shows a confirmation code.
- Back in the terminal, approve the pairing prompt. The pairing is persisted in
approved-bridges.json. - Trigger actions from the Tampermonkey menu on the Explore page:
fetch,push,push-plan,status.fetchpulls waypoints and collections through the userscript and reconciles them into the GeoPackage.push-planprints what a push would do without writing to Garmin.pushbuilds the plan, asks for confirmation in the CLI, then applies changes via the userscript.
The Library collection is treated as a system all-waypoints collection locally and is not editable. Deleted local waypoints are moved into a local-only Trashcan collection and kept there after Garmin deletion until an explicit purge path is added. Push never enables MapShare publishing for new waypoints.
Other CLI commands #
carnet-de-route add-waypoint --name "Camp" --lat 43.1 --lon 11.2 --elevation 850 --icon 151
carnet-de-route status # counts, dirty rows, conflicts
carnet-de-route inspect-db # validate GeoPackage metadata and app tables
carnet-de-route style --reset # reset the managed QGIS style row
carnet-de-route style --refresh-icons # refetch the Garmin icon sprite and rebuild QML
All commands accept --db PATH. On macOS, defaults live under ~/Library/Application Support/carnet-de-route/ (browser profile, GeoPackage, approved bridges).
The GeoPackage ships a default QGIS style for the waypoints layer; see docs/qgis.md for behavior and how style --reset works.
Development #
go test ./...
go vet ./...
Integration tests require an authenticated browser profile and are opt-in:
GARMIN_EXPLORE_INTEGRATION=1 go test ./internal/explore -run Integration
Further reading #
- docs/ARCHITECTURE.md — how the bridge, store, and Garmin client are wired together.
- docs/api-specs.md — observed Garmin Explore endpoints and field semantics.
- docs/icons-spec.md — Garmin waypoint icon catalog.
- docs/qgis.md — managed QGIS style behavior for the GeoPackage.
License #
carnet-de-route is licensed under the GNU General Public License v3.0 or
later (GPL-3.0-or-later). See LICENSE for the full text.
Licensing is declared via the REUSE specification
in REUSE.toml, so new files inherit the project license without per-file
SPDX headers.
Garmin, Garmin Explore, and inReach are trademarks of Garmin Ltd. This
project is not affiliated with or endorsed by Garmin. Icon identifiers and
endpoint shapes are documented for interoperability only. The Garmin icon
sprite fetched at runtime by style --refresh-icons remains Garmin's
copyright; the resulting GeoPackage should not be redistributed.
- Go 94%
- JavaScript 3%
- QML 3%