diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..cd967fc
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,25 @@
+**/.dockerignore
+**/.env
+**/.git
+**/.gitignore
+**/.project
+**/.settings
+**/.toolstarget
+**/.vs
+**/.vscode
+**/.idea
+**/*.*proj.user
+**/*.dbmdl
+**/*.jfm
+**/azds.yaml
+**/bin
+**/charts
+**/docker-compose*
+**/Dockerfile*
+**/node_modules
+**/npm-debug.log
+**/obj
+**/secrets.dev.yaml
+**/values.dev.yaml
+LICENSE
+README.md
\ No newline at end of file
diff --git a/.idea/.idea.RelayCore/.idea/.gitignore b/.idea/.idea.RelayCore/.idea/.gitignore
new file mode 100644
index 0000000..50dbf98
--- /dev/null
+++ b/.idea/.idea.RelayCore/.idea/.gitignore
@@ -0,0 +1,13 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Rider ignored files
+/projectSettingsUpdater.xml
+/modules.xml
+/contentModel.xml
+/.idea.RelayCore.iml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/.idea.RelayCore/.idea/AndroidProjectSystem.xml b/.idea/.idea.RelayCore/.idea/AndroidProjectSystem.xml
new file mode 100644
index 0000000..e82600c
--- /dev/null
+++ b/.idea/.idea.RelayCore/.idea/AndroidProjectSystem.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.RelayCore/.idea/encodings.xml b/.idea/.idea.RelayCore/.idea/encodings.xml
new file mode 100644
index 0000000..df87cf9
--- /dev/null
+++ b/.idea/.idea.RelayCore/.idea/encodings.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.RelayCore/.idea/indexLayout.xml b/.idea/.idea.RelayCore/.idea/indexLayout.xml
new file mode 100644
index 0000000..7b08163
--- /dev/null
+++ b/.idea/.idea.RelayCore/.idea/indexLayout.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.RelayCore/.idea/vcs.xml b/.idea/.idea.RelayCore/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/.idea.RelayCore/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..d6dc02a
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,21 @@
+FROM mcr.microsoft.com/dotnet/runtime:9.0 AS base
+USER $APP_UID
+WORKDIR /app
+
+FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
+ARG BUILD_CONFIGURATION=Release
+WORKDIR /src
+COPY ["RelayCore.csproj", "./"]
+RUN dotnet restore "RelayCore.csproj"
+COPY . .
+WORKDIR "/src/"
+RUN dotnet build "./RelayCore.csproj" -c $BUILD_CONFIGURATION -o /app/build
+
+FROM build AS publish
+ARG BUILD_CONFIGURATION=Release
+RUN dotnet publish "./RelayCore.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
+
+FROM base AS final
+WORKDIR /app
+COPY --from=publish /app/publish .
+ENTRYPOINT ["dotnet", "RelayCore.dll"]
diff --git a/Program.cs b/Program.cs
new file mode 100644
index 0000000..e5dff12
--- /dev/null
+++ b/Program.cs
@@ -0,0 +1,3 @@
+// See https://aka.ms/new-console-template for more information
+
+Console.WriteLine("Hello, World!");
\ No newline at end of file
diff --git a/RelayCore.csproj b/RelayCore.csproj
new file mode 100644
index 0000000..8372c2e
--- /dev/null
+++ b/RelayCore.csproj
@@ -0,0 +1,11 @@
+
+
+
+ Exe
+ net9.0
+ enable
+ enable
+ Linux
+
+
+
diff --git a/RelayCore.sln b/RelayCore.sln
new file mode 100644
index 0000000..1a0a0ee
--- /dev/null
+++ b/RelayCore.sln
@@ -0,0 +1,21 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RelayCore", "RelayCore.csproj", "{E918B36B-F762-4D75-BFF6-3566400F36CD}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{6BE28511-369E-4D50-BDAF-3258D32FA7B9}"
+ ProjectSection(SolutionItems) = preProject
+ compose.yaml = compose.yaml
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {E918B36B-F762-4D75-BFF6-3566400F36CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E918B36B-F762-4D75-BFF6-3566400F36CD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E918B36B-F762-4D75-BFF6-3566400F36CD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E918B36B-F762-4D75-BFF6-3566400F36CD}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+EndGlobal
diff --git a/compose.yaml b/compose.yaml
new file mode 100644
index 0000000..eed92af
--- /dev/null
+++ b/compose.yaml
@@ -0,0 +1,7 @@
+services:
+ relaycore:
+ image: relaycore
+ build:
+ context: .
+ dockerfile: Dockerfile
+
diff --git a/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs b/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs
new file mode 100644
index 0000000..feda5e9
--- /dev/null
+++ b/obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs
@@ -0,0 +1,4 @@
+//
+using System;
+using System.Reflection;
+[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v9.0", FrameworkDisplayName = ".NET 9.0")]
diff --git a/obj/Debug/net9.0/RelayCore.AssemblyInfo.cs b/obj/Debug/net9.0/RelayCore.AssemblyInfo.cs
new file mode 100644
index 0000000..83795cb
--- /dev/null
+++ b/obj/Debug/net9.0/RelayCore.AssemblyInfo.cs
@@ -0,0 +1,22 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+using System;
+using System.Reflection;
+
+[assembly: System.Reflection.AssemblyCompanyAttribute("RelayCore")]
+[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
+[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
+[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+f8281d23e500ea2193d3ba250c72e52cc6ba5719")]
+[assembly: System.Reflection.AssemblyProductAttribute("RelayCore")]
+[assembly: System.Reflection.AssemblyTitleAttribute("RelayCore")]
+[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
+
+// Generated by the MSBuild WriteCodeFragment class.
+
diff --git a/obj/Debug/net9.0/RelayCore.AssemblyInfoInputs.cache b/obj/Debug/net9.0/RelayCore.AssemblyInfoInputs.cache
new file mode 100644
index 0000000..9382867
--- /dev/null
+++ b/obj/Debug/net9.0/RelayCore.AssemblyInfoInputs.cache
@@ -0,0 +1 @@
+851998f658dd2dac9cb5399ab03b4ba71b56fcacf9ba6114b09e7e190bcae806
diff --git a/obj/Debug/net9.0/RelayCore.GeneratedMSBuildEditorConfig.editorconfig b/obj/Debug/net9.0/RelayCore.GeneratedMSBuildEditorConfig.editorconfig
new file mode 100644
index 0000000..da7f5a5
--- /dev/null
+++ b/obj/Debug/net9.0/RelayCore.GeneratedMSBuildEditorConfig.editorconfig
@@ -0,0 +1,15 @@
+is_global = true
+build_property.TargetFramework = net9.0
+build_property.TargetPlatformMinVersion =
+build_property.UsingMicrosoftNETSdkWeb =
+build_property.ProjectTypeGuids =
+build_property.InvariantGlobalization =
+build_property.PlatformNeutralAssembly =
+build_property.EnforceExtendedAnalyzerRules =
+build_property._SupportedPlatformList = Linux,macOS,Windows
+build_property.RootNamespace = RelayCore
+build_property.ProjectDir = D:\DDI\Relay\RelayChat\RelayCore\
+build_property.EnableComHosting =
+build_property.EnableGeneratedComInterfaceComImportInterop =
+build_property.EffectiveAnalysisLevelStyle = 9.0
+build_property.EnableCodeStyleSeverity =
diff --git a/obj/Debug/net9.0/RelayCore.GlobalUsings.g.cs b/obj/Debug/net9.0/RelayCore.GlobalUsings.g.cs
new file mode 100644
index 0000000..8578f3d
--- /dev/null
+++ b/obj/Debug/net9.0/RelayCore.GlobalUsings.g.cs
@@ -0,0 +1,8 @@
+//
+global using global::System;
+global using global::System.Collections.Generic;
+global using global::System.IO;
+global using global::System.Linq;
+global using global::System.Net.Http;
+global using global::System.Threading;
+global using global::System.Threading.Tasks;
diff --git a/obj/Debug/net9.0/RelayCore.assets.cache b/obj/Debug/net9.0/RelayCore.assets.cache
new file mode 100644
index 0000000..f0e0593
Binary files /dev/null and b/obj/Debug/net9.0/RelayCore.assets.cache differ
diff --git a/obj/RelayCore.csproj.nuget.dgspec.json b/obj/RelayCore.csproj.nuget.dgspec.json
new file mode 100644
index 0000000..fa1c02a
--- /dev/null
+++ b/obj/RelayCore.csproj.nuget.dgspec.json
@@ -0,0 +1,74 @@
+{
+ "format": 1,
+ "restore": {
+ "D:\\DDI\\Relay\\RelayChat\\RelayCore\\RelayCore.csproj": {}
+ },
+ "projects": {
+ "D:\\DDI\\Relay\\RelayChat\\RelayCore\\RelayCore.csproj": {
+ "version": "1.0.0",
+ "restore": {
+ "projectUniqueName": "D:\\DDI\\Relay\\RelayChat\\RelayCore\\RelayCore.csproj",
+ "projectName": "RelayCore",
+ "projectPath": "D:\\DDI\\Relay\\RelayChat\\RelayCore\\RelayCore.csproj",
+ "packagesPath": "C:\\Users\\Core\\.nuget\\packages\\",
+ "outputPath": "D:\\DDI\\Relay\\RelayChat\\RelayCore\\obj\\",
+ "projectStyle": "PackageReference",
+ "fallbackFolders": [
+ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
+ ],
+ "configFilePaths": [
+ "C:\\Users\\Core\\AppData\\Roaming\\NuGet\\NuGet.Config",
+ "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
+ "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
+ ],
+ "originalTargetFrameworks": [
+ "net9.0"
+ ],
+ "sources": {
+ "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
+ "C:\\Program Files\\dotnet\\library-packs": {},
+ "https://api.nuget.org/v3/index.json": {}
+ },
+ "frameworks": {
+ "net9.0": {
+ "targetAlias": "net9.0",
+ "projectReferences": {}
+ }
+ },
+ "warningProperties": {
+ "warnAsError": [
+ "NU1605"
+ ]
+ },
+ "restoreAuditProperties": {
+ "enableAudit": "true",
+ "auditLevel": "low",
+ "auditMode": "direct"
+ },
+ "SdkAnalysisLevel": "9.0.300"
+ },
+ "frameworks": {
+ "net9.0": {
+ "targetAlias": "net9.0",
+ "imports": [
+ "net461",
+ "net462",
+ "net47",
+ "net471",
+ "net472",
+ "net48",
+ "net481"
+ ],
+ "assetTargetFallback": true,
+ "warn": true,
+ "frameworkReferences": {
+ "Microsoft.NETCore.App": {
+ "privateAssets": "all"
+ }
+ },
+ "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.305/PortableRuntimeIdentifierGraph.json"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/obj/RelayCore.csproj.nuget.g.props b/obj/RelayCore.csproj.nuget.g.props
new file mode 100644
index 0000000..65e84c4
--- /dev/null
+++ b/obj/RelayCore.csproj.nuget.g.props
@@ -0,0 +1,16 @@
+
+
+
+ True
+ NuGet
+ $(MSBuildThisFileDirectory)project.assets.json
+ $(UserProfile)\.nuget\packages\
+ C:\Users\Core\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages
+ PackageReference
+ 6.14.0
+
+
+
+
+
+
\ No newline at end of file
diff --git a/obj/RelayCore.csproj.nuget.g.targets b/obj/RelayCore.csproj.nuget.g.targets
new file mode 100644
index 0000000..3dc06ef
--- /dev/null
+++ b/obj/RelayCore.csproj.nuget.g.targets
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/obj/project.assets.json b/obj/project.assets.json
new file mode 100644
index 0000000..c63c0b4
--- /dev/null
+++ b/obj/project.assets.json
@@ -0,0 +1,80 @@
+{
+ "version": 3,
+ "targets": {
+ "net9.0": {}
+ },
+ "libraries": {},
+ "projectFileDependencyGroups": {
+ "net9.0": []
+ },
+ "packageFolders": {
+ "C:\\Users\\Core\\.nuget\\packages\\": {},
+ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {}
+ },
+ "project": {
+ "version": "1.0.0",
+ "restore": {
+ "projectUniqueName": "D:\\DDI\\Relay\\RelayChat\\RelayCore\\RelayCore.csproj",
+ "projectName": "RelayCore",
+ "projectPath": "D:\\DDI\\Relay\\RelayChat\\RelayCore\\RelayCore.csproj",
+ "packagesPath": "C:\\Users\\Core\\.nuget\\packages\\",
+ "outputPath": "D:\\DDI\\Relay\\RelayChat\\RelayCore\\obj\\",
+ "projectStyle": "PackageReference",
+ "fallbackFolders": [
+ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
+ ],
+ "configFilePaths": [
+ "C:\\Users\\Core\\AppData\\Roaming\\NuGet\\NuGet.Config",
+ "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
+ "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
+ ],
+ "originalTargetFrameworks": [
+ "net9.0"
+ ],
+ "sources": {
+ "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
+ "C:\\Program Files\\dotnet\\library-packs": {},
+ "https://api.nuget.org/v3/index.json": {}
+ },
+ "frameworks": {
+ "net9.0": {
+ "targetAlias": "net9.0",
+ "projectReferences": {}
+ }
+ },
+ "warningProperties": {
+ "warnAsError": [
+ "NU1605"
+ ]
+ },
+ "restoreAuditProperties": {
+ "enableAudit": "true",
+ "auditLevel": "low",
+ "auditMode": "direct"
+ },
+ "SdkAnalysisLevel": "9.0.300"
+ },
+ "frameworks": {
+ "net9.0": {
+ "targetAlias": "net9.0",
+ "imports": [
+ "net461",
+ "net462",
+ "net47",
+ "net471",
+ "net472",
+ "net48",
+ "net481"
+ ],
+ "assetTargetFallback": true,
+ "warn": true,
+ "frameworkReferences": {
+ "Microsoft.NETCore.App": {
+ "privateAssets": "all"
+ }
+ },
+ "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.305/PortableRuntimeIdentifierGraph.json"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/obj/project.nuget.cache b/obj/project.nuget.cache
new file mode 100644
index 0000000..1a9b805
--- /dev/null
+++ b/obj/project.nuget.cache
@@ -0,0 +1,8 @@
+{
+ "version": 2,
+ "dgSpecHash": "+jJKSs40Yjo=",
+ "success": true,
+ "projectFilePath": "D:\\DDI\\Relay\\RelayChat\\RelayCore\\RelayCore.csproj",
+ "expectedPackageFiles": [],
+ "logs": []
+}
\ No newline at end of file
diff --git a/obj/project.packagespec.json b/obj/project.packagespec.json
new file mode 100644
index 0000000..d45d2f5
--- /dev/null
+++ b/obj/project.packagespec.json
@@ -0,0 +1 @@
+"restore":{"projectUniqueName":"D:\\DDI\\Relay\\RelayChat\\RelayCore\\RelayCore.csproj","projectName":"RelayCore","projectPath":"D:\\DDI\\Relay\\RelayChat\\RelayCore\\RelayCore.csproj","outputPath":"D:\\DDI\\Relay\\RelayChat\\RelayCore\\obj\\","projectStyle":"PackageReference","fallbackFolders":["C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"],"originalTargetFrameworks":["net9.0"],"sources":{"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\":{},"C:\\Program Files\\dotnet\\library-packs":{},"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net9.0":{"targetAlias":"net9.0","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"},"SdkAnalysisLevel":"9.0.300"}"frameworks":{"net9.0":{"targetAlias":"net9.0","imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"C:\\Program Files\\dotnet\\sdk\\9.0.305/PortableRuntimeIdentifierGraph.json"}}
\ No newline at end of file
diff --git a/obj/rider.project.model.nuget.info b/obj/rider.project.model.nuget.info
new file mode 100644
index 0000000..2558a74
--- /dev/null
+++ b/obj/rider.project.model.nuget.info
@@ -0,0 +1 @@
+17731136919568974
\ No newline at end of file
diff --git a/obj/rider.project.restore.info b/obj/rider.project.restore.info
new file mode 100644
index 0000000..1fabd17
--- /dev/null
+++ b/obj/rider.project.restore.info
@@ -0,0 +1 @@
+17731137598642406
\ No newline at end of file