NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #4170 most downloaded on pub.dev
Android implementation of the Tracelet background geolocation plugin.
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
171 releases · first in 2026
One column per month.
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.FIX: Rename PermissionManager to TraceletPermissionManager to avoid class name collision with permission_handler_apple (#32).
PermissionManager to TraceletPermissionManager to avoid class name collision with permission_handler_apple (#32).kotlin-gradle-plugin 2.3.10 → 2.3.20.androidx.sqlite:sqlite 2.4.0 → 2.6.2.com.google.android.play:integrity 1.4.0 → 1.6.0.org.mockito.kotlin:mockito-kotlin 5.4.0 → 6.3.0.androidx.security:security-crypto 1.1.0-alpha06 → 1.1.0 (stable).tracelet_platform_interface dependency constraint to ^1.4.6.CHORE: Update tracelet_platform_interface dependency constraint to ^1.4.5.
tracelet_platform_interface dependency constraint to ^1.4.5.FEAT: Add reducedAccuracy field to location map for cross-platform API consistency with iOS 14+.
reducedAccuracy field to location map for cross-platform API consistency with iOS 14+.tracelet_platform_interface dependency constraint to ^1.4.4.FEAT: Automatic GPS-off fallback — when GPS hardware is disabled, the engine auto-downgrades to PRIORITY_BALANCED_POWER_ACCURACY for Wi-Fi/cell tower
PRIORITY_BALANCED_POWER_ACCURACY for Wi-Fi/cell tower fixes. Restores original priority when GPS is re-enabled.locationSource classification to every location fix (gps, wifi, cell, network, unknown).gpsFallback flag to provider state for Dart-side awareness of fallback state.tracelet_platform_interface dependency constraint to ^1.4.3.FIX: Dead reckoning activation now uses LocationManager.isProviderEnabled(GPS_PROVIDER) instead of accuracy heuristic — Wi-Fi/cell fixes no longer pre
LocationManager.isProviderEnabled(GPS_PROVIDER) instead of accuracy heuristic — Wi-Fi/cell fixes no longer prevent DR from activating when GPS hardware is disabled.activateDeadReckoning() now retries via timer instead of silently returning when lastLocation is null.tracelet_platform_interface dependency constraint to ^1.4.2.FEAT: Dead reckoning — full IMU sensor fusion implementation (DeadReckoningEngine). Pedestrian Dead Reckoning with step detection (Weinberg formula) a
DeadReckoningEngine). Pedestrian Dead Reckoning with step detection (Weinberg formula) and magnetic heading. Vehicle mode with high-pass-filtered acceleration integration.ConfigManager.tracelet_platform_interface dependency constraint to ^1.4.1.FEAT: Encrypted SQLite — database encryption via SQLCipher with Android Keystore-backed key management (DatabaseEncryptionManager).
DatabaseEncryptionManager).DeviceAttestor).getDeadReckoningState() stub for future accelerometer/gyroscope-based position estimation.getCarbonReport() returns CO₂ estimates from tracked locations using EU average emission factors.net.zetetic:sqlcipher-android, androidx.sqlite:sqlite, androidx.security:security-crypto, and com.google.android.play:integrity dependencies.tracelet_platform_interface dependency constraint to ^1.4.0.FIX: Fix ClassNotFoundException crash for BootReceiver, GeofenceBroadcastReceiver, PeriodicAlarmReceiver, and LocationService caused by package path m
ClassNotFoundException crash for BootReceiver, GeofenceBroadcastReceiver, PeriodicAlarmReceiver, and LocationService caused by package path mismatch in AndroidManifest.xml (fixes #31).LocationService not being resolved from the manifest.^1.3.7.FIX: getLocations() now honors SQLQuery.start and SQLQuery.end timestamp filtering.
getLocations() now honors SQLQuery.start and SQLQuery.end timestamp filtering.getCount() now accepts optional SQLQuery for time-bounded counting.^1.3.6.CHORE: Update cross-package dependency constraints to ^1.3.5.
^1.3.5.CHORE: Update tracelet_platform_interface dependency constraint to ^1.3.3.
tracelet_platform_interface dependency constraint to ^1.3.3.FIX: Bundle native core Kotlin source files (com.tracelet.core.*) directly inside the plugin package so they are included when published to pub.dev. P
com.tracelet.core.*) directly inside the plugin package so they are included when published to pub.dev. Previously, the build.gradle referenced sources via a relative monorepo path that was inaccessible to pub.dev consumers.PERF: Replace per-location JSONObject allocations with streaming android.util.JsonWriter in HttpSyncManager.buildJsonBody() (A-L5).
JSONObject allocations with streaming android.util.JsonWriter in HttpSyncManager.buildJsonBody() (A-L5).FIX: getHttpExtras() and getPersistenceExtras() now read distinct config keys (httpExtras, persistenceExtras) with backward-compatible fallback.
getHttpExtras() and getPersistenceExtras() now read distinct config keys (httpExtras, persistenceExtras) with backward-compatible fallback.CHORE: Version bump for federation consistency with tracelet 1.3.0.
tracelet 1.3.0.CHORE: Version bump for federation consistency with tracelet_platform_interface 1.2.0 (new NotificationPriority and HashAlgorithm enums).
tracelet_platform_interface 1.2.0 (new NotificationPriority and HashAlgorithm enums).FEAT: Add native DeltaEncoder (Kotlin) for delta-compressed HTTP sync payloads — mirrors the Dart implementation exactly for platform consistency. Enc
DeltaEncoder (Kotlin) for delta-compressed HTTP sync payloads — mirrors the Dart implementation exactly for platform consistency. Encodes only field deltas between consecutive locations using shortened keys (la, lo, t, s, h, a, al, b), achieving 60–80% bandwidth reduction. Uses java.time.Instant for ISO 8601 timestamp parsing with flexible numeric type coercion.ConfigManager now reads and applies the following new configuration fields from Dart: batteryBudgetPerHour (adaptive battery budget target), enableSparseUpdates, sparseDistanceThreshold, sparseMaxIdleSeconds (app-level deduplication), enableDeadReckoning, deadReckoningActivationDelay, deadReckoningMaxDuration (inertial navigation when GPS lost), enableDeltaCompression, deltaCoordinatePrecision (HTTP delta encoding), and disableAutoSyncOnCellular (WiFi-only sync).HttpSyncManager now supports disableAutoSyncOnCellular — skips auto-sync when device is on cellular network, syncing only on WiFi. Also conditionally applies DeltaEncoder.encode() to multi-location batches before HTTP upload when enableDeltaCompression is enabled, reducing upload size by 60–80%.FIX: destroyAll() unconditionally removed geofence registrations from Play Services even when stopOnTerminate: false was configured with trackingMode=
destroyAll() unconditionally removed geofence registrations from Play Services even when stopOnTerminate: false was configured with trackingMode=1 (geofence mode). Geofences now survive app termination and are re-registered on boot/task-removal (#23).FIX: HTTP auto-sync never triggered from automatic location tracking — onLocationInserted() was only called from the manual insertLocation handler, no
onLocationInserted() was only called from the manual insertLocation handler, not from LocationEngine.persistLocationIfAllowed() (#21).PeriodicLocationWorker now triggers HTTP auto-sync after each periodic location insert.FEAT: First stable release of tracelet_android.
tracelet_android.PERF: Add 10-minute wakelock timeout to prevent indefinite CPU wake (A-C1).
SimpleDateFormat as static isoFormatter (A-H1).@Volatile to isRunning in LocationService (A-H4).@Volatile to sync flags in HttpSyncManager (A-H5).ThreadLocal<MessageDigest> for thread-safe SHA-256 (A-H6).getLog() query (A-H9).ConfigManager with double-checked locking (A-M1).Locale.US to all String.format() in buildCanonicalString() (A-M2).BootReceiver (A-M5).ConcurrentHashMap.newKeySet() for activeGeofenceIds (A-M6).SELECT COUNT(*) for auto-sync threshold (A-M7).created_at index on locations table (DB v5) (A-M8).deferTime to LocationRequest.setMaxUpdateDelayMillis() (A-M9).@Volatile to consecutiveStillSamples in MotionDetector (A-M10).cursorToLocationList() (A-L1).equals(ignoreCase = true) instead of uppercase() allocation in logger (A-L2).toMutableMap() in watchPosition() (A-L3).ParsedSchedule data class to deduplicate schedule parsing (A-L4).setOf() instead of listOf() for OEM manufacturer detection (A-L6).isMoreRestrictive() wrapper, inline isActionMoreRestrictive() call.created_at index).CHORE: Version bump for platform consistency.
FIX: Add ACCESS_BACKGROUND_LOCATION permission checks to all killed-state restart paths — BootReceiver, LocationService.onTaskRemoved(), LocationServi
ACCESS_BACKGROUND_LOCATION permission checks to all killed-state restart paths — BootReceiver, LocationService.onTaskRemoved(), LocationService.startBootTracking(), PeriodicAlarmReceiver, and PeriodicLocationWorker. Prevents "While In Use" permission from triggering tracking in killed/boot state.hasBackgroundPermission() utility on LocationEngine for proactive background permission verification.CHORE: Tighten tracelet_platform_interface constraint to ^0.11.2.
tracelet_platform_interface constraint to ^0.11.2.FIX: Auto-select exact alarms for periodic intervals < 15 min without foreground service.
PeriodicLocationWorker.doWork() now uses interval < 900 auto-detect to match initial scheduling strategy.set() to setAndAllowWhileIdle() in scheduleExactAlarm().EventDispatcher in onAttachedToEngine() when periodic mode is already active (fixes null dispatcher after process restart).destroyAll() when stopOnTerminate=false and periodic tracking is active.canScheduleExactAlarms and openExactAlarmSettings method channel handlers.FEAT: AuditTrailManager — SHA-256 hash chain with SQLite persistence and SharedPreferences chain state.
AuditTrailManager — SHA-256 hash chain with SQLite persistence and SharedPreferences chain state.PrivacyZoneManager — Haversine distance-based zone evaluation with exclude, degrade, and event-only actions.ConfigManager getters for audit and privacy zone configuration.tracelet_platform_interface to ^0.11.0.FEAT: Periodic mode — GPS-friendly interval tracking via startPeriodic(). Three scheduling strategies: WorkManager (default), foreground service, and
startPeriodic(). Three scheduling strategies: WorkManager (default), foreground service, and exact alarms.PeriodicLocationWorker — WorkManager CoroutineWorker for one-shot GPS fixes with automatic SQLite persistence and EventChannel/headless dispatch.PeriodicAlarmReceiver — BroadcastReceiver for AlarmManager exact alarm chaining when periodicUseExactAlarms: true.SCHEDULE_EXACT_ALARM permission with graceful fallback to inexact alarms on Android 13+.TraceletAndroidPluginTest — make mainHandler lazy to avoid RuntimeException in plain JUnit tests.tracelet_platform_interface to ^0.10.0.FIX: Fire heartbeat events in boot-mode headless tracking. LocationService.startBootTracking() now starts a self-rescheduling heartbeat timer so heart
LocationService.startBootTracking() now starts a self-rescheduling heartbeat timer so heartbeat events dispatch to HeadlessTaskService after device reboot.FEAT: HTTP sync retry engine — configurable retry with exponential backoff for transient 5xx, 429, and timeout failures. Respects Retry-After headers.
Retry-After headers. Defers sync on connectivity loss.MotionDetector reads shakeThreshold, stillThreshold, stillSampleCount from ConfigManager at runtime instead of hardcoded constants.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS permission to AndroidManifest.xml for battery exemption settings.tracelet_platform_interface to ^0.9.0.FEAT: Proximity-based geofence auto-load/unload — only geofences within geofenceProximityRadius are registered with the OS, sorted by distance, capped
geofenceProximityRadius are registered with the OS, sorted by distance, capped at 100 (Android limit). Enables monitoring thousands of geofences.GeofenceManager.updateProximity() — re-evaluates which geofences to monitor on every location update, dynamically swapping registrations as the device moves.geofencesChange event fires with on/off arrays when geofences are activated/deactivated from proximity monitoring.maxMonitoredGeofences config respected — caps simultaneously monitored geofences below the platform limit.tracelet_platform_interface to ^0.8.3.DOCS: Improve README visuals with combined Android & iOS demo image.
DOCS: Document iOS background hardening changes (no Android code changes in this release).
FEAT: OemCompat utility — comprehensive OEM compatibility layer with manufacturer detection (Huawei, Xiaomi, OnePlus, Samsung, Oppo, Vivo), aggression
OemCompat utility — comprehensive OEM compatibility layer with manufacturer detection (Huawei, Xiaomi, OnePlus, Samsung, Oppo, Vivo), aggression ratings (0–5), and OEM-specific settings deep-links.LocationManagerService wakelock tag to bypass PowerGenie background killing.PackageManager.resolveActivity().getSettingsHealth method channel handler — returns full device OEM health map.openOemSettings method channel handler — launches OEM settings by label.LocationService — acquire on start, release on stop/destroy/taskRemoved.BOOT_COMPLETED processing to survive aggressive OEM process killing.consumer-rules.pro) — prevents stripping of services, receivers, Room entities, and Kotlin metadata in release builds.tracelet_platform_interface to ^0.8.0.DOCS: Add mock location detection feature to README with platform-specific detection details.
tracelet_platform_interface to ^0.7.1.FEAT: Mock location detection — isLocationMock() uses Location.isMock() (API 31+) and isFromMockProvider() (API 18+) to flag spoofed GPS.
isLocationMock() uses Location.isMock() (API 31+) and isFromMockProvider() (API 18+) to flag spoofed GPS.SystemClock.elapsedRealtimeNanos drift detection (> 5s = suspicious).enrichLocation() includes mock flag and mockHeuristics metadata map (satellites, elapsedRealtimeDriftMs, platformFlagMock).rejectMockLocations is enabled, drops mocked locations before sending to Dart and fires ProviderChangeEvent.mockLocationsDetected.ConfigManager.getMockDetectionLevel() and getRejectMockLocations() getters.tracelet_platform_interface to ^0.7.0.REFACTOR: Remove 6 dead ConfigManager constants and methods for filtering migrated to Dart in 0.6.0 (getDisableElasticity, getElasticityMultiplier, ge
ConfigManager constants and methods for filtering migrated to Dart in 0.6.0 (getDisableElasticity, getElasticityMultiplier, getFilterPolicy, getMaxImpliedSpeed, getTrackingAccuracyThreshold, getUseKalmanFilter).EventDispatcher.sendTrip() and "trip" channel registration — trip events now from Dart TripManager.tracelet_platform_interface to ^0.6.1.REFACTOR: Remove duplicate location filtering from LocationEngine.onLocationReceived() — elasticity, distance filter, accuracy filter, and speed filte
LocationEngine.onLocationReceived() — elasticity, distance filter, accuracy filter, and speed filter now handled by shared Dart LocationProcessor.GeofenceManager.evaluateHighAccuracyProximity() with no-op stub — proximity evaluation moved to shared Dart GeofenceEvaluator.tracelet_platform_interface to ^0.6.0.CHORE: Bump tracelet_platform_interface to ^0.5.5.
tracelet_platform_interface to ^0.5.5.FIX: Heartbeat event now wraps location data in {"location": ...} to match HeartbeatEvent.fromMap() — fixes heartbeat always returning zero coordinate
{"location": ...} to match HeartbeatEvent.fromMap() — fixes heartbeat always returning zero coordinates.enrichLocation()) when getCurrentPosition returns null.CHORE: Bump tracelet_platform_interface to ^0.5.3.
tracelet_platform_interface to ^0.5.3.FEAT: Accelerometer-only motion detection mode — when disableMotionActivityUpdates is true, uses hardware accelerometer + TYPE_SIGNIFICANT_MOTION sens
disableMotionActivityUpdates is true, uses hardware accelerometer + TYPE_SIGNIFICANT_MOTION sensor for permission-free stationary↔moving detection.ActivityRecognitionClient — no longer created when unused in accelerometer-only mode.SensorManager instance via obtainSensorManager() instead of re-fetching on each call.ACTIVITY_RECOGNITION permission throws SecurityException, automatically falls back to accelerometer-only mode.activityTransition() helper to reduce boilerplate in transition registration.DOCS: Rewrite README with proper description, setup guide link, and related packages table.
CHORE: Bump tracelet_platform_interface to ^0.5.0.
tracelet_platform_interface to ^0.5.0.FEAT: getMotionPermissionStatus() / requestMotionPermission() — ACTIVITY_RECOGNITION permission handling.
getMotionPermissionStatus() / requestMotionPermission() — ACTIVITY_RECOGNITION permission handling.MotionDetector.start() when stationary.lastEffectiveSpeed in LocationEngine.\n in import line.tracelet_platform_interface to ^0.4.0.FEAT: One-shot location via getCurrentPosition() with persist, samples, maximumAge, and extras parameters.
getCurrentPosition() with persist, samples, maximumAge, and extras parameters.getLastKnownLocation() with 3-tier fallback — in-memory cache → FusedLocationProviderClient → system LocationManager (GPS/Network).ForegroundServiceConfig.enabled — conditionally start/stop foreground service based on config.requestLocationUpdates with sequential getCurrentLocation() calls in collectSamples() to avoid silent throttling on budget devices without foreground service.tracelet_platform_interface: ^0.3.0.Fix LICENSE file format for proper SPDX detection on pub.dev.
Fix ConfigManager.setConfig() — flatten nested section sub-maps (geo, app, http, etc.) sent by Dart before processing. Fixes foreground service notifi
ConfigManager.setConfig() — flatten nested section sub-maps (geo, app, http, etc.) sent by Dart before processing. Fixes foreground service notification config (title, text, channel, priority) and all other sub-config values being silently ignored.Version bump for coordinated release.
Add SPDX license: Apache-2.0 identifier for pub.dev scoring.
license: Apache-2.0 identifier for pub.dev scoring.FusedLocationProvider-based location tracking.
Your coding agent can read these notes before it upgrades. Set up the MCP server →