NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #4171 most downloaded on pub.dev
A common platform interface for the Tracelet background geolocation plugin. Used by tracelet_android and tracelet_ios implementations.
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
Nothing withdrawn
no release was ever pulled
7 months old
165 releases · first in 2026
One column per month.
Release tracelet_platform_interface v3.8.8
Release tracelet_platform_interface v3.8.8
FIX: the flutter_rust_bridge runtime is pinned to the codegen version — >=2.13.0 <2.14.0, with the bindings regenerated by 2.13.0 — so RustLib.init() no longer fails with a codegen/runtime version mismatch on a fresh pub get (#421).
FEAT: TripManager surfaces the trip-start edge and currentTripId from the Rust core, and passes tripId, startedAt, and endedAt through to the trip maps (#402).
Tracelet Sync iOS SDK v3.8.7
Tracelet Sync iOS SDK v3.8.7
Tracelet Sync iOS SDK v3.8.6
Tracelet Sync iOS SDK v3.8.6
Nothing published for this version
Version alignment with tracelet 3.8.5.
Version alignment with tracelet 3.8.5.
FEAT: TlForegroundServiceConfig carries notificationStartedAt, notificationShowTimer and notificationOnlyAlertOnce, and TlLiveActivityConfig carries s
FEAT: TlForegroundServiceConfig carries notificationStartedAt, notificationShowTimer and notificationOnlyAlertOnce, and TlLiveActivityConfig carries startedAt and showTimer, for the OS-rendered elapsed timer. The fields are appended at the end of each Pigeon class and the generated decoders read those indices unconditionally, so a native package must resolve against this interface version or newer — the platform packages' constraints move with this release (#376).
FIX: the method-channel fallback sends liveActivityConfig. _iosToMap never wrote the key, so a platform implementation on that path saw no Live Activity configuration at all — timer fields or otherwise (#376).
FEAT: TlTelematicsRecord carries speed and value. Both are nullable, so a Dart side newer than the native plugin decodes a missing field as null rathe
FEAT: TlTelematicsRecord carries speed and value. Both are nullable, so a Dart side newer than the native plugin decodes a missing field as null rather than failing. severity is unchanged (#367).
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.
FIX: every leaf Tl*Config field is nullable, so "the caller did not set this" survives the channel and the platform can leave the persisted value alon
FIX: every leaf Tl*Config field is nullable, so "the caller did not set this" survives the channel and the platform can leave the persisted value alone instead of overwriting it with a default. The method-channel and web transports omit unset fields rather than sending them as explicit nulls or resolved defaults (#321).
FIX: TlForegroundServiceConfig fields are nullable, so "the caller did not set this" survives the channel and the platform can leave the persisted value alone instead of overwriting it with a default (#320).
FIX: the method-channel path serialised no showNotificationOnPauseOnly at all, so the flag never reached the platform over that transport however it was configured — the same class of silent drop as the geofence flag in #305. It is now sent, and the whole foreground-service map omits fields the caller left unset (#320).
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.
FIX: TlMotionConfig.shakeThreshold, stillThreshold and stillSampleCount are now nullable, so "unset" can be expressed across the platform channel. The
FIX: TlMotionConfig.shakeThreshold, stillThreshold and stillSampleCount are now nullable, so "unset" can be expressed across the platform channel. They were required, which meant Dart's defaults (the Android-tuned values) were transmitted unconditionally and silently overrode each platform's own tuned defaults — on iOS stillThreshold: 0.4 m/s² arrived as 0.04 g, about four times stricter than the 0.15 g iOS default. null now means "use the platform default"; the Pigeon bindings were regenerated from the schema (#288).
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).
FIX(plugin): correct native-map -> Pigeon field mapping (#175).
FIX (Location data, Android/iOS): Several location-map fields surfaced as static/default values in the Dart layer because the native-map → platform-channel converters dropped or mis-keyed them (#175):
getCurrentPosition(extras:, desiredAccuracy:) were silently ignored on Android (never forwarded to the SDK) — now applied.battery.isCharging was always false — the converter read isCharging instead of the native snake_case is_charging.isMoving was always false — read isMoving instead of native is_moving.Converters now read the native keys (with camelCase fallback), and field-by-field regression tests over the converters were added on both platforms to prevent recurrence.
TUNE (Crash detection): Lowered the default crashGThreshold from 3.0 g to 2.0 g. Validation against the large VZCrash field dataset showed the 3.0 g speed-gated rule missed ~48% of real crashes (median impact ~2.2 g) while the false-positive budget was small. Crash detection is opt-in with a cancel-countdown, so the default now favours recall — raise it if you see too many prompts. See #173. (Crash detection remains beta pending first-party field validation.)
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
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 →