NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #3671 most downloaded on pub.dev
Android implementation of the Tracelet background geolocation plugin.
Last release 1 months ago
16 Aug 2026
Ships on a steady schedule
a new release about every 8 days
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
6 months old
170 releases · first in 2026
One column per month.
FIX: streamline geofence event payload handling in fromMap method.
FIX(ios): Remove TraceletCore+Dummy.swift / TraceletSyncFFI+Dummy.swift — @_silgen_name declarations from the old static library model caused "Undefin
TraceletCore+Dummy.swift / TraceletSyncFFI+Dummy.swift — @_silgen_name declarations from the old static library model caused "Undefined symbol" linker errors after the static→dynamic xcframework migration.ForegroundServiceStartNotAllowedException in LocationService.start() so calling ready() from the background on Android 12+ no longer crashes the host app; the foreground service start is deferred until the app returns to foreground.FIX: Persist geofence ENTER/EXIT events in offline queue and auto-sync to server — events were previously dispatched to the app but never stored in th
event_type, event_payload) for geofence events round-trips correctly through getLocations() and insertLocation().setSyncBodyBuilder (Issue #125).NOT_READY error before ready() is called to match iOS parity; previously Android silently ignored SDK calls before initialization (Issue #129).flutter_rust_bridge has not been initialized on release builds — TraceletCore is now a dynamic framework, preventing dead-code stripping of FRB symbols (Issues #116, #123, #124).Failed to lookup symbol 'frb_get_rust_content_hash' — Rust symbols are now loaded directly from libtracelet_core.so bypassing RTLD_LOCAL isolation (Issues #116, #123).is_moving state per location record so getLocations() returns accurate values instead of always returning the current live state (Issue #126).FIX(ios): prevent dead code stripping of flutter_rust_bridge symbols in release builds.
showPowerManager to handle aggressive battery restrictions on specific OEM devices.PERF: Optimize database timestamp queries for O(log N) fast filtering and resolve precision bugs (Issue #119).
sslPinningFingerprints natively across iOS and Android with Rust configs.FIX: Resolved iOS accelerometer sensitivity mismatch (stationary lock) by normalizing incoming m/s² thresholds to g-force expected by CMMotionManager.
flutter_rust_bridge dynamic library load failures on release builds for users without use_frameworks! by preserving global symbols during Xcode stripping.FIX(ios): safely resolve dynamic symbols when use_frameworks! :linkage => :dynamic is used.
use_frameworks! :linkage => :dynamic is used.FIX: Force speed motion manager to evaluate initial speed on Android to prevent the state machine from being permanently stuck in MOVING when indoors
MOVING when indoors (#115).flutter_rust_bridge has not been initialized crash by ensuring the Rust core is instantiated and initialized before accessing methods (#116).CHORE: Sync release versions across all federated packages and update Swift Package Manager configuration.
CHORE: Align federated package versions and include additional patch updates.
FEAT: Implement short-lived WakeLocks for transient background tasks (startBackgroundTask / stopBackgroundTask), improving background execution reliab
startBackgroundTask / stopBackgroundTask), improving background execution reliability on Android (matches iOS beginBackgroundTask).tracelet_sync module, which must now be included if you require network synchronization.FIX(android): bump Android SDK and tracelet_android build.gradle versions to 3.1.14
Nothing published for this version
Nothing published for this version
Nothing published for this version
Bump "tracelet_android" to 3.1.10.
3.1.10.FIX(android): conditionally apply kotlin-android plugin to support older flutter SDKs while preventing warnings in modern Flutter environments.
release.yml.- Fix iOS SPM publishing
FIX(android): apply kotlin-android plugin to fix gradle build errors on newer AGP versions.
Nothing published for this version
Nothing published for this version
CHORE: Sync release versions across workspace.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
FIX(ios): Add missing FlutterFramework dependency to SPM plugin configuration to resolve compilation failures and PlatformExceptions.
FlutterFramework dependency to SPM plugin configuration to resolve compilation failures and PlatformExceptions.FEAT: Massive Architecture Rewrite — Core algorithms are now powered by a high-performance Rust Core using flutter_rust_bridge.
flutter_rust_bridge.MotionDetectionMode.smart powered by the Rust battery budget engine.FEAT: Smart Foreground Notification Visibility (Android) — Added dynamic foreground service notification management. The notification now intelligentl
tl.MotionDetectionMode.speed). In this mode, motion state transitions are driven directly by GPS speed calculations rather than raw accelerometer hardware. This provides enhanced compatibility and reliability on devices with aggressive sensor sleep policies, particularly in vehicular tracking scenarios.stopTimeout countdown. Previously, if the device was still for 5 seconds on a smooth road, it would begin the 60-second stop countdown and ignore any subsequent bumps or shakes. Now, the accelerometer remains active during the countdown and will correctly abort the stationary transition if motion resumes (#85).TraceletHasRequestedAlways is now properly reset upon notDetermined OS state.retryBackoffCap and retryBackoffBase. Time values are now properly cast as milliseconds instead of seconds, resolving a severe bug where HTTP retries fired every 60ms during network failure, causing excessive CPU/network thrashing and a massive 58KB+ log flood.Tracelet.locationStream pipeline. Replaced the faulty asyncMap batch processing with a highly robust .expand() implementation. The Tracelet.locationStream now correctly parses, type-casts, and guarantees delivery of every individual Location object without throwing type '_Map<Object?, Object?>' is not a subtype of type 'Map<String, dynamic>' or silently discarding valid coordinates.LocationEngine.stop from unintentionally overriding the global stateManager.enabled flag during speed-based motion transitions.MotionDetectionMode.accelerometer as the default to ensure immediate indoor responsiveness upon installation.Packages with breaking changes:
2.0.8.Packages with breaking changes:
Packages with other changes:
Packages with dependency updates only:
Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
tracelet - v2.0.7tracelet_doctor - v1.0.2tracelet_platform_interface constraint to ^2.0.8.FIX(interface): correct intToAuthStatus permission index mappings ([#80](https://github.com/Ikolvi/Tracelet/issues/80)).
tracelet_platform_interface constraint to ^2.0.7.CHORE: Update tracelet_platform_interface constraint to ^2.0.6.
tracelet_platform_interface constraint to ^2.0.6.2.0.6.CHORE: Version bump for monorepo consistency and package lockstep alignment.
tracelet_platform_interface constraint to ^2.0.5.2.0.5.CHORE: Version bump for monorepo consistency and native SDK alignment.
tracelet_platform_interface constraint to ^2.0.4.FIX: Removed unreliable timestamp drift heuristic from location spoofing detection.
CHORE: Version bump for iOS status bar fix consistency.
tracelet_platform_interface constraint to ^2.0.1.BREAKING: Adopts an "on-demand" dependency model. Core SDK no longer bundles GMS Location, SQLCipher, or Play Integrity by default, reducing APK size
android/app/build.gradle if required.MethodChannel with type-safe generated interfaces.LocationManager fallback when GMS is unavailable.tracelet-sdk constraint to 2.0.0.2: 3: - CHORE: Bump native tracelet-sdk constraint to 1.1.4. 4: 5: ## 1.9.2
2:
3: - CHORE: Bump native tracelet-sdk constraint to 1.1.4.
4:
5: ## 1.9.2
Tracelet.locationStream no longer goes silent when flutter_overlay_window (or any FlutterEngineGroup plugin) creates a secondary in-process FlutterEngine. The primary-instance guard (#51) unconditionally skipped EventDispatcher re-binding for all secondary engines, including in-process overlay engines that attach on the main thread. A Looper-based discriminator now selectively re-binds the dispatcher for main-thread overlay engines while preserving the full skip for off-thread headless/Firebase engines (#51 fix intact).destroyAll() now guards all background-critical subsystems when stopOnTerminate: false (#65). httpSyncManager.stop(), scheduleManager.stop(), and stopHeartbeat() were still called unconditionally on every swipe-to-dismiss, killing HTTP sync and heartbeat even when background tracking should survive. Fixed in native tracelet-sdk 1.1.2.secondaryMainThreadEngine_rebindsDispatcherOnly and secondaryBackgroundThreadEngine_fullySkipped to PluginSecondaryEngineGuardTest covering both discriminator branches. Existing headless tests updated to stub isMainThread=false.tracelet-sdk constraint to 1.1.2.Nothing published for this version
FIX: destroyAll() now respects stopOnTerminate: false for continuous (mode 0) and geofence (mode 1) tracking modes (#63). locationEngine.destroy() was
destroyAll() now respects stopOnTerminate: false for continuous (mode 0) and geofence (mode 1) tracking modes (#63). locationEngine.destroy() was unconditionally called, racing with LocationService.onTaskRemoved() native bootstrap. PeriodicLocationWorker static refs (eventSender, httpSyncManager) are also now preserved when keepPeriodicAlive is true.tracelet-sdk constraint to 1.1.1.FIX: LocationService no longer crashes the host app with RemoteServiceException: Context.startForegroundService() did not then call Service.startForeg
LocationService no longer crashes the host app with RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground() (#59). Reproducible on real devices when using periodicUseForegroundService: true. Root cause: onStartCommand only promoted to foreground for ACTION_START, but the system can deliver intents for other actions (and null-intent sticky restarts after a system kill) under the same foreground-service contract. Fixed in native tracelet-sdk 1.1.0 by always promoting at the top of onStartCommand.tracelet_platform_interface 1.9.0 fix that restores extras and vertices propagation for addGeofence (#58). No native-side changes for this part.tracelet-sdk constraint to 1.1.0.LocationServiceForegroundContractTest covering all 5 entry paths (ACTION_START, ACTION_STOP, ACTION_UPDATE_NOTIFICATION, ACTION_BUTTON, null-intent sticky restart).EventDispatcher headless-fallback geofence extras forwarding.PERF: Reduce first-fix latency on stationary → moving transitions. LocationEngine.changePace(true) now fires an additional one-shot getCurrentLocation
LocationEngine.changePace(true) now fires an additional one-shot getCurrentLocation() so a fresh GPS fix arrives as soon as the hardware is warm, instead of waiting for locationUpdateInterval on the continuous stream. The one-shot is guarded by a CancellationTokenSource that is cancelled on stop() (#54).Tracelet.changePace(false), MotionDetector’s accelerometer + significant-motion listeners are now re-engaged so real motion can resume tracking. Previously the SDK could get stuck in a permanent stationary state with no sensors listening.FIX: Geofence extras are now delivered correctly to onGeofence callbacks. Previously, extras were persisted via Map.toString() and could not be parsed
extras are now delivered correctly to onGeofence callbacks. Previously, extras were persisted via Map.toString() and could not be parsed back into a Map, causing GeofenceEvent.extras to always arrive empty (#51 follow-up).extras are now included in read-back location maps (previously silently dropped in cursorToLocation).FIX: Guard against secondary FlutterEngine (e.g. Firebase background messaging) overwriting SDK singleton's event sender and callbacks (#51).
FIX: Killed-state tracking now works reliably — stopBootTracking() deferred from sdk.initialize() to sdk.ready() so boot-mode native tracking (Locatio
stopBootTracking() deferred from sdk.initialize() to sdk.ready() so boot-mode native tracking (LocationEngine + HttpSyncManager) survives until the Dart side explicitly takes over (#50).FEAT: Add syncInterval support — timer-based HTTP sync via ScheduledExecutorService (#50).
syncInterval support — timer-based HTTP sync via ScheduledExecutorService (#50).1.0.9.FIX: HTTP sync payload now uses canonical is_moving (snake_case) and ISO 8601 timestamps, matching iOS format (#48).
is_moving (snake_case) and ISO 8601 timestamps, matching iOS format (#48).1.0.8.CHORE: Align federated package versions and include additional patch updates.
1.0.7.FIX: getCurrentPosition(samples: 1) now uses requestLocationUpdates instead of FusedLocationProviderClient.getCurrentLocation() — forces a fresh GPS f
getCurrentPosition(samples: 1) now uses requestLocationUpdates instead of FusedLocationProviderClient.getCurrentLocation() — forces a fresh GPS fix with proper timeout instead of returning stale cached locations (#46).onAttachedToEngine callback wiring with primaryInstance — prevents headless FlutterEngine from overwriting foreground httpSyncManager callbacks, which caused requestFreshHeaders to timeout (10s) or return notImplemented.onRequestFreshHeaders invocation — eliminates MethodChannel round-trip before every sync request. Token refresh handled by onAuthorizationRequired on 401.1.0.6.ready() — guards relaxed from isReady to ::manager.isInitialized.FIX: getCurrentPosition() falls back to last known location when FusedLocationProviderClient.getCurrentLocation() returns null (e.g. emulator, GPS-off
getCurrentPosition() falls back to last known location when FusedLocationProviderClient.getCurrentLocation() returns null (e.g. emulator, GPS-off) — fixes LOCATION_UNAVAILABLE errors (#46).clearPendingPermissionCallback() to TraceletSdk — resolves cross-module internal visibility error.1.0.5.FIX: Add isReady guards to all Android SDK methods — prevents UninitializedPropertyAccessException when called before ready() (re-fixes #46).
isReady guards to all Android SDK methods — prevents UninitializedPropertyAccessException when called before ready() (re-fixes #46).1.0.4 — prevents auto-resolving to incompatible newer releases.FIX: Add isReady guards to all Android SDK methods — prevents UninitializedPropertyAccessException when called before ready() (re-fixes #46).
isReady guards to all Android SDK methods — prevents UninitializedPropertyAccessException when called before ready() (re-fixes #46).com.ikolvi:tracelet-sdk 1.0.2 → 1.0.3.FIX: Guard soundManager access in handleMotionStateChange() and destroyAll() — prevents UninitializedPropertyAccessException if motion detector fires
soundManager access in handleMotionStateChange() and destroyAll() — prevents UninitializedPropertyAccessException if motion detector fires before full initialization.LocationManagerCompat.isLocationEnabled() instead of LocationManager.isLocationEnabled() — fixes crash on Android API 26/27.Class.forName checks prevent NoClassDefFoundError.DeviceAttestor uses lazy IntegrityManagerFactory initialization — prevents crash when Play Integrity is not on the classpath.-dontwarn for optional deps.destroyAll_doesNotCrash_withoutSoundManager unit test.CHORE: Version bump for iOS periodic mode location indicator fix.
FIX: ConfigManager null-merge — partial setConfig() no longer overwrites existing non-null values (e.g. HTTP URL) with null defaults.
setConfig() no longer overwrites existing non-null values (e.g. HTTP URL) with null defaults.Result.retry(), preventing permanent chain breaks on exceptions.geofenceManager is null, instead of silently dropping events.isCharging → is_charging, flat coords → nested coords map, add activity map, isMock → mock.cursorToLocation outputs is_charging in battery map.destroySyncedLocations() — deletes only synced locations from the database.HttpSyncManager.destroySyncedLocations.FIX: Wire headlessFallback in eventSenderFactory — fixes geofence events silently dropped on task removal (#43).
headlessFallback in eventSenderFactory — fixes geofence events silently dropped on task removal (#43).sendTrip/sendBudgetAdjustment to NoOpEventSender.EventDispatcher to use Pigeon TraceletEventApi FlutterApi.TraceletHostApiImpl for type-safe Pigeon HostApi dispatch.sdk/android/ module (Maven Central: com.ikolvi:tracelet-sdk).LocationService.startBootTracking().returnDefaultValues for Android unit tests.FEAT: Rewrite EventDispatcher to use Pigeon TraceletEventApi FlutterApi instead of EventChannels.
EventDispatcher to use Pigeon TraceletEventApi FlutterApi instead of EventChannels.TraceletHostApiImpl for type-safe Pigeon HostApi dispatch.sdk/android/ module.^1.6.3-alpha.1.FEAT: Add 401-aware retry — on HTTP 401 Unauthorized, invoke headless headers callback to refresh token, then retry once with updated dynamic headers.
FEAT: Add SSL certificate pinning — support for PEM certificates (CertificatePinner) and SHA-256 fingerprints (HandshakeCertificates) via OkHttp TLS.
CertificatePinner) and SHA-256 fingerprints (HandshakeCertificates) via OkHttp TLS.ConfigManagerSyncFeaturesTest — 12 Robolectric unit tests for sync features.okhttp-tls:5.3.2 dependency.tracelet_platform_interface dependency constraint to ^1.6.0.FEAT: Add boot-mode HttpSyncManager — locations are auto-synced to the server even when the app is killed or the device reboots.
HttpSyncManager — locations are auto-synced to the server even when the app is killed or the device reboots.HttpSyncManager so periodic locations sync without the Flutter engine.tracelet_platform_interface dependency constraint to ^1.5.0.Your coding agent can read these notes before it upgrades. Set up the MCP server →