diff --git a/lib/user/save_destination_standalone.dart b/lib/user/save_destination_standalone.dart
new file mode 100644
index 0000000000000000000000000000000000000000..a3ee673f49284e61fda85bacf160de8ba1e43f64
--- /dev/null
+++ b/lib/user/save_destination_standalone.dart
@@ -0,0 +1,48 @@
+import 'dart:async';
+import 'dart:io';
+
+import 'package:path/path.dart' as path;
+import 'package:path_provider/path_provider.dart';
+
+import 'profile.dart';
+import 'save_state.dart';
+
+class SaveDestinationStandalone with SaveDestination {
+  static const fileName = 'profile.json';
+
+  File? _saveFile;
+  FutureOr<File> get saveFile async => _saveFile ??= await _getSaveFile();
+
+  Profile? state;
+
+  Future<Directory> _getSaveDirectory() async {
+    if (Platform.isWindows) {
+      return await getApplicationCacheDirectory();
+    }
+    return await getApplicationDocumentsDirectory();
+  }
+
+  Future<File> _getSaveFile() async {
+    final directory = await _getSaveDirectory();
+    return File(path.join(directory.path, fileName));
+  }
+
+  @override
+  Future<void> save(String content) async {
+    final file = await saveFile;
+
+    await file.writeAsString(content);
+    print('Saved to ${file.path}');
+  }
+
+  @override
+  Future<String?> load() async {
+    final file = await saveFile;
+
+    if (!await file.exists()) {
+      return null;
+    }
+
+    return await file.readAsString();
+  }
+}
diff --git a/lib/user/save_destination_web.dart b/lib/user/save_destination_web.dart
new file mode 100644
index 0000000000000000000000000000000000000000..7fa675d13d0a86b8a77f543f21f73e116121f7f5
--- /dev/null
+++ b/lib/user/save_destination_web.dart
@@ -0,0 +1,13 @@
+import 'save_state.dart';
+
+class SaveDestinationWeb with SaveDestination {
+  @override
+  Future<String?> load() async {
+    return null;
+  }
+
+  @override
+  Future<void> save(String content) async {
+    print('Mock-saving $content');
+  }
+}
diff --git a/lib/user/save_state.dart b/lib/user/save_state.dart
index 0775c3b579e6fd1250cdf3de5b2e1925c888d105..83e7aefc51d089f9fad0ea011b45903f2c10b29f 100644
--- a/lib/user/save_state.dart
+++ b/lib/user/save_state.dart
@@ -1,52 +1,39 @@
 import 'dart:async';
 import 'dart:convert';
-import 'dart:io';
 
-import 'package:path/path.dart' as path;
-import 'package:path_provider/path_provider.dart';
+import 'package:flutter/foundation.dart';
 
 import 'profile.dart';
+import 'save_destination_standalone.dart';
+import 'save_destination_web.dart';
+
+mixin SaveDestination {
+  Future<void> save(String content);
+  Future<String?> load();
+}
 
 class SaveManager {
   static const fileName = 'profile.json';
 
-  File? _saveFile;
-  FutureOr<File> get saveFile async => _saveFile ??= await _getSaveFile();
+  final SaveDestination _destination =
+      kIsWeb ? SaveDestinationWeb() : SaveDestinationStandalone();
 
   Profile? state;
 
-  Future<Directory> _getSaveDirectory() async {
-    if (Platform.isWindows) {
-      return await getApplicationCacheDirectory();
-    }
-    return await getApplicationDocumentsDirectory();
-  }
-
-  Future<File> _getSaveFile() async {
-    final directory = await _getSaveDirectory();
-    return File(path.join(directory.path, fileName));
-  }
-
   Future<void> save() async {
-    final file = await saveFile;
-
     final jsonString = jsonEncode(state!.toJson());
-    await file.writeAsString(jsonString);
-    print('Saved to ${file.path}');
+    await _destination.save(jsonString);
   }
 
   Future<Profile> _load() async {
-    final file = await saveFile;
+    final jsonString = await _destination.load();
 
-    if (!await file.exists()) {
+    if (jsonString == null) {
       print('No profile saved, creating new one');
       return Profile();
     }
 
-    final fileContent = await file.readAsString();
-    final jsonContent = jsonDecode(fileContent);
-
-    print('Loading from ${file.path}');
+    final jsonContent = jsonDecode(jsonString);
     return Profile.fromJson(jsonContent);
   }