tracelet 1.3.6
tracelet: ^1.3.6 copied to clipboard
Production-grade background geolocation for Flutter. Battery-conscious tracking, geofencing, SQLite persistence, HTTP sync, and headless execution for iOS & Android.
1.3.6 #
- FIX:
SQLQuery.startandSQLQuery.endnow correctly filter locations on all platforms (Android, iOS, Web). - FIX: Add
offsetfield toSQLQueryto match native handler expectations. - FIX:
getCount()now accepts optionalSQLQueryfor time-bounded counting. - PERF:
DeltaEncoder.encodeis 2.1x faster (cached DateTime parsing, precomputed rounding factors). - PERF:
GeoUtils.haversineoptimized — fewer trig calls, precomputed constants. - CHORE: Update cross-package dependency constraints to
^1.3.6.
1.3.5 #
- FIX: iOS — fix
Unable to find module dependency: 'TraceletCore'build error. - CHORE: Update cross-package dependency constraints to
^1.3.5.
1.3.4 #
- 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 when installed from pub.dev. - FIX: iOS — bundle TraceletCore Swift source directly inside the plugin package instead of depending on an unpublished local CocoaPod.
- CHORE: Remove React Native support to simplify the monorepo.
1.3.2 #
- PERF: Android — streaming
JsonWriterreplaces per-locationJSONObjectallocations in batch sync (A-L5). - PERF: iOS — C-level UUID generation replaces Foundation
UUID()inLocationEngineandTraceletDatabase(I-M6). - PERF: Performance audit now 77/77 items resolved (100%).
1.3.1 #
- FIX: Resolve
extraskey collision betweenHttpConfigandPersistenceConfig— serialization keys renamed tohttpExtrasandpersistenceExtrasto prevent native ConfigManager flat-merge from overwriting one with the other. Backward-compatible viafromMapfallback. - PERF: Add 22 new benchmarks covering DeltaEncoder, BatteryBudgetEngine, CarbonEstimator, PersistDecider, Config/State serialization.
- PERF: iOS
markSynced()now uses chunked prepared statements (500 UUIDs/chunk) to avoid SQLite variable limit and improve sync performance.
1.3.0 #
- FIX:
getState()always returnedenabled: falseon iOS — the iOSStateManager.toMap()flat-merged config keys into the state dictionary, overwritingenabledandisMovingwith config defaults. Fixed by nesting config under a"config"key, matching Android behavior (#26).
1.2.0 #
Breaking Changes #
- REFACTOR:
ForegroundServiceConfig.notificationPrioritychanged frominttoNotificationPriorityenum. Replace raw integers (-2..2) with enum values (NotificationPriority.min,.low,.defaultPriority,.high,.max). - REFACTOR:
AuditConfig.hashAlgorithmchanged fromStringtoHashAlgorithmenum. Replace'SHA-256'withHashAlgorithm.sha256,'SHA-512'withHashAlgorithm.sha512, etc. - REFACTOR:
MotionConfig.triggerActivitieschanged from comma-separatedStringtoSet<ActivityType>. Replace'on_foot, in_vehicle'with{ActivityType.onFoot, ActivityType.inVehicle}.
Notes #
- Native platform channel serialization is backward-compatible — no native code changes required.
notificationPrioritystill serializes as int,hashAlgorithmas"SHA-256"string, andtriggerActivitiesas comma-separated string.
1.1.0 #
New Features #
- FEAT: Add
ComplianceReportmodel andTracelet.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). SupportstoJson()for automated tooling integration andtoMarkdown()for human-readable audit documents. - FEAT: Add
BatteryBudgetEnginealgorithm — a feedback control loop that automatically adjustsdistanceFilter,desiredAccuracy, and periodic interval to maintain a configurable battery budget. SetbatteryBudgetPerHourinGeoConfig(typical range: 1.0–5.0 %/hr) to enable. Subscribe toTracelet.onBudgetAdjustment()for real-time adjustment events showing current drain vs. target and the new parameters being applied. - FEAT: Add
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. ReturnsTripCarbonSummarywithtotalCarbonGrams,totalDistanceMeters,carbonByMode,distanceByMode, anddominantMode. Tracks cumulative totals across trips. - FEAT: Add
DeltaEncoderalgorithm — 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. - FEAT: Add
RTree<T>spatial index — O(log n) geofence proximity queries supporting 10,000+ geofences with sub-millisecond lookup. ProvidesqueryCircle()andqueryBBox()APIs with Haversine-verified results.
New Configuration Fields #
- FEAT:
GeoConfig.batteryBudgetPerHour(double, default0.0) — target max battery drain (%/hr). When > 0, enablesBatteryBudgetEnginewhich auto-adjusts accuracy, distance filter, and sample rate. Overrides manual settings. - FEAT:
GeoConfig.enableSparseUpdates(bool, defaultfalse) — app-level deduplication that drops locations withinsparseDistanceThreshold(default 50 m) of the last recorded position. UnlikedistanceFilter(which controls platform GPS sampling), this filters at the persistence layer.sparseMaxIdleSeconds(default 300) forces periodic "still here" updates. - FEAT:
GeoConfig.enableDeadReckoning(bool, defaultfalse) — inertial navigation using accelerometer + gyroscope + compass when GPS is lost for longer thandeadReckoningActivationDelayseconds (default 10). Auto-stops afterdeadReckoningMaxDurationseconds (default 120) to prevent IMU drift accumulation. - FEAT:
HttpConfig.enableDeltaCompression(bool, defaultfalse) — enable delta encoding for batch HTTP syncs.deltaCoordinatePrecision(default 6) controls coordinate precision. - FEAT:
HttpConfig.disableAutoSyncOnCellular(bool, defaultfalse) — skip auto-sync on cellular networks, only sync on WiFi. Supported on Android, iOS, and Web (via Network Information API). - FEAT:
GeoConfig.enableAdaptiveMode(bool, defaultfalse) — 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%. - FEAT: Periodic mode configuration:
periodicLocationInterval(60–43200 sec),periodicDesiredAccuracy,periodicUseForegroundService(Android — sub-15-min intervals),periodicUseExactAlarms(Android —AlarmManagerprecision).
Bug Fixes #
- FIX:
generateComplianceReport()andgetHealthCheck()no longer crash withtype 'Map<Object?, Object?>' is not a subtype of type 'Map<String, Object?>'errors. Platform channel maps are now safely converted viaMap<String, Object?>.from()instead of directascasts. Also fixed nested config sub-map casts (config,geo,http,audit,persistence) using null-safeis Mapchecks.
Infrastructure #
- CHORE: Migrate melos configuration from standalone
melos.yamltopubspec.yamlunder themelos: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 viamelos run <name>. - CHORE: Adopt Dart pub workspaces — root
pubspec.yamldeclaresworkspace:listing all 6 packages; each package declaresresolution: workspace. Removed 5pubspec_overrides.yamlfiles that are no longer needed. - CHORE: Upgrade melos dependency from
^6.0.0to^7.0.0.
1.0.2 #
- FIX: (Android/iOS) Geofence registrations were unconditionally destroyed on app termination and reset, even when
stopOnTerminate: falsewas configured withtrackingMode=1. Geofences now survive process death and are properly re-registered (#23).
1.0.1 #
- FIX: HTTP auto-sync was not triggered during automatic location tracking on any platform — locations accumulated in the database without being synced to the server (#21).
- FIX: (iOS)
HttpMethod.putwas silently ignored due to type mismatch in native config parsing. - FIX: (iOS) HTTP headers could be dropped when platform channel delivered mixed-type maps.
- FIX: (iOS)
maxBatchSizedefault corrected from 100 to 250.
1.0.0 #
🎉 Stable Release #
- FEAT: First stable release of
tracelet— production-grade background geolocation for Flutter. - DOCS: Add Play Store background location declaration guide.
- REFACTOR: Remove third-party company name references — use generic
flutter_background_geolocationthroughout. - REFACTOR: Rename migration guide to
MIGRATION-FROM-FBG.md. - All APIs are finalized and production-ready.
0.12.0 #
Performance Audit — 74 of 77 issues resolved #
- PERF: Cache
AdaptiveSamplingEngineinstance instead of re-creating per GPS fix (D-C1). - PERF: Add
Location.copyWithCoords()to eliminatetoMap()/fromMap()round-trip in Kalman filter hot path (D-C2). - PERF: Wire trip detection to processed location stream, eliminating duplicate
Location.fromMap()(D-H1). - PERF: Fast-path
_castToMapwith type check — avoids map copy when already correct type (D-H2). - PERF: Replace
.expand()with.where()in_filterLocationto avoid single-element list allocations (D-H4). - PERF: Cancel adaptive activity subscription in
removeListeners()(D-H7). - PERF: Use
.toList(growable: false)foraddGeofences/addPrivacyZonesresult lists (D-M6). - PERF: Invalidate cached stream pipeline on
setConfig()so it rebuilds with new settings (D-M8). - PERF: Use
Map.from()instead of.map()withMapEntryfor extras inLocation.fromMap()(D-L4). - REFACTOR: Deduplicate
LocationProcessorparameter list insetConfig()(D-L5).
0.11.5 #
- FIX: [Android/iOS] Polygon geofence
verticesare now correctly persisted to the native SQLite databases. Previously, vertex data was silently dropped duringaddGeofence(), causing polygon geofences to revert to circular after app restart.
0.11.4 #
- FIX: [iOS] Revert over-aggressive permission guards — When In Use permission now works correctly for all tracking modes. Only the killed-state auto-resume (
autoResumeTracking) requires Always authorization. iOS enforces permission at the OS level.
0.11.3 #
- FIX: [Android] Enforce
ACCESS_BACKGROUND_LOCATIONcheck on all killed-state restart paths (boot receiver, task removal, periodic alarms/workers). "While In Use" permission no longer triggers background tracking. - FIX: [iOS] Enforce
.authorizedAlwayscheck on killed-state auto-resume and guardallowsBackgroundLocationUpdates. "When In Use" permission no longer triggers tracking from killed state.- FEAT: AddTracelet.hasBackgroundPermissionstatic getter — convenience check that returnstruewhen location permission isAuthorizationStatus.always.
0.11.2 #
- DOCS: Fix 22 unresolved dartdoc references (
[Enterprise],[Config.*],[isValid],[brokenAtIndex],[brokenAtUuid]). - CHORE: Tighten all platform package constraints to
^0.11.2(fixespub downgradescore penalty).
0.11.1 #
- FEAT: Add
canScheduleExactAlarms()andopenExactAlarmSettings()static methods for Android exact alarm permission management. - FIX: Bypass
LocationProcessordistance/accuracy/speed filters for periodic location events — every timed fix is now delivered regardless of movement. - CHORE: Bump platform interface to 0.11.1.
0.11.0 #
- FEAT: Tamper-proof audit trail — SHA-256 hash chain for location integrity verification.
- FEAT: Privacy zones — exclude, degrade, or event-only actions for geographic privacy control.
- FEAT:
AuditConfigsub-config withenabled,hashAlgorithm,includeExtrasInHashoptions. - FEAT:
PrivacyZoneConfigsub-config withenabledtoggle. - FEAT:
PrivacyZonemodel withidentifier,latitude,longitude,radius,action,degradedAccuracyMeters. - FEAT:
AuditProofmodel for hash chain verification results. - FEAT: CRUD API:
addPrivacyZone(),addPrivacyZones(),removePrivacyZone(),removePrivacyZones(),getPrivacyZones(). - FEAT: Audit API:
getAuditTrail(),verifyAuditTrail(),getAuditProof(). - DOCS: Added AUDIT-TRAIL.md and PRIVACY-ZONES.md guides.
- CHORE: Bump all platform packages to ^0.11.0.
0.10.0 #
- FEAT: Periodic mode —
Tracelet.startPeriodic()for GPS-friendly interval tracking. GPS icon visible only ~5–10 seconds per fix instead of permanently. - FEAT:
GeoConfigperiodic options:periodicLocationInterval,periodicDesiredAccuracy,periodicUseForegroundService,periodicUseExactAlarms. - FEAT: Three Android scheduling strategies: WorkManager (default, battery-optimal), foreground service (reliable timing), and AlarmManager exact alarms (precise, no notification).
- FEAT: Example app: periodic mode UI section with start/stop toggle, custom settings dialog, and map integration with distinct cyan markers.
- DOCS: Updated API.md, CONFIGURATION.md, BACKGROUND-TRACKING.md, and INSTALL-ANDROID.md with periodic mode and exact alarms documentation.
- CHORE: Bump all platform packages to ^0.10.0.
0.9.1 #
- FIX: iOS
HttpSyncManageroptionalUIBackgroundTaskIdentifierunwrap safety.
0.9.0 #
- FEAT: Adaptive sampling engine — auto-adjusts
distanceFilterbased on detected activity type, battery level, and speed. Enable withGeoConfig(enableAdaptiveMode: true). See Adaptive Sampling Guide. - FEAT: Health check API —
Tracelet.getHealth()returns a comprehensive diagnostic snapshot covering tracking state, permissions, battery, sensors, database, and geofence state with actionableHealthWarningenum. See Health Check Guide. - FEAT: HTTP sync retry metadata —
HttpEventnow includesisRetryandretryCountfields. - FEAT: Configurable motion sensitivity —
MotionConfiggainsshakeThreshold,stillThreshold, andstillSampleCountfor tuning accelerometer-based motion detection. - FEAT:
HealthWarningDescriptionextension with.descriptiongetter for human-readable warning text. - CHORE: Bump all platform dependencies to ^0.9.0.
0.8.3 #
- FEAT: Unlimited geofences via proximity-based auto-load/unload — only geofences within
geofenceProximityRadiusare registered with the OS (up to 100 on Android, 20 on iOS), sorted by distance. Enables monitoring thousands of geofences despite platform limits. - FEAT:
geofencesChangeevent fires when geofences are activated/deactivated from proximity monitoring. - CHORE: Bump all platform dependencies to ^0.8.3.
0.8.2 #
- DOCS: Improve README visuals with combined Android & iOS demo image.
0.8.1 #
- PERF: iOS background hardening — all native operations (location persist, HTTP sync, headless engine boot, lifecycle transitions) now wrapped in
beginBackgroundTaskfor safe background execution. - FEAT: iOS 17+
CLBackgroundActivitySessionsupport — extends background runtime for location tracking. - FEAT: iOS 18+
CLServiceSessionsupport — maintains authorization state during background execution. - FIX: iOS
preventSuspendlifecycle gaps — audio keep-alive now correctly started/stopped in all tracking modes and transitions. - FIX: Web EventChannel bridge — all event streams (
onLocation,onMotionChange,onHeartbeat, etc.) were broken on web due to events being consumed but never forwarded. Now works correctly. - CHORE: Bump
tracelet_iosto ^0.8.1,tracelet_webto ^0.8.1.
0.8.0 #
- FEAT: OEM compatibility — automatic mitigations for aggressive OEM power management (Huawei, Xiaomi, OnePlus, Samsung, Oppo, Vivo).
- FEAT:
Tracelet.getSettingsHealth()— device health API returning manufacturer, aggression rating, battery optimization status, and available OEM settings screens. - FEAT:
Tracelet.openOemSettings(label)— open OEM-specific settings screens (autostart, battery saver, app launch) by label. - DOCS: Comprehensive OEM-COMPATIBILITY.md guide with per-manufacturer instructions.
- DOCS: Update README with OEM compatibility feature and documentation link.
- CHORE: Bump all platform dependencies to ^0.8.0.
0.7.1 #
- DOCS: Add mock location detection feature to README with documentation links and feature description.
- DOCS: Add Mock Detection guide to documentation table.
- CHORE: Bump all platform dependencies to ^0.7.1.
0.7.0 #
- FEAT: Mock location detection & prevention — detect and reject spoofed GPS locations across Android, iOS, and Web.
- FEAT:
Location.isMockfield — boolean flag indicating if a location came from a mock provider. - FEAT:
Location.mockHeuristicsfield —MockHeuristicsmetadata (satellite count, elapsed realtime drift, timestamp drift, platform flag). - FEAT:
LocationFilter.rejectMockLocationsconfig — block spoofed locations from reaching the app. - FEAT:
LocationFilter.mockDetectionLevelconfig —MockDetectionLevelenum (disabled,basic,heuristic) for configurable detection depth. - FEAT:
ProviderChangeEvent.mockLocationsDetected— real-time alert when mock locations are detected. - FEAT: Re-export
MockDetectionLevelfromtracelet.dartbarrel file. - DOCS: Comprehensive MOCK-DETECTION.md guide.
- DOCS: Updated CONFIGURATION.md with mock detection options.
- CHORE: Bump all platform dependencies to ^0.7.0.
0.6.1 #
- CHORE: Bump all platform dependencies to ^0.6.1.
0.6.0 #
- FEAT: Integrate shared Dart
LocationProcessorintoonLocationstream — distance filtering, elasticity, accuracy filtering, and speed filtering now run in Dart for cross-platform consistency. - FEAT: Integrate shared Dart
GeofenceEvaluatorfor high-accuracy proximity checks. - FIX: Fix broadcast stream bug — stateful
LocationProcessorandKalmanLocationFilterwere 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. - PERF: Native code no longer duplicates filtering logic — significantly reduces native code surface.
- CHORE: Bump all platform dependencies to ^0.6.0.
0.5.5 #
- FIX: iOS
onScheduleevent now sends full state map instead of partial data. - CHORE: Bump all platform dependencies to ^0.5.5.
0.5.4 #
- FIX: Heartbeat events no longer return zero coordinates on Android and iOS.
0.5.3 #
- CHORE: Bump all platform dependencies to ^0.5.3.
0.5.2 #
- FEAT:
disableMotionActivityUpdatesnow falls back to permission-free accelerometer-only motion detection instead of disabling all motion detection entirely. - DOCS: Expanded
MotionConfig.disableMotionActivityUpdatesdocumentation with fallback behavior, use cases, and battery notes. - DOCS: Updated
getMotionPermissionStatus()/requestMotionPermission()docs to reflect accelerometer-only mode behavior. - DOCS: Added "Opting Out of Motion Permission" section to PERMISSIONS.md with comparison table.
0.5.1 #
- DOCS: Update README with web platform in architecture and documentation tables.
0.5.0 #
- FEAT: Add web platform support via
tracelet_webpackage. - FEAT: Guard
registerHeadlessTask()for web compatibility (kIsWebearly return). - DOCS: Add Web Support guide (
help/WEB-SUPPORT.md) with full API compatibility matrix. - DOCS: Update README with web platform in architecture table and documentation links.
- CHORE: Bump all platform dependencies to ^0.5.0.
0.4.0 #
- FEAT:
getMotionPermissionStatus()andrequestMotionPermission()APIs for activity recognition permission. - FIX: Speed always zero in motionchange events — track
lastEffectiveSpeedacross location updates. - DOCS: Split README into focused help guides (Permissions, Background Tracking, API, Configuration).
- DOCS: Add side-by-side Android/iOS demo recordings.
- CHORE: Bump all platform dependencies to ^0.4.0.
- CHORE: Format all Dart files.
0.3.0 #
- FEAT: One-shot location —
getCurrentPosition()now supportspersist,samples,maximumAge, andextrasparameters for enterprise single-time location requests. - FEAT:
getLastKnownLocation()— returns the last cached location without triggering the GPS, ornullif unavailable. - FEAT:
ForegroundServiceConfig.enabled— disable foreground service/notification for lightweight one-shot requests. - BREAKING: Bump all platform dependencies to ^0.3.0.
0.2.5 #
- Fix LICENSE file format for proper SPDX detection on pub.dev.
- Bump
tracelet_androiddependency to ^0.2.3. - Bump
tracelet_iosdependency to ^0.2.4.
0.2.4 #
- Bump
tracelet_androiddependency to ^0.2.2 (fixes config not applied to foreground notification). - Bump
tracelet_iosdependency to ^0.2.3 (fixes config values ignored on iOS).
0.2.3 #
- Bump
tracelet_iosdependency to ^0.2.2 (fixes iOSConfigManagercrash).
0.2.2 #
- Fix dangling library doc comment lint in
_helpers.dart.
0.2.1 #
- Add
tracelet_androidandtracelet_iosas explicit dependencies to fix default plugin resolution warnings.
0.2.0 #
- Add
isMovingfield toStatemodel. - Fix
Config.toMap()— use nested map structure to prevent extras key collision. - Fix
watchPositionlistener leak — subscriptions now tracked and cancelled. - Fix
removeListeners()to cancel all Dart-side stream subscriptions. - Change
LogLeveldefault fromofftoinfo. - Complete
==/hashCodeon all sub-config classes. - Extract shared deserialization helpers to reduce code duplication.
- Fix example (
LogConfig→LoggerConfig).
0.1.1 #
- Fix pubspec description length for pub.dev scoring.
- Add SPDX
license: Apache-2.0identifier. - Add
example/main.dartfor pub.dev documentation score.
0.1.0 #
- Initial release.
- Full background geolocation API with 38 public methods.
- 14 real-time event streams (location, motion, geofence, HTTP, etc.).
- Comprehensive config system: GeoConfig, AppConfig, HttpConfig, MotionConfig, GeofenceConfig, PersistenceConfig, LoggerConfig.
- Elasticity-based distance filter scaling.
- Location filtering and denoising.
- Headless Dart execution for background events.
- Scheduling with cron-like expressions.
removeListeners()for centralized cleanup.
