diff --git a/Pulsar/Features/EventsHub.cs b/Pulsar/Features/EventsHub.cs
index 10042eb..5efe0d1 100644
--- a/Pulsar/Features/EventsHub.cs
+++ b/Pulsar/Features/EventsHub.cs
@@ -2,6 +2,7 @@ namespace Pulsar.Features;
 
 using Observatory.Framework.Files;
 using Observatory.Framework.Files.Journal;
+using Observatory.Framework.Files.Journal.Odyssey;
 
 public class EventsHub : Hub<IEventsHub>
 {
@@ -24,6 +25,8 @@ public class EventsHub : Hub<IEventsHub>
     public async Task CargoUpdated(CargoFile cargo) => await Clients.All.CargoUpdated(cargo);
 
     public async Task BackpackUpdated(BackpackFile backpack) => await Clients.All.BackpackUpdated(backpack);
+    
+    public async Task ShipLockerUpdated(ShipLockerMaterials shipLocker) => await Clients.All.ShipLockerUpdated(shipLocker);
 }
 
 public interface IEventsHub
@@ -47,4 +50,6 @@ public interface IEventsHub
     Task CargoUpdated(CargoFile cargo);
 
     Task BackpackUpdated(BackpackFile backpack);
+    
+    Task ShipLockerUpdated(ShipLockerMaterials shipLocker);
 }
\ No newline at end of file
diff --git a/Pulsar/Features/FileHandlerService.cs b/Pulsar/Features/FileHandlerService.cs
index 01198e4..2d70e84 100644
--- a/Pulsar/Features/FileHandlerService.cs
+++ b/Pulsar/Features/FileHandlerService.cs
@@ -1,8 +1,6 @@
 using Observatory.Framework.Files;
+using Observatory.Framework.Files.Journal;
 using Observatory.Framework.Files.Journal.Odyssey;
-using Pulsar.Features.ModulesInfo;
-using Pulsar.Features.ShipLocker;
-
 namespace Pulsar.Features;
 
 public interface IFileHandler
@@ -23,6 +21,8 @@ public class FileHandlerService(
     public static readonly string ModulesFileName = "Modules.json";
     public static readonly string JournalLogFileNameRegEx = @"Journal\.\d\d\d\d-\d\d-\d\dT\d+\.\d\d\.log";
     public static readonly string JournalLogFileName = "Journal.*.log";
+    public static readonly string JournalLogFileNameStart = "Journal.";
+    public static readonly string JournalLogFileNameEnd = ".log";
     public static readonly string RouteFileName = "Route.json";
     public static readonly string CargoFileName = "Cargo.json";
     public static readonly string BackpackFileName = "Backpack.json";
@@ -37,7 +37,7 @@ public class FileHandlerService(
         OutfittingFileName,
         ShipyardFileName,
         ModulesFileName,
-        JournalLogFileNameRegEx,
+        JournalLogFileNameStart,
         RouteFileName,
         CargoFileName,
         BackpackFileName,
@@ -51,8 +51,14 @@ public class FileHandlerService(
         { StatusFileName, typeof(IJournalHandler<Observatory.Framework.Files.Status>) },
         { ModulesInfoFileName, typeof(IJournalHandler<ModuleInfoFile>) },
         { ShipLockerFileName, typeof(IJournalHandler<ShipLockerMaterials>) },
-        { ShipLockerFileName, typeof(IJournalHandler<ShipLockerMaterials>) },
+        { ShipyardFileName, typeof(IJournalHandler<ShipyardFile>) },
+        { MarketFileName, typeof(IJournalHandler<MarketFile>) },
+        { NavRouteFileName, typeof(IJournalHandler<NavRouteFile>) },
         { CargoFileName, typeof(IJournalHandler<CargoFile>) },
+        { BackpackFileName, typeof(IJournalHandler<BackpackFile>) },
+        { RouteFileName, typeof(IJournalHandler<NavRouteFile>) },
+        { OutfittingFileName, typeof(IJournalHandler<OutfittingFile>) },
+        { JournalLogFileNameStart, typeof(IJournalHandler<List<JournalBase>>) }
     };
 
     public async Task HandleFile(string path)
@@ -70,13 +76,19 @@ public class FileHandlerService(
             return;
         }
 
-        if (Handlers.TryGetValue(match, out var type))
+        if (!Handlers.TryGetValue(match, out var type))
         {
-            logger.LogInformation("Handling file {FileName} with Type {Type}", fileName);
-            (serviceProvider.GetRequiredService(type) as IJournalHandler)?.HandleFile(path);
+            logger.LogInformation("File {FileName} was not handled", fileName);
             return;
         }
-
-        logger.LogInformation("File {FileName} was not handled", fileName);
+        
+        if (serviceProvider.GetRequiredService(type) is not IJournalHandler handler)
+        {
+            logger.LogWarning("Handler for {FileName} is not available", fileName);
+            return;
+        }
+            
+        logger.LogInformation("Handling file {FileName} with Type {Type}", fileName, handler.GetType().ToString());
+        await handler.HandleFile(path);
     }
 }
\ No newline at end of file
diff --git a/Pulsar/Features/FileWatcherService.cs b/Pulsar/Features/FileWatcherService.cs
index cdaf26f..401d2e5 100644
--- a/Pulsar/Features/FileWatcherService.cs
+++ b/Pulsar/Features/FileWatcherService.cs
@@ -26,7 +26,10 @@ public class FileWatcherService(IOptions<PulsarConfiguration> options, IFileHand
     {
         foreach (var file in watcher.GetDirectoryContents(""))
         {
-            if (!file.Name.EndsWith(".json") || file.IsDirectory) continue;
+            if (file.IsDirectory || !file.Name.EndsWith(".json") && !(file.Name.StartsWith(FileHandlerService.JournalLogFileNameStart) && file.Name.EndsWith(FileHandlerService.JournalLogFileNameEnd)))
+            {
+                continue;
+            }
             
             var existing = FileDates.GetOrAdd(file.PhysicalPath, file.LastModified);
             
@@ -40,7 +43,7 @@ public class FileWatcherService(IOptions<PulsarConfiguration> options, IFileHand
     
     private void Watch()
     {
-        watcher.Watch("**/*.json").RegisterChangeCallback(HandleFileChanged, null);
+        watcher.Watch("*.*").RegisterChangeCallback(HandleFileChanged, null);
     }
 
     public Task StopAsync(CancellationToken cancellationToken)
diff --git a/Pulsar/Features/ModulesInfo/ModulesInfoService.cs b/Pulsar/Features/ModulesInfo/ModulesInfoService.cs
index 2c6b7b0..f787d7a 100644
--- a/Pulsar/Features/ModulesInfo/ModulesInfoService.cs
+++ b/Pulsar/Features/ModulesInfo/ModulesInfoService.cs
@@ -11,34 +11,9 @@ public class ModulesInfoService(
 {
     public string FileName => FileHandlerService.ModulesInfoFileName;
 
-    public bool ValidateFile(string filePath)
-    {
-        if (!File.Exists(filePath))
-        {
-            logger.LogWarning("Journal file {JournalFile} does not exist", filePath);
-            return false;
-        }
-
-        var fileInfo = new FileInfo(filePath);
-
-        if (!string.Equals(fileInfo.Name, FileName, StringComparison.InvariantCultureIgnoreCase))
-        {
-            logger.LogWarning("Journal file {name} is not valid");
-            return false;
-        }
-
-        if (fileInfo.Length == 0)
-        {
-            logger.LogWarning("Journal file {name} is empty", filePath);
-            return false;
-        }
-
-        return true;
-    }
-
     public async Task HandleFile(string filePath)
     {
-        if (!ValidateFile(filePath))
+        if (!FileHelper.ValidateFile(filePath))
         {
             return;
         }
@@ -59,7 +34,7 @@ public class ModulesInfoService(
     {
         var moduleInfoFile = Path.Combine(options.Value.JournalDirectory, FileName);
 
-        if (!ValidateFile(moduleInfoFile))
+        if (!FileHelper.ValidateFile(moduleInfoFile))
         {
             return new ModuleInfoFile();
         }
diff --git a/Pulsar/Features/ShipLocker/ShipLockerService.cs b/Pulsar/Features/ShipLocker/ShipLockerService.cs
index 99014db..67f67ca 100644
--- a/Pulsar/Features/ShipLocker/ShipLockerService.cs
+++ b/Pulsar/Features/ShipLocker/ShipLockerService.cs
@@ -4,43 +4,45 @@ using Observatory.Framework.Files.Journal.Odyssey;
 
 public interface IShipLockerService : IJournalHandler<ShipLockerMaterials>;
 
-public class ShipLockerService(ILogger<ShipLockerService> logger)
+public class ShipLockerService(ILogger<ShipLockerService> logger, IOptions<PulsarConfiguration> options,
+    IEventHubContext hub)
     : IShipLockerService
 {
     public string FileName => FileHandlerService.ShipLockerFileName;
 
-    public bool ValidateFile(string filePath)
+    public async Task<ShipLockerMaterials> Get()
     {
-        if (!File.Exists(filePath))
+        var shipLockerFile = Path.Combine(options.Value.JournalDirectory, FileName);
+
+        if (!FileHelper.ValidateFile(shipLockerFile))
         {
-            logger.LogWarning("Journal file {JournalFile} does not exist", filePath);
-            return false;
+            return new ShipLockerMaterials();
         }
 
-        var fileInfo = new FileInfo(filePath);
+        await using var file = File.Open(shipLockerFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
+        var shipLocker = await JsonSerializer.DeserializeAsync<ShipLockerMaterials>(file);
+        if (shipLocker != null) return shipLocker;
 
-        if (!string.Equals(fileInfo.Name, FileName, StringComparison.InvariantCultureIgnoreCase))
-        {
-            logger.LogWarning("Journal file {name} is not valid");
-            return false;
-        }
-
-        if (fileInfo.Length == 0)
-        {
-            logger.LogWarning("Journal file {name} is empty", filePath);
-            return false;
-        }
-
-        return true;
+        logger.LogWarning("Failed to deserialize ship locker file {ShipLockerFile}", shipLockerFile);
+        return new ShipLockerMaterials();
     }
 
-    public Task<ShipLockerMaterials> Get()
+    public async Task HandleFile(string filePath)
     {
-        throw new NotImplementedException();
-    }
+        if (!FileHelper.ValidateFile(filePath))
+        {
+            return;
+        }
 
-    public Task HandleFile(string filePath)
-    {
-        throw new NotImplementedException();
+        var file = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
+        var shipLocker = await JsonSerializer.DeserializeAsync<ShipLockerMaterials>(file);
+
+        if (shipLocker == null)
+        {
+            logger.LogWarning("Failed to deserialize status file {FilePath}", filePath);
+            return;
+        }
+
+        await hub.Clients.All.ShipLockerUpdated(shipLocker);
     }
 }
\ No newline at end of file
diff --git a/Pulsar/Features/Shipyard/ShipyardService.cs b/Pulsar/Features/Shipyard/ShipyardService.cs
new file mode 100644
index 0000000..af85151
--- /dev/null
+++ b/Pulsar/Features/Shipyard/ShipyardService.cs
@@ -0,0 +1,47 @@
+using Observatory.Framework.Files;
+
+namespace Pulsar.Features.Shipyard;
+
+public interface IShipyardService : IJournalHandler<ShipyardFile>;
+
+public class ShipyardService(ILogger<ShipyardService> logger, IOptions<PulsarConfiguration> options,
+    IEventHubContext hub) : IShipyardService
+{
+    public string FileName => FileHandlerService.ShipyardFileName;
+    public async Task<ShipyardFile> Get()   
+    {
+        var shipyardFile = Path.Combine(options.Value.JournalDirectory, FileName);
+
+        if (!FileHelper.ValidateFile(shipyardFile))
+        {
+            return new ShipyardFile();
+        }
+
+        await using var file = File.Open(shipyardFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
+        var shipyard = await JsonSerializer.DeserializeAsync<ShipyardFile>(file);
+        if (shipyard != null) return shipyard;
+
+        logger.LogWarning("Failed to deserialize shipyard file {ShipyardFile}", shipyardFile);
+        return new ShipyardFile();
+    }
+
+    public async Task HandleFile(string path)
+    {
+        if (!FileHelper.ValidateFile(path))
+        {
+            return;
+        }
+
+        var file = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
+        var shipyard = await JsonSerializer.DeserializeAsync<ShipyardFile>(file);
+
+        if (shipyard == null)
+        {
+            logger.LogWarning("Failed to deserialize status file {FilePath}", path);
+            return;
+        }
+
+        await hub.Clients.All.ShipyardUpdated(shipyard);
+    }
+
+}
\ No newline at end of file
diff --git a/Pulsar/Features/Status/StatusService.cs b/Pulsar/Features/Status/StatusService.cs
index dc7bdaf..b2198a7 100644
--- a/Pulsar/Features/Status/StatusService.cs
+++ b/Pulsar/Features/Status/StatusService.cs
@@ -40,7 +40,7 @@ public class StatusService
 
     public async Task HandleFile(string filePath)
     {
-        if (!ValidateFile(filePath))
+        if (!FileHelper.ValidateFile(filePath))
         {
             return;
         }
@@ -61,7 +61,7 @@ public class StatusService
     {
         var statusFile = Path.Combine(options.Value.JournalDirectory, FileName);
 
-        if (!ValidateFile(statusFile))
+        if (!FileHelper.ValidateFile(statusFile))
         {
             return new Status();
         }
diff --git a/Pulsar/Pulsar.csproj b/Pulsar/Pulsar.csproj
index fdc767b..3f591e8 100644
--- a/Pulsar/Pulsar.csproj
+++ b/Pulsar/Pulsar.csproj
@@ -19,6 +19,8 @@
       <PackageReference Include="Lamar.Microsoft.DependencyInjection" Version="13.0.3" />
       <PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.4" />
       <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.4" />
+      <PackageReference Include="NSwag.AspNetCore" Version="14.0.7" />
+      <PackageReference Include="NSwag.SwaggerGeneration" Version="12.3.0" />
       <PackageReference Include="Yarp.ReverseProxy" Version="2.1.0" />
     </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/Pulsar/PulsarServiceRegistry.cs b/Pulsar/PulsarServiceRegistry.cs
index 04ee0d5..1652320 100644
--- a/Pulsar/PulsarServiceRegistry.cs
+++ b/Pulsar/PulsarServiceRegistry.cs
@@ -4,6 +4,8 @@ using Pulsar.Features;
 using Pulsar.Features.Cargo;
 using Pulsar.Features.ModulesInfo;
 using Pulsar.Features.Journal;
+using Pulsar.Features.ShipLocker;
+using Pulsar.Features.Shipyard;
 
 namespace Pulsar;
 
@@ -17,5 +19,7 @@ public class PulsarServiceRegistry : ServiceRegistry
         For<IModulesInfoService>().Use<ModulesInfoService>();
         For<ICargoService>().Use<CargoService>();
         For<IJournalService>().Use<JournalService>();
+        For<IShipLockerService>().Use<ShipLockerService>();
+        For<IShipyardService>().Use<ShipyardService>();
     }
 }
\ No newline at end of file
diff --git a/Pulsar/WebApp/package-lock.json b/Pulsar/WebApp/package-lock.json
index effd2fb..01fac8b 100644
--- a/Pulsar/WebApp/package-lock.json
+++ b/Pulsar/WebApp/package-lock.json
@@ -8,22 +8,21 @@
 			"name": "pulsar-web",
 			"version": "0.0.1",
 			"devDependencies": {
-				"@biomejs/biome": "1.6.4",
+				"@biomejs/biome": "^1.7.3",
 				"@microsoft/signalr": "^8.0.0",
-				"@playwright/test": "^1.28.1",
+				"@playwright/test": "^1.44.0",
 				"@sveltejs/adapter-static": "^3.0.1",
-				"@sveltejs/kit": "^2.0.0",
-				"@sveltejs/vite-plugin-svelte": "^3.0.0",
-				"@types/eslint": "^8.56.7",
-				"eslint-plugin-svelte": "^2.36.0",
-				"globals": "^15.0.0",
-				"sass": "^1.75.0",
-				"svelte": "^5.0.0-next.121",
-				"svelte-check": "^3.6.0",
-				"tslib": "^2.4.1",
-				"typescript": "^5.0.0",
-				"typescript-eslint": "^7.5.0",
-				"vite": "^5.0.3"
+				"@sveltejs/kit": "^2.5.7",
+				"@sveltejs/vite-plugin-svelte": "next",
+				"@sveltestack/svelte-query": "^1.6.0",
+				"eslint-plugin-svelte": "^2.39.0",
+				"globals": "^15.2.0",
+				"sass": "^1.77.0",
+				"svelte": "^5.0.0-next.126",
+				"svelte-check": "^3.7.1",
+				"tslib": "^2.6.2",
+				"typescript": "^5.4.5",
+				"vite": "^5.2.11"
 			}
 		},
 		"node_modules/@aashutoshrathi/word-wrap": {
@@ -50,9 +49,9 @@
 			}
 		},
 		"node_modules/@biomejs/biome": {
-			"version": "1.6.4",
-			"resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.6.4.tgz",
-			"integrity": "sha512-3groVd2oWsLC0ZU+XXgHSNbq31lUcOCBkCcA7sAQGBopHcmL+jmmdoWlY3S61zIh+f2mqQTQte1g6PZKb3JJjA==",
+			"version": "1.7.3",
+			"resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.7.3.tgz",
+			"integrity": "sha512-ogFQI+fpXftr+tiahA6bIXwZ7CSikygASdqMtH07J2cUzrpjyTMVc9Y97v23c7/tL1xCZhM+W9k4hYIBm7Q6cQ==",
 			"dev": true,
 			"hasInstallScript": true,
 			"bin": {
@@ -66,20 +65,20 @@
 				"url": "https://opencollective.com/biome"
 			},
 			"optionalDependencies": {
-				"@biomejs/cli-darwin-arm64": "1.6.4",
-				"@biomejs/cli-darwin-x64": "1.6.4",
-				"@biomejs/cli-linux-arm64": "1.6.4",
-				"@biomejs/cli-linux-arm64-musl": "1.6.4",
-				"@biomejs/cli-linux-x64": "1.6.4",
-				"@biomejs/cli-linux-x64-musl": "1.6.4",
-				"@biomejs/cli-win32-arm64": "1.6.4",
-				"@biomejs/cli-win32-x64": "1.6.4"
+				"@biomejs/cli-darwin-arm64": "1.7.3",
+				"@biomejs/cli-darwin-x64": "1.7.3",
+				"@biomejs/cli-linux-arm64": "1.7.3",
+				"@biomejs/cli-linux-arm64-musl": "1.7.3",
+				"@biomejs/cli-linux-x64": "1.7.3",
+				"@biomejs/cli-linux-x64-musl": "1.7.3",
+				"@biomejs/cli-win32-arm64": "1.7.3",
+				"@biomejs/cli-win32-x64": "1.7.3"
 			}
 		},
 		"node_modules/@biomejs/cli-darwin-arm64": {
-			"version": "1.6.4",
-			"resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.6.4.tgz",
-			"integrity": "sha512-2WZef8byI9NRzGajGj5RTrroW9BxtfbP9etigW1QGAtwu/6+cLkdPOWRAs7uFtaxBNiKFYA8j/BxV5zeAo5QOQ==",
+			"version": "1.7.3",
+			"resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.7.3.tgz",
+			"integrity": "sha512-eDvLQWmGRqrPIRY7AIrkPHkQ3visEItJKkPYSHCscSDdGvKzYjmBJwG1Gu8+QC5ed6R7eiU63LEC0APFBobmfQ==",
 			"cpu": [
 				"arm64"
 			],
@@ -93,9 +92,9 @@
 			}
 		},
 		"node_modules/@biomejs/cli-darwin-x64": {
-			"version": "1.6.4",
-			"resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.6.4.tgz",
-			"integrity": "sha512-uo1zgM7jvzcoDpF6dbGizejDLCqNpUIRkCj/oEK0PB0NUw8re/cn1EnxuOLZqDpn+8G75COLQTOx8UQIBBN/Kg==",
+			"version": "1.7.3",
+			"resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.7.3.tgz",
+			"integrity": "sha512-JXCaIseKRER7dIURsVlAJacnm8SG5I0RpxZ4ya3dudASYUc68WGl4+FEN03ABY3KMIq7hcK1tzsJiWlmXyosZg==",
 			"cpu": [
 				"x64"
 			],
@@ -109,9 +108,9 @@
 			}
 		},
 		"node_modules/@biomejs/cli-linux-arm64": {
-			"version": "1.6.4",
-			"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.6.4.tgz",
-			"integrity": "sha512-wAOieaMNIpLrxGc2/xNvM//CIZg7ueWy3V5A4T7gDZ3OL/Go27EKE59a+vMKsBCYmTt7jFl4yHz0TUkUbodA/w==",
+			"version": "1.7.3",
+			"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.7.3.tgz",
+			"integrity": "sha512-phNTBpo7joDFastnmZsFjYcDYobLTx4qR4oPvc9tJ486Bd1SfEVPHEvJdNJrMwUQK56T+TRClOQd/8X1nnjA9w==",
 			"cpu": [
 				"arm64"
 			],
@@ -125,9 +124,9 @@
 			}
 		},
 		"node_modules/@biomejs/cli-linux-arm64-musl": {
-			"version": "1.6.4",
-			"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.6.4.tgz",
-			"integrity": "sha512-Hp8Jwt6rjj0wCcYAEN6/cfwrrPLLlGOXZ56Lei4Pt4jy39+UuPeAVFPeclrrCfxyL1wQ2xPrhd/saTHSL6DoJg==",
+			"version": "1.7.3",
+			"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.7.3.tgz",
+			"integrity": "sha512-c8AlO45PNFZ1BYcwaKzdt46kYbuP6xPGuGQ6h4j3XiEDpyseRRUy/h+6gxj07XovmyxKnSX9GSZ6nVbZvcVUAw==",
 			"cpu": [
 				"arm64"
 			],
@@ -141,9 +140,9 @@
 			}
 		},
 		"node_modules/@biomejs/cli-linux-x64": {
-			"version": "1.6.4",
-			"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.6.4.tgz",
-			"integrity": "sha512-qTWhuIw+/ePvOkjE9Zxf5OqSCYxtAvcTJtVmZT8YQnmY2I62JKNV2m7tf6O5ViKZUOP0mOQ6NgqHKcHH1eT8jw==",
+			"version": "1.7.3",
+			"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.7.3.tgz",
+			"integrity": "sha512-vnedYcd5p4keT3iD48oSKjOIRPYcjSNNbd8MO1bKo9ajg3GwQXZLAH+0Cvlr+eMsO67/HddWmscSQwTFrC/uPA==",
 			"cpu": [
 				"x64"
 			],
@@ -157,9 +156,9 @@
 			}
 		},
 		"node_modules/@biomejs/cli-linux-x64-musl": {
-			"version": "1.6.4",
-			"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.6.4.tgz",
-			"integrity": "sha512-wqi0hr8KAx5kBO0B+m5u8QqiYFFBJOSJVSuRqTeGWW+GYLVUtXNidykNqf1JsW6jJDpbkSp2xHKE/bTlVaG2Kg==",
+			"version": "1.7.3",
+			"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.7.3.tgz",
+			"integrity": "sha512-UdEHKtYGWEX3eDmVWvQeT+z05T9/Sdt2+F/7zmMOFQ7boANeX8pcO6EkJPK3wxMudrApsNEKT26rzqK6sZRTRA==",
 			"cpu": [
 				"x64"
 			],
@@ -173,9 +172,9 @@
 			}
 		},
 		"node_modules/@biomejs/cli-win32-arm64": {
-			"version": "1.6.4",
-			"resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.6.4.tgz",
-			"integrity": "sha512-Wp3FiEeF6v6C5qMfLkHwf4YsoNHr/n0efvoC8jCKO/kX05OXaVExj+1uVQ1eGT7Pvx0XVm/TLprRO0vq/V6UzA==",
+			"version": "1.7.3",
+			"resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.7.3.tgz",
+			"integrity": "sha512-unNCDqUKjujYkkSxs7gFIfdasttbDC4+z0kYmcqzRk6yWVoQBL4dNLcCbdnJS+qvVDNdI9rHp2NwpQ0WAdla4Q==",
 			"cpu": [
 				"arm64"
 			],
@@ -189,9 +188,9 @@
 			}
 		},
 		"node_modules/@biomejs/cli-win32-x64": {
-			"version": "1.6.4",
-			"resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.6.4.tgz",
-			"integrity": "sha512-mz183Di5hTSGP7KjNWEhivcP1wnHLGmOxEROvoFsIxMYtDhzJDad4k5gI/1JbmA0xe4n52vsgqo09tBhrMT/Zg==",
+			"version": "1.7.3",
+			"resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.7.3.tgz",
+			"integrity": "sha512-ZmByhbrnmz/UUFYB622CECwhKIPjJLLPr5zr3edhu04LzbfcOrz16VYeNq5dpO1ADG70FORhAJkaIGdaVBG00w==",
 			"cpu": [
 				"x64"
 			],
@@ -592,6 +591,7 @@
 			"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
 			"integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
 			"dev": true,
+			"peer": true,
 			"engines": {
 				"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
 			}
@@ -779,12 +779,12 @@
 			}
 		},
 		"node_modules/@playwright/test": {
-			"version": "1.43.1",
-			"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.43.1.tgz",
-			"integrity": "sha512-HgtQzFgNEEo4TE22K/X7sYTYNqEMMTZmFS8kTq6m8hXj+m1D8TgwgIbumHddJa9h4yl4GkKb8/bgAl2+g7eDgA==",
+			"version": "1.44.0",
+			"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.44.0.tgz",
+			"integrity": "sha512-rNX5lbNidamSUorBhB4XZ9SQTjAqfe5M+p37Z8ic0jPFBMo5iCtQz1kRWkEMg+rYOKSlVycpQmpqjSFq7LXOfg==",
 			"dev": true,
 			"dependencies": {
-				"playwright": "1.43.1"
+				"playwright": "1.44.0"
 			},
 			"bin": {
 				"playwright": "cli.js"
@@ -1004,15 +1004,15 @@
 			}
 		},
 		"node_modules/@sveltejs/kit": {
-			"version": "2.5.5",
-			"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.5.5.tgz",
-			"integrity": "sha512-ULe3PB00q4+wYRL+IS5FDPsCEVnhEITofm7b9Yz8malcH3r1SAnW/JJ6T13hIMeu8QNRIuVQWo+P4+2VklbnLQ==",
+			"version": "2.5.7",
+			"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.5.7.tgz",
+			"integrity": "sha512-6uedTzrb7nQrw6HALxnPrPaXdIN2jJJTzTIl96Z3P5NiG+OAfpdPbrWrvkJ3GN4CfWqrmU4dJqwMMRMTD/C7ow==",
 			"dev": true,
 			"hasInstallScript": true,
 			"dependencies": {
 				"@types/cookie": "^0.6.0",
 				"cookie": "^0.6.0",
-				"devalue": "^4.3.2",
+				"devalue": "^5.0.0",
 				"esm-env": "^1.0.0",
 				"import-meta-resolve": "^4.0.0",
 				"kleur": "^4.1.5",
@@ -1086,260 +1086,38 @@
 				"svelte": "^3.19.0 || ^4.0.0"
 			}
 		},
+		"node_modules/@sveltestack/svelte-query": {
+			"version": "1.6.0",
+			"resolved": "https://registry.npmjs.org/@sveltestack/svelte-query/-/svelte-query-1.6.0.tgz",
+			"integrity": "sha512-C0wWuh6av1zu3Pzwrg6EQmX3BhDZQ4gMAdYu6Tfv4bjbEZTB00uEDz52z92IZdONh+iUKuyo0xRZ2e16k2Xifg==",
+			"dev": true,
+			"peerDependencies": {
+				"broadcast-channel": "^4.5.0"
+			},
+			"peerDependenciesMeta": {
+				"broadcast-channel": {
+					"optional": true
+				}
+			}
+		},
 		"node_modules/@types/cookie": {
 			"version": "0.6.0",
 			"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
 			"integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==",
 			"dev": true
 		},
-		"node_modules/@types/eslint": {
-			"version": "8.56.9",
-			"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.9.tgz",
-			"integrity": "sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg==",
-			"dev": true,
-			"dependencies": {
-				"@types/estree": "*",
-				"@types/json-schema": "*"
-			}
-		},
 		"node_modules/@types/estree": {
 			"version": "1.0.5",
 			"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
 			"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
 			"dev": true
 		},
-		"node_modules/@types/json-schema": {
-			"version": "7.0.15",
-			"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
-			"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
-			"dev": true
-		},
 		"node_modules/@types/pug": {
 			"version": "2.0.10",
 			"resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.10.tgz",
 			"integrity": "sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==",
 			"dev": true
 		},
-		"node_modules/@types/semver": {
-			"version": "7.5.8",
-			"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
-			"integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
-			"dev": true
-		},
-		"node_modules/@typescript-eslint/eslint-plugin": {
-			"version": "7.6.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.6.0.tgz",
-			"integrity": "sha512-gKmTNwZnblUdnTIJu3e9kmeRRzV2j1a/LUO27KNNAnIC5zjy1aSvXSRp4rVNlmAoHlQ7HzX42NbKpcSr4jF80A==",
-			"dev": true,
-			"dependencies": {
-				"@eslint-community/regexpp": "^4.10.0",
-				"@typescript-eslint/scope-manager": "7.6.0",
-				"@typescript-eslint/type-utils": "7.6.0",
-				"@typescript-eslint/utils": "7.6.0",
-				"@typescript-eslint/visitor-keys": "7.6.0",
-				"debug": "^4.3.4",
-				"graphemer": "^1.4.0",
-				"ignore": "^5.3.1",
-				"natural-compare": "^1.4.0",
-				"semver": "^7.6.0",
-				"ts-api-utils": "^1.3.0"
-			},
-			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			},
-			"peerDependencies": {
-				"@typescript-eslint/parser": "^7.0.0",
-				"eslint": "^8.56.0"
-			},
-			"peerDependenciesMeta": {
-				"typescript": {
-					"optional": true
-				}
-			}
-		},
-		"node_modules/@typescript-eslint/parser": {
-			"version": "7.6.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.6.0.tgz",
-			"integrity": "sha512-usPMPHcwX3ZoPWnBnhhorc14NJw9J4HpSXQX4urF2TPKG0au0XhJoZyX62fmvdHONUkmyUe74Hzm1//XA+BoYg==",
-			"dev": true,
-			"dependencies": {
-				"@typescript-eslint/scope-manager": "7.6.0",
-				"@typescript-eslint/types": "7.6.0",
-				"@typescript-eslint/typescript-estree": "7.6.0",
-				"@typescript-eslint/visitor-keys": "7.6.0",
-				"debug": "^4.3.4"
-			},
-			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			},
-			"peerDependencies": {
-				"eslint": "^8.56.0"
-			},
-			"peerDependenciesMeta": {
-				"typescript": {
-					"optional": true
-				}
-			}
-		},
-		"node_modules/@typescript-eslint/scope-manager": {
-			"version": "7.6.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.6.0.tgz",
-			"integrity": "sha512-ngttyfExA5PsHSx0rdFgnADMYQi+Zkeiv4/ZxGYUWd0nLs63Ha0ksmp8VMxAIC0wtCFxMos7Lt3PszJssG/E6w==",
-			"dev": true,
-			"dependencies": {
-				"@typescript-eslint/types": "7.6.0",
-				"@typescript-eslint/visitor-keys": "7.6.0"
-			},
-			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			}
-		},
-		"node_modules/@typescript-eslint/type-utils": {
-			"version": "7.6.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.6.0.tgz",
-			"integrity": "sha512-NxAfqAPNLG6LTmy7uZgpK8KcuiS2NZD/HlThPXQRGwz6u7MDBWRVliEEl1Gj6U7++kVJTpehkhZzCJLMK66Scw==",
-			"dev": true,
-			"dependencies": {
-				"@typescript-eslint/typescript-estree": "7.6.0",
-				"@typescript-eslint/utils": "7.6.0",
-				"debug": "^4.3.4",
-				"ts-api-utils": "^1.3.0"
-			},
-			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			},
-			"peerDependencies": {
-				"eslint": "^8.56.0"
-			},
-			"peerDependenciesMeta": {
-				"typescript": {
-					"optional": true
-				}
-			}
-		},
-		"node_modules/@typescript-eslint/types": {
-			"version": "7.6.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.6.0.tgz",
-			"integrity": "sha512-h02rYQn8J+MureCvHVVzhl69/GAfQGPQZmOMjG1KfCl7o3HtMSlPaPUAPu6lLctXI5ySRGIYk94clD/AUMCUgQ==",
-			"dev": true,
-			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			}
-		},
-		"node_modules/@typescript-eslint/typescript-estree": {
-			"version": "7.6.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.6.0.tgz",
-			"integrity": "sha512-+7Y/GP9VuYibecrCQWSKgl3GvUM5cILRttpWtnAu8GNL9j11e4tbuGZmZjJ8ejnKYyBRb2ddGQ3rEFCq3QjMJw==",
-			"dev": true,
-			"dependencies": {
-				"@typescript-eslint/types": "7.6.0",
-				"@typescript-eslint/visitor-keys": "7.6.0",
-				"debug": "^4.3.4",
-				"globby": "^11.1.0",
-				"is-glob": "^4.0.3",
-				"minimatch": "^9.0.4",
-				"semver": "^7.6.0",
-				"ts-api-utils": "^1.3.0"
-			},
-			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			},
-			"peerDependenciesMeta": {
-				"typescript": {
-					"optional": true
-				}
-			}
-		},
-		"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-			"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
-			"dev": true,
-			"dependencies": {
-				"balanced-match": "^1.0.0"
-			}
-		},
-		"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
-			"version": "9.0.4",
-			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
-			"integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
-			"dev": true,
-			"dependencies": {
-				"brace-expansion": "^2.0.1"
-			},
-			"engines": {
-				"node": ">=16 || 14 >=14.17"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/isaacs"
-			}
-		},
-		"node_modules/@typescript-eslint/utils": {
-			"version": "7.6.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.6.0.tgz",
-			"integrity": "sha512-x54gaSsRRI+Nwz59TXpCsr6harB98qjXYzsRxGqvA5Ue3kQH+FxS7FYU81g/omn22ML2pZJkisy6Q+ElK8pBCA==",
-			"dev": true,
-			"dependencies": {
-				"@eslint-community/eslint-utils": "^4.4.0",
-				"@types/json-schema": "^7.0.15",
-				"@types/semver": "^7.5.8",
-				"@typescript-eslint/scope-manager": "7.6.0",
-				"@typescript-eslint/types": "7.6.0",
-				"@typescript-eslint/typescript-estree": "7.6.0",
-				"semver": "^7.6.0"
-			},
-			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			},
-			"peerDependencies": {
-				"eslint": "^8.56.0"
-			}
-		},
-		"node_modules/@typescript-eslint/visitor-keys": {
-			"version": "7.6.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.6.0.tgz",
-			"integrity": "sha512-4eLB7t+LlNUmXzfOu1VAIAdkjbu5xNSerURS9X/S5TUKWFRpXRQZbmtPqgKmYx8bj3J0irtQXSiWAOY82v+cgw==",
-			"dev": true,
-			"dependencies": {
-				"@typescript-eslint/types": "7.6.0",
-				"eslint-visitor-keys": "^3.4.3"
-			},
-			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			}
-		},
 		"node_modules/@ungap/structured-clone": {
 			"version": "1.2.0",
 			"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
@@ -1461,15 +1239,6 @@
 				"dequal": "^2.0.3"
 			}
 		},
-		"node_modules/array-union": {
-			"version": "2.1.0",
-			"resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
-			"integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
-			"dev": true,
-			"engines": {
-				"node": ">=8"
-			}
-		},
 		"node_modules/axobject-query": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz",
@@ -1704,23 +1473,11 @@
 			}
 		},
 		"node_modules/devalue": {
-			"version": "4.3.2",
-			"resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.2.tgz",
-			"integrity": "sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==",
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/devalue/-/devalue-5.0.0.tgz",
+			"integrity": "sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==",
 			"dev": true
 		},
-		"node_modules/dir-glob": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
-			"integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
-			"dev": true,
-			"dependencies": {
-				"path-type": "^4.0.0"
-			},
-			"engines": {
-				"node": ">=8"
-			}
-		},
 		"node_modules/doctrine": {
 			"version": "3.0.0",
 			"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
@@ -1863,9 +1620,9 @@
 			}
 		},
 		"node_modules/eslint-plugin-svelte": {
-			"version": "2.37.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.37.0.tgz",
-			"integrity": "sha512-H/2Gz7agYHEMEEzRuLYuCmAIdjuBnbhFG9hOK0yCdSBvvJGJMkjo+lR6j67OIvLOavgp4L7zA5LnDKi8WqdPhQ==",
+			"version": "2.39.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.39.0.tgz",
+			"integrity": "sha512-FXktBLXsrxbA+6ZvJK2z/sQOrUKyzSg3fNWK5h0reSCjr2fjAsc9ai/s/JvSl4Hgvz3nYVtTIMwarZH5RcB7BA==",
 			"dev": true,
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.4.0",
@@ -1873,13 +1630,13 @@
 				"debug": "^4.3.4",
 				"eslint-compat-utils": "^0.5.0",
 				"esutils": "^2.0.3",
-				"known-css-properties": "^0.30.0",
+				"known-css-properties": "^0.31.0",
 				"postcss": "^8.4.38",
 				"postcss-load-config": "^3.1.4",
 				"postcss-safe-parser": "^6.0.0",
 				"postcss-selector-parser": "^6.0.16",
 				"semver": "^7.6.0",
-				"svelte-eslint-parser": ">=0.34.0 <1.0.0"
+				"svelte-eslint-parser": ">=0.36.0 <1.0.0"
 			},
 			"engines": {
 				"node": "^14.17.0 || >=16.0.0"
@@ -1889,7 +1646,7 @@
 			},
 			"peerDependencies": {
 				"eslint": "^7.0.0 || ^8.0.0-0 || ^9.0.0-0",
-				"svelte": "^3.37.0 || ^4.0.0 || ^5.0.0-next.95"
+				"svelte": "^3.37.0 || ^4.0.0 || ^5.0.0-next.112"
 			},
 			"peerDependenciesMeta": {
 				"svelte": {
@@ -2221,9 +1978,9 @@
 			}
 		},
 		"node_modules/globals": {
-			"version": "15.0.0",
-			"resolved": "https://registry.npmjs.org/globals/-/globals-15.0.0.tgz",
-			"integrity": "sha512-m/C/yR4mjO6pXDTm9/R/SpYTAIyaUB4EOzcaaMEl7mds7Mshct9GfejiJNQGjHHbdMPey13Kpu4TMbYi9ex1pw==",
+			"version": "15.2.0",
+			"resolved": "https://registry.npmjs.org/globals/-/globals-15.2.0.tgz",
+			"integrity": "sha512-FQ5YwCHZM3nCmtb5FzEWwdUc9K5d3V/w9mzcz8iGD1gC/aOTHc6PouYu0kkKipNJqHAT7m51sqzQjEjIP+cK0A==",
 			"dev": true,
 			"engines": {
 				"node": ">=18"
@@ -2238,26 +1995,6 @@
 			"integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==",
 			"dev": true
 		},
-		"node_modules/globby": {
-			"version": "11.1.0",
-			"resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
-			"integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
-			"dev": true,
-			"dependencies": {
-				"array-union": "^2.1.0",
-				"dir-glob": "^3.0.1",
-				"fast-glob": "^3.2.9",
-				"ignore": "^5.2.0",
-				"merge2": "^1.4.1",
-				"slash": "^3.0.0"
-			},
-			"engines": {
-				"node": ">=10"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
 		"node_modules/globrex": {
 			"version": "0.1.2",
 			"resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
@@ -2274,7 +2011,8 @@
 			"version": "1.4.0",
 			"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
 			"integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
-			"dev": true
+			"dev": true,
+			"peer": true
 		},
 		"node_modules/has-flag": {
 			"version": "4.0.0",
@@ -2291,6 +2029,7 @@
 			"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
 			"integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
 			"dev": true,
+			"peer": true,
 			"engines": {
 				"node": ">= 4"
 			}
@@ -2475,9 +2214,9 @@
 			}
 		},
 		"node_modules/known-css-properties": {
-			"version": "0.30.0",
-			"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.30.0.tgz",
-			"integrity": "sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==",
+			"version": "0.31.0",
+			"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.31.0.tgz",
+			"integrity": "sha512-sBPIUGTNF0czz0mwGGUoKKJC8Q7On1GPbCSFPfyEsfHb2DyBG0Y4QtV+EVWpINSaiGKZblDNuF5AezxSgOhesQ==",
 			"dev": true
 		},
 		"node_modules/levn": {
@@ -2666,7 +2405,8 @@
 			"version": "1.4.0",
 			"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
 			"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
-			"dev": true
+			"dev": true,
+			"peer": true
 		},
 		"node_modules/node-fetch": {
 			"version": "2.7.0",
@@ -2797,15 +2537,6 @@
 				"node": ">=8"
 			}
 		},
-		"node_modules/path-type": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-			"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-			"dev": true,
-			"engines": {
-				"node": ">=8"
-			}
-		},
 		"node_modules/picocolors": {
 			"version": "1.0.0",
 			"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
@@ -2825,12 +2556,12 @@
 			}
 		},
 		"node_modules/playwright": {
-			"version": "1.43.1",
-			"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.43.1.tgz",
-			"integrity": "sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA==",
+			"version": "1.44.0",
+			"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.44.0.tgz",
+			"integrity": "sha512-F9b3GUCLQ3Nffrfb6dunPOkE5Mh68tR7zN32L4jCk4FjQamgesGay7/dAAe1WaMEGV04DkdJfcJzjoCKygUaRQ==",
 			"dev": true,
 			"dependencies": {
-				"playwright-core": "1.43.1"
+				"playwright-core": "1.44.0"
 			},
 			"bin": {
 				"playwright": "cli.js"
@@ -2843,9 +2574,9 @@
 			}
 		},
 		"node_modules/playwright-core": {
-			"version": "1.43.1",
-			"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.43.1.tgz",
-			"integrity": "sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg==",
+			"version": "1.44.0",
+			"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.44.0.tgz",
+			"integrity": "sha512-ZTbkNpFfYcGWohvTTl+xewITm7EOuqIqex0c7dNZ+aXsbrLj0qI8XlGKfPpipjm0Wny/4Lt4CJsWJk1stVS5qQ==",
 			"dev": true,
 			"bin": {
 				"playwright-core": "cli.js"
@@ -3164,9 +2895,9 @@
 			}
 		},
 		"node_modules/sass": {
-			"version": "1.75.0",
-			"resolved": "https://registry.npmjs.org/sass/-/sass-1.75.0.tgz",
-			"integrity": "sha512-ShMYi3WkrDWxExyxSZPst4/okE9ts46xZmJDSawJQrnte7M1V9fScVB+uNXOVKRBt0PggHOwoZcn8mYX4trnBw==",
+			"version": "1.77.0",
+			"resolved": "https://registry.npmjs.org/sass/-/sass-1.77.0.tgz",
+			"integrity": "sha512-eGj4HNfXqBWtSnvItNkn7B6icqH14i3CiCGbzMKs3BAPTq62pp9NBYsBgyN4cA+qssqo9r26lW4JSvlaUUWbgw==",
 			"dev": true,
 			"dependencies": {
 				"chokidar": ">=3.0.0 <4.0.0",
@@ -3238,15 +2969,6 @@
 				"node": ">= 10"
 			}
 		},
-		"node_modules/slash": {
-			"version": "3.0.0",
-			"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-			"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-			"dev": true,
-			"engines": {
-				"node": ">=8"
-			}
-		},
 		"node_modules/sorcery": {
 			"version": "0.11.0",
 			"resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz",
@@ -3323,9 +3045,9 @@
 			}
 		},
 		"node_modules/svelte": {
-			"version": "5.0.0-next.121",
-			"resolved": "https://registry.npmjs.org/svelte/-/svelte-5.0.0-next.121.tgz",
-			"integrity": "sha512-dWxr42t8wv6iUmgKrYDG9RwQd2lf3vF2+ACYT7ziDnLeYItPM4sABmM8ptMaYL8czwtqpNzfCsxQR7ShN5PS9A==",
+			"version": "5.0.0-next.126",
+			"resolved": "https://registry.npmjs.org/svelte/-/svelte-5.0.0-next.126.tgz",
+			"integrity": "sha512-Qnxhf+LG/qxhXpYm6I5+o8msSFBba2QOfnybrOqWbbtQbgbfy4gDVr3p2IExCT4yPOSUcqZWJiiSPsMbCuVwtA==",
 			"dev": true,
 			"dependencies": {
 				"@ampproject/remapping": "^2.2.1",
@@ -3347,9 +3069,9 @@
 			}
 		},
 		"node_modules/svelte-check": {
-			"version": "3.6.9",
-			"resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.6.9.tgz",
-			"integrity": "sha512-hDQrk3L0osX07djQyMiXocKysTLfusqi8AriNcCiQxhQR49/LonYolcUGMtZ0fbUR8HTR198Prrgf52WWU9wEg==",
+			"version": "3.7.1",
+			"resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.7.1.tgz",
+			"integrity": "sha512-U4uJoLCzmz2o2U33c7mPDJNhRYX/DNFV11XTUDlFxaKLsO7P+40gvJHMPpoRfa24jqZfST4/G9fGNcUGMO8NAQ==",
 			"dev": true,
 			"dependencies": {
 				"@jridgewell/trace-mapping": "^0.3.17",
@@ -3369,9 +3091,9 @@
 			}
 		},
 		"node_modules/svelte-eslint-parser": {
-			"version": "0.34.1",
-			"resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.34.1.tgz",
-			"integrity": "sha512-9+uLA1pqI9AZioKVGJzYYmlOZWxfoCXSbAM9iaNm7H01XlYlzRTtJfZgl9o3StQGN41PfGJIbkKkfk3e/pHFfA==",
+			"version": "0.36.0",
+			"resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.36.0.tgz",
+			"integrity": "sha512-/6YmUSr0FAVxW8dXNdIMydBnddPMHzaHirAZ7RrT21XYdgGGZMh0LQG6CZsvAFS4r2Y4ItUuCQc8TQ3urB30mQ==",
 			"dev": true,
 			"dependencies": {
 				"eslint-scope": "^7.2.2",
@@ -3387,7 +3109,7 @@
 				"url": "https://github.com/sponsors/ota-meshi"
 			},
 			"peerDependencies": {
-				"svelte": "^3.37.0 || ^4.0.0 || ^5.0.0-next.94"
+				"svelte": "^3.37.0 || ^4.0.0 || ^5.0.0-next.115"
 			},
 			"peerDependenciesMeta": {
 				"svelte": {
@@ -3517,18 +3239,6 @@
 			"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
 			"dev": true
 		},
-		"node_modules/ts-api-utils": {
-			"version": "1.3.0",
-			"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
-			"integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
-			"dev": true,
-			"engines": {
-				"node": ">=16"
-			},
-			"peerDependencies": {
-				"typescript": ">=4.2.0"
-			}
-		},
 		"node_modules/tslib": {
 			"version": "2.6.2",
 			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
@@ -3574,32 +3284,6 @@
 				"node": ">=14.17"
 			}
 		},
-		"node_modules/typescript-eslint": {
-			"version": "7.6.0",
-			"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.6.0.tgz",
-			"integrity": "sha512-LY6vH6F1l5jpGqRtU+uK4+mOecIb4Cd4kaz1hAiJrgnNiHUA8wiw8BkJyYS+MRLM69F1QuSKwtGlQqnGl1Rc6w==",
-			"dev": true,
-			"dependencies": {
-				"@typescript-eslint/eslint-plugin": "7.6.0",
-				"@typescript-eslint/parser": "7.6.0",
-				"@typescript-eslint/utils": "7.6.0"
-			},
-			"engines": {
-				"node": "^18.18.0 || >=20.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/typescript-eslint"
-			},
-			"peerDependencies": {
-				"eslint": "^8.56.0"
-			},
-			"peerDependenciesMeta": {
-				"typescript": {
-					"optional": true
-				}
-			}
-		},
 		"node_modules/universalify": {
 			"version": "0.2.0",
 			"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
@@ -3636,9 +3320,9 @@
 			"dev": true
 		},
 		"node_modules/vite": {
-			"version": "5.2.8",
-			"resolved": "https://registry.npmjs.org/vite/-/vite-5.2.8.tgz",
-			"integrity": "sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==",
+			"version": "5.2.11",
+			"resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz",
+			"integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==",
 			"dev": true,
 			"dependencies": {
 				"esbuild": "^0.20.1",
diff --git a/Pulsar/WebApp/package.json b/Pulsar/WebApp/package.json
index 3fc862d..8438d77 100644
--- a/Pulsar/WebApp/package.json
+++ b/Pulsar/WebApp/package.json
@@ -12,26 +12,21 @@
 		"lint": "biomejs ."
 	},
 	"devDependencies": {
-		"@biomejs/biome": "1.6.4",
+		"@biomejs/biome": "^1.7.3",
 		"@microsoft/signalr": "^8.0.0",
-		"@playwright/test": "^1.28.1",
+		"@playwright/test": "^1.44.0",
 		"@sveltejs/adapter-static": "^3.0.1",
-		"@sveltejs/kit": "^2.0.0",
-		"@sveltejs/vite-plugin-svelte": "^3.0.0",
-		"@types/eslint": "^8.56.7",
-		"eslint-plugin-svelte": "^2.36.0",
-		"globals": "^15.0.0",
-		"sass": "^1.75.0",
-		"svelte": "^5.0.0-next.121",
-		"svelte-check": "^3.6.0",
-		"tslib": "^2.4.1",
-		"typescript": "^5.0.0",
-		"typescript-eslint": "^7.5.0",
-		"vite": "^5.0.3"
-	},
-	"type": "module",
-	"dependencies": {
 		"@sveltestack/svelte-query": "^1.6.0",
-		"axios": "^1.6.8"
-	}
+		"@sveltejs/kit": "^2.5.7",
+		"@sveltejs/vite-plugin-svelte": "next",
+		"eslint-plugin-svelte": "^2.39.0",
+		"globals": "^15.2.0",
+		"sass": "^1.77.0",
+		"svelte": "^5.0.0-next.126",
+		"svelte-check": "^3.7.1",
+		"tslib": "^2.6.2",
+		"typescript": "^5.4.5",
+		"vite": "^5.2.11"
+	},
+	"type": "module"
 }
diff --git a/Pulsar/WebApp/src/lib/Debug.svelte b/Pulsar/WebApp/src/lib/Debug.svelte
index 68a9973..1db9e63 100644
--- a/Pulsar/WebApp/src/lib/Debug.svelte
+++ b/Pulsar/WebApp/src/lib/Debug.svelte
@@ -1,14 +1,13 @@
 <script lang="ts">
-    import axios from "axios";
     import { useQuery, useQueryClient } from "@sveltestack/svelte-query";
 
     const queryClient = useQueryClient();
 
     const getData = async () => {
-        const response = await axios.get(
+        const response = await fetch(
             "http://localhost:5000/api/journal/",
         );
-        return response.data;
+        return response.json()
     };
 
     const query = useQuery("journal", getData, { staleTime: Infinity });
diff --git a/Pulsar/WebApp/src/lib/MissionStack.svelte b/Pulsar/WebApp/src/lib/MissionStack.svelte
index 1918463..58997ea 100644
--- a/Pulsar/WebApp/src/lib/MissionStack.svelte
+++ b/Pulsar/WebApp/src/lib/MissionStack.svelte
@@ -1,12 +1,11 @@
 <script lang="ts">
-    import axios from "axios";
     import { useQuery, useQueryClient } from "@sveltestack/svelte-query";
 
     const queryClient = useQueryClient();
 
     const getData = async () => {
-        const response = await axios.get("http://localhost:5000/api/journal/");
-        return response.data;
+        const response = await fetch("http://localhost:5000/api/journal/");
+        return response.json();
     };
 
     const query = useQuery("journal", getData, { staleTime: Infinity });
diff --git a/Pulsar/WebApp/src/lib/Ship.svelte b/Pulsar/WebApp/src/lib/Ship.svelte
index 280055f..7390d35 100644
--- a/Pulsar/WebApp/src/lib/Ship.svelte
+++ b/Pulsar/WebApp/src/lib/Ship.svelte
@@ -1,14 +1,13 @@
 <script lang="ts">
-    import axios from "axios";
     import { useQuery, useQueryClient } from "@sveltestack/svelte-query";
 
     const queryClient = useQueryClient();
 
     const getData = async () => {
-        const response = await axios.get(
+        const response = await fetch(
             "http://localhost:5000/api/modulesinfo/",
         );
-        return response.data;
+        return response.json();
     };
 
     const query = useQuery("modulesinfo", getData, { staleTime: Infinity });
diff --git a/Pulsar/WebApp/src/lib/Status.svelte b/Pulsar/WebApp/src/lib/Status.svelte
index a2e22ba..4f33e63 100644
--- a/Pulsar/WebApp/src/lib/Status.svelte
+++ b/Pulsar/WebApp/src/lib/Status.svelte
@@ -1,9 +1,7 @@
 <script lang="ts">
     import * as signalR from "@microsoft/signalr"
     import {onMount} from "svelte";
-    import axios from "axios";
     import { useQueryClient } from "@sveltestack/svelte-query";
-    import { text } from "@sveltejs/kit";
     let x: string | null = $state(null);
     let textarea = $state("");
 
@@ -38,7 +36,7 @@
     let status: Welcome | null = $state(null);
 
     const connection = new signalR.HubConnectionBuilder()
-        .withUrl("http://172.31.0.111:5000/api/events")
+        .withUrl("http://localhost:5000/api/events")
         .configureLogging(signalR.LogLevel.Information)
         .build();
 
@@ -59,8 +57,8 @@
     });
 
     const getStatus = async () => {
-        var response = await axios.get("http://172.31.0.111:5000/api/status/");
-        status = response.data as Welcome;
+        const response = await fetch("http://localhost:5000/api/status/");
+        status = await response.json() as Welcome
         textarea = status.event;
     };
 </script>
diff --git a/Pulsar/WebApp/src/routes/+layout.svelte b/Pulsar/WebApp/src/routes/+layout.svelte
index 20882bc..d67f483 100644
--- a/Pulsar/WebApp/src/routes/+layout.svelte
+++ b/Pulsar/WebApp/src/routes/+layout.svelte
@@ -10,7 +10,7 @@
     <nav>
         <ul>
             <li><a href="/">Dashboard</a></li>
-            <li><a href="/settings">Settings</a></li>
+            <!--<li><a href="/settings">Settings</a></li>-->
         </ul>
     </nav>
 </header>
diff --git a/README.md b/README.md
index 00d92b3..1428377 100644
--- a/README.md
+++ b/README.md
@@ -17,6 +17,7 @@ A Cross Platform Fork of Elite Observatory Core.
  - [ ] !System Exobiology Value 
    - [ ] !Exobiology Scan info (+[Show Req. Disatance](https://github.com/EDCD/EDDI/blob/e28ef64a1d41c1e39485863aa362d207e8d36834/Utilities/Functions.cs#L128C1-L152C10) for next scan)
  - [ ] !Fuel/Jump Warning
+ - [ ] Material Tracking (Flag planets with materials, set goals, closest trader) [e.g.](https://github.com/jixxed/ed-odyssey-materials-helper)
  - [ ] Custom Sounds (on user-defined Events)
  - [ ] Mission Targets [Mission Stack Viewer](https://github.com/kaivalagi/EDMissionStackViewer)
  - [ ] Commodities Targets/Alerts (Commodity Above/Below value at current station)