diff --git a/mobile/.gitignore b/mobile/.gitignore
index 1b035f8f3d..f643592c03 100644
--- a/mobile/.gitignore
+++ b/mobile/.gitignore
@@ -49,3 +49,8 @@ app.*.map.json
 
 # Fastlane
 ios/fastlane/report.xml
+
+# Isar
+default.isar
+default.isar.lock
+libisar.so
\ No newline at end of file
diff --git a/mobile/.isar b/mobile/.isar
index 70da4e0bbd..6643d064ab 160000
--- a/mobile/.isar
+++ b/mobile/.isar
@@ -1 +1 @@
-Subproject commit 70da4e0bbd7be1005a3cfc38a8cd39f1c8fc530f
+Subproject commit 6643d064abf22606b6c6a741ea873e4781115ef4
diff --git a/mobile/lib/modules/backup/models/backup_album.model.g.dart b/mobile/lib/modules/backup/models/backup_album.model.g.dart
index 87dfcab1cc..0f8f07bcba 100644
--- a/mobile/lib/modules/backup/models/backup_album.model.g.dart
+++ b/mobile/lib/modules/backup/models/backup_album.model.g.dart
@@ -7,7 +7,7 @@ part of 'backup_album.model.dart';
 // **************************************************************************
 
 // coverage:ignore-file
-// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters
+// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types
 
 extension GetBackupAlbumCollection on Isar {
   IsarCollection<BackupAlbum> get backupAlbums => this.collection();
@@ -45,7 +45,7 @@ const BackupAlbumSchema = CollectionSchema(
   getId: _backupAlbumGetId,
   getLinks: _backupAlbumGetLinks,
   attach: _backupAlbumAttach,
-  version: '3.0.5',
+  version: '3.1.0+1',
 );
 
 int _backupAlbumEstimateSize(
diff --git a/mobile/lib/modules/backup/models/duplicated_asset.model.g.dart b/mobile/lib/modules/backup/models/duplicated_asset.model.g.dart
index 087925d3db..a1950bbe12 100644
--- a/mobile/lib/modules/backup/models/duplicated_asset.model.g.dart
+++ b/mobile/lib/modules/backup/models/duplicated_asset.model.g.dart
@@ -7,7 +7,7 @@ part of 'duplicated_asset.model.dart';
 // **************************************************************************
 
 // coverage:ignore-file
-// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters
+// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types
 
 extension GetDuplicatedAssetCollection on Isar {
   IsarCollection<DuplicatedAsset> get duplicatedAssets => this.collection();
@@ -34,7 +34,7 @@ const DuplicatedAssetSchema = CollectionSchema(
   getId: _duplicatedAssetGetId,
   getLinks: _duplicatedAssetGetLinks,
   attach: _duplicatedAssetAttach,
-  version: '3.0.5',
+  version: '3.1.0+1',
 );
 
 int _duplicatedAssetEstimateSize(
diff --git a/mobile/lib/shared/models/album.g.dart b/mobile/lib/shared/models/album.g.dart
index e483907a24..8d24155657 100644
--- a/mobile/lib/shared/models/album.g.dart
+++ b/mobile/lib/shared/models/album.g.dart
@@ -7,7 +7,7 @@ part of 'album.dart';
 // **************************************************************************
 
 // coverage:ignore-file
-// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters
+// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types
 
 extension GetAlbumCollection on Isar {
   IsarCollection<Album> get albums => this.collection();
@@ -111,7 +111,7 @@ const AlbumSchema = CollectionSchema(
   getId: _albumGetId,
   getLinks: _albumGetLinks,
   attach: _albumAttach,
-  version: '3.0.5',
+  version: '3.1.0+1',
 );
 
 int _albumEstimateSize(
diff --git a/mobile/lib/shared/models/asset.g.dart b/mobile/lib/shared/models/asset.g.dart
index bad9e958e8..e7085bad4c 100644
--- a/mobile/lib/shared/models/asset.g.dart
+++ b/mobile/lib/shared/models/asset.g.dart
@@ -7,7 +7,7 @@ part of 'asset.dart';
 // **************************************************************************
 
 // coverage:ignore-file
-// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters
+// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types
 
 extension GetAssetCollection on Isar {
   IsarCollection<Asset> get assets => this.collection();
@@ -142,7 +142,7 @@ const AssetSchema = CollectionSchema(
   getId: _assetGetId,
   getLinks: _assetGetLinks,
   attach: _assetAttach,
-  version: '3.0.5',
+  version: '3.1.0+1',
 );
 
 int _assetEstimateSize(
diff --git a/mobile/lib/shared/models/etag.g.dart b/mobile/lib/shared/models/etag.g.dart
index acfec7040e..0342531e1c 100644
--- a/mobile/lib/shared/models/etag.g.dart
+++ b/mobile/lib/shared/models/etag.g.dart
@@ -7,7 +7,7 @@ part of 'etag.dart';
 // **************************************************************************
 
 // coverage:ignore-file
-// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters
+// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types
 
 extension GetETagCollection on Isar {
   IsarCollection<ETag> get eTags => this.collection();
@@ -53,7 +53,7 @@ const ETagSchema = CollectionSchema(
   getId: _eTagGetId,
   getLinks: _eTagGetLinks,
   attach: _eTagAttach,
-  version: '3.0.5',
+  version: '3.1.0+1',
 );
 
 int _eTagEstimateSize(
diff --git a/mobile/lib/shared/models/exif_info.g.dart b/mobile/lib/shared/models/exif_info.g.dart
index 708bf700b6..9122942bd9 100644
--- a/mobile/lib/shared/models/exif_info.g.dart
+++ b/mobile/lib/shared/models/exif_info.g.dart
@@ -7,7 +7,7 @@ part of 'exif_info.dart';
 // **************************************************************************
 
 // coverage:ignore-file
-// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters
+// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types
 
 extension GetExifInfoCollection on Isar {
   IsarCollection<ExifInfo> get exifInfos => this.collection();
@@ -99,7 +99,7 @@ const ExifInfoSchema = CollectionSchema(
   getId: _exifInfoGetId,
   getLinks: _exifInfoGetLinks,
   attach: _exifInfoAttach,
-  version: '3.0.5',
+  version: '3.1.0+1',
 );
 
 int _exifInfoEstimateSize(
diff --git a/mobile/lib/shared/models/logger_message.model.g.dart b/mobile/lib/shared/models/logger_message.model.g.dart
index 1d763754e0..a6b960eece 100644
--- a/mobile/lib/shared/models/logger_message.model.g.dart
+++ b/mobile/lib/shared/models/logger_message.model.g.dart
@@ -7,7 +7,7 @@ part of 'logger_message.model.dart';
 // **************************************************************************
 
 // coverage:ignore-file
-// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters
+// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types
 
 extension GetLoggerMessageCollection on Isar {
   IsarCollection<LoggerMessage> get loggerMessages => this.collection();
@@ -55,7 +55,7 @@ const LoggerMessageSchema = CollectionSchema(
   getId: _loggerMessageGetId,
   getLinks: _loggerMessageGetLinks,
   attach: _loggerMessageAttach,
-  version: '3.0.5',
+  version: '3.1.0+1',
 );
 
 int _loggerMessageEstimateSize(
diff --git a/mobile/lib/shared/models/store.g.dart b/mobile/lib/shared/models/store.g.dart
index 6370573a68..00f8ea0bf4 100644
--- a/mobile/lib/shared/models/store.g.dart
+++ b/mobile/lib/shared/models/store.g.dart
@@ -7,7 +7,7 @@ part of 'store.dart';
 // **************************************************************************
 
 // coverage:ignore-file
-// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters
+// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types
 
 extension GetStoreValueCollection on Isar {
   IsarCollection<StoreValue> get storeValues => this.collection();
@@ -39,7 +39,7 @@ const StoreValueSchema = CollectionSchema(
   getId: _storeValueGetId,
   getLinks: _storeValueGetLinks,
   attach: _storeValueAttach,
-  version: '3.0.5',
+  version: '3.1.0+1',
 );
 
 int _storeValueEstimateSize(
diff --git a/mobile/lib/shared/models/user.g.dart b/mobile/lib/shared/models/user.g.dart
index d70fd02df2..26f20b9854 100644
--- a/mobile/lib/shared/models/user.g.dart
+++ b/mobile/lib/shared/models/user.g.dart
@@ -7,7 +7,7 @@ part of 'user.dart';
 // **************************************************************************
 
 // coverage:ignore-file
-// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters
+// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types
 
 extension GetUserCollection on Isar {
   IsarCollection<User> get users => this.collection();
@@ -98,7 +98,7 @@ const UserSchema = CollectionSchema(
   getId: _userGetId,
   getLinks: _userGetLinks,
   attach: _userAttach,
-  version: '3.0.5',
+  version: '3.1.0+1',
 );
 
 int _userEstimateSize(
diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock
index 9e25b5341d..736b7a4f56 100644
--- a/mobile/pubspec.lock
+++ b/mobile/pubspec.lock
@@ -624,26 +624,26 @@ packages:
     dependency: "direct main"
     description:
       name: isar
-      sha256: "5be35dbc489880fccc535da3d1c4b3f5fdeee6ebfcacd4b149e39e803c4029cd"
+      sha256: "99165dadb2cf2329d3140198363a7e7bff9bbd441871898a87e26914d25cf1ea"
       url: "https://pub.dev"
     source: hosted
-    version: "3.0.5"
+    version: "3.1.0+1"
   isar_flutter_libs:
     dependency: "direct main"
     description:
       name: isar_flutter_libs
-      sha256: "9794524734856a8a3629652f9f359b66e3fea3cebeec4dbdeb3e3a8fb253073e"
+      sha256: bc6768cc4b9c61aabff77152e7f33b4b17d2fc93134f7af1c3dd51500fe8d5e8
       url: "https://pub.dev"
     source: hosted
-    version: "3.0.5"
+    version: "3.1.0+1"
   isar_generator:
     dependency: "direct dev"
     description:
       name: isar_generator
-      sha256: ee4ab5d5b251bc7e86e1257793b57af100065831f00f3a12404b177ae53c2d69
+      sha256: "76c121e1295a30423604f2f819bc255bc79f852f3bc8743a24017df6068ad133"
       url: "https://pub.dev"
     source: hosted
-    version: "3.0.5"
+    version: "3.1.0+1"
   js:
     dependency: transitive
     description:
diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml
index 358f17abc5..1ac05703f7 100644
--- a/mobile/pubspec.yaml
+++ b/mobile/pubspec.yaml
@@ -3,7 +3,7 @@ description: Immich - selfhosted backup media file on mobile phone
 
 publish_to: "none"
 version: 1.57.1+80
-isar_version: &isar_version 3.0.5
+isar_version: &isar_version 3.1.0+1
 
 environment:
   sdk: ">=3.0.0-0 <4.0.0"
diff --git a/mobile/test/sync_service_test.dart b/mobile/test/sync_service_test.dart
index 177e9439c3..0d1045c729 100644
--- a/mobile/test/sync_service_test.dart
+++ b/mobile/test/sync_service_test.dart
@@ -47,6 +47,7 @@ void main() {
         LoggerMessageSchema
       ],
       maxSizeMiB: 256,
+      directory: ".",
     );
   }