diff --git a/lib/ui/qr_manager.dart b/lib/ui/qr_manager.dart
index 642f18466566e42f65e12c3f52871f1dac51a952..50d3d65b5f9b9d54cd788be5578e23e2d9e1b504 100644
--- a/lib/ui/qr_manager.dart
+++ b/lib/ui/qr_manager.dart
@@ -1 +1,3 @@
-export 'qr_manager_mobile.dart' if (dart.library.html) 'qr_manager_web.dart';
+export 'qr_manager_mobile.dart'
+    if (dart.library.html) 'qr_manager_web.dart'
+    if (dart.library.io) 'qr_manager_linux.dart';
diff --git a/lib/ui/qr_manager_linux.dart b/lib/ui/qr_manager_linux.dart
new file mode 100644
index 0000000000000000000000000000000000000000..83c32a20977b07c0671fc7ee934961301f1112c1
--- /dev/null
+++ b/lib/ui/qr_manager_linux.dart
@@ -0,0 +1,81 @@
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_zxing/flutter_zxing.dart';
+
+// ignore: avoid_classes_with_only_static_members
+class QrManager {
+  static Future<String?> qrScan(BuildContext context) async {
+    try {
+      final Code? result = await Navigator.push(
+        context,
+        MaterialPageRoute(
+          builder: (BuildContext context) => const QrScannerScreen(),
+        ),
+      );
+
+      if (result != null && result.isValid) {
+        return result.text;
+      } else {
+        if (!context.mounted) {
+          return null;
+        }
+        ScaffoldMessenger.of(context).showSnackBar(
+          SnackBar(
+            content: Text(tr('qr_scanner_no_qr_detected')),
+            backgroundColor: Colors.red,
+          ),
+        );
+        return null;
+      }
+    } catch (e) {
+      debugPrint('Error scanning QR: $e');
+      if (!context.mounted) {
+        return null;
+      }
+      ScaffoldMessenger.of(context).showSnackBar(
+        SnackBar(
+          content: Text(tr('qr_scanner_error')),
+          backgroundColor: Colors.red,
+        ),
+      );
+      return null;
+    }
+  }
+}
+
+class QrScannerScreen extends StatelessWidget {
+  const QrScannerScreen({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(
+        title: Text(tr('qr_scanner_title')),
+      ),
+      body: ReaderWidget(
+        onScan: (Code result) {
+          if (result.isValid) {
+            Navigator.of(context).pop(result);
+          } else {
+            ScaffoldMessenger.of(context).showSnackBar(
+              SnackBar(
+                content: Text(tr('qr_scanner_no_qr_detected')),
+                backgroundColor: Colors.red,
+              ),
+            );
+          }
+        },
+        onScanFailure: (Code? result) {
+          ScaffoldMessenger.of(context).showSnackBar(
+            SnackBar(
+              content: Text(tr('qr_scanner_error')),
+              backgroundColor: Colors.red,
+            ),
+          );
+        },
+        scanDelay: const Duration(milliseconds: 500),
+        actionButtonsBackgroundColor: Colors.black.withOpacity(0.5),
+      ),
+    );
+  }
+}
diff --git a/pubspec.lock b/pubspec.lock
index 01d229613aeb210e47453d617dcde03130ea1a1f..792e8d1bf20a6d56527a7735f596bc9738ee72c0 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -238,6 +238,46 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "1.1.7"
+  camera:
+    dependency: transitive
+    description:
+      name: camera
+      sha256: "26ff41045772153f222ffffecba711a206f670f5834d40ebf5eed3811692f167"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.11.0+2"
+  camera_android_camerax:
+    dependency: transitive
+    description:
+      name: camera_android_camerax
+      sha256: e3627fdc2132d89212b8a8676679f5b07008c7e3d8ae00cea775c3397f9e742b
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.6.10"
+  camera_avfoundation:
+    dependency: transitive
+    description:
+      name: camera_avfoundation
+      sha256: "2e4c568f70e406ccb87376bc06b53d2f5bebaab71e2fbcc1a950e31449381bcf"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.9.17+5"
+  camera_platform_interface:
+    dependency: transitive
+    description:
+      name: camera_platform_interface
+      sha256: b3ede1f171532e0d83111fe0980b46d17f1aa9788a07a2fbed07366bbdbb9061
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.8.0"
+  camera_web:
+    dependency: transitive
+    description:
+      name: camera_web
+      sha256: "595f28c89d1fb62d77c73c633193755b781c6d2e0ebcd8dc25b763b514e6ba8f"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.3.5"
   characters:
     dependency: transitive
     description:
@@ -659,6 +699,38 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "0.2.14"
+  file_selector_linux:
+    dependency: transitive
+    description:
+      name: file_selector_linux
+      sha256: b2b91daf8a68ecfa4a01b778a6f52edef9b14ecd506e771488ea0f2e0784198b
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.9.3+1"
+  file_selector_macos:
+    dependency: transitive
+    description:
+      name: file_selector_macos
+      sha256: "271ab9986df0c135d45c3cdb6bd0faa5db6f4976d3e4b437cf7d0f258d941bfc"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.9.4+2"
+  file_selector_platform_interface:
+    dependency: transitive
+    description:
+      name: file_selector_platform_interface
+      sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.6.2"
+  file_selector_windows:
+    dependency: transitive
+    description:
+      name: file_selector_windows
+      sha256: "8f5d2f6590d51ecd9179ba39c64f722edc15226cc93dcc8698466ad36a4a85a4"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.9.3+3"
   filesystem_picker:
     dependency: "direct main"
     description:
@@ -798,6 +870,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "3.0.2"
+  flutter_plugin_android_lifecycle:
+    dependency: transitive
+    description:
+      name: flutter_plugin_android_lifecycle
+      sha256: "9b78450b89f059e96c9ebb355fa6b3df1d6b330436e0b885fb49594c41721398"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.0.23"
   flutter_slidable:
     dependency: "direct main"
     description:
@@ -840,6 +920,14 @@ packages:
     description: flutter
     source: sdk
     version: "0.0.0"
+  flutter_zxing:
+    dependency: "direct main"
+    description:
+      name: flutter_zxing
+      sha256: "7ced1ebb196a5361964f03af37a8f51120271982698ff7befe34f7e35f0babbc"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.7.0"
   frontend_server_client:
     dependency: transitive
     description:
@@ -1048,6 +1136,70 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "4.3.0"
+  image_picker:
+    dependency: transitive
+    description:
+      name: image_picker
+      sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.1.2"
+  image_picker_android:
+    dependency: transitive
+    description:
+      name: image_picker_android
+      sha256: "8faba09ba361d4b246dc0a17cb4289b3324c2b9f6db7b3d457ee69106a86bd32"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.8.12+17"
+  image_picker_for_web:
+    dependency: transitive
+    description:
+      name: image_picker_for_web
+      sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.0.6"
+  image_picker_ios:
+    dependency: transitive
+    description:
+      name: image_picker_ios
+      sha256: "4f0568120c6fcc0aaa04511cb9f9f4d29fc3d0139884b1d06be88dcec7641d6b"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.8.12+1"
+  image_picker_linux:
+    dependency: transitive
+    description:
+      name: image_picker_linux
+      sha256: "4ed1d9bb36f7cd60aa6e6cd479779cc56a4cb4e4de8f49d487b1aaad831300fa"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.2.1+1"
+  image_picker_macos:
+    dependency: transitive
+    description:
+      name: image_picker_macos
+      sha256: "3f5ad1e8112a9a6111c46d0b57a7be2286a9a07fc6e1976fdf5be2bd31d4ff62"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.2.1+1"
+  image_picker_platform_interface:
+    dependency: transitive
+    description:
+      name: image_picker_platform_interface
+      sha256: "9ec26d410ff46f483c5519c29c02ef0e02e13a543f882b152d4bfd2f06802f80"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.10.0"
+  image_picker_windows:
+    dependency: transitive
+    description:
+      name: image_picker_windows
+      sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.2.1+1"
   infinite_scroll_pagination:
     dependency: "direct main"
     description:
diff --git a/pubspec.yaml b/pubspec.yaml
index 2eb14d9622911bd4d72a808d63b2e4d37a636e66..c9e9d19462092c7ffcdc9c8a9a05ee5c1bcfe252 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -129,6 +129,7 @@ dependencies:
   latlong2: ^0.9.1
   flutter_speed_dial: ^7.0.0
   intl: ^0.18.1
+  flutter_zxing: ^1.7.0
 
 dev_dependencies:
   flutter_test: