diff --git a/Elsa.Extensions.sln b/Elsa.Extensions.sln
index fdf72b48..3ca34442 100644
--- a/Elsa.Extensions.sln
+++ b/Elsa.Extensions.sln
@@ -277,6 +277,14 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "diagnostics", "diagnostics"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.OpenTelemetry", "src\modules\diagnostics\Elsa.OpenTelemetry\Elsa.OpenTelemetry.csproj", "{28D04FA3-4DCC-4137-8ED4-9F6F1A815909}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "io", "io", "{9B363CC3-1F38-409B-8E0D-E2C13019902A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.IO", "src\modules\io\Elsa.IO\Elsa.IO.csproj", "{D620FC48-5B8E-4010-86DE-20628364AA6E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.IO.Compression", "src\modules\io\Elsa.IO.Compression\Elsa.IO.Compression.csproj", "{53F9BF60-127F-4F86-9B33-34445BFA512D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.IO.Http", "src\modules\io\Elsa.IO.Http\Elsa.IO.Http.csproj", "{89D15E59-B0BF-4525-99FA-B61BA8451241}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -631,6 +639,18 @@ Global
{28D04FA3-4DCC-4137-8ED4-9F6F1A815909}.Debug|Any CPU.Build.0 = Debug|Any CPU
{28D04FA3-4DCC-4137-8ED4-9F6F1A815909}.Release|Any CPU.ActiveCfg = Release|Any CPU
{28D04FA3-4DCC-4137-8ED4-9F6F1A815909}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D620FC48-5B8E-4010-86DE-20628364AA6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D620FC48-5B8E-4010-86DE-20628364AA6E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D620FC48-5B8E-4010-86DE-20628364AA6E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D620FC48-5B8E-4010-86DE-20628364AA6E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {53F9BF60-127F-4F86-9B33-34445BFA512D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {53F9BF60-127F-4F86-9B33-34445BFA512D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {53F9BF60-127F-4F86-9B33-34445BFA512D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {53F9BF60-127F-4F86-9B33-34445BFA512D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {89D15E59-B0BF-4525-99FA-B61BA8451241}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {89D15E59-B0BF-4525-99FA-B61BA8451241}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {89D15E59-B0BF-4525-99FA-B61BA8451241}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {89D15E59-B0BF-4525-99FA-B61BA8451241}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -755,6 +775,10 @@ Global
{8D0EC628-350F-47FC-8B36-DD98B4B7CC93} = {30CF0330-4B09-4784-B499-46BED303810B}
{28D04FA3-4DCC-4137-8ED4-9F6F1A815909} = {8D0EC628-350F-47FC-8B36-DD98B4B7CC93}
{04265302-AF6B-4627-807C-DE9E1699D7C9} = {30CF0330-4B09-4784-B499-46BED303810B}
+ {9B363CC3-1F38-409B-8E0D-E2C13019902A} = {30CF0330-4B09-4784-B499-46BED303810B}
+ {D620FC48-5B8E-4010-86DE-20628364AA6E} = {9B363CC3-1F38-409B-8E0D-E2C13019902A}
+ {53F9BF60-127F-4F86-9B33-34445BFA512D} = {9B363CC3-1F38-409B-8E0D-E2C13019902A}
+ {89D15E59-B0BF-4525-99FA-B61BA8451241} = {9B363CC3-1F38-409B-8E0D-E2C13019902A}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {11A771DA-B728-445E-8A88-AE1C84C3B3A6}
diff --git a/src/modules/io/Elsa.IO.Compression/Activities/CreateZipArchive.cs b/src/modules/io/Elsa.IO.Compression/Activities/CreateZipArchive.cs
new file mode 100644
index 00000000..fcc612c9
--- /dev/null
+++ b/src/modules/io/Elsa.IO.Compression/Activities/CreateZipArchive.cs
@@ -0,0 +1,208 @@
+using System.IO.Compression;
+using System.Text.Json.Serialization;
+using Elsa.Extensions;
+using Elsa.IO.Contracts;
+using Elsa.IO.Extensions;
+using Elsa.Workflows;
+using Elsa.Workflows.Attributes;
+using Elsa.Workflows.Models;
+using Elsa.Workflows.UIHints;
+using Microsoft.Extensions.Logging;
+
+namespace Elsa.IO.Compression.Activities;
+
+///
+/// Creates a ZIP archive from a collection of entries.
+///
+[Activity("Elsa", "Compression", "Creates a ZIP archive from a collection of entries.", DisplayName = "Create Zip Archive")]
+public class CreateZipArchive : CodeActivity
+{
+ private const string DefaultArchiveName = "archive.zip";
+ private const string ZipExtension = ".zip";
+ private const string DefaultEntryNameFormat = "entry_{0}";
+
+ ///
+ [JsonConstructor]
+ public CreateZipArchive(string? source = null, int? line = null) : base(source, line)
+ {
+ }
+
+ ///
+ /// The entries to include in the ZIP archive. Can be byte[], Stream, file path, file URL, base64 string, ZipEntry objects, or arrays of these types.
+ ///
+ [Input(
+ Description = "The entries to include in the ZIP archive. Can be byte[], Stream, file path, file URL, base64 string, ZipEntry objects, or arrays of these types",
+ UIHint = InputUIHints.MultiLine
+ )]
+ public Input