NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Drop-in diagnostic overlay widget for Tracelet. Visualizes permissions, battery health, OEM compatibility, sensor availability, and tracking state with actionable fix suggestions.
Last release 20 days ago
18 Sep 2026
Release timing varies
gaps range from 8 days to 5 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
2 versions withdrawn
withdrawn after publishing
4 months old
92 releases · first in 2026
One column per month.
Release tracelet_doctor v3.8.8
Release tracelet_doctor v3.8.8
FIX: the health-check verdict accounts for the conditions that stop background tracking outright, so a report can no longer open with "all systems healthy" while the section below it says the OS has switched tracking off. HealthCheck.warnings is computed from the health map alone and the background restrictions live in the foreground-service snapshot — a different platform call — so the two sections could contradict each other in the same report, and the summary is what gets read first. The Restricted battery state, the RESTRICTED standby bucket, a location-blind promotion and a promotion the OS refused now appear as 🔴 blockers ahead of the ordinary warnings, and they survive a failed health call rather than disappearing with it. Both sections now share one snapshot instead of making the same platform call twice (#406, #405).
FIX: the four log-derived sections share one read instead of fetching the same rows over the platform channel four times, and the lifecycle and geofence scans default to 5000 entries rather than 2000. 2000 was also the SDK's row cap at logLevel: verbose, so the scan could see the whole table and no more; now that the cap is applied per channel, the always-on LIFECYCLE rows are kept behind up to a full cap of level-based chatter and a 2000-row scan would stop short of exactly the entries these sections exist to surface (#318).
FIX: the report states a verdict on the foreground service instead of leaving it to be inferred from six rows that all say true. A service that is running, promoted, carrying FOREGROUND_SERVICE_TYPE_LOCATION and denied location by the OS rendered as an entirely green table, which is how a report covering 52 seconds of recording nothing read as healthy. The foreground-service section gains Started in foreground, Background restricted and Standby bucket, and the in-app card no longer shows "Healthy" for either state (#405, #406). The Location stream health section picks up the new silence and resume entries, and its empty case no longer claims "the stream has been accepting fixes" — it had asserted exactly that over a window in which it accepted none. An absence of markers is now reported as an absence of markers (#407).
Tracelet Sync iOS SDK v3.8.7
Tracelet Sync iOS SDK v3.8.7
FIX: the bug report names the Tracelet version that produced it, and gained a Location stream health section — stalls, recoveries and battery-budget throttle movements lifted out of the general log, each stall line carrying the rejection histogram, the gate the last fix was measured against, the configured gate beside it and the thresholds in force. These are written on the always-on lifecycle channel, so the section is populated even for an app running at the default logLevel (#397, #398).
Tracelet Sync iOS SDK v3.8.6
Tracelet Sync iOS SDK v3.8.6
Version alignment with tracelet 3.8.5.
Version alignment with tracelet 3.8.5.
FEAT: the foreground-service card renders suppressed as a state of its own. A notification hidden on purpose by showNotificationOnPauseOnly used to re
FEAT: the foreground-service card renders suppressed as a state of its own. A notification hidden on purpose by showNotificationOnPauseOnly used to read as "not confirmed yet", indistinguishable from the OS refusing a promotion; it is now labelled and explained as the configured behaviour it is — tracking continues, the service is promoted again when the app backgrounds, and the setting is ignored entirely under stopOnTerminate: false (#378).
Version alignment with tracelet 3.8.3.
Version alignment with tracelet 3.8.3.
Version alignment with tracelet 3.8.2.
Version alignment with tracelet 3.8.2.
Version alignment with tracelet 3.8.1.
Version alignment with tracelet 3.8.1.
FEAT: TraceletBugReport gains a ## Session lifecycle (background & killed-state trace) section carrying what the background pipelines actually did — s
FEAT: TraceletBugReport gains a ## Session lifecycle (background & killed-state trace) section carrying what the background pipelines actually did — service start/stop, sticky restarts and boot bootstrap outcomes on Android, relaunch and termination boundaries on iOS, and motion-state transitions on both. These are recorded regardless of logLevel, so a pasted report carries them even when the developer never enabled logging. Given its own section for the same reason as the geofence trace: lifecycle events are rare while routine chatter is not, so at debug/verbose the entry from the overnight run that actually failed is exactly the one pushed out of the ## Logs window. An absent entry is diagnostic too — motion (foreground) with no killed-state counterpart means the background detector never ran, and an iOS termination: with no following relaunch: means the app was never woken (#318).
FEAT: a Location Filter section reports the thresholds Tracelet.getCurrentLocationTuning() says are actually in force, beside the ones you configured. Every other card reads Tracelet.activeConfig — a Dart-side mirror of the last Config passed in — so until now the Doctor could only show what was asked for, never what the native filter was using. The verdict chip separates the two ways those can disagree: with autoTuneFromTransportMode on, a committed transport mode owns the thresholds and the difference is expected (Auto-tuned); with it off, nothing should be moving them and the configured value did not reach the processor (Mismatch, the #303 failure class). Reads N/A before a tracking session has built a processor, and always on Web (#303).
FEAT: TraceletBugReport gains a ## Location filter (in force vs. configured) section carrying the same two columns and the same auto-tune verdict, so a pasted issue distinguishes an auto-tune from configuration that never landed without a maintainer having to ask (#303).
Version alignment with tracelet 3.8.0-beta.2.
Version alignment with tracelet 3.8.0-beta.2.
Version alignment with tracelet 3.8.0-beta.
Version alignment with tracelet 3.8.0-beta.
Version alignment with tracelet 3.8.0-alpha.
Version alignment with tracelet 3.8.0-alpha.
Version alignment with tracelet 3.7.6.
Version alignment with tracelet 3.7.6.
Version alignment with tracelet 3.7.5.
Version alignment with tracelet 3.7.5.
Version alignment with tracelet 3.7.4.
Version alignment with tracelet 3.7.4.
FIX: the Permissions card no longer reports a granted motion/activity permission as a red "Restricted". HealthCheck.motionPermission carries a MotionA
FIX: the Permissions card no longer reports a granted motion/activity permission as a red "Restricted". HealthCheck.motionPermission carries a MotionAuthorizationStatus index (notDetermined, granted, deniedForever → 0, 1, 2), but the card decoded it against CoreMotion's CMAuthorizationStatus scale, where index 1 is restricted — so a healthy device showed a red "Restricted" beside an "All Clear" warning list, the warning path checking == 2 and being unaffected. The card now switches over the enum via the new HealthCheck.motionAuthorization getter, which makes the mapping exhaustive at compile time, and the dead 3 => 'Granted' branch (unreachable — the enum has no index 3) is gone.
FIX: the bug report prints the motion permission by name rather than as a bare index, so Motion permission | 0 no longer reads as a boolean or a count.
FEAT: the bug report gained a Geofence transitions (decision trace) section, filtering [geofence] log lines and scanning 2000 entries rather than the 500-entry general log window, so rare ENTER/EXIT crossings are not buried by lifecycle chatter. Both the copy and share actions include it.
Version alignment with tracelet 3.7.2.
Version alignment with tracelet 3.7.2.
Version alignment with tracelet 3.7.1.
Version alignment with tracelet 3.7.1.
Version alignment with tracelet 3.7.0.
Version alignment with tracelet 3.7.0.
Version alignment with tracelet 3.6.15.
Version alignment with tracelet 3.6.15.
Version alignment with tracelet 3.6.14.
Version alignment with tracelet 3.6.14.
Version alignment with tracelet 3.6.13.
Version alignment with tracelet 3.6.13.
Version alignment with tracelet 3.6.12.
Version alignment with tracelet 3.6.12.
Version alignment with tracelet 3.6.11.
Version alignment with tracelet 3.6.11.
Version alignment with tracelet 3.6.10.
Version alignment with tracelet 3.6.10.
Version alignment with tracelet 3.6.9.
Version alignment with tracelet 3.6.9.
Version alignment with tracelet 3.6.8.
Version alignment with tracelet 3.6.8.
Version alignment with tracelet 3.6.7.
Version alignment with tracelet 3.6.7.
FEAT: Added a Foreground Service card to the Doctor overlay and a matching section to the generated bug report, powered by Tracelet.getForegroundServi
FEAT: Added a Foreground Service card to the Doctor overlay and a matching section to the generated bug report, powered by Tracelet.getForegroundServiceHealth(). It surfaces the authoritative native foreground-service state — whether the service is running and promoted to the foreground, and the last promotion result (success/deferred/failed) with its failure class and message — so "tracking stops in the background" reports show whether the foreground service was actually running. iOS/web (which have no foreground service) are reflected accordingly (#255).
Version alignment with tracelet 3.6.5.
Version alignment with tracelet 3.6.5.
Version alignment with tracelet 3.6.4.
Version alignment with tracelet 3.6.4.
Version alignment with tracelet 3.6.3.
Version alignment with tracelet 3.6.3.
Version alignment with tracelet 3.6.2.
Version alignment with tracelet 3.6.2.
Version alignment with tracelet 3.6.1.
Version alignment with tracelet 3.6.1.
FEAT: Tracelet.updateLocationProviderOptions() — live provider-options override without a pipeline restart, on iOS and Android (#241).
FEAT: Tracelet.updateLocationProviderOptions() — live provider-options override without a pipeline restart, on iOS and Android (#241).
Version alignment with tracelet 3.6.0.
FIX: Build fails without AGP built-in Kotlin (AGP <9 / builtInKotlin=false) (#239).
FIX: Build fails without AGP built-in Kotlin (AGP <9 / builtInKotlin=false) (#239).
FIX: Custom sync body 400 Bad Request HTTP errors now gracefully return fallback results instead of propagating fatal exceptions in native Sync engine
FIX: Custom sync body 400 Bad Request HTTP errors now gracefully return fallback results instead of propagating fatal exceptions in native Sync engines (#238).
FIX: Ensure foreground service is properly started in periodic mode when configured (#237).
FIX: Ensure foreground service is properly started in periodic mode when configured (#237).
FIX: Enrich geofence transition events with real coordinate metrics and battery (#231). FIX: Propagate runtime setConfig changes to active native trac
FIX: Enrich geofence transition events with real coordinate metrics and battery (#231).
FIX: Propagate runtime setConfig changes to active native tracking/sensor loops (#230).
FIX: Null-guard subsystems during teardown so Activity destruction never throws (#227).
FIX: Android: standard geofence mode no longer runs a foreground service, complying with Google Play's 2026-10-28 foreground-service-for-geofencing policy.
FIX: Added explicit ProGuard keep rules for TraceletStartupProvider in the tracelet_android package to prevent ClassNotFoundException on process start
FIX: Added explicit ProGuard keep rules for TraceletStartupProvider in the tracelet_android package to prevent ClassNotFoundException on process start when aggressive shrinking (like R8 full mode) is used (#228).
FIX: Android continuous tracking no longer silently stops after a while on aggressive OEMs (Samsung One UI, etc.). The foreground-service wakelock use
FIX: Android continuous tracking no longer silently stops after a while on aggressive OEMs (Samsung One UI, etc.). The foreground-service wakelock used a fixed 10-minute auto-expiry and was never renewed, so once it lapsed the CPU could deep-sleep and FusedLocationProvider stopped delivering updates with no error or callback. The wakelock is now renewed for the lifetime of tracking (#222).
FEAT: Crash detection now uses the device barometer as an extra confirmation clue — a serious crash or airbag deployment causes a quick cabin air-pres
FEAT: Crash detection now uses the device barometer as an extra confirmation clue — a serious crash or airbag deployment causes a quick cabin air-pressure change that raises crash confidence on phones with a pressure sensor; phones without one skip it with no downside (#173). FEAT: Stronger crash/fall corroboration — a sudden post-impact speed collapse (#181) and the free-fall → impact → stillness signature (#180) now raise confidence, and confirmation is process-death-safe so a confirmed event survives the app being killed (#182).
FEAT: Crash-detection ML model promoted from beta to stable (trained on a CC0 / public-domain dataset, cleared for commercial use) and the on-device m
FEAT: Crash-detection ML model promoted from beta to stable (trained on a CC0 / public-domain dataset, cleared for commercial use) and the on-device model cache now auto-re-downloads on a new published version (#183).
REFACTOR: reformat test files and sync body context for consistent code style.
FEAT(geofence): cross-platform geofenceModeHighAccuracy via GeofenceConfig.
REFACTOR: extract issues 185 and 198, fix iOS config mapping.
CHORE: bump version.
CHORE: bump version.
FIX(android): deliver headless geofence events after reboot in high-accuracy mode (#185).
FIX(plugin): correct native-map -> Pigeon field mapping (#175).
FIX(crash): harden crash/fall detection (confirmation survival, threshold, debounce, sample rate).
FEAT (Doctor): One-tap bug report — the *Copy* button now bundles health + active configuration (secrets redacted) + recent logs + telematics into a s
.md file. Available programmatically via TraceletBugReport.build() and TraceletBugReport.redactConfig().harsh_braking / harsh_acceleration / harsh_cornering / speeding via TelematicsConfig + Tracelet.onDrivingEvent (opt-in, default off) (#163).ClassifierConfig + Tracelet.onModeChange (#164).ImpactConfig + Tracelet.onImpact and Tracelet.confirmImpact / Tracelet.cancelImpact (opt-in, default off) (#165).CHORE: version bump for patch release
CHORE: version bump for patch release
FIX (Native): ready() / getState() now populate State.config with the active configuration instead of leaving it permanently null (#147).
ready() / getState() now populate State.config with the active configuration instead of leaving it permanently null (#147).HttpConfig.syncInterval for interval-based sync — the documented repeating-timer cadence was missing from the Dart config and the Pigeon layer; the native interval timer now flushes the offline queue on this cadence (#149).destroySyncedLocations() returns the real number of synced-and-pruned locations instead of a hardcoded 0 stub (#154).getPendingLocations() and getPendingLocationCount() (#159).useKalmanFilter config key so the Extended Kalman Filter is no longer silently disabled by a key mismatch (#148)."activity": "unknown" (#155).ready() applies a new config, so settings such as distanceFilter take effect immediately instead of using stale defaults (#157).getCount() honors time-bound queries instead of always returning the whole-database total (#152).AuditConfig hash-algorithm mapping so configuring sha384 / sha512 no longer crashes with a fatal RangeError during ready() — unsupported variants fall back to sha256 (#150).is_moving (#151) and its trigger event (location / motionchange / heartbeat / geofence) (#156) — both were previously omitted by the native sync record.FIX (Native): Resolve iOS auto-sync thread starvation by offloading synchronous HTTP requests to a background DispatchQueue to prevent blocking Swift
FIX (Native): Resolve Android/iOS getting stuck in the moving state and never transitioning back to stationary, which kept continuous GPS active and d
ready(), so an internal readiness guard silently dropped every captured location before it reached the database, leaving auto-sync with nothing to upload.showNotificationOnPauseOnly enabled. The app's own foreground service skewed foreground/background detection (and OS process-importance updates lag), so the pause-only notification was suppressed even though tracking and syncing continued.FIX (Native): Allow getState() and stop() to be called before ready() is invoked, correctly reporting persistent state and shutting down background se
getState() and stop() to be called before ready() is invoked, correctly reporting persistent state and shutting down background services if the app was restarted from a killed state.MissingPluginException and test timing issues with setHasCustomSyncBodyBuilder.FIX(sync): keep method channel alive to avoid iOS timeout bugs when no builder is registered.
CHORE: Version bump to 3.2.13 to stay in lockstep with the federated set (Android startOnBoot reboot-tracking fix — see tracelet_android). No changes
startOnBoot reboot-tracking fix — see tracelet_android). No changes to this package.CHORE: Re-release to align the full federated package set and native SDKs to a single consistent version. The 3.2.11 release published with mismatched
CHORE: Version bump to align with 3.2.11 platform release.
Your coding agent can read these notes before it upgrades. Set up the MCP server →