NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #4477 most downloaded on pub.dev
Production-grade background geolocation for Flutter. Battery-conscious tracking, geofencing, SQLite persistence, HTTP sync, and headless execution for iOS & Android.
Last release 17 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
41 versions withdrawn
withdrawn after publishing
7 months old
173 releases · first in 2026
FIX: Custom sync-body builder now falls back to the headless engine on timeout (instead of aborting the sync) on both Android and iOS — fixes location
setSyncBodyBuilder (Issue #134).FIX: streamline geofence event payload handling in fromMap method.
One column per month.
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.autoSyncDelay to HttpConfig — configure the debounce delay in milliseconds before automatically dispatching an HTTP sync request after a location is recorded.tracelet_sync package for offline SQLite persistence and automatic HTTP synchronization.resolveAddress) functionality for automatic address lookups.FIX(ios): prevent dead code stripping of flutter_rust_bridge symbols in SPM apps by referencing them explicitly in TraceletIosPlugin
Nothing published for this version
Nothing published for this version
Nothing published for this version
- Bump \"tracelet\" 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
FEAT: Major architectural upgrade: Unified Rust Core.
FEAT: Major architectural upgrade: Unified Rust Core.
tracelet_core).FEAT: Introduced explicit predefined tracking profiles: Config.highAccuracy(), Config.balanced(), and Config.lowPower() to simplify setup.
CHORE: Release strategy overhaul. The iOS Rust Core is now bundled directly into the tracelet_ios plugin for pub.dev publication, while the Android SDK continues to be distributed via Maven Central.
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 (Location Filtering, Kalman Filter, Trip Management, Battery Budgeting, Schedule Parsing, Delta E
flutter_rust_bridge and UniFFI. This brings identically deterministic behavior and extreme battery efficiency across Android, iOS, and Dart.MotionDetectionMode.smart. This intelligent hybrid detection mode optimizes battery consumption dynamically by delegating evaluation to the Rust battery budget engine.tracelet_supabase (Supabase Postgres background syncing & Auth) and tracelet_firebase (Firebase RTDB live location broadcasting) plugins.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.2Int64 integer values across all iOS config mappings. Integer configurations (such as stopTimeout, locationUpdateInterval, etc.) are now correctly applied on iOS instead of silently falling back to defaults.distanceFilter override to continuous tracking during stopTimeout when preventSuspend is enabled. This significantly reduces stationary battery drain when using the audio keep-alive feature.^2.0.8.FIX(interface): correct intToAuthStatus permission index mappings ([#80](https://github.com/Ikolvi/Tracelet/issues/80)).
intToAuthStatus permission index mappings on Android and iOS — getLocationAuthorization() and requestLocationAuthorization() now return the correct AuthorizationStatus values (#80).^2.0.7.PERF: Hardware-level sensor batching on Android reduces CPU wake-ups by over 90% during active accelerometer monitoring.
BatteryBudgetEngine adjustments (distance filter, desired accuracy, periodic interval) are now correctly applied to the location engine.TYPE_SIGNIFICANT_MOTION when the primary accelerometer is missing.^2.0.6.FEAT: Added Tracelet.isHeadlessRegistered static getter. Returns true after registerHeadlessTask() has been called. Useful for diagnostic tools like t
Tracelet.isHeadlessRegistered static getter. Returns true after registerHeadlessTask() has been called. Useful for diagnostic tools like tracelet_doctor to detect missing headless handlers.tracelet_doctor (v1.0.0) — drop-in diagnostic overlay widget. See tracelet_doctor.FEAT: Integrated Kalman Location Filter GPS smoothing into the Flutter plugin and the dynamic config settings in the Example App.
^2.0.4.FIX: Removed unreliable timestamp drift heuristic from Android and iOS location spoofing detection. This prevents valid locations from being incorrect
FIX: Fixed persistent blue location indicator on iOS by properly conditionally disabling CLBackgroundActivitySession and continuous GPS in low-accurac
CLBackgroundActivitySession and continuous GPS in low-accuracy geofence-only mode.2.0.1.Removed Deprecated APIs: Permission methods that returned raw integers (e.g., getPermissionStatus, requestPermission) have been removed in favor of th…
Tracelet 2.0.0 introduces a modernized configuration schema, robust type-safe platform communication via Pigeon, and a flexible dependency model to optimize app size and compatibility.
Config model is now a nested compound structure. Fields are grouped into GeoConfig, AppConfig, AndroidConfig, HttpConfig, LoggerConfig, MotionConfig, GeofenceConfig, and SecurityConfig.android/app/build.gradle if required.getPermissionStatus, requestPermission) have been removed in favor of the strongly-typed Future<AuthorizationStatus> methods introduced in 1.9.0.shakeThreshold, stillThreshold, and stillSampleCount to MotionConfig, providing granular control over accelerometer-based motion detection across all platforms.CoreLocation and CoreMotion requests.LocationManager on Android when Google Play Services are unavailable.2: 3: - CHORE: Bump native SDK dependencies to 1.1.4. 4: - CHORE: Aligned repository podspec files and updated release documentation. 5: 6: ## 1.9.2
2:
3: - CHORE: Bump native SDK dependencies to 1.1.4.
4: - CHORE: Aligned repository podspec files and updated release documentation.
5:
6: ## 1.9.2
TlTrackingMode to a strongly-typed enum across the entire Pigeon bridge. This improves type safety and developer experience by eliminating magic integers in the platform communication layer. Android and iOS native implementations now use the generated enum types directly.locationStream when secondary engines (like overlays or background isolates) detach. Ensured destroyAll() is correctly integrated into the primaryInstance guard on both Android and iOS to prevent resource leaks and duplicate registrations during hot restarts.Tracelet.locationStream no longer goes silent when flutter_overlay_window (or any plugin using FlutterEngineGroup) creates a secondary in-process FlutterEngine. The primary-instance guard introduced in 1.9.0 (#51) blocked EventDispatcher re-binding for in-process overlay engines, causing Pigeon FlutterApi onLocation channel to report "Unable to establish connection". A Looper-based discriminator now distinguishes overlay engines (main-thread attach → re-bind dispatcher) from headless background engines (off-thread attach → full skip, preserving #51).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, permanently killing HTTP sync and heartbeat monitoring until the app was manually reopened. Fixed in native tracelet-sdk 1.1.2.PigeonTracelet serialization logic to use enum indices for backward compatibility with the high-level State model while maintaining type-safe internal bridge contracts.Nothing published for this version
FIX: Android destroyAll() now respects stopOnTerminate: false for continuous and geofence tracking modes (#63). locationEngine.destroy() was unconditi
destroyAll() now respects stopOnTerminate: false for continuous and geofence tracking modes (#63). locationEngine.destroy() was unconditionally called in onDetachedFromEngine(), racing with LocationService.onTaskRemoved() which bootstraps native tracking. Background location tracking now survives app swipe from recents when stopOnTerminate: false is configured.…requestTemporaryFullAccuracy) are now @Deprecated and will be removed in 2.0.0.
getLocationAuthorization, requestLocationAuthorization, getNotificationAuthorization, requestNotificationAuthorization, getMotionAuthorization, requestMotionAuthorization, and requestTemporaryFullAccuracyAuthorization, all returning Future<AuthorizationStatus> instead of magic ints. The matching int-returning methods (getPermissionStatus, requestPermission, getNotificationPermissionStatus, requestNotificationPermission, getMotionPermissionStatus, requestMotionPermission, requestTemporaryFullAccuracy) are now @Deprecated and will be removed in 2.0.0.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.Geofence(extras: {...}) now correctly persists and is returned by getGeofences() and delivered in onGeofence events (#58). Bug was in tracelet_platform_interface's _mapToGeofence, which silently dropped extras and vertices when constructing the Pigeon payload; the 1.8.12 native fix had no effect because the data never crossed the platform channel. Affected both Android and iOS.example/integration_test/geofence_extras_test.dart) that round-trips addGeofence → getGeofences() to prevent regression.PERF: Reduce first-fix latency on stationary → moving transitions on both iOS and Android. The native engines now fire an additional one-shot location
distanceFilter (iOS) or locationUpdateInterval (Android) on the continuous stream (#54).Tracelet.changePace(false) (force stationary), the SDK can now detect real motion and resume tracking automatically. Previously the wake-up sensors stayed torn down, leaving the SDK in a dead-state. iOS was unaffected.FIX: Geofence extras now arrive in GeofenceEvent.extras on Android (previously always empty). Location extras are also correctly included when reading
extras now arrive in GeofenceEvent.extras on Android (previously always empty). Location extras are also correctly included when reading back persisted locations (#51 follow-up).FIX: Geofence callbacks no longer silently stop during continuous tracking when a secondary FlutterEngine (e.g. Firebase background messaging) registe
FIX: Killed-state tracking now works reliably — stopBootTracking() deferred from initialize() to ready() so boot-mode native tracking survives until t
stopBootTracking() deferred from initialize() to ready() so boot-mode native tracking survives until the Dart side explicitly takes over (#50).FEAT: Add syncInterval to HttpConfig — flush locations on a fixed timer instead of per-insert, for fleet/logistics use cases (#50).
syncInterval to HttpConfig — flush locations on a fixed timer instead of per-insert, for fleet/logistics use cases (#50).FIX: HTTP sync payload now consistent between iOS and Android — Android cursorToLocation() and all location map producers now use canonical is_moving
cursorToLocation() and all location map producers now use canonical is_moving (snake_case) and ISO 8601 timestamps, matching iOS format (#48).FIX: Enhance overall stability by including pending 1.8.6 patches.
FIX: getCurrentPosition() falls back to last known location when GPS returns no fix (e.g. emulator, GPS-off) — fixes LOCATION_UNAVAILABLE errors (#46)
getCurrentPosition() falls back to last known location when GPS returns no fix (e.g. emulator, GPS-off) — fixes LOCATION_UNAVAILABLE errors (#46).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).FIX: Prevent crash when getState(), setConfig(), or any other method is called before ready() on iOS — comprehensive isReady guards across all native
getState(), setConfig(), or any other method is called before ready() on iOS — comprehensive isReady guards across all native SDK methods (re-fixes #46).FIX: Prevent crash when stop() is called before ready() on iOS — returns NOT_READY error instead of accessing uninitialized properties.
stop() is called before ready() on iOS — returns NOT_READY error instead of accessing uninitialized properties.soundManager access on Android to prevent UninitializedPropertyAccessException during motion state changes or cleanup.LocationManagerCompat.isLocationEnabled() on Android — fixes NoSuchMethodError crash on API 26/27 devices.NoClassDefFoundError crashes.-dontwarn for optional enterprise dependencies.INSTALL-ANDROID.md and DATABASE-ENCRYPTION.md with enterprise dependency setup instructions.FIX: iOS periodic mode no longer shows persistent location indicator in the status bar.
FIX: Align location map format contract across Android, iOS, and Dart layers — fixes 9 format mismatches.
Tracelet.destroySyncedLocations() — deletes only synced locations, returns count deleted.help/LOCATION-MAP-FORMAT.md canonical format contract reference.FEAT: Migrate all event subscriptions from EventChannels to Pigeon FlutterApi platform streams.
Location.fromTl and LocationActivity.fromTl factory constructors for Pigeon type conversion.FEAT: Migrate all event subscriptions from EventChannels to Pigeon FlutterApi platform streams.
Location.fromTl and LocationActivity.fromTl factory constructors for Pigeon type conversion._eventChannels, _eventStreams maps, and _getEventStream() helper.^1.6.3-alpha.1.FIX: Update tracelet_web dependency to ^1.6.1 — fixes 5 missing HTTP Sync method stubs that caused UnimplementedError on web.
tracelet_web dependency to ^1.6.1 — fixes 5 missing HTTP Sync method stubs that caused UnimplementedError on web.FEAT: Add 401-aware retry — native HTTP sync now detects 401 responses, invokes the headless headers callback (registerHeadlessHeadersCallback) to ref
registerHeadlessHeadersCallback) to refresh authorization tokens, and retries the request once with updated dynamic headers. Works in both foreground and killed-state (headless) modes.FEAT: Add SSL certificate pinning via HttpConfig.sslPinningCertificates and HttpConfig.sslPinningFingerprints.
HttpConfig.sslPinningCertificates and HttpConfig.sslPinningFingerprints.setDynamicHeaders(), setHeadersCallback(), refreshHeaders(), and headless registerHeadlessHeadersCallback().setRouteContext() / clearRouteContext() to attach metadata to every synced location.setSyncBodyBuilder() and headless registerHeadlessSyncBodyBuilder().RouteContext, SyncBodyContext, and HttpConfig SSL fields.^1.6.0.FEAT: Boot-mode HTTP auto-sync — locations sync to your server even when the app is killed or the device reboots (Android).
latitude/longitude from nested coords object.^1.5.0.Your coding agent can read these notes before it upgrades. Set up the MCP server →