diff --git a/Duplicati.sln b/Duplicati.sln
index 47c8cfa25..0c665b4b9 100644
--- a/Duplicati.sln
+++ b/Duplicati.sln
@@ -170,6 +170,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{15388C37
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RemoteSynchronization", "Tools\RemoteSynchronization\RemoteSynchronization.csproj", "{D3A7E41E-279D-4E0A-A2DB-5E8002E02B6D}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.SyncTool", "Executables\net8\Duplicati.CommandLine.SyncTool\Duplicati.CommandLine.SyncTool.csproj", "{48D32674-0FE9-4407-B102-4AE46D93595F}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -480,6 +482,10 @@ Global
{D3A7E41E-279D-4E0A-A2DB-5E8002E02B6D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D3A7E41E-279D-4E0A-A2DB-5E8002E02B6D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D3A7E41E-279D-4E0A-A2DB-5E8002E02B6D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {48D32674-0FE9-4407-B102-4AE46D93595F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {48D32674-0FE9-4407-B102-4AE46D93595F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {48D32674-0FE9-4407-B102-4AE46D93595F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {48D32674-0FE9-4407-B102-4AE46D93595F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -541,6 +547,7 @@ Global
{8ACA2736-3C69-4FA5-BCF9-5EDF50CAF332} = {566EBBDA-19A4-4056-A615-D901D57D2439}
{836E0557-B40C-4DC7-9A2A-5C062F9ACC6B} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4}
{D3A7E41E-279D-4E0A-A2DB-5E8002E02B6D} = {15388C37-9218-4818-972E-738EEA8F1602}
+ {48D32674-0FE9-4407-B102-4AE46D93595F} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {8B40BAFE-D862-4397-9495-8F5EAF5CE80C}
diff --git a/Duplicati/Library/AutoUpdater/PackageHelper.cs b/Duplicati/Library/AutoUpdater/PackageHelper.cs
index 5f1ee0341..314facb04 100644
--- a/Duplicati/Library/AutoUpdater/PackageHelper.cs
+++ b/Duplicati/Library/AutoUpdater/PackageHelper.cs
@@ -89,6 +89,10 @@ namespace Duplicati.Library.AutoUpdater
/// The secret tool
///
SecretTool,
+ ///
+ /// The sync tool
+ ///
+ SyncTool
}
@@ -115,6 +119,7 @@ namespace Duplicati.Library.AutoUpdater
NamedExecutable.Service => OperatingSystem.IsWindows() ? "Duplicati.Service.exe" : "duplicati-service",
NamedExecutable.Agent => OperatingSystem.IsWindows() ? "Duplicati.Agent.exe" : "duplicati-agent",
NamedExecutable.SecretTool => OperatingSystem.IsWindows() ? "Duplicati.CommandLine.SecretTool.exe" : "duplicati-secret-tool",
+ NamedExecutable.SyncTool => OperatingSystem.IsWindows() ? "Duplicati.CommandLine.SyncTool.exe" : "duplicati-sync-tool",
_ => throw new ArgumentException($"Named executable not known: {exe}", nameof(exe))
};
diff --git a/Executables/net8/Duplicati.CommandLine.SyncTool/Duplicati.CommandLine.SyncTool.csproj b/Executables/net8/Duplicati.CommandLine.SyncTool/Duplicati.CommandLine.SyncTool.csproj
new file mode 100644
index 000000000..2ce4cf329
--- /dev/null
+++ b/Executables/net8/Duplicati.CommandLine.SyncTool/Duplicati.CommandLine.SyncTool.csproj
@@ -0,0 +1,22 @@
+
+
+
+ Exe
+ net8.0
+ SyncTool for Duplicati
+ Copyright © 2025 Team Duplicati, MIT license
+
+
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
diff --git a/Executables/net8/Duplicati.CommandLine.SyncTool/Program.cs b/Executables/net8/Duplicati.CommandLine.SyncTool/Program.cs
new file mode 100644
index 000000000..c0e13737d
--- /dev/null
+++ b/Executables/net8/Duplicati.CommandLine.SyncTool/Program.cs
@@ -0,0 +1,31 @@
+// Copyright (C) 2025, The Duplicati Team
+// https://duplicati.com, hello@duplicati.com
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+using Duplicati.Library.Crashlog;
+
+namespace Duplicati.CommandLine.SyncTool.Net8
+{
+ // Wrapper class to keep code independent
+ public static class Program
+ {
+ public static int Main(string[] args)
+ => CrashlogHelper.WrapWithCrashLog(() => RemoteSynchronization.Program.Main(args).ConfigureAwait(false).GetAwaiter().GetResult());
+ }
+}
\ No newline at end of file
diff --git a/ReleaseBuilder/Build/Command.cs b/ReleaseBuilder/Build/Command.cs
index d0de3a4b9..46ea9f935 100644
--- a/ReleaseBuilder/Build/Command.cs
+++ b/ReleaseBuilder/Build/Command.cs
@@ -86,6 +86,7 @@ public static partial class Command
{ "Duplicati.CommandLine.Snapshots", "duplicati-snapshots" },
{ "Duplicati.CommandLine.ServerUtil", "duplicati-server-util" },
{ "Duplicati.CommandLine.SecretTool", "duplicati-secret-tool" },
+ { "Duplicati.CommandLine.SyncTool", "duplicati-sync-tool" },
{ "Duplicati.Service", "duplicati-service" },
{ "Duplicati.Agent", "duplicati-agent" },
{ "Duplicati.CommandLine", "duplicati-cli" },
diff --git a/Tools/RemoteSynchronization/RemoteSynchronization.csproj b/Tools/RemoteSynchronization/RemoteSynchronization.csproj
index 6cd7b2704..9c800af07 100644
--- a/Tools/RemoteSynchronization/RemoteSynchronization.csproj
+++ b/Tools/RemoteSynchronization/RemoteSynchronization.csproj
@@ -1,7 +1,7 @@
- Exe
+ Library
net8.0
disable
enable