diff --git a/src/Recyclarr.Common/Extensions/ExceptionExtensions.cs b/src/Recyclarr.Common/Extensions/ExceptionExtensions.cs
deleted file mode 100644
index c30da989..00000000
--- a/src/Recyclarr.Common/Extensions/ExceptionExtensions.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-namespace Recyclarr.Common.Extensions;
-
-public static class ExceptionExtensions
-{
- public static string FullMessage(this Exception ex)
- {
- if (ex is AggregateException aex)
- {
- return aex.InnerExceptions.Aggregate("[ ", (total, next) => $"{total}[{next.FullMessage()}] ") + "]";
- }
-
- var msg = ex.Message.Replace(", see inner exception.", "").Trim();
- var innerMsg = ex.InnerException?.FullMessage();
- if (innerMsg != null && !innerMsg.ContainsIgnoreCase(msg) && !msg.ContainsIgnoreCase(innerMsg))
- {
- msg = $"{msg} [ {innerMsg} ]";
- }
-
- return msg;
- }
-}
diff --git a/src/Recyclarr.Config/Parsing/ConfigurationLoader.cs b/src/Recyclarr.Config/Parsing/ConfigurationLoader.cs
index 122d8d11..d3ccdb28 100644
--- a/src/Recyclarr.Config/Parsing/ConfigurationLoader.cs
+++ b/src/Recyclarr.Config/Parsing/ConfigurationLoader.cs
@@ -2,7 +2,7 @@
using AutoMapper;
using Recyclarr.Config.Models;
using Recyclarr.Config.Parsing.PostProcessing;
-using Recyclarr.Platform;
+using Recyclarr.Logging;
using Serilog.Context;
namespace Recyclarr.Config.Parsing;
diff --git a/src/Recyclarr.Config/Parsing/PostProcessing/IncludePostProcessor.cs b/src/Recyclarr.Config/Parsing/PostProcessing/IncludePostProcessor.cs
index 77a9569b..33b7b619 100644
--- a/src/Recyclarr.Config/Parsing/PostProcessing/IncludePostProcessor.cs
+++ b/src/Recyclarr.Config/Parsing/PostProcessing/IncludePostProcessor.cs
@@ -1,6 +1,6 @@
using Recyclarr.Config.Parsing.PostProcessing.ConfigMerging;
using Recyclarr.Config.Parsing.PostProcessing.Deprecations;
-using Recyclarr.Platform;
+using Recyclarr.Logging;
using Recyclarr.TrashGuide;
using Serilog.Context;
diff --git a/src/Recyclarr.Config/Recyclarr.Config.csproj b/src/Recyclarr.Config/Recyclarr.Config.csproj
index 191db802..9ddfa9d3 100644
--- a/src/Recyclarr.Config/Recyclarr.Config.csproj
+++ b/src/Recyclarr.Config/Recyclarr.Config.csproj
@@ -10,6 +10,7 @@
+
diff --git a/src/Recyclarr.Gui/Pages/_Host.cshtml b/src/Recyclarr.Gui/Pages/_Host.cshtml
index 01d8266d..31b5c4d3 100644
--- a/src/Recyclarr.Gui/Pages/_Host.cshtml
+++ b/src/Recyclarr.Gui/Pages/_Host.cshtml
@@ -1,4 +1,5 @@
@page "/"
+@using Microsoft.AspNetCore.Mvc.TagHelpers
@namespace Recyclarr.Gui.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@{
diff --git a/src/Recyclarr.Gui/Pages/_Layout.cshtml b/src/Recyclarr.Gui/Pages/_Layout.cshtml
index e0c3d53e..c15b19fe 100644
--- a/src/Recyclarr.Gui/Pages/_Layout.cshtml
+++ b/src/Recyclarr.Gui/Pages/_Layout.cshtml
@@ -1,4 +1,5 @@
@using Microsoft.AspNetCore.Components.Web
+@using Microsoft.AspNetCore.Mvc.TagHelpers
@namespace Recyclarr.Gui.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
diff --git a/src/Recyclarr.Http/FlurlLoggingEventHandlers.cs b/src/Recyclarr.Http/FlurlLoggingEventHandlers.cs
index 7e0c50e8..e9b85624 100644
--- a/src/Recyclarr.Http/FlurlLoggingEventHandlers.cs
+++ b/src/Recyclarr.Http/FlurlLoggingEventHandlers.cs
@@ -1,4 +1,5 @@
using Flurl.Http;
+using Recyclarr.Logging;
using Serilog;
namespace Recyclarr.Http;
diff --git a/src/Recyclarr.Http/Recyclarr.Http.csproj b/src/Recyclarr.Http/Recyclarr.Http.csproj
index dd38fec3..d27cc679 100644
--- a/src/Recyclarr.Http/Recyclarr.Http.csproj
+++ b/src/Recyclarr.Http/Recyclarr.Http.csproj
@@ -6,5 +6,6 @@
+
diff --git a/src/Recyclarr.Http/Sanitize.cs b/src/Recyclarr.Http/Sanitize.cs
deleted file mode 100644
index 33167509..00000000
--- a/src/Recyclarr.Http/Sanitize.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using System.Text.RegularExpressions;
-using Flurl;
-using Recyclarr.Common.Extensions;
-
-namespace Recyclarr.Http;
-
-public static partial class Sanitize
-{
- public static string Message(string message)
- {
- // Replace full URLs
- var result = UrlRegex().Replace(message, SanitizeMatch);
-
- // There are sometimes parenthetical parts of the message that contain the host but are not
- // detected as true URLs. Just strip those out completely.
- return HostRegex().Replace(result, "");
- }
-
- public static string ExceptionMessage(Exception exception)
- {
- return Message(exception.FullMessage());
- }
-
- public static Url Url(Url url)
- {
- // Replace hostname for user privacy
- url.Host = "REDACTED";
- return url;
- }
-
- private static string SanitizeMatch(Match match)
- {
- return Url(match.Value).ToString() ?? match.Value;
- }
-
- [GeneratedRegex(@"\([-a-zA-Z0-9@:%._+~#=]{1,256}(?::[0-9]+)?\)")]
- private static partial Regex HostRegex();
-
- [GeneratedRegex(@"https?://(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}(:[0-9]+)?\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)")]
- private static partial Regex UrlRegex();
-}
diff --git a/src/Recyclarr.Platform/LogProperty.cs b/src/Recyclarr.Platform/LogProperty.cs
deleted file mode 100644
index 73634c2b..00000000
--- a/src/Recyclarr.Platform/LogProperty.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace Recyclarr.Platform;
-
-public static class LogProperty
-{
- public static string Scope => nameof(Scope);
-}
diff --git a/src/Recyclarr.Repo/ConfigTemplatesRepo.cs b/src/Recyclarr.Repo/ConfigTemplatesRepo.cs
index 5b9c3ea5..0de5002a 100644
--- a/src/Recyclarr.Repo/ConfigTemplatesRepo.cs
+++ b/src/Recyclarr.Repo/ConfigTemplatesRepo.cs
@@ -1,4 +1,5 @@
using System.IO.Abstractions;
+using Recyclarr.Logging;
using Recyclarr.Platform;
using Recyclarr.Settings;
using Serilog.Context;
diff --git a/src/Recyclarr.Repo/Recyclarr.Repo.csproj b/src/Recyclarr.Repo/Recyclarr.Repo.csproj
index 3d2b9406..ee978528 100644
--- a/src/Recyclarr.Repo/Recyclarr.Repo.csproj
+++ b/src/Recyclarr.Repo/Recyclarr.Repo.csproj
@@ -1,6 +1,7 @@
+
diff --git a/src/Recyclarr.Repo/TrashGuidesRepo.cs b/src/Recyclarr.Repo/TrashGuidesRepo.cs
index c824da84..d244b231 100644
--- a/src/Recyclarr.Repo/TrashGuidesRepo.cs
+++ b/src/Recyclarr.Repo/TrashGuidesRepo.cs
@@ -1,4 +1,5 @@
using System.IO.Abstractions;
+using Recyclarr.Logging;
using Recyclarr.Platform;
using Recyclarr.Settings;
using Serilog.Context;