NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #4440 most downloaded on pub.dev
Web implementation of the Tracelet background geolocation plugin.
Last release 19 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
Nothing withdrawn
no release was ever pulled
7 months old
160 releases · first in 2026
One column per month.
Tracelet iOS SDK v3.8.8
Tracelet iOS SDK v3.8.8
Release tracelet_web v3.8.7
Release tracelet_web v3.8.7
Release tracelet_web v3.8.6
Release tracelet_web v3.8.6
Nothing published for this version
FIX: setOdometer() drops the reference the odometer measures from. Accumulation runs off _lastLocation, which the setter left in place, so the next br
FIX: setOdometer() drops the reference the odometer measures from. Accumulation runs off _lastLocation, which the setter left in place, so the next browser fix added the whole span since the previous one and a reset survived exactly one fix — the same defect the native engines had, reached independently (#387).
Version alignment with tracelet 3.8.5.
Version alignment with tracelet 3.8.4.
Version alignment with tracelet 3.8.4.
FIX: maxRecordsToPersist: -1 no longer throws RangeError on every insert. -1 is the documented "unlimited" sentinel, and because ready() resolves ever
FIX: maxRecordsToPersist: -1 no longer throws RangeError on every insert. -1 is the documented "unlimited" sentinel, and because ready() resolves every field before it crosses the channel it is what the default configuration sends — so the unguarded while (_locations.length > _maxRecords) removeAt(0) emptied the store and then ran off the end of it on the first insert of every web session. A non-positive cap now means unlimited, as it already did on the native platforms (#362).
FIX: maxDaysToPersist is now enforced on web. applyConfig never read the key, so the web store had no age-based retention at all. A record whose timestamp is absent or unparseable is kept rather than treated as ancient; the record cap bounds those (#361).
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.
Version alignment with tracelet 3.8.0.
Version alignment with tracelet 3.8.0.
FIX: (Web) GeofenceConfig.geofenceModeHighAccuracy is now honored. The web plugin read only the deprecated AndroidConfig.geofenceModeHighAccuracy, so…
FEAT: Tracelet.getCurrentLocationTuning() reports the location-filter thresholds actually in force, read back from the native processor rather than from the config you set. activeConfig is a Dart-side mirror of the last Config passed in, so it cannot tell you whether a value reached the filter that uses it — and it cannot show a transport-mode auto-tune, which changes these thresholds with no config call at all. Returns null before a tracking session has built a processor, and always null on Web (#303).
FIX: the method-channel android config block now carries the same geofenceModeHighAccuracy value as the geofence block. Native reads the key from both, so emitting the raw Android-only flag in one and the OR'd value in the other made behavior depend on which block the platform happened to consult (#305).
FIX: (Android + iOS) the location-filter configuration now reaches the Rust processor at runtime. setConfig() rebuilt the processor only for a short list of location keys, so trackingAccuracyThreshold, odometerAccuracyThreshold, maxImpliedSpeed, filterPolicy, enableAdaptiveMode, rejectMockLocations, mockDetectionLevel, the sparse-update trio and useKalmanFilter were accepted, cached, and then ignored until the next cold start. Because LocationProcessor captured its base thresholds at construction, this also broke the #301 guarantee that disabling autoTuneFromTransportMode restores "the values you configured" — it restored the values captured when the processor was built. A new set_base_tuning carries thresholds in without dropping the positional anchor a rebuild would cost (the reason retune exists, #299); the remaining constructor-only parameters trigger a targeted rebuild, and the Kalman filter is toggled independently of the processor (#303).
FIX: (iOS) the whole LocationFilter block now reaches the config cache. Every transport serializes it as a filter sub-map nested inside geo, but the iOS ConfigManager flattened only one level and then stored that block as a single opaque value no getter ever read — so trackingAccuracyThreshold, odometerAccuracyThreshold, maxImpliedSpeed, rejectMockLocations, mockDetectionLevel and useKalmanFilter were pinned to their defaults (100 m / 0 m / 80 m/s / off) no matter what was configured, at ready() as well as at runtime. The change detection added above compared key names absent from both config snapshots, so a filter change triggered neither the targeted rebuild nor setBaseTuning — the fix landed on a bridge that was never connected. Caches persisted in the nested shape are lifted on load, because autoResumeTracking() starts the pipeline off the persisted cache with no ready() in between (#303).
FIX: (Android + iOS) LocationFilter.policy is now applied. It is serialized under policy by every transport, while getFilterPolicy() — and the processor-rebuild key list — read filterPolicy, so the value was cached under a name nothing asked for and the policy stayed at adjust however it was configured. It is renamed during flattening, so both readers see it (#303).
FIX: (Android + iOS) logMaxDays is now applied. Both platforms pruned logs only by a row count derived from logLevel, so the configured retention window was accepted and discarded — logMaxDays: 3 and logMaxDays: 90 behaved identically. Log pruning now enforces both caps (#304).
FIX: (iOS) disableLocationAuthorizationAlert is now honored. The permission manager requested authorization unconditionally, so apps that wanted to own their pre-permission UX could not suppress the system prompt. It now reports the current status instead of prompting (#304).
FIX: (Web) GeofenceConfig.geofenceModeHighAccuracy is now honored. The web plugin read only the deprecated AndroidConfig.geofenceModeHighAccuracy, so setting the documented cross-platform flag had no effect on web. It is now OR'd with the deprecated flag, matching both Pigeon hosts, and geofenceExitAccuracyMax is carried too (#305).
FIX: the method-channel transport no longer drops geofence configuration. _geofenceToMap emitted two of the five geofence keys, silently discarding geofenceModeHighAccuracy (so no OR was performed on that path), geofenceInitialTrigger, and geofenceExitAccuracyMax — the #276 tunable (#305).
FIX: the four built-in TraceletProfile presets now set high-accuracy geofencing through the cross-platform geofence block instead of the deprecated android one. TraceletProfile.highAccuracy therefore enables it on iOS as well, and the deprecated field has no remaining internal dependants (#305).
FIX: the pure-Dart GeofenceEvaluator now applies the geofenceExitAccuracyMax policy (-1 full gating, 0 disabled, N clamp). It is documented as a mirror of the Rust core but gated EXIT on raw accuracy, diverging from both native managers, which pass accuracy through effectiveExitAccuracy first (#276). The parameter defaults to -1, so existing callers are unaffected (#306).
FIX: the Rust geofence evaluator drops pending exit confirmations for fences a re-index no longer covers. clear() and remove_geofence() both pruned them; index_geofences() did not, so a half-accumulated count survived and could contribute to a later EXIT (#306).
DEPRECATED: AuditConfig.includeExtrasInHash and AttestationConfig.verificationUrl were never implemented — no platform reads either value. They are now annotated so the analyzer surfaces it, rather than being silently discarded at runtime. Implementing them is not a patch: the first changes what the audit chain hashes and so invalidates every existing chain, and the second needs a token-verification transport (#304).
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.
Version alignment with tracelet 3.7.3.
Version alignment with tracelet 3.7.3.
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.
Version alignment with tracelet 3.6.6.
Version alignment with tracelet 3.6.6.
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).
geofenceModeHighAccuracy config mapping in Web plugin to prevent runtime getter errors. (065b3bbc)FIX(plugin): correct native-map -> Pigeon field mapping (#175).
FIX(crash): harden crash/fall detection (confirmation survival, threshold, debounce, sample rate).
FEAT (Driving & Safety): On-device driving-behavior telematics — harsh_braking / harsh_acceleration / harsh_cornering / speeding via TelematicsConfig
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
Your coding agent can read these notes before it upgrades. Set up the MCP server →