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 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
41 versions withdrawn
withdrawn after publishing
7 months old
173 releases · first in 2026
FIX: Rename native 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).^1.4.6.TEST: Add integration tests for GPS-off fallback and reduced accuracy field serialization.
^1.4.5.One column per month.
FEAT: Add reducedAccuracy field to Location — true when iOS 14+ grants only approximate location authorization.
reducedAccuracy field to Location — true when iOS 14+ grants only approximate location authorization.[REDUCED] tag and gpsFallback=ON indicator for reduced/fallback location states.reducedAccuracy field (default, parse, snake_case, round-trip, copyWithCoords).^1.4.4.FEAT: Add locationSource field to Location — classifies each fix as gps, wifi, cell, network, or unknown.
locationSource field to Location — classifies each fix as gps, wifi, cell, network, or unknown.gpsFallback field to ProviderChangeEvent — signals when the engine auto-downgrades to Wi-Fi/cell positioning because GPS is disabled.^1.4.3.FIX: Dead reckoning activation now reliably detects GPS hardware state instead of using accuracy-based heuristic.
^1.4.2.FEAT: Dead reckoning — full native IMU sensor fusion for GPS-denied environments (tunnels, parking structures, urban canyons). Activates automatically
^1.4.1.FEAT: Encrypted SQLite — Tracelet.isDatabaseEncrypted() and Tracelet.encryptDatabase() for at-rest database encryption (SQLCipher on Android, Data Pro
Tracelet.isDatabaseEncrypted() and Tracelet.encryptDatabase() for at-rest database encryption (SQLCipher on Android, Data Protection on iOS).Tracelet.getAttestationToken() returns a platform attestation token (Play Integrity on Android, App Attest on iOS).onRemoteConfig event stream.Tracelet.getDeadReckoningState() stub for future accelerometer/gyroscope-based position estimation.Tracelet.getCarbonReport() returns CO₂ emission estimates from tracked journeys.SecurityConfig and AttestationConfig to Config model for enterprise feature configuration.^1.4.0.FIX: Android — fix ClassNotFoundException crash on app upgrade for BootReceiver and other manifest-declared components (fixes #31).
ClassNotFoundException crash on app upgrade for BootReceiver and other manifest-declared components (fixes #31).tracelet_android dependency constraint to ^1.3.7.FIX: SQLQuery.start and SQLQuery.end now correctly filter locations on all platforms (Android, iOS, Web).
SQLQuery.start and SQLQuery.end now correctly filter locations on all platforms (Android, iOS, Web).offset field to SQLQuery to match native handler expectations.getCount() now accepts optional SQLQuery for time-bounded counting.DeltaEncoder.encode is 2.1x faster (cached DateTime parsing, precomputed rounding factors).GeoUtils.haversine optimized — fewer trig calls, precomputed constants.^1.3.6.FIX: iOS — fix Unable to find module dependency: 'TraceletCore' build error.
Unable to find module dependency: 'TraceletCore' build error.^1.3.5.CHORE: Update cross-package dependency constraints to ^1.3.3.
^1.3.3.FIX: Android — bundle native core Kotlin source (com.tracelet.core.*) directly inside the plugin package, fixing "Unresolved reference" build errors w
com.tracelet.core.*) directly inside the plugin package, fixing "Unresolved reference" build errors when installed from pub.dev.PERF: Android — streaming JsonWriter replaces per-location JSONObject allocations in batch sync (A-L5).
JsonWriter replaces per-location JSONObject allocations in batch sync (A-L5).UUID() in LocationEngine and TraceletDatabase (I-M6).FIX: Resolve extras key collision between HttpConfig and PersistenceConfig — serialization keys renamed to httpExtras and persistenceExtras to prevent
extras key collision between HttpConfig and PersistenceConfig — serialization keys renamed to httpExtras and persistenceExtras to prevent native ConfigManager flat-merge from overwriting one with the other. Backward-compatible via fromMap fallback.markSynced() now uses chunked prepared statements (500 UUIDs/chunk) to avoid SQLite variable limit and improve sync performance.FIX: getState() always returned enabled: false on iOS — the iOS StateManager.toMap() flat-merged config keys into the state dictionary, overwriting en
getState() always returned enabled: false on iOS — the iOS StateManager.toMap() flat-merged config keys into the state dictionary, overwriting enabled and isMoving with config defaults. Fixed by nesting config under a "config" key, matching Android behavior (#26).REFACTOR: ForegroundServiceConfig.notificationPriority changed from int to NotificationPriority enum. Replace raw integers (-2..2) with enum values (N
ForegroundServiceConfig.notificationPriority changed from int to NotificationPriority enum. Replace raw integers (-2..2) with enum values (NotificationPriority.min, .low, .defaultPriority, .high, .max).AuditConfig.hashAlgorithm changed from String to HashAlgorithm enum. Replace 'SHA-256' with HashAlgorithm.sha256, 'SHA-512' with HashAlgorithm.sha512, etc.MotionConfig.triggerActivities changed from comma-separated String to Set<ActivityType>. Replace 'on_foot, in_vehicle' with {ActivityType.onFoot, ActivityType.inVehicle}.notificationPriority still serializes as int, hashAlgorithm as "SHA-256" string, and triggerActivities as comma-separated string.FEAT: Add ComplianceReport model and Tracelet.generateComplianceReport() API for GDPR Article 30 / CCPA data processing inventory reports. Auto-genera
ComplianceReport model and Tracelet.generateComplianceReport() API for GDPR Article 30 / CCPA data processing inventory reports. Auto-generates a structured snapshot of all location data collection metadata including: totalLocationsStored, totalLocationsSynced, data retention policy (maxDaysToPersist, maxRecordsToPersist), timestamp bounds of stored records (oldestRecord, newestRecord), database encryption status, active privacy zone count and identifiers, HTTP sync URL and auto-sync state, audit trail status with chain validation, permission states (location + motion), and tracking configuration flags (sparse updates, Kalman filter, delta compression, tracking mode). Supports toJson() for automated tooling integration and toMarkdown() for human-readable audit documents.BatteryBudgetEngine algorithm — a feedback control loop that automatically adjusts distanceFilter, desiredAccuracy, and periodic interval to maintain a configurable battery budget. Set batteryBudgetPerHour in GeoConfig (typical range: 1.0–5.0 %/hr) to enable. Subscribe to Tracelet.onBudgetAdjustment() for real-time adjustment events showing current drain vs. target and the new parameters being applied.CarbonEstimator — per-trip and cumulative CO₂ emission calculator using EU EEA 2024 mode-specific emission factors (gCO₂/km): car = 192, bus = 89, train = 41, walking/cycling = 0. Integrates with activity recognition to track distance per transport mode via Haversine. Returns TripCarbonSummary with totalCarbonGrams, totalDistanceMeters, carbonByMode, distanceByMode, and dominantMode. Tracks cumulative totals across trips.DeltaEncoder algorithm — batch location compression codec using delta encoding with 60–80% payload reduction. First location transmitted in full; subsequent positions as deltas with shortened field names and configurable coordinate precision (5 = ~1.1 m, 6 = ~0.11 m). Native implementations provided on Android (Kotlin) and iOS (Swift) for consistency.RTree<T> spatial index — O(log n) geofence proximity queries supporting 10,000+ geofences with sub-millisecond lookup. Provides queryCircle() and queryBBox() APIs with Haversine-verified results.GeoConfig.batteryBudgetPerHour (double, default 0.0) — target max battery drain (%/hr). When > 0, enables BatteryBudgetEngine which auto-adjusts accuracy, distance filter, and sample rate. Overrides manual settings.GeoConfig.enableSparseUpdates (bool, default false) — app-level deduplication that drops locations within sparseDistanceThreshold (default 50 m) of the last recorded position. Unlike distanceFilter (which controls platform GPS sampling), this filters at the persistence layer. sparseMaxIdleSeconds (default 300) forces periodic "still here" updates.GeoConfig.enableDeadReckoning (bool, default false) — inertial navigation using accelerometer + gyroscope + compass when GPS is lost for longer than deadReckoningActivationDelay seconds (default 10). Auto-stops after deadReckoningMaxDuration seconds (default 120) to prevent IMU drift accumulation.HttpConfig.enableDeltaCompression (bool, default false) — enable delta encoding for batch HTTP syncs. deltaCoordinatePrecision (default 6) controls coordinate precision.HttpConfig.disableAutoSyncOnCellular (bool, default false) — skip auto-sync on cellular networks, only sync on WiFi. Supported on Android, iOS, and Web (via Network Information API).GeoConfig.enableAdaptiveMode (bool, default false) — dynamic sampling based on activity type + battery level + charging state. Activity profiles: still → 500 m, walking → 50 m, driving → 10 m; battery scaling progressively widens filter below 50%/20%/10%.periodicLocationInterval (60–43200 sec), periodicDesiredAccuracy, periodicUseForegroundService (Android — sub-15-min intervals), periodicUseExactAlarms (Android — AlarmManager precision).generateComplianceReport() and getHealthCheck() no longer crash with type 'Map<Object?, Object?>' is not a subtype of type 'Map<String, Object?>' errors. Platform channel maps are now safely converted via Map<String, Object?>.from() instead of direct as casts. Also fixed nested config sub-map casts (config, geo, http, audit, persistence) using null-safe is Map checks.melos.yaml to pubspec.yaml under the melos: key for melos 7.x compatibility. All 13 scripts (analyze, format, format:fix, test, test:dart, pigeon, clean, pub:get, build:example:android/ios/web, coverage, benchmark) now run via melos run <name>.pubspec.yaml declares workspace: listing all 6 packages; each package declares resolution: workspace. Removed 5 pubspec_overrides.yaml files that are no longer needed.^6.0.0 to ^7.0.0.FIX: (Android/iOS) Geofence registrations were unconditionally destroyed on app termination and reset, even when stopOnTerminate: false was configured
stopOnTerminate: false was configured with trackingMode=1. Geofences now survive process death and are properly re-registered (#23).FIX: HTTP auto-sync was not triggered during automatic location tracking on any platform — locations accumulated in the database without being synced
HttpMethod.put was silently ignored due to type mismatch in native config parsing.maxBatchSize default corrected from 100 to 250.FEAT: First stable release of tracelet — production-grade background geolocation for Flutter.
tracelet — production-grade background geolocation for Flutter.flutter_background_geolocation throughout.MIGRATION-FROM-FBG.md.PERF: Cache AdaptiveSamplingEngine instance instead of re-creating per GPS fix (D-C1).
AdaptiveSamplingEngine instance instead of re-creating per GPS fix (D-C1).Location.copyWithCoords() to eliminate toMap()/fromMap() round-trip in Kalman filter hot path (D-C2).Location.fromMap() (D-H1)._castToMap with type check — avoids map copy when already correct type (D-H2)..expand() with .where() in _filterLocation to avoid single-element list allocations (D-H4).removeListeners() (D-H7)..toList(growable: false) for addGeofences/addPrivacyZones result lists (D-M6).setConfig() so it rebuilds with new settings (D-M8).Map.from() instead of .map() with MapEntry for extras in Location.fromMap() (D-L4).LocationProcessor parameter list in setConfig() (D-L5).FIX: [iOS] Revert over-aggressive permission guards — When In Use permission now works correctly for all tracking modes. Only the killed-state auto-re
autoResumeTracking) requires Always authorization. iOS enforces permission at the OS level.FIX: [Android] Enforce ACCESS_BACKGROUND_LOCATION check on all killed-state restart paths (boot receiver, task removal, periodic alarms/workers). "Whi
ACCESS_BACKGROUND_LOCATION check on all killed-state restart paths (boot receiver, task removal, periodic alarms/workers). "While In Use" permission no longer triggers background tracking..authorizedAlways check on killed-state auto-resume and guard allowsBackgroundLocationUpdates. "When In Use" permission no longer triggers tracking from killed state.- FEAT: Add Tracelet.hasBackgroundPermission static getter — convenience check that returns true when location permission is AuthorizationStatus.always.DOCS: Fix 22 unresolved dartdoc references ([Enterprise], [Config.*], [isValid], [brokenAtIndex], [brokenAtUuid]).
[Enterprise], [Config.*], [isValid], [brokenAtIndex], [brokenAtUuid]).^0.11.2 (fixes pub downgrade score penalty).FEAT: Add canScheduleExactAlarms() and openExactAlarmSettings() static methods for Android exact alarm permission management.
canScheduleExactAlarms() and openExactAlarmSettings() static methods for Android exact alarm permission management.LocationProcessor distance/accuracy/speed filters for periodic location events — every timed fix is now delivered regardless of movement.FEAT: Tamper-proof audit trail — SHA-256 hash chain for location integrity verification.
AuditConfig sub-config with enabled, hashAlgorithm, includeExtrasInHash options.PrivacyZoneConfig sub-config with enabled toggle.PrivacyZone model with identifier, latitude, longitude, radius, action, degradedAccuracyMeters.AuditProof model for hash chain verification results.addPrivacyZone(), addPrivacyZones(), removePrivacyZone(), removePrivacyZones(), getPrivacyZones().getAuditTrail(), verifyAuditTrail(), getAuditProof().FEAT: Periodic mode — Tracelet.startPeriodic() for GPS-friendly interval tracking. GPS icon visible only ~5–10 seconds per fix instead of permanently.
Tracelet.startPeriodic() for GPS-friendly interval tracking. GPS icon visible only ~5–10 seconds per fix instead of permanently.GeoConfig periodic options: periodicLocationInterval, periodicDesiredAccuracy, periodicUseForegroundService, periodicUseExactAlarms.FIX: iOS HttpSyncManager optional UIBackgroundTaskIdentifier unwrap safety.
HttpSyncManager optional UIBackgroundTaskIdentifier unwrap safety.FEAT: Adaptive sampling engine — auto-adjusts distanceFilter based on detected activity type, battery level, and speed. Enable with GeoConfig(enableAd
distanceFilter based on detected activity type, battery level, and speed. Enable with GeoConfig(enableAdaptiveMode: true). See Adaptive Sampling Guide.Tracelet.getHealth() returns a comprehensive diagnostic snapshot covering tracking state, permissions, battery, sensors, database, and geofence state with actionable HealthWarning enum. See Health Check Guide.HttpEvent now includes isRetry and retryCount fields.MotionConfig gains shakeThreshold, stillThreshold, and stillSampleCount for tuning accelerometer-based motion detection.HealthWarningDescription extension with .description getter for human-readable warning text.FEAT: Unlimited geofences via proximity-based auto-load/unload — only geofences within geofenceProximityRadius are registered with the OS (up to 100 o
geofenceProximityRadius are registered with the OS (up to 100 on Android, 20 on iOS), sorted by distance. Enables monitoring thousands of geofences despite platform limits.geofencesChange event fires when geofences are activated/deactivated from proximity monitoring.DOCS: Improve README visuals with combined Android & iOS demo image.
PERF: iOS background hardening — all native operations (location persist, HTTP sync, headless engine boot, lifecycle transitions) now wrapped in begin
beginBackgroundTask for safe background execution.CLBackgroundActivitySession support — extends background runtime for location tracking.CLServiceSession support — maintains authorization state during background execution.preventSuspend lifecycle gaps — audio keep-alive now correctly started/stopped in all tracking modes and transitions.onLocation, onMotionChange, onHeartbeat, etc.) were broken on web due to events being consumed but never forwarded. Now works correctly.tracelet_ios to ^0.8.1, tracelet_web to ^0.8.1.FEAT: OEM compatibility — automatic mitigations for aggressive OEM power management (Huawei, Xiaomi, OnePlus, Samsung, Oppo, Vivo).
Tracelet.getSettingsHealth() — device health API returning manufacturer, aggression rating, battery optimization status, and available OEM settings screens.Tracelet.openOemSettings(label) — open OEM-specific settings screens (autostart, battery saver, app launch) by label.DOCS: Add mock location detection feature to README with documentation links and feature description.
FEAT: Mock location detection & prevention — detect and reject spoofed GPS locations across Android, iOS, and Web.
Location.isMock field — boolean flag indicating if a location came from a mock provider.Location.mockHeuristics field — MockHeuristics metadata (satellite count, elapsed realtime drift, timestamp drift, platform flag).LocationFilter.rejectMockLocations config — block spoofed locations from reaching the app.LocationFilter.mockDetectionLevel config — MockDetectionLevel enum (disabled, basic, heuristic) for configurable detection depth.ProviderChangeEvent.mockLocationsDetected — real-time alert when mock locations are detected.MockDetectionLevel from tracelet.dart barrel file.CHORE: Bump all platform dependencies to ^0.6.1.
FEAT: Integrate shared Dart LocationProcessor into onLocation stream — distance filtering, elasticity, accuracy filtering, and speed filtering now run
LocationProcessor into onLocation stream — distance filtering, elasticity, accuracy filtering, and speed filtering now run in Dart for cross-platform consistency.GeofenceEvaluator for high-accuracy proximity checks.LocationProcessor and KalmanLocationFilter were called once per listener per event, causing second subscriber to see distance=0 and filter all locations. Now uses cached .asBroadcastStream() so transformations run exactly once.FIX: iOS onSchedule event now sends full state map instead of partial data.
onSchedule event now sends full state map instead of partial data.FIX: Heartbeat events no longer return zero coordinates on Android and iOS.
CHORE: Bump all platform dependencies to ^0.5.3.
FEAT: disableMotionActivityUpdates now falls back to permission-free accelerometer-only motion detection instead of disabling all motion detection ent
disableMotionActivityUpdates now falls back to permission-free accelerometer-only motion detection instead of disabling all motion detection entirely.MotionConfig.disableMotionActivityUpdates documentation with fallback behavior, use cases, and battery notes.getMotionPermissionStatus() / requestMotionPermission() docs to reflect accelerometer-only mode behavior.DOCS: Update README with web platform in architecture and documentation tables.
FEAT: Add web platform support via tracelet_web package.
tracelet_web package.registerHeadlessTask() for web compatibility (kIsWeb early return).help/WEB-SUPPORT.md) with full API compatibility matrix.FEAT: getMotionPermissionStatus() and requestMotionPermission() APIs for activity recognition permission.
getMotionPermissionStatus() and requestMotionPermission() APIs for activity recognition permission.lastEffectiveSpeed across location updates.FEAT: One-shot location — getCurrentPosition() now supports persist, samples, maximumAge, and extras parameters for enterprise single-time location re
getCurrentPosition() now supports persist, samples, maximumAge, and extras parameters for enterprise single-time location requests.getLastKnownLocation() — returns the last cached location without triggering the GPS, or null if unavailable.ForegroundServiceConfig.enabled — disable foreground service/notification for lightweight one-shot requests.Fix LICENSE file format for proper SPDX detection on pub.dev.
tracelet_android dependency to ^0.2.3.tracelet_ios dependency to ^0.2.4.Bump tracelet_android dependency to ^0.2.2 (fixes config not applied to foreground notification).
tracelet_android dependency to ^0.2.2 (fixes config not applied to foreground notification).tracelet_ios dependency to ^0.2.3 (fixes config values ignored on iOS).Bump tracelet_ios dependency to ^0.2.2 (fixes iOS ConfigManager crash).
tracelet_ios dependency to ^0.2.2 (fixes iOS ConfigManager crash).Fix dangling library doc comment lint in _helpers.dart.
_helpers.dart.Add tracelet_android and tracelet_ios as explicit dependencies to fix default plugin resolution warnings.
tracelet_android and tracelet_ios as explicit dependencies to fix default plugin resolution warnings.Add isMoving field to State model.
isMoving field to State model.Config.toMap() — use nested map structure to prevent extras key collision.watchPosition listener leak — subscriptions now tracked and cancelled.removeListeners() to cancel all Dart-side stream subscriptions.LogLevel default from off to info.==/hashCode on all sub-config classes.LogConfig → LoggerConfig).Fix pubspec description length for pub.dev scoring.
license: Apache-2.0 identifier.example/main.dart for pub.dev documentation score.Full background geolocation API with 38 public methods.
removeListeners() for centralized cleanup.Your coding agent can read these notes before it upgrades. Set up the MCP server →