2026-02-11 20:57:31 +00:00
# Elsa Workflows
2022-12-19 11:18:53 +00:00
2026-02-06 14:36:33 +00:00

2023-12-10 21:59:13 +00:00
2023-12-10 23:10:45 +00:00
[](https://github.com/elsa-workflows/elsa-core/actions/workflows/packages.yml)
2023-12-13 09:04:12 +00:00
[](https://www.nuget.org/packages/Elsa/)
2026-03-07 10:48:45 +00:00

2023-12-10 23:10:45 +00:00
[](https://hub.docker.com/repository/docker/elsaworkflows/elsa-v3)
2023-12-13 09:04:12 +00:00
[](https://discord.gg/hhChk5H472)
2023-12-10 23:10:45 +00:00
[]( http://stackoverflow.com/questions/tagged/elsa-workflows )
2024-11-13 19:21:45 +00:00
[](https://gurubase.io/g/elsa)
2025-11-15 18:44:16 +00:00
[](https://deepwiki.com/elsa-workflows/elsa-core)
<!-- DeepWiki badge generated by https://deepwiki.ryoppippi.com/ -->
2023-12-10 23:10:45 +00:00
2025-01-05 19:29:08 +00:00
### [For Elsa 2, Click Here](https://github.com/elsa-workflows/elsa-core/tree/2.x)
2023-12-14 11:21:39 +00:00
2023-12-13 09:04:12 +00:00
## Introduction
2023-12-10 21:33:31 +00:00
Elsa is a powerful workflow library that enables workflow execution within any .NET application. Elsa allows you to define workflows in various ways, including:
2022-12-19 11:18:53 +00:00
2023-12-10 11:27:39 +00:00
- Writing C# code
- Using a visual designer
- Specifying workflows in JSON
2022-12-19 11:18:53 +00:00
2023-12-10 21:59:13 +00:00

2023-12-10 11:30:06 +00:00
2023-12-13 09:04:12 +00:00
### Try with Docker
To give the Elsa Studio + Elsa Server a quick spin, you can run the following command to start the Elsa Docker container:
```shell
2024-02-25 12:38:48 +00:00
docker pull elsaworkflows/elsa-server-and-studio-v3:latest
docker run -t -i -e ASPNETCORE_ENVIRONMENT='Development' -e HTTP_PORTS=8080 -e HTTP__BASEURL=http://localhost:13000 -p 13000:8080 elsaworkflows/elsa-server-and-studio-v3:latest
2023-12-13 09:04:12 +00:00
```
2023-12-14 10:35:48 +00:00
2023-12-13 20:43:03 +00:00
> This Docker image is based on a reference ASP.NET application that hosts both the workflow server and designer and is not intended for production use.
2023-12-13 09:04:12 +00:00
2023-12-14 10:35:48 +00:00
By default, you can access http://localhost:13000 and log in with:
```
Username: admin
Password: password
```
2025-09-25 18:58:21 +00:00
### TLS and custom certificate authorities
All Elsa Docker images now ship with the operating system's certificate authority bundle baked in at build time. This means you can call public HTTPS endpoints such as `https://example.com` without any additional configuration.
If you need to trust a private or corporate CA, mount the certificate bundle into the container and reference it via `EXTRA_CA_CERT` :
```bash
docker run \
-v /path/to/company-ca.crt:/certs/company-ca.crt:ro \
-e EXTRA_CA_CERT=/certs/company-ca.crt \
elsaworkflows/elsa-server-and-studio-v3:latest
```
On startup, the container copies the certificate into `/usr/local/share/ca-certificates` and runs `update-ca-certificates` , making the trust available to .NET, OpenSSL, curl, and other system components. Multiple certificates can be provided by pointing `EXTRA_CA_CERT` at a directory containing `.crt` or `.pem` files.
In highly restricted environments where you cannot modify the system trust store, you can instead rely on the standard `SSL_CERT_FILE` or `SSL_CERT_DIR` environment variables:
```bash
docker run \
-v /path/to/company-ca-bundle.pem:/certs/custom.pem:ro \
-e SSL_CERT_FILE=/certs/custom.pem \
elsaworkflows/elsa-server-and-studio-v3:latest
```
> ℹ ️ Installing the CA bundle adds roughly 300KB to the Debian-based images. No package managers run at container startup; all trust updates happen immutably at build time or via the mounted certificates shown above.
2023-12-10 11:27:39 +00:00
## Table of Contents
- [Documentation ](#documentation )
- [Known Issues and Limitations ](#known-issues-and-limitations )
- [Features ](#features )
- [Roadmap ](#roadmap )
- [Use Cases ](#use-cases )
2025-05-09 17:55:21 +00:00
- [Coding Workflows ](#coding-workflows )
2024-10-07 07:36:10 +00:00
- [Designed Workflows ](#designed-workflows )
- [Contributing ](#contributing )
- [Support ](#support )
- [Community Support ](#community-support )
- [Enterprise Support ](#enterprise-support )
2022-12-19 11:18:53 +00:00
## Documentation
2023-12-10 11:27:39 +00:00
2025-01-15 10:25:43 +00:00
[Elsa Documentation Website ](https://docs.elsaworkflows.io/ ).
2022-12-19 11:18:53 +00:00
feat: extend shells integration and modular server support (#7399)
* refactor(deps): use local CShells project refs
Replace CShells NuGet package references with direct project references to the local CShells source to enable developing and testing against local changes and simplify build integration across modules.
* Handle assembly load errors in feature discovery
Added error handling for assembly load failures in feature discovery to improve resilience. Also updated configuration for identity token options and removed unused service bus consumer dependencies. Simplified project structure by moving and cleaning up `Directory.Build.targets` files.
* Refactor configuration and service extension methods.
Moved `ShellSettingsExtensions` and `ShellConfiguration` to `CShells.Abstractions` for better modularity. Added new `ServiceCollectionFeatureExtensions` to improve options registration. Updated appsettings and references to support these changes.
* Introduce ManagementServiceCollectionExtensions to streamline activity and variable registration
Added `ManagementServiceCollectionExtensions` for registering Elsa activity types and variable descriptors, providing a modular and shell-feature-compatible approach to configuration. Updated relevant features to utilize these new extension methods, enhancing code modularity and reducing redundancy.
* Add resilience strategy registration to HTTP feature
Introduced `ResilienceServiceCollectionExtensions` to register resilience strategies within the `Elsa.Resilience.Core` module. Updated `HttpFeature` to incorporate resilience strategies, enhancing HTTP-related resilience configuration leveraging the new extension methods.
* Add new configuration options to JavaScriptFeature
Implemented multiple properties in `JavaScriptFeature` to enhance JavaScript execution: `AllowClrAccess`, `AllowConfigurationAccess`, `ScriptCacheTimeout`, `DisableWrappers`, and `DisableVariableCopying`. These additions enable more flexible and secure configuration of the Jint JavaScript engine.
* refactor(workflows): unify graph caching
Resolve workflow definitions first and store graphs under stable per-version-ID cache keys so different lookup paths share entries.
Centralize cache creation and change-token registration to remove duplicated caching logic.
Skip materializer-unavailable definitions to avoid caching null graphs and simplify flow.
* refactor(tests): centralize default IDs and materializer setup
Introduce constants for default definition and version IDs, and materializer name. Refactor tests to use these constants, streamline graph and definition resolution, and improve cache key creation by sharing logic across tests. Extend tests to check scenarios with unavailable materializers, ensuring caching only occurs for valid cases.
* extend(tests): enhance cache key verification in AutoUpdateTests
Added checks for both workflow definition and version cache keys in AutoUpdateTests to ensure comprehensive cache validation, improving test reliability and coverage.
* refactor(projects): update CShells project paths and solution configuration
Revised project reference paths in `Elsa.ModularServer.Web.csproj` for CShells projects and updated `Elsa.sln` to include new CShells projects, streamlining project organization and build configuration.
* Add `IWorkflowReferenceGraphBuilder` to `WorkflowManagementFeature`; rename `ResilienceShellFeature` to `ResilienceFeature`.
* Refactor `HttpFeature` to use `IMiddlewareShellFeature`, include `HttpWorkflowsMiddleware`, and update `HttpActivityOptions` defaults.
* Add `AddTypeAlias` and `AddVariableTypeAndAlias` extension methods to service collections
- Introduced `AddTypeAlias<T>` method in `ServiceCollectionExtensions.cs` for adding type aliases.
- Added `AddVariableTypeAndAlias<T>` method in `ManagementServiceCollectionExtensions.cs` to add variable types with aliases.
* Remove shell reload API endpoints, orchestrator, and associated tests from the codebase.
* Introduce `DefaultAdminUser` options and refactor `AdminUserInitializer` to use `IOptions`.
* Add user management endpoints: Delete, List, Update with enhanced user store functionality
* Implement `DefaultAdminUser` feature for initial admin bootstrap, decouple `SecurityRoot` from user management endpoints, update related documentation and permissions.
* Add role management endpoints: Delete, List, and Update, including role data models and handle obsolete SecurityRoot policy.
* Update CShells package references to version 0.0.12-preview.66 and refactor `TenantTaskManager` for improved task lifecycle management.
* Replace project references with package references in csproj files and remove unused folders.
* Integrate Nuplane features, add sample packages, and update dependency handling within ModularServer Web.
* Improve `CShells` startup endpoint registration and resolver handling
- Address duplicate endpoint registration by adding state-aware tracking and deduplication
- Resolve `WebRoutingShellResolver` constructor ambiguity by switching to factory-based registration
- Implement a startup-specific filter to prevent redundant endpoint remapping during `ShellsReloaded`
- Update project to use project references for `CShells` and `Nuplane` components in csproj files.
* Update logging configuration in appsettings for Development and Production
- Change default log level to 'Warning' in Development settings
- Adjust Microsoft.Hosting and Elsa.SamplePackage log levels to 'Information'
- Remove Microsoft.EntityFrameworkCore log level entry from Production settings
* Refactor assembly retrieval methods and update endpoint calls for consistency.
* Add `SampleEndpointFeature` and enhance logging and service integration
- Implement `SampleEndpointFeature` with a new endpoint for handling requests.
- Log endpoint access and integrate `ISampleService` with method `DoSomething`.
- Update logging configuration to include `CShells` and `Nuplane` log levels in Development settings.
- Update `Elsa.SamplePackage` to version 1.0.1 and manage dependencies with project and assembly references.
- Modify JSON configuration for `SampleEndpoint`.
* Update package versions for `CShells` to 0.0.13 and `Nuplane` to 0.0.1-preview.15 in props file.
* Refactor `DefaultAdminUserFeature` by renaming `ConfigureServices` to `Apply` and adjusting service registration method.
* Replace project references with package references across multiple projects and remove obsolete cshells-related solution entries.
* Remove `SampleCatalogEndpointExtensions.cs` and related endpoint mappings.
* Improve `TenantTaskManager` by using `TryRemove` for state clean-up and clarify `SemaphoreSlim` disposal behavior.
* Remove hardcoded default admin credentials and add warning for unconfigured AdminRoleName in admin user setup.
* Address unresolved review comments: fix doc comments, security defaults, compilation issue, and restore reload response contracts
Agent-Logs-Url: https://github.com/elsa-workflows/elsa-core/sessions/34eb1e13-833f-4b3c-9db6-2e9221d221b9
Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com>
* Refine reload endpoints: use specific exceptions, add error messages, rename ReloadedAt to Timestamp, remove unused model
Agent-Logs-Url: https://github.com/elsa-workflows/elsa-core/sessions/34eb1e13-833f-4b3c-9db6-2e9221d221b9
Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com>
* Potential fix for pull request finding 'Generic catch clause'
Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
* Potential fix for pull request finding 'Generic catch clause'
Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
* Potential fix for pull request finding 'Generic catch clause'
Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
* Add `ExceptionExtensions` with `IsFatal` method and simplify exception handling in `TenantTaskManager`. Remove unused properties from `Directory.Build.props`.
* Add unit tests for `TenantTaskManager` and fix potential state orphaning issue.
* Potential fix for pull request finding 'Generic catch clause'
Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
* Fix logger dependency in `SampleEndpointFeature` constructor to use correct type.
* Add unit tests for Elsa Shells API endpoints and update solution configuration.
* Refactor ShellReload models: remove ShellReloadItemResult, update ShellReloadResponse properties.
* Potential fix for pull request finding 'Generic catch clause'
Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
2026-04-18 12:33:34 +00:00
- [Default Admin User bootstrap (shell + legacy feature system) ](src/modules/Elsa.Identity/README.md )
2023-12-10 11:15:11 +00:00
## Known Issues and Limitations
2023-12-10 11:27:39 +00:00
Elsa is continually evolving, and while it offers powerful capabilities, there are some known limitations and ongoing work:
- Documentation is still a work in progress.
- Input/Output is not yet implemented in the Workflow Instance Viewer.
- Starting workflows from the designer is currently supported only for workflows that do not require input and do not start with a trigger; this is planned for a future release.
- The designer currently only supports Flowchart activities. Support for Sequence and StateMachine activities is planned for a future release.
- UI input validation is not yet implemented.
2023-12-10 11:15:11 +00:00
2022-12-19 11:18:53 +00:00
## Features
2023-12-10 11:27:39 +00:00
Elsa offers a wide range of features for building and executing workflows, including:
2022-12-19 11:18:53 +00:00
2023-12-10 11:27:39 +00:00
- Execution of workflows in any .NET application with support for .NET 6 and beyond.
- Support for both short-running and long-running workflows.
- A programming model loosely inspired by Windows Workflow Foundation.
- A web-based drag & drop designer with support for custom activities.
- Native support for activity composition, including activities like `Sequence` , `Flowchart` , and `ForEach` .
2023-12-10 11:15:11 +00:00
- Parallel execution of activities.
2023-12-10 11:27:39 +00:00
- Built-in activities for common scenarios, such as sending emails, making HTTP calls, scheduling tasks, sending and receiving messages, and more.
- Workflow versioning and migration via API.
- Easy integration with external applications via HTTP, message queues, and more.
2023-12-10 11:15:11 +00:00
- Actor model for increased workflow throughput.
2023-12-10 11:27:39 +00:00
- Dynamic expressions with support for C#, JavaScript, Python, and Liquid.
- Persistence agnostic, with support for Entity Framework Core, MongoDB, and Dapper out of the box.
- [Elsa Studio ](https://github.com/elsa-workflows/elsa-studio ): a modular Blazor dashboard app for managing and designing workflows.
2023-12-10 11:15:11 +00:00
## Roadmap
2025-01-15 10:25:43 +00:00
See #3232
2023-12-10 11:15:11 +00:00
2023-12-10 11:27:39 +00:00
## Use Cases
2023-12-10 11:15:11 +00:00
2023-12-10 11:27:39 +00:00
Elsa can be used in a variety of scenarios, including:
2022-12-19 11:18:53 +00:00
2023-12-10 11:27:39 +00:00
- Long-running workflows such as order fulfillment and product approval.
- Short-running workflows such as sending emails and generating PDFs.
- Scheduled workflows such as sending daily reports.
- Event-driven workflows such as sending welcome emails when a user signs up.
2023-12-10 11:15:11 +00:00
2025-01-15 10:25:43 +00:00
## Coding Workflows
2023-12-10 11:15:11 +00:00
2023-12-16 10:44:41 +00:00
Elsa allows you to define workflows in code using C#. The following example shows how to receive HTTP requests and send an email in response:
2023-12-10 21:13:00 +00:00
```csharp
2023-12-16 10:44:41 +00:00
public class SendEmailWorkflow : WorkflowBase
2023-12-10 11:15:11 +00:00
{
protected override void Build(IWorkflowBuilder builder)
{
builder.Root = new Sequence
{
Activities =
{
new HttpEndpoint
{
2023-12-16 10:44:41 +00:00
Path = new("/send-email"),
SupportedMethods = new(new[] { HttpMethods.Post }),
2023-12-10 11:15:11 +00:00
CanStartWorkflow = true
},
2023-12-16 10:44:41 +00:00
new SendEmail
2023-12-10 11:15:11 +00:00
{
2023-12-16 10:44:41 +00:00
From = new("alic@acme.com"),
To = new(new[]{ "bob@acme.com" }),
Subject = new("Your workflow has been triggered!"),
Body = new("Hello!")
2023-12-10 11:15:11 +00:00
}
}
};
}
}
```
2025-01-15 10:25:43 +00:00
## Designing Workflows
2023-12-10 11:15:11 +00:00
2023-12-16 10:44:41 +00:00
Elsa allows you to define workflows using a visual designer. The following example shows how to receive HTTP requests and send an email in response:
2023-12-11 10:01:55 +00:00
2024-02-08 17:42:48 +00:00

## Contributing
We welcome contributions from the community and are pleased that you are interested in helping to improve the Elsa Workflow project! Here are the steps to contribute to our project:
### 1. Fork and Clone the Repo
To get started, you'll need to fork the repository to your own GitHub account. You can do this by navigating to the [Elsa Workflow GitHub repository ](https://github.com/elsa-workflows/elsa-core ) and clicking the "Fork" button in the top-right corner of the page. Once you have forked the repo, you can clone it to your local machine using the following command:
```bash
git clone https://github.com/YOUR_USERNAME/elsa-core.git
```
Replace `YOUR_USERNAME` with your GitHub username. For more information on forking a repo, check out the GitHub documentation [here ](https://docs.github.com/en/github/getting-started-with-github/fork-a-repo ).
2024-08-13 18:56:32 +00:00
Incorporating the details about the "apps" folder and its projects into the second point about opening the `Elsa.sln` using your favorite IDE, we can expand the instructions to guide developers on where to start and what projects they might want to explore first. Here's an updated version of that section with the additional information:
2024-02-08 17:42:48 +00:00
### 2. Open `Elsa.sln` Using Your Favorite IDE
After cloning the repository, navigate to the cloned directory and open the `Elsa.sln` solution file with your preferred IDE that supports .NET development, such as Visual Studio, JetBrains Rider, or Visual Studio Code with the appropriate extensions.
2024-08-13 18:56:32 +00:00
Within the solution, you will find an "apps" folder containing three projects designed to help you get started and explore the capabilities of Elsa Workflow:
2024-02-08 17:42:48 +00:00
- **Elsa.Server.Web**: This project is a reference ASP.NET Core application that acts as a workflow server. It's a great starting point if you want to understand how Elsa functions as a server-side workflow engine.
- **Elsa.ServerAndStudio.Web**: This project serves a dual purpose. Like `Elsa.Server.Web` , it acts as a workflow server. Additionally, it hosts the Elsa Studio Blazor WebAssembly app. This is the perfect project to run if you want to see the full capabilities of Elsa, including both the server aspects and the client-side studio experience in one application.
- **Elsa.Studio.Web**: This project is a reference Blazor WebAssembly application that solely hosts the Elsa Studio Blazor WebAssembly app. It requires a running Elsa server application to connect to. Use this project if you're interested in focusing on the Elsa Studio UI and its interactions with an Elsa workflow server.
### 3. Submit a PR with Your Changes
Once you have made your changes, commit them and push them back to your fork. Then, navigate to the original Elsa Workflow repository and create a new Pull Request. Ensure your PR description clearly describes the changes and any relevant information that will help the reviewers understand your contributions. For a detailed guide on creating a pull request, visit [Creating a pull request from a fork ](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request-from-a-fork ).
### 4. Open an Issue First
Before you start working on your changes or submit a pull request, please open an issue to discuss what you would like to do. This step is crucial as it ensures you don't spend time working on something that might not align with the project's goals or might already be under development by someone else. You can open an issue [here ](https://github.com/elsa-workflows/elsa-core/issues ).
This approach helps us streamline contributions and ensures that your efforts are aligned with the project's needs and priorities. We look forward to your contributions and are here to support you throughout the process. Thank you for contributing to the Elsa Workflow project!
2024-10-07 07:36:10 +00:00
## Support
2024-02-08 17:42:48 +00:00
2024-10-07 07:36:10 +00:00
There are various ways to get support for Elsa Workflows, ranging from community-driven channels to enterprise-level services.
### Community Support
Elsa has an active and helpful community where you can find support through multiple channels:
- [GitHub Issues ](https://github.com/elsa-workflows/elsa-core/issues ) for bug reports and feature requests.
- [GitHub Discussions ](https://github.com/elsa-workflows/elsa-core/discussions ) for open-ended conversations, questions, and community-driven support.
- [Discord ](https://discord.gg/hhChk5H472 ) for real-time support and interaction with the Elsa community.
- [StackOverflow ](https://stackoverflow.com/questions/tagged/elsa-workflows ) for searching or asking technical questions.
2026-02-11 20:57:31 +00:00
### Professional Support
2026-04-14 13:35:36 +00:00
For organizations requiring professional support and long-term commitment, check out [Elsa+ ](https://www.elsaworkflows.io/elsa-plus ), a growing ecosystem of premium services, tooling, and extensions around Elsa Workflows.