diff --git a/mobile/.fvmrc b/mobile/.fvmrc
index 07470f9cab..b987073ac6 100644
--- a/mobile/.fvmrc
+++ b/mobile/.fvmrc
@@ -1,3 +1,3 @@
 {
   "flutter": "3.29.3"
-}
+}
\ No newline at end of file
diff --git a/mobile/.vscode/settings.json b/mobile/.vscode/settings.json
index ceaf9a6ab8..9c5244f098 100644
--- a/mobile/.vscode/settings.json
+++ b/mobile/.vscode/settings.json
@@ -1,5 +1,5 @@
 {
-  "dart.flutterSdkPath": ".fvm/versions/3.24.3",
+  "dart.flutterSdkPath": ".fvm/versions/3.29.3",
   "search.exclude": {
     "**/.fvm": true
   },
diff --git a/mobile/lib/providers/map/map_service.provider.dart b/mobile/lib/providers/map/map_service.provider.dart
index 0d998c5173..4ae199789f 100644
--- a/mobile/lib/providers/map/map_service.provider.dart
+++ b/mobile/lib/providers/map/map_service.provider.dart
@@ -6,4 +6,4 @@ import 'package:riverpod_annotation/riverpod_annotation.dart';
 part 'map_service.provider.g.dart';
 
 @riverpod
-MapSerivce mapService(Ref ref) => MapSerivce(ref.watch(apiServiceProvider));
+MapService mapService(Ref ref) => MapService(ref.watch(apiServiceProvider));
diff --git a/mobile/lib/providers/map/map_service.provider.g.dart b/mobile/lib/providers/map/map_service.provider.g.dart
index 70e44da621..0bb5094c61 100644
--- a/mobile/lib/providers/map/map_service.provider.g.dart
+++ b/mobile/lib/providers/map/map_service.provider.g.dart
@@ -6,11 +6,11 @@ part of 'map_service.provider.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$mapServiceHash() => r'7b26bcd231ed5728ac51fe015dddbf8f91491abb';
+String _$mapServiceHash() => r'ffc8f38b726083452b9df236ed58903879348987';
 
 /// See also [mapService].
 @ProviderFor(mapService)
-final mapServiceProvider = AutoDisposeProvider<MapSerivce>.internal(
+final mapServiceProvider = AutoDisposeProvider<MapService>.internal(
   mapService,
   name: r'mapServiceProvider',
   debugGetCreateSourceHash:
@@ -21,6 +21,6 @@ final mapServiceProvider = AutoDisposeProvider<MapSerivce>.internal(
 
 @Deprecated('Will be removed in 3.0. Use Ref instead')
 // ignore: unused_element
-typedef MapServiceRef = AutoDisposeProviderRef<MapSerivce>;
+typedef MapServiceRef = AutoDisposeProviderRef<MapService>;
 // ignore_for_file: type=lint
 // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
diff --git a/mobile/lib/services/api.service.dart b/mobile/lib/services/api.service.dart
index 92b077ef59..24bdccc04d 100644
--- a/mobile/lib/services/api.service.dart
+++ b/mobile/lib/services/api.service.dart
@@ -10,6 +10,7 @@ import 'package:immich_mobile/entities/store.entity.dart';
 import 'package:immich_mobile/utils/url_helper.dart';
 import 'package:logging/logging.dart';
 import 'package:openapi/api.dart';
+import 'package:immich_mobile/utils/user_agent.dart';
 
 class ApiService implements Authentication {
   late ApiClient _apiClient;
@@ -48,6 +49,7 @@ class ApiService implements Authentication {
 
   setEndpoint(String endpoint) {
     _apiClient = ApiClient(basePath: endpoint, authentication: this);
+    _setUserAgentHeader();
     if (_accessToken != null) {
       setAccessToken(_accessToken!);
     }
@@ -72,6 +74,11 @@ class ApiService implements Authentication {
     memoriesApi = MemoriesApi(_apiClient);
   }
 
+  Future<void> _setUserAgentHeader() async {
+    final userAgent = await getUserAgentString();
+    _apiClient.addDefaultHeader('User-Agent', userAgent);
+  }
+
   Future<String> resolveAndSetEndpoint(String serverUrl) async {
     final endpoint = await resolveEndpoint(serverUrl);
     setEndpoint(endpoint);
diff --git a/mobile/lib/services/map.service.dart b/mobile/lib/services/map.service.dart
index 26a0746414..2d236f77ef 100644
--- a/mobile/lib/services/map.service.dart
+++ b/mobile/lib/services/map.service.dart
@@ -2,13 +2,22 @@ import 'package:immich_mobile/mixins/error_logger.mixin.dart';
 import 'package:immich_mobile/models/map/map_marker.model.dart';
 import 'package:immich_mobile/services/api.service.dart';
 import 'package:logging/logging.dart';
+import 'package:maplibre_gl/maplibre_gl.dart';
+import 'package:immich_mobile/utils/user_agent.dart';
 
-class MapSerivce with ErrorLoggerMixin {
+class MapService with ErrorLoggerMixin {
   final ApiService _apiService;
   @override
   final logger = Logger("MapService");
 
-  MapSerivce(this._apiService);
+  MapService(this._apiService) {
+    _setMapUserAgentHeader();
+  }
+
+  Future<void> _setMapUserAgentHeader() async {
+    final userAgent = await getUserAgentString();
+    setHttpHeaders({'User-Agent': userAgent});
+  }
 
   Future<Iterable<MapMarker>> getMapMarkers({
     bool? isFavorite,
diff --git a/mobile/lib/utils/user_agent.dart b/mobile/lib/utils/user_agent.dart
new file mode 100644
index 0000000000..232bcaec38
--- /dev/null
+++ b/mobile/lib/utils/user_agent.dart
@@ -0,0 +1,15 @@
+import 'dart:io' show Platform;
+import 'package:package_info_plus/package_info_plus.dart';
+
+Future<String> getUserAgentString() async {
+  final packageInfo = await PackageInfo.fromPlatform();
+  String platform;
+  if (Platform.isAndroid) {
+    platform = 'Android';
+  } else if (Platform.isIOS) {
+    platform = 'iOS';
+  } else {
+    platform = 'Unknown';
+  }
+  return 'Immich_${platform}_${packageInfo.version}';
+}