# Privacy and data handling Better Peakbagger has: - no Better Peakbagger account; - no analytics, telemetry, or advertising; and - no developer-operated data server. The extension uses data only for the features described here. It does not sell data or use or transfer it for unrelated purposes or credit decisions. Data leaves the browser only when a feature requires it: - **Peakbagger** receives summit lookups and user-approved GPS Preview data. - **Open-Meteo** receives summit coordinates, elevation when available, and an ascent-day window or sixteen past days plus up to sixteen forecast days automatically when an enabled weather card approaches the viewport. - **USDA NRCS** receives public station IDs and relative date ranges when an enabled nearby-snow card approaches the viewport. Station matching is local; no summit coordinates or GPX are sent to NRCS. - **NOAA NOHRSC** receives viewed-area tile bounds for an enabled Snow depth overlay, plus credential-free reads of its public analysis time and legend. An explicit map right-click also sends that point when Snow depth is visible. - **USGS** receives viewed-area tile bounds when slope or public-land overlays are enabled, without GPX, account credentials or referrers. An explicit map right-click sends the selected point for applicable visible slope/land readings. - **3D map providers** receive tile requests for the viewed area only after the user enables 3D. - **Microsoft Planetary Computer** receives viewed-area bounds, a capture search date range, and satellite tile requests when Sentinel-2 is selected in 2D or 3D. - **GitHub** receives only the data types the user explicitly or automatically backs up or opts to synchronize to their selected repository. - **ImgBB** receives a flattened image only when the user uploads it. Copy image and Export image in Photo Topos send nothing to a network service. - **AllTrails, CalTopo, Gaia GPS, and onX Backcountry** receive the saved Peakbagger GPX for preview or parsing only when the user clicks the matching **Send** button. Final Upload, Import, and Save actions remain manual. - **Media hosts** receive ordinary browser requests when remote report media is displayed. - **Custom overlay providers** receive direct metadata, tile or GeoJSON requests only after the user enables a source or explicitly checks its metadata. Tile coordinates reveal the viewed area. Requests omit cookies and referrers and use ordinary browser CORS for public sources. Private request parameters use BPB’s constrained background relay after optional provider access and bounded map approval. Public URL keys remain visible to the page; private values do not. The Sun and Moon calculator is not a data-transfer feature. Its coordinate, date, time, map bearing, and astronomical results remain in the Peakbagger tab. ## Browser permissions | Permission | Purpose and limits | | --- | --- | | `storage` | Stores preferences, credentials, caches, drafts, and other extension data as detailed below. | | `activeTab` | Temporarily accesses only the Garmin Connect or Strava activity tab where the user clicks the toolbar button. This toolbar path has no persistent provider website access; the separate Garmin API connection is optional. | | `scripting` | Injects packaged adapters into the clicked provider tab to verify ownership and request its same-origin GPX export, into a Peakbagger tab for login and summit requests, and into Gaia, onX, AllTrails, or CalTopo after the matching **Send** click. Optional Instagram access additionally registers the confined display helper described below. It never downloads or executes remote code. | | `tabGroups` | Groups newly opened ascent drafts under **Peak Drafts** without inspecting or reorganizing unrelated groups. | | `alarms` | Removes expired session records every five minutes and schedules automatic backups and the 30-second trailing / 15-minute periodic ignored-list sync checks when enabled. | | Peakbagger host access | Supports GPX analysis, offline Sun and Moon planning, filters, theme, login and summit checks, draft filling, and climber-list management on Peakbagger. | | Optional GitHub host access | Access to `github.com` and `api.github.com` is requested only when the user connects GitHub. It supports device-flow sign-in and the one repository the user grants. | | Optional ImgBB host access | Access to `api.imgbb.com` is requested only from the photo editor when the user uploads or from Settings when the user saves an API key. It does not inspect unrelated browsing. | | Optional custom-map provider access | `https://*/*` is declared optional to support user-selected providers. BPB requests only configured HTTPS hostnames when saving/checking a private source or approving its map access. It does not automatically gain access to all sites. The worker uses saved endpoints only and does not inject scripts or inspect provider tabs. | | Optional Instagram host access | Requested only by **Match BPB theme** in Settings → Capture & reports → Trip report viewing. The browser grants `www.instagram.com`; BPB registers packaged code only for captioned post/Reel embeds, and activates it only inside BPB's own authenticated wrapper. It styles player chrome; it does not extract captions, media URLs, cookies or browsing history. Ordinary post loading does not require this permission. | | Optional Gaia GPS host access | Access to `www.gaiagps.com` is requested only when the user clicks **Send to Gaia**. It lets the extension open Gaia's map and supply the saved GPX to Gaia's visible import preview; the extension does not click Gaia's **Save** control. | | Optional onX host access | Access to `backcountry.onxmaps.com` is requested only when the user clicks **Send to onX**. It lets the extension open onX Backcountry's import page and supply the saved GPX to its visible preview; the extension does not click onX's **Import** control and has no access to `identity.onxmaps.com`. | | Optional CalTopo host access | Access to `caltopo.com` is requested only when the user clicks **Send to CalTopo**. File selection sends the saved GPX to CalTopo for parsing and object review; the extension does not confirm **Import** or **Save**. | | Optional AllTrails host access | Access to `www.alltrails.com` is requested only when the user clicks **Send to AllTrails**. It lets the extension open the custom route builder and supply the saved GPX to its visible upload preview; the extension does not click AllTrails' **Upload** control. | Firefox's `locationInfo` declaration is a data-handling disclosure, not permission to read device location. It covers: - activity coordinates sent to Peakbagger for summit lookup and GPS Preview; - summit coordinates sent to Open-Meteo for historical weather and forecasts when an enabled weather card approaches the viewport; - nearby public SNOTEL station IDs sent to USDA NRCS when an enabled snow card approaches the viewport, with summit proximity computed locally; - viewed-area tile coordinates sent to Mapterhorn, Maptoolkit, or a selected compatible map provider when 3D is used; - clicked-area tile coordinates sent to Mapterhorn after an explicit map right-click for the approximate elevation readout, plus that selected point sent to applicable visible snow/slope/land providers for their readings; - a Peakbagger-stored GPS track written to the user's GitHub repository when the user backs up an ascent; and - a Peakbagger-stored GPS track sent to Gaia, onX, AllTrails, or CalTopo when the user clicks that destination's **Send** button. ### Where browser data is stored | Storage | Contents | Retention and sync | | --- | --- | --- | | `storage.sync` | Theme, units, chart, route/map appearance, weather models/metric/card placement, capture, editor, beta-filter, favorite-source and photo-tool appearance preferences | May sync through the browser account; included in settings files and optional GitHub settings backup. No coordinates, weather results or annotation contents. | | `storage.local` | Device settings (map dimensions, terrain cache budget and GitHub transfer consent), DEM cache index, custom favorites, ignored climbers, Buddy cache/intents, GitHub token/repository, ImgBB API key, report drafts and backup/sync state | Device-local; never browser-synced. | | `storage.sync` map overlay preferences | Raster opacity percentages and selected public-land type IDs | Included in settings sync, exports and backups. Enabled layers remain in page memory. | | `storage.local.bpbCustomMapOverlaysV1` and `bpbCustomMapOverlayPreferencesV1` | User-entered overlay definitions, public URLs/keys, attribution, appearance, saved order and opacity | Included in manual settings files and opted-in GitHub settings backups; excluded from browser sync. Manage in Settings → Map layers. Custom enablement, parsed geometry, tile bytes and probe locations are not persisted by the extension. | | `storage.local` public snow catalog | Public SNOTEL station metadata only, with a fetch timestamp | Refreshed after seven days when next used; expired metadata can remain until replaced or extension data is cleared. No peak/location query or observations; excluded from settings exports, sync and backups. | | `storage.session` | Capture-job metadata, generation-scoped reduced GPX payloads, prepared drafts, temporary Peakbagger helper leases, validated rate-limit cooldown, save-time backup snapshots, ascent-deletion intents/tombstones, pending GitHub device authorization, and bounded Full Screen overlay handoffs | Map handoffs expire after 30 seconds and are removed on consumption. Capture, draft, snapshot, and deletion records expire after 30 minutes. Helper leases expire; cooldown is removed at its validated retry time. Authorization is removed when it completes, fails, or expires. | | `storage.session` (onX) | At most 64 saved-ascent source/tab/document identities, attempt cutoffs and delivery outcomes; no GPX or credentials | Automatic authority lasts at most ten seconds after permission approval. Metadata is replaced as capacity is reached or removed when the browser session ends; missing metadata never authorizes a resend. | | CacheStorage | Bounded DEM response cache | Browser-managed and subject to eviction. | | IndexedDB | Photo catalog, projects, original and thumbnail image blobs, upload journal, ImgBB delete URLs, and deletion tombstones | Device-local; never browser-synced. | | IndexedDB `bpb-private-map-sources-v1` | Private map definitions/query parameters, shared request counters and 429 cooldowns | Extension-origin, device-local; never in content-script-accessible storage, sync or GitHub backups. Manual settings files include private definitions and query parameters in plain text, but never counters, cooldowns or approvals. Successfully deleting a layer deletes its private definition; budget records remain to prevent resetting quotas by deletion. Uninstalling clears the store. | | Peakbagger `localStorage` | Page-specific filter state and the early theme mirror | Remains with the Peakbagger site data. | ## Garmin API activity inbox Connecting Garmin requests optional access only to `https://personal.connectapi.garmin.com/*`. Your personal API key stays in extension-origin IndexedDB on this device. It is excluded from browser sync, automatic backups, diagnostics and URLs. A manual settings export includes it only when **Include saved credentials** is checked; that file is not encrypted. Access tokens stay in worker memory and are never exported. The popup and toolbar icon can show how many activities are waiting for peak checks. That number is computed on this device and is never sent anywhere. Only the **Activity count on toolbar icon** choice travels with your portable settings. The General **Automatically detect Garmin activities** switch defaults on. Turning it off hides the activity inbox and stops imports and queued peak checks, preserving the key, drafts and import history. Settings keeps the Garmin connection visible so you can **Disconnect** even while imports are off. Disconnect removes the saved key and stops imports, keeping local drafts and history. It also attempts to remove optional Garmin host access. Deleting local Garmin data is a separate confirmed action. Turning imports on does not grant Garmin access or create a connection. Connecting or importing a validated Garmin key enables drafts on this device, including for previously connected keys. The first peak check records your verified Peakbagger account before downloading or processing routes; later checks must use the same account. Checks run while the browser is running, every four hours by default; frequency, recent lookback (30 days by default) and full history dates are configurable. Manual only disables automatic scans. Full history checks look for older uploads; discovery uses activity dates and IDs, not an upload-time watermark. If Peakbagger is unavailable or requires verification, activities remain queued locally. Returning to a loaded, active Peakbagger tab resumes queued peak checks using that tab's session, including in Manual only mode, subject to rate limits. The extension does not open a tab or solve an interactive challenge automatically. Garmin sends complete activity summaries and recordings, which can contain health and device data. The extension immediately projects summaries to ID, owner, activity type and dates, and decodes only route fields from FIT. Raw recordings and unwanted fields remain transient in extension memory. Route processing waits for a suitable existing Peakbagger session. Summit lookup sends small route-corridor boxes to Peakbagger; every lookup must succeed before matches appear. Automatic checks do not open or focus provider or Peakbagger tabs. Pending drafts retain derived ascent values and a privacy-reduced route (up to 3,000 points) in extension-origin IndexedDB until completed or explicitly removed. They have no automatic expiry. No raw FIT/ZIP, arbitrary source XML or fitness measurements are persisted. Preparation is limited to 200 activities and 20 MiB; capacity errors preserve existing items. Minimal source-ID, dismissal and verified-save receipts remain locally to prevent duplicate proposals. They are excluded from settings files and sync. Clearing extension data removes the inbox. **Open selected drafts** creates a fresh 30-minute session handoff. Current privacy settings are applied again, and Peakbagger receives newly serialized Preview GPX. Save remains manual. An unverified previous handoff blocks automatic replacement forms. **Disconnect** deletes the key and requests removal of optional permission while keeping drafts and history. **Delete local Garmin data** also removes those local records; neither action deletes Garmin activities or Peakbagger ascents. ## Activity capture Activity capture is a short-lived, user-started transaction: 1. **Supported tab and settings:** an unsupported page is rejected without reading capture settings. On a recognized activity, capture stops before provider injection if the authoritative settings read fails. UI defaults never authorize capture or become an exported or remote settings backup. 2. **Ownership check:** capture stops before reading coordinates unless the activity page unambiguously proves that the signed-in Garmin or Strava user owns the activity. Profile and author identifiers are compared on the page; only the verdict, provider, and activity id reach the extension. 3. **Peakbagger session check:** a Peakbagger tab verifies the signed-in account before the provider page is asked for coordinates. The extension does not request cookie-reading permission or copy cookie values; the site handles its own signed-in session. A page freshly opened or loaded for capture may satisfy the check from a small allowlist of Peakbagger's global account-navigation links and their consistent climber ID; ambiguous evidence and already-loaded tabs use the live account-page check. No arbitrary page text or form data is copied. 4. **Provider export and local analysis:** the response is classified before parsing so sign-out, challenge, rate limit, changed response, invalid GPX, and no recorded route remain distinct. Raw provider GPX is parsed on the activity page. It is never persisted, sent to the developer, or forwarded as source XML. 5. **Summit lookup:** the Peakbagger tab makes small bounding-box requests derived from the track corridor. At most four Peakbagger requests are active across captures. A challenge or rate limit stops sibling traffic; a valid retry time may remain in session storage. Every required lookup must succeed before results appear. 6. **Prepared drafts:** derived ascent fields and a generation-scoped reduced track stay separately in `storage.session`, are bound to the expected tabs, and expire after 30 minutes. 7. **GPS Preview:** after the user selects **Open drafts**, Peakbagger receives a newly serialized GPX. Trackpoints and waypoints share a 3,000-point limit. 8. **Review and Save:** the extension may prepare GPS Preview, but it never clicks a Peakbagger Save control. Publication remains with the user. The reduced GPX can contain: - trackpoint latitude, longitude, optional elevation and timestamp, and segment boundaries; - waypoint latitude, longitude, and name, when enabled; and - an activity or track name only when enabled for multi-peak Trip Info. It excludes heart rate, cadence, power, temperature, device fields, descriptions, routes, waypoint elevation/time/symbols, and extension elements. The Options-only **Remove GPX timestamps** preference removes recorded times from GPX sent to Peakbagger. Capture results offer **Include timestamps for this capture** before opening drafts; the choice applies to all selected summits and locks when opening starts. The next capture uses the default again. Allowlisted timed and timeless reduced tracks remain in private session storage under the same 30-minute expiry so this exception needs no provider re-export. The preference syncs and transfers with settings; exceptions and GPX do not. Derived form values such as date, ascent times, distance, gain, per-day statistics, and nights out remain only in the prepared draft until it expires or is discarded. There is no capture telemetry. A disabled-by-default developer/test diagnostic switch can print one local console record containing only allowlisted durations and aggregate counts. It accepts and persists no provider identity, URL, coordinates, GPX, page text, response body, cookies, or headers. ## Processing a GPX file you upload **Attach GPX** uses Peakbagger's native Preview on the current ascent. It sends the chosen file to Peakbagger without summit processing or the extension's full capture privacy reduction. When **Remove GPX timestamps** is enabled, metadata, waypoint, route, and track `