Вы находитесь на странице: 1из 84

Wexflow - Open source workflow engine

Akram El Assas

20 Sep 2019 MIT

A high-performance, extensible, modular and cross-platform workflow engine. Built for automation.

Download the latest release

Table of contents
1. Preface
2. What's New?
3. Introduction
4. Why Wexflow?
5. Real Life Examples
6. Benefits
7. How To Install Wexflow?
8. How To Uninstall Wexflow?
9. How To Use Wexflow?

1. General
2. Wexflow Manager
3. Backend
4. Android Manager
5. iOS Manager
6. Command Line Client

10. Workflow Samples

1. Sequential Workflows
2. Execution Graph
3. Flowchart Workflows
4. Approval Workflows
5. Workflow Events

11. How To Create A Custom Task?


12. How To Debug Wexflow?
13. Libraries Used By Wexflow
14. History

Preface
The source code of Wexflow is on GitHub. I will be actively maintaining and adding brand new features to this project as I believe
very strongly in it. I will keep this article and the source code in sync.

You can download the latest stable release from GitHub releases page.

You can follow installation instructions whether in this article or in GitHub wiki.
To get started, you can follow usage instructions whether in this article or in GitHub wiki.

To start creating your own workflows, you can check out workflow samples whether in this article or in GitHub wiki. Also, check out
the 100+ built-in tasks that come with Wexflow.

To build from source, follow these instructions.

You can contribute to this project in many ways. If you have brand new feature ideas or found a bug or faced an issue, just open a
new issue in the issue board. Pull requests are very welcome, to contribute follow these instructions to get the source code and
these guidelines to create pull requests.

What's New?
Take a look at the brand new version 4.7. This version brings support of CosmosDB, MangoDB and RavenDB. As well as a
new command line client for querying Wexflow server.

This version has been depthly tested on Windows, Linux and macOS, and runs 100% on Windows, Linux and macOS.

Introduction
Wexflow is a high-performance, extensible, modular and cross-platform workflow engine. The goal of Wexflow is to automate
recurring tasks with or without user intervention. With the help of Wexflow, building automation and workflow processes become
easy. Wexflow also helps in making the long-running processes straightforward.

Wexflow aims to make automations, workflow processes, long-running processes and interactions between systems, applications
and folks easy, straightforward and clean. The communication between systems or applications becomes easy through this powerful
workflow engine.

Wexflow makes use of .NET Core, a cross-platform version of .NET for building websites, services, and console apps. Thus, Wexflow
provides a cross-platform workflow server and a cross-platform backend for managing, designing and tracking workflows with ease
and flexibility. Wexflow server and its backend run on Windows, Linux and macOS.

Wexflow also makes use of Quartz.NET open source job scheduling system that is used in large scale enterprise systems. Thus,
Wexflow offers flexibility in planning workflow jobs such as cron workflows.

Furthermore, Wexflow makes use of must popular databases such as CosmosDB, MangoDB, RavenDB and LiteDB serverless NoSQL
Document Store database in its server and back end which enhance and improve the performance of this workflow engine. The user
can choose between the database of his choice at the installation.

Wexflow comes with a back end too, so you can search and filter among all your workflows, have real-time statistics on your
workflows, manage your workflows with ease, design your workflows with ease, and track your workflows with ease:
Just to give you an idea of what Wexflow does, this is a screenshot from the "Designer" page. Using the "Designer" page, we get a
nice visual overview of the dependency graph of the workflow. Each node represents a task which has to be run:
  

Moreover, the "Designer" page allows to edit workflow files through its Web XML editor:
Why Wexflow?
Free and open source.
Easy to install and effortless configuration.
Straightforward and easy to use.
A cross-platform workflow server.
A cross-platform back end.
An Android app for managing workflows.
An iOS app for managing workflows.
Sequential workflows.
Flowchart workflows.
Approval workflows.
100+ built-in tasks.
User-driven.
Cron scheduling.
CosmosDB, MongoDB, RavenDB and LiteDB support.
Extensive logging and incident reporting.
Real-time stats.
RESTful API.
Extensible.

Discover more about the features in details.


Real Life Examples
Orchestration engine.
Form submission approval processes.
Batch recording live video feeds.
Batch transcoding audio and video files.
Batch uploading videos and their metadata to YouTube SFTP dropbox.
YouTube integration: Automatically upload, search for content and list uploaded videos on YouTube through YouTube Data
API.
Vimeo integration: Automatically upload and list uploaded videos on Vimeo through Vimeo API.
Instagram integration: Automatically upload images and videos to Instagram through Instagram API.
Twitter integration: Automatically send tweets through Twitter API.
Reddit integration: Automatically send posts and links to Reddit.
Slack integration: Automatically send messages to Slack channels.
Batch encrypting and decrypting large files.
Batch converting, resizing and cropping images.
Creating and sending reports and invoices by email.
Connecting systems and applications via watch folders.
Batch downloading files over FTP/FTPS/SFTP/HTTP/HTTPS/Torrent.
Batch uploading files over FTP/FTPS/SFTP.
Database administration and maintenance.
Synchronizing the content of local or remote directories.
Optimizing PDF files.

Benefits
Gain time by automating repetitive tasks.
Save money by avoiding re-work and corrections.
Reduce human error.
Become more efficient and effective in completing your tasks.
Become more productive in what you do.
Become consistent in what you do.

How To Install Wexflow?


Wexflow is easy to install and needs effortless configuration. It can be installed and configured in seconds.

This section shows how to install the .NET version of Wexflow on a Windows system, and how to install the .NET Core version of
Wexflow on a Windows system, a Linux system or a macOS system.

Windows (.NET)
Wexflow can be installed on Windows 7, Windows Server 2008 or higher. Wexflow supports .NET Framework 4.6.1 or higher.

To install Wexflow, proceed as follows:

1. Install Microsoft .NET Framework 4.6.1 or higher.

2. Install Wexflow:
3. Select a destination location:
4. Choose the components to install:

It is highly recommended to install workflow samples. Especially if new built-in tasks are released.

5. You can choose to create a desktop shortcut:


5. Click on "Install" to perform the installation:
6. The installer will install Wexflow on the system:

7. Finally, click on finish to finish the installation:


8.  Install Microsoft Sync Framework 2.1 Redistributables if you want to use Sync task:

     8.1 Synchronization-v2.1-x86-ENU.msi and ProviderServices-v2.1-x86-ENU.msi if you are using Wexflow x86.

     8.2 Synchronization-v2.1-x64-ENU.msi and ProviderServices-v2.1-x64-ENU.msi if you are using Wexflow x64.

The following menus are added in the start menu:

The "Backend" menu opens the backend.


The "Configuration" menu opens the configuration folder of Wexflow.
The "Documentation" menu opens the documentation folder of Wexflow. 
The "Logs" menu opens the log file of the day.
The "Manager" menu opens Wexflow Manager GUI.
The "Install CosmosDB samples" installs CosmosDB samples.
The "Install MongoDB samples" installs MongoDB samples.
The "Install RavenDB samples" installs RavenDB samples.
The "Uninstall" menu uninstalls Wexflow.
After Wexflow is installed a Windows Service named Wexflow is installed and starts automatically. To start Wexflow Manager, this
Windows Service must be running. However, If you want to stop it you can do it from Windows Services console:

When you open Wexflow Manager, you will get this window:


Here are the credentials to sign in:

Username: admin
Password: wexflow2018

You can change the password from the backend.

After you sign in, you will get this window:


With Wexflow Manager, you can manage your workflows with ease.

Wexflow makes use of must popular databases such as CosmosDB, MangoDB, RavenDB and LiteDB serverless NoSQL Document
Store database in its server and back end. The user can choose between the database of his choice at the installation. The default
database used is LiteDB since it needs zero configuration. However, if you want to use MongoDB, RavenDB or CosmosDB just read
the documentation of the database of your choice in order to configure it and make Wexflow use it.

Windows (.NET Core)


Wexflow supports .NET Core 2.2 or higher.

1. Download and install .NET Core runtime.


2. Download and extract the .NET Core package somewhere on your system.
3. Double-click on "install.bat" to install the configuration files of Wexflow.
4. That's it. Double-click on "run.bat" to start Wexflow workflow server:
The port 8000 must be free. If you are already using the .NET version of Wexflow, you must stop Wexflow Windows service or
change the port of the .NET Core version.

To change the port of the .NET Core version, edit the file Wexflow.Server\appsettings.json and change the value of the setting
"WexflowServicePort". Then, change the port in the backend too by editing the configuration file Backend\js\settings.js.

Finally, you can open the backend by opening the web page Backend\index.html on a browser.

To open the backend, go to "Backend" folder and double-click on the file "index.html":
You can sign in with these credentials if you installed Wexflow for the first time:

Username: admin

Password: wexflow2018

You can then change the password from the back end.

Wexflow makes use of must popular databases such as CosmosDB, MangoDB, RavenDB and LiteDB serverless NoSQL Document
Store database in its server and back end. The user can choose between the database of his choice at the installation. The default
database used is LiteDB since it needs zero configuration. However, if you want to use MongoDB, RavenDB or CosmosDB just read
the documentation of the database of your choice in order to configure it and make Wexflow use it.

Linux
Wexflow supports .NET Core 2.2 or higher.

1. Download and install .NET Core runtime.


2. Download and extract the .NET Core package in /opt/.
3. Open a terminal and type the following commands:

sudo chown -R $USER:$USER /opt/wexflow


cd /opt/wexflow/Wexflow.Server
dotnet Wexflow.Server.dll
That's it, Wexflow is installed and ready for work:

Finally, you can open the backend by opening the web page /opt/wexflow/Backend/index.html  on a browser:
You can sign in with these credentials if you installed Wexflow for the first time:

Username: admin

Password: wexflow2018

You can then change the password from the back end.

If you want to use the image processing tasks, you must install these libraries:

sudo apt install libc6-dev libgdiplus

Wexflow makes use of must popular databases such as CosmosDB, MangoDB, RavenDB and LiteDB serverless NoSQL Document
Store database in its server and back end. The user can choose between the database of his choice at the installation. The default
database used is LiteDB since it needs zero configuration. However, if you want to use MongoDB, RavenDB or CosmosDB just read
the documentation of the database of your choice in order to configure it and make Wexflow use it.

macOS
Wexflow supports .NET Core 2.2 or higher.

Wexflow can be installed on macOS 10.12 (Sierra) or above.

1. Download and install .NET Core runtime.


2. Download and extract the .NET Core package in /Applications/.
3. Open a terminal and type the following commands:

cd /Applications/wexflow/Wexflow.Server
dotnet Wexflow.Server.dll

That's it, Wexflow is installed and ready for work:

Finally, you can open the backend  by opening the web page /Applications/wexflow/Backend/index.html on a browser:
You can sign in with these credentials if you installed Wexflow for the first time:

Username: admin

Password: wexflow2018

You can then change the password from the back end.

Wexflow makes use of must popular databases such as CosmosDB, MangoDB, RavenDB and LiteDB serverless NoSQL Document
Store database in its server and back end. The user can choose between the database of his choice at the installation. The default
database used is LiteDB since it needs zero configuration. However, if you want to use MongoDB, RavenDB or CosmosDB just read
the documentation of the database of your choice in order to configure it and make Wexflow use it.

Android
After Wexflow server is installed, proceed as follows to install Wexflow Manager on an Android device:

1. Download wexflow.apk

2. Install wexflow.apk

3. Launch Wexflow application and open the application settings through the settings menu:
 

5. Click on "Wexflow Web Service URI":

6. Configure Wexflow Web Service Uri:

Ensure that Wexflow server is running and that the port 8000 is open in the firewall.

That's it, Wexflow application is ready for work. You can sign in with these credentials if you installed Wexflow for the first time:

Username: admin

Password: wexflow2018

You can change the password from the backend.


After you sign in you will get the list of workflows that you can manage easily from your Android device:

iOS
After Wexflow server is installed, proceed as follows to install Wexflow Manager on an iOS device:

1. Download wexflow.ipa from releases page.

2. Download Cydia Impactor for Windows, Linux or macOS.

3. Install Cydia Impactor on your Windows, Linux or macOS machine.

4. Plug your iOS device in your Windows, Linux or macOS machine.

5. Disable Apple two factor authentication if it is enabled from appleid.apple.com.

6. Create an app-specific access code from appleid.apple.com.

7. Open Cydia Impactor. You'll see your iOS device in the second drop down.

8. Drag and drop wexflow.ipa in Cydia Impactor.

9. Enter your apple ID and password.

10. Cydia Impactor will automatically install wexflow.ipa on your iOS device:
11. Enable "Untrusted developer" for Wexflow app:
iOS 9+>Settings>General>Profiles
iOS 6-8>Settings>General>Device Management>Wexflow [Confirm]

12. Launch Wexflow application and open the application settings through the settings menu:

13. Configure Wexflow server URL:


Ensure that Wexflow server is running and that the port 8000 is open in the firewall.

That's it, Wexflow application is ready for work. You can sign in with these credentials if you installed Wexflow for the first time:

Username: admin

Password: wexflow2018

You can change the password from the backend.

After you sign in you will get the list of workflows that you can manage easily from your iOS device:
How To Uninstall Wexflow?

Windows
To uninstall Wexflow, simply click on "Uninstall" menu from "Windows Start menu > Wexflow".

Or go to "Configuration Panel > Add/remove programs" then select "Wexflow" and click on uninstall:


After Wexflow is uninstalled, a window will show up informing that the un-installation succeeded:
After Wexflow is uninstalled, the folders C:\Wexflow\ and C:\WexflowTesting\ are not deleted to prevent user defined
workflows and testing scenarios from being deleted. However, If you do not need them you can delete them manually.

The log file C:\Program Files\Wexflow\Wexflow.log is also not deleted to keep track of the last operations done by
Wexflow. However, If you do not need the logs you can delete the log files.

Linux
To uninstall Wexflow from a Linux system, proceed as follows:

sudo rm -rf /opt/wexflow

macOS
To uninstall Wexflow from a macOS system, simply delete wexflow from /Applications/ folder.

Android
To uninstall Wexflow from an Android device, simply open Settings>Applications>Wexflow then uninstall it.

iOS
Tap and hold the app icon until it starts to wiggle and an x appears at the upper left corner of the icon. Then, tap the x, then tap
Delete.

How To Use Wexflow?

General
After installing Wexflow, the folders C:\Wexflow\ and C:\WexflowTesting\ are created.

The folder C:\Wexflow\  is the main configuration folder of Wexflow and contains the following elements:

Wexflow.xml which is the main configuration file of Wexflow server. Its path can be configured from C:\Program
Files\Wexflow\Wexflow.Server.exe.config for the .NET version and from Wexflow.Server\appsettings.json for the .NET Core
version.
Workflow.xsd which is the XML Schema Definition of a workflow.
Temp/ which is the temporary folder of Wexflow.
Database/ which contains the database of Wexflow workflow engine.
Tasks/ which is an optional folder that can contain the dlls of custom tasks.
GlobalVariables.xml which contains the global variables for workflows.
TasksNames.json which contains the names of the tasks. This configuration file is used by the designer.
TasksSettings.json which contains the settings of the tasks. This configuration file is used by the designer.

The folder C:\WexflowTesting\ contains data of testing scenarios.

The logs are written in C:\Program Files\Wexflow\Wexflow.log. There is one log file per day. The old log files are saved in this
format Wexflow.logyyyyMMdd.

In the .NET Core version:

Windows: The folders C:\Wexflow-dotnet-core\ and C:\WexflowTesting\ are created. The path of the main configuration file
C:\Wexflow-dotnet-core\Wexflow.xml can be configured from Wexflow.Server\appsettings.json. The logs are written in
Wexflow.Server\Wexflow.log.
Linux: The folders /opt/wexflow/Wexflow/ and /opt/wexflow/WexflowTesting/ are created. The path of the main
configuration file /opt/wexflow/Wexflow/Wexflow.xml can be configured from
/opt/wexflow/Wexflow.Server/appsettings.json. The logs are written in /opt/wexflow/Wexflow.Server/Wexflow.log.
macOS: The folders /Applications/wexflow/Wexflow/ and /Applications/wexflow/WexflowTesting/ are created. The path of
the main configuration file /Applications/wexflow/Wexflow/Wexflow.xml can be configured from
/Applications/wexflow/Wexflow.Server/appsettings.json. The logs are written
in /Applications/wexflow/Wexflow.Server/Wexflow.log.

Below the configuration file of a workflow:

<!--
This is the configuration file of a workflow.
A workflow is composed of:
- An id which is an integer that must be unique.
- A name which is a string that must be unique.
- A description which is a string.
- A Settings section which is composed of the following elements:
- A launchType which is one of the following options:
- startup: The workflow is launched when Wexflow Engine starts.
- trigger: The workflow is launched manually from Wexflow Manager.
- periodic: The workflow is launched periodically.
- cron: The workflow is launched depending on a cron expression.
- A period which is necessary for the periodic launchType. It is
a timeSpan in this format dd.hh:mm:ss. For example the period
00.00:02:00 will launch the workflow every 2 minutes.
- A cron expression which is necessary for the cron launchType.
For example '0 0/2 * * * ?' will launch the workflow every 2 minutes.
- The enabled option which allows to enable or disable a workflow.
The possible values are true or false.
- The approval option which marks the current workflow as an approval workflow.
The possible values are true or false. An approval workflow must contain
at least one Approval task or more.
- A LocalVariables section which contains local variables.
- A Tasks section which contains the tasks that will be executed by
the workflow one after the other.
- A Task is composed of:
- An id which is an integer that must be unique.
- A name which is one of the options described in the tasks documentation.
- A description which is a string.
- The enabled option which allows to enable or disable a task. The possible
values are true or false.
- A collection of settings.
- An ExecutionGraph section which contains the execution graph of the workflow.
-->
<Workflow xmlns="urn:wexflow-schema" id="$int" name="$string" description="$string">
<Settings>
<Setting name="launchType" value="startup|trigger|periodic|cron" />
<Setting name="period" value="dd.hh:mm:ss" />
<Setting name="cronExpression" value="$string" />
<Setting name="enabled" value="true|false" />
<Setting name="approval" value="true|false" />
</Settings>
<LocalVariables>
<Variable name="$string" value="$string" />
<Variable name="$string" value="$string" />
<!-- You can add as many variables as you want. -->
</LocalVariables>
<Tasks>
<Task id="$int" name="$string" description="$string" enabled="true|false">
<Setting name="$string" value="$string" />
<Setting name="$string" value="$string" />
<!-- You can add as many settings as you want. -->
</Task>
<Task id="$int" name="$string" description="$string" enabled="true|false">
<Setting name="$string" value="$string" />
<Setting name="$string" value="$string" />
</Task>
<!-- You can add as many tasks as you want. -->
</Tasks>
<!-- This section is optional and described in the samples section. -->
<ExecutionGraph />
</Workflow>

For cron workflows, read the following documentation for more details.


Local variables are explained here.

Global variables are explained here.

The name option of a Task must be one of the followings.

The execution graph is explained in the samples section.

To learn how to make your own workflows, you can check out the workflow samples availabe
in C:\Wexflow\Workflows\ and read the tasks documentation.

If a new workflow is created in C:\Wexflow\Workflows\ or if an existing workflow is deleted or modified, you don't have to
restart Wexflow Windows Service so that these modifications take effect. Wexflow engine will automatically detect the changes and
reload, add or delete the workflow.

To disable a workflow, you can set the enabled settings option of the workflow to false. If you want to make a workflow
disappears from the list of the workflows loaded by Wexflow engine, you can create a directory named disabled
within C:\Wexflow\Workflows\ and move that workflow to that directory.

How tasks communicate between each other?

State is transferred between tasks through selectFiles and through selectEntities settings.

This works the following way:

1. A task in a workflow does its job and produces files which it stores in a collection.
2. Another task (must be in the same workflow) can afterwards reference those files with the selectFiles XML property,
specifying the ID of the task that produced the required files. It then can use these files to do its own job.

More visually (from the examples):

<Workflow xmlns="urn:wexflow-schema" id="1" name="Workflow_Invoices"


description="Workflow_Invoices">
<Settings>
<Setting name="launchType" value="trigger" />
<Setting name="enabled" value="true" />
</Settings>
<Tasks>
<Task id="1" name="FilesLoader" description="Loading invoices" enabled="true">
<Setting name="folder" value="C:\WexflowTesting\Invoices\" />
</Task>
<!-- some more tasks here -->
<Task id="6" name="FilesMover" description="Moving invoices" enabled="true">
<Setting name="selectFiles" value="1" />
<Setting name="destFolder" value="C:\WexflowTesting\Invoices_sent\" />
</Task>
</Tasks>
</Workflow>

selectEntities setting works the same way as selectFiles. The only difference is that selectEntities is designed to be used for tasks that
manipulate custom objects from a database or from web services for example. To go further, read this documentation regarding
entities.

Wexflow Manager
When you open Wexflow Manager for the first time, you will get this window:
Here are the credentials to sign in:

Username: admin
Password: wexflow2018

After you sign in, you will get this window:


You can then change the password from the backend.

With Wexflow Manager, you can manage your workflows with ease. Wexflow Manager is a simple application that allows the user to
do the following things:

See all the workflows loaded by Wexflow Engine.


See the status of the selected workflow (running, suspended, waiting for approval or disabled).
Start a workflow.
Stop a workflow.
Suspend a workflow.
Resume a workflow.
Approve an approval workflow.
Disapprove an approval workflow.
The "Backend" button opens the backend from which you can manage workflows, design workflows, track workfows and
have real-time statistics on workflows.
The "Logs" button allows to view the logs of the day.
The "Refresh" button allows to reload the list of workflows.
The "Restart server" button allows to restart Wexflow Server.
The "Search" button allows to search for workflows.
The "Help" menu opens the help page.
The "About" menu shows the version of Wexflow and checks if a new version is available.

To see what's going on in Wexflow, open the log file C:\Program Files\Wexflow\Wexflow.log in a text editor like
Notepad++. Notepad++ will update the log file as it fills up.
Backend
The backend is a website that can be hosted on IIS, Apache, Nginx or any other web server. The backend can also run locally.

The backend gives real-time statistics on workflows. It will let you manage, design and track your workflows with ease and flexibility.
You can use the backend to access, configure, manage, administer, and develop your workflows with ease.

Login

When you open the backend for the first time, you will arrive on the login page:

Here are the credentials to sign in:

Username: admin
Password: wexflow2018

After you sign in, you can change the password from the "Users" page.

Password reset

If a user forgot his password, he can click on "Forgot password?" link to reset his password:
When the user clicks on "Submit" button, an email is sent to him with a temporary password that he can change after he signs in.

To allow the backend sending emails, the SMPT configuration must be set in the configuration file: C:\Program
Files\Wexflow\Wexflow.Server.exe.config:

<?xml version="1.0" encoding="utf-8"?>


<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<appSettings>
<add key="WexflowSettingsFile" value="C:\Wexflow\Wexflow.xml"/>
<add key="DateTimeFormat" value="dd-MM-yyyy HH:mm:ss"/>
<add key="Smtp.Host" value="smtp.gmail.com"/>
<add key="Smtp.Port" value="587"/>
<add key="Smtp.EnableSsl" value="true"/>
<add key="Smtp.User" value="user"/>
<add key="Smtp.Password" value="password"/>
<add key="Smtp.From" value="user"/>
</appSettings>
...
</configuration>

The DateTimeFormat setting option is explained here.

In the .NET Core version, the configuration file to edit in a Windows system is Wexflow.Server\appsettings.json:
{
"WexflowSettingsFile": "C:\\Wexflow-dotnet-core\\Wexflow.xml",
"WexflowServicePort": 8000,
"DateTimeFormat": "dd-MM-yyyy HH:mm:ss",
"Smtp.Host": "smtp.gmail.com",
"Smtp.Port": 587,
"Smtp.EnableSsl": true,
"Smtp.User": "user",
"Smtp.Password": "password",
"Smtp.From": "user",
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Verbose",
"System": "Information",
"Microsoft": "Information"
}
}
}

In a Linux system, the configuration file to edit is /opt/wexflow/Wexflow.Server/appsettings.json:

{
"WexflowSettingsFile": "/opt/wexflow/Wexflow/Wexflow.xml",
"WexflowServicePort": 8000,
"DateTimeFormat": "dd-MM-yyyy HH:mm:ss",
"Smtp.Host": "smtp.gmail.com",
"Smtp.Port": 587,
"Smtp.EnableSsl": true,
"Smtp.User": "user",
"Smtp.Password": "password",
"Smtp.From": "user",
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Verbose",
"System": "Information",
"Microsoft": "Information"
}
}
}

In a macOS system, the configuration file to edit is /Applications/wexflow/Wexflow.Server/appsettings.json:

{
"WexflowSettingsFile": "/Applications/wexflow/Wexflow/Wexflow.xml",
"WexflowServicePort": 8000,
"DateTimeFormat": "dd-MM-yyyy HH:mm:ss",
"Smtp.Host": "smtp.gmail.com",
"Smtp.Port": 587,
"Smtp.EnableSsl": true,
"Smtp.User": "user",
"Smtp.Password": "password",
"Smtp.From": "user",
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Verbose",
"System": "Information",
"Microsoft": "Information"
}
}
}

Dashboard
After you sign in, you will arrive on the dashboard page:

Wexflow gives you a beautiful dashboard to view real-time statistics on your workflows. Indeed, the "Dashboard" page gives you
real-time statistics on workflows and will let you track your workflow server with ease and detail. From the dashboard, you can also
filter the workflow entries by a keyword or by date. You can also order the workflow entries by date, by name, etc.

Manager

The "Manager" page will let you manage your workflows with ease. Indeed, from this page you can start a workflow, suspend a
running workflow, resume a suspended workflow, stop a running workflow and search for workflows by a keyword:
Designer

The "Designer" page will let you design your workflows with ease. Indeed, from this page you can create a new workflow, edit an
existing workflow or delete a workflow. This page will also let you visualize the dependency graph of a workflow. Using the
"Designer" page, we get a nice visual overview of the dependency graph of the workflow. Each node represents a task which has to
be run:
Furthermore, the "Designer" page allows to edit workflow files through its Web XML editor:
Approval

The "Approval" page will let you view all approval workflows and will let you approve or disapprove workflows that need approval:
History

The "History" page will let you track all your workflows and everything that happens on the workflow server. Indeed, from this page
you will have an overview of all the workflow instances executed on the workflow server. Furthermore, you can filter the entries by
keywords or date. You can also order the entries by date, by name, etc.
Users

The "Users" page allows to create new users, change passwords and user's informations, and delete users who have restricted
access.
A user who has restricted rights has only access to the "Dashboard" page and the "History" page. When he signs in, he'll have the
following view of the backend:
Profiles

The "Profiles" page allows to assign workflows to users. Once the workflow assigned, the user can run it, modify it and delete it.
Installation

The backend is a website that can be hosted on IIS, Apache, Nginx or any other web server. The backend can also run locally.

To install the backend on a web server, simply copy the content of the folder "C:\Program Files\Wexflow\Backend" in the web server.
Then, configure the workflow server URI if you want to install the backend on another machine. Simply edit the configuration file
"js/settings.js":

Settings = {
Uri: "http://localhost:8000/wexflow/"
};

Instead of localhost, put the IP or the DNS of the machine where Wexflow server is installed.

Android Manager
Wexflow provides an Android application for managing workflows.

Wexflow Android Manager allows the user to do the following things:

See all the workflows loaded by Wexflow Engine.


See the status of the selected workflow (running, suspended, waiting for approval or disabled).
Start a workflow.
Stop a workflow.
Suspend a workflow.
Resume a workflow.
Approve an approval workflow.
Disapprove an approval workflow.
The "Refresh" button allows to reload the list of workflows.

iOS Manager
Wexflow provides an iOS application for managing workflows.

Wexflow iOS Manager allows the user to do the following things:

See all the workflows loaded by Wexflow Engine.


See the status of the selected workflow (running, suspended, waiting for approval or disabled).
Start a workflow.
Stop a workflow.
Suspend a workflow.
Resume a workflow.
Approve an approval workflow.
Disapprove an approval workflow.
The "Refresh" button allows to reload the list of workflows.

Command Line Client


Wexflow provides a command line client for querying Wexflow server. The command line tool is available for both .NET and .NET
Core and works on Windows, Linux and macOS.

Options

Examples

Fire and wait

The following command starts the workflow 41 and waits until it finishes its jobs:

Wexflow.Clients.CommandLine.exe -o start -i 41 -w

Fire and forget


The following command starts the workflow 41:

Wexflow.Clients.CommandLine.exe -o start -i 41

Stop

The following command stops the workflow 41:

Wexflow.Clients.CommandLine.exe -o stop -i 41

Suspend

The following command suspends the workflow 41:

Wexflow.Clients.CommandLine.exe -o suspend -i 41

Resume

The following command resumes the workflow 41:

Wexflow.Clients.CommandLine.exe -o resume -i 41

Approve

The following command approves the workflow 126:

Wexflow.Clients.CommandLine.exe -o approve -i 126

Disapprove

The following command disapproves the workflow 126:

Wexflow.Clients.CommandLine.exe -o disapprove -i 126

Windows (.NET)

The command line tool is located in C:\Program Files\Wexflow\Wexflow.Clients.CommandLine. To run the command line tool, just
run the executable C:\Program Files\Wexflow\Wexflow.Clients.CommandLine\Wexflow.Clients.CommandLine.exe

The configuration file C:\Program Files\Wexflow\Wexflow.Clients.CommandLine\Wexflow.Clients.CommandLine.exe.config contains


WexflowWebServiceUri, Username and Password settings. The password must be in MD5 checksum format.

Windows (.NET Core)

The command line tool is located in .\Wexflow.Clients.CommandLine. To run the command line tool, just run the following
command

cd .\Wexflow.Clients.CommandLine
dotnet Wexflow.Clients.CommandLine.dll

The configuration file .\Wexflow.Clients.CommandLine\appsettings.json contains WexflowWebServiceUri, Username and Password


settings. The password must be in MD5 checksum format.

Linux
After installing Wexflow on Linux, the command line tool is located in /opt/wexflow/Wexflow.Clients.CommandLine. To run the
command line tool, just run the following command

cd /opt/wexflow/Wexflow.Clients.CommandLine
dotnet Wexflow.Clients.CommandLine.dll

The configuration file /opt/wexflow/Wexflow.Clients.CommandLine/appsettings.json contains WexflowWebServiceUri, Username and


Password settings. The password must be in MD5 checksum format.

macOS

After installing Wexflow on macOS, the command line tool is located in /Applications/wexflow/Wexflow.Clients.CommandLine. To
run the command line tool, just run the following command

cd /Applications/wexflow/Wexflow.Clients.CommandLine
dotnet Wexflow.Clients.CommandLine.dll

The configuration file /Applications/wexflow/Wexflow.Clients.CommandLine/appsettings.json contains WexflowWebServiceUri,


Username and Password settings. The password must be in MD5 checksum format.

Workflow Samples
Wexflow is designed in a way to make things easy and straightforward for beginners in the world of workflows and automation.

Workflows can be designed through the designer or through XML editing by editing the configuration file of the workflow.
However, it is highly recommended to understand Wexflow workflow syntax in order to become familiar with this workflow engine.

Each workflow in Wexflow has a configuration file located by default in the folder:

.NET version: C:\Wexflow\Workflows


.NET Core version (Windows): C:\Wexflow-dotnet-core\Workflows
.NET Core version (Linux): /opt/wexflow/Wexflow/Workflows
.NET Core version (macOS): /Applications/wexflow/Wexflow/Workflows

Each configuration file contains a set of settings and tasks to do depending on a specified schedule and a specified configuration.

In this section, few workflow samples will be presented in order to make the end user familiar with Wexflow workflows syntax:

1. Sequential Workflows
2. Execution Graph
3. Flowchart Workflows
4. Approval Workflows
5. Workflow Events

Sequential Workflows
A sequential workflow executes a set of tasks in order, one by one. Tasks are executed in a sequential manner until the last task
finishes. The order of the execution of the tasks can be altered by modifying the execution graph of the workflow.

Workflow 1
This workflow uploads invoices to an SFTP server, then waits for 2 days and then notifies the customers.

<Workflow xmlns="urn:wexflow-schema" id="1" name="Workflow_Invoices"


description="Workflow_Invoices">
<Settings>
<Setting name="launchType" value="trigger" />
<Setting name="enabled" value="true" />
</Settings>
<Tasks>
<Task id="1" name="FilesLoader" description="Loading invioces" enabled="true">
<Setting name="folder" value="C:\WexflowTesting\Invoices\" />
</Task>
<Task id="2" name="Ftp" description="Uploading invoices" enabled="true">
<Setting name="protocol" value="sftp" /> <!-- ftp|ftps|sftp -->
<Setting name="command" value="upload" /> <!-- list|upload|download|delete -->
<Setting name="server" value="127.0.1" />
<Setting name="port" value="21" />
<Setting name="user" value="user" />
<Setting name="password" value="password" />
<Setting name="path" value="/" />
<Setting name="selectFiles" value="1" />
</Task>
<Task id="3" name="Wait" description="Waiting for 2 days" enabled="true">
<Setting name="duration" value="2.00:00:00" />
</Task>
<Task id="4" name="FilesLoader" description="Loading emails" enabled="true">
<Setting name="file" value="C:\WexflowTesting\Emails\Invoices.xml" />
</Task>
<Task id="5" name="MailsSender" description="Notifying customers" enabled="true">
<Setting name="selectFiles" value="4" />
<Setting name="host" value="127.0.0.1" />
<Setting name="port" value="587" />
<Setting name="enableSsl" value="true" />
<Setting name="user" value="user" />
<Setting name="password" value="password" />
</Task>
<Task id="6" name="FilesMover" description="Moving invoices" enabled="true">
<Setting name="selectFiles" value="1" />
<Setting name="destFolder" value="C:\WexflowTesting\Invoices_sent\" />
</Task>
</Tasks>
</Workflow>

First of all, the FilesLoader task loads all the invoices located in the folder C:\WexflowTesting\Invoices\, then the
Ftp task uploads them to the SFTP server, then the Wait task waits for 2 days, then the FilesLoader task loads the emails in
XML format and then the MailsSender task sends the emails. Finally, the FilesMover task moves the invoices to the
folder C:\WexflowTesting\Invoices_sent\.

Workflow 2

This workflow waits for files to arrive in C:\WexflowTesting\Watchfolder1\


and C:\WexflowTesting\Watchfolder2\ then uploads them to an FTP server then moves them to
C:\WexflowTesting\Sent\ folder. This workflow starts every 2 minutes.

<Workflow xmlns="urn:wexflow-schema" id="2" name="Workflow_FilesSender"


description="Workflow_FilesSender">
<Settings>
<Setting name="launchType" value="periodic" />
<Setting name="period" value="00.00:02:00.00" />
<Setting name="enabled" value="true" />
</Settings>
<Tasks>
<Task id="1" name="FilesLoader" description="Loading files" enabled="true">
<Setting name="folder" value="C:\WexflowTesting\Watchfolder1\" />
<Setting name="folder" value="C:\WexflowTesting\Watchfolder2\" />
</Task>
<Task id="2" name="Ftp" description="Uploading files" enabled="true">
<Setting name="protocol" value="ftp" /> <!-- ftp|ftps|sftp -->
<Setting name="command" value="upload" /> <!-- list|upload|download|delete -->
<Setting name="server" value="127.0.1" />
<Setting name="port" value="21" />
<Setting name="user" value="user" />
<Setting name="password" value="password" />
<Setting name="path" value="/" />
<Setting name="selectFiles" value="1" />
</Task>
<Task id="3" name="FilesMover" description="Moving files to Sent folder"
enabled="true">
<Setting name="selectFiles" value="1" />
<Setting name="destFolder" value="C:\WexflowTesting\Sent\" />
</Task>
</Tasks>
</Workflow>

First of all, the FilesLoader task loads all the files located in the folders C:\WexflowTesting\Watchfolder1\
and C:\WexflowTesting\Watchfolder2\ then the Ftp task loads the files and uploads them to the FTP server. Finally,
the FilesMover task moves the files to the folder C:\WexflowTesting\Sent\.

Workflow 3

This workflow transcodes the WAV files located in C:\WexflowTesting\WAV\ to MP3 format through FFMPEG and moves
the transcoded files to C:\WexflowTesting\MP3\.

<Workflow xmlns="urn:wexflow-schema" id="3" name="Workflow_ffmpeg"


description="Workflow_ffmpeg">
<Settings>
<Setting name="launchType" value="trigger" />
<Setting name="enabled" value="true" />
</Settings>
<Tasks>
<Task id="1" name="FilesLoader" description="Loading WAV files" enabled="true">
<Setting name="folder" value="C:\WexflowTesting\WAV\" />
</Task>
<Task id="2" name="ProcessLauncher" description="WAV to MP3" enabled="true">
<Setting name="selectFiles" value="1" />
<!-- You need to install FFMPEG -->
<Setting name="processPath" value="C:\Program Files\ffmpeg\bin\ffmpeg.exe" />
<!-- variables: {$filePath},{$fileName},{$fileNameWithoutExtension}-->
<Setting name="processCmd" value="-i {$filePath} -codec:a libmp3lame -qscale:a 2
{$output:$fileNameWithoutExtension.mp3}" />
<Setting name="hideGui" value="true" />
<Setting name="generatesFiles" value="true" />
</Task>
<Task id="3" name="FilesMover" description="Moving MP3 files from temp folder"
enabled="true">
<Setting name="selectFiles" value="2" />
<Setting name="destFolder" value="C:\WexflowTesting\MP3\" />
</Task>
</Tasks>
</Workflow>

First of all, the FilesLoader task loads all the files located in the folder C:\WexflowTesting\WAV\ then
the ProcessLauncher task launches FFMPEG process on every file by specifying the right command in order to create the MP3
file. Finally, the FilesMover task moves the MP3 files to the folder C:\WexflowTesting\MP3\.

Workflow 4

This workflow waits for WAV files to arrive in C:\WexflowTesting\WAV\ then transcodes them to MP3 files through VLC
then uploads the MP3 files to an FTP server then moves the WAV files to C:\WexflowTesting\WAV_processed\. This
workflow starts every 2 minutes.

<Workflow xmlns="urn:wexflow-schema" id="4" name="Workflow_vlc" description="Workflow_vlc">


<Settings>
<Setting name="launchType" value="periodic" />
<Setting name="period" value="00.00:02:00.00" />
<Setting name="enabled" value="true" />
</Settings>
<Tasks>
<Task id="1" name="FilesLoader" description="Loading WAV files" enabled="true">
<Setting name="folder" value="C:\WexflowTesting\WAV\" />
</Task>
<Task id="2" name="ProcessLauncher" description="WAV to MP3" enabled="true">
<Setting name="selectFiles" value="1" />
<!-- You need to install VLC-->
<Setting name="processPath" value="C:\Program Files\VideoLAN\VLC\vlc.exe" />
<!-- variables: {$filePath},{$fileName},{$fileNameWithoutExtension}-->
<Setting name="processCmd" value="-I dummy {$filePath}
:sout=#transcode{acodec=mpga}:std{dst={$output:$fileNameWithoutExtension.mp3},access=file}
vlc://quit" />
<Setting name="hideGui" value="true" />
<Setting name="generatesFiles" value="true" />
</Task>
<Task id="3" name="Ftp" description="Uploading MP3 files" enabled="true">
<Setting name="protocol" value="ftp" />
<Setting name="command" value="upload" />
<Setting name="server" value="127.0.1" />
<Setting name="port" value="21" />
<Setting name="user" value="user" />
<Setting name="password" value="password" />
<Setting name="path" value="/" />
<Setting name="selectFiles" value="2" />
</Task>
<Task id="4" name="FilesMover" description="Moving WAV files" enabled="true">
<Setting name="selectFiles" value="1" />
<Setting name="destFolder" value="C:\WexflowTesting\WAV_processed\" />
</Task>
</Tasks>
</Workflow>

First of all, the FilesLoader task loads all the files located in the folder C:\WexflowTesting\WAV\ then
the ProcessLauncher task launches VLC process on every file by specifying the right command in order to create the MP3 file.
Then, the Ftp task loads the MP3 files generated by the ProcessLauncher task and then uploads them to the FTP server.
Finally, the FilesMover task moves the processed WAV files to the folder C:\WexflowTesting\WAV_processed\.

Workflow 5

This workflow downloads specific files from an FTP server. This workflow starts by listing all the files located at the root folder of the
server, then the specific files that will be downloaded are tagged through an XSLT (LisFiles.xslt), then the files
are downloaded by the Ftp task through todo="toDownload" and from="app4" tags, then the downloaded files
are moved to the folder C:\WexflowTesting\Ftp_download\.

<Workflow xmlns="urn:wexflow-schema" id="5" name="Workflow_Ftp_download_tag"


description="Workflow_Ftp_download_tag">
<Settings>
<Setting name="launchType" value="trigger" /> <!-- startup|trigger|periodic -->
<Setting name="enabled" value="true" /> <!-- true|false -->
</Settings>
<Tasks>
<Task id="1" name="Ftp" description="Listing files (FTP)" enabled="true">
<Setting name="command" value="list" />
<Setting name="protocol" value="ftp" /> <!-- ftp|ftps|sftp -->
<Setting name="server" value="127.0.1" />
<Setting name="port" value="21" />
<Setting name="user" value="user" />
<Setting name="password" value="password" />
<Setting name="path" value="/" />
</Task>
<Task id="2" name="ListFiles" description="Listing files" enabled="true">
</Task>
<Task id="3" name="Xslt" description="Renaming and tagging files" enabled="true">
<Setting name="selectFiles" value="2" />
<Setting name="xsltPath" value="C:\Wexflow\Xslt\ListFiles.xslt" />
<Setting name="version" value="2.0" /> <!-- 1.0|2.0 -->
<Setting name="removeWexflowProcessingNodes" value="false" />
</Task>
<Task id="4" name="Ftp" description="Downloading files" enabled="true">
<Setting name="command" value="download" />
<Setting name="protocol" value="ftp" /> <!-- ftp|ftps|sftp -->
<Setting name="server" value="127.0.1" />
<Setting name="port" value="21" />
<Setting name="user" value="user" />
<Setting name="password" value="password" />
<Setting name="path" value="/" />
<Setting name="selectFiles" todo="toDownload" from="app4" />
</Task>
<Task id="5" name="FilesMover" description="Moving files to Ftp_download"
enabled="true">
<Setting name="selectFiles" value="4" />
<Setting name="destFolder" value="C:\WexflowTesting\Ftp_download\" />
<Setting name="overwrite" value="true" />
</Task>
</Tasks>
</Workflow>

Roughly speaking, the Ftp task loads the list of files located at the root folder of the FTP server in the running instance of the
workflow, then the ListFiles task outputs and XML file that contains all the files loaded then the Xslt task takes as input this
XML and generates an XML which contains a system node called <WexflowProcessing> which contains the list of files to be
tagged and/or renamed.

To understand how tagging and renaming files work, refer to the documentation of the ListFiles and Xslt tasks.

Below is the XSLT ListFiles.xslt used for tagging files:

<?xml version="1.0" encoding="utf-8"?>


<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="/">
<root>
<WexflowProcessing>
<xsl:for-each select="//WexflowProcessing/Workflow/Files//File">
<xsl:choose>
<xsl:when test="@name = 'file1.txt'">
<File taskId="{@taskId}" name="{@name}" renameTo="file1_renamed.txt"
todo="toRename" from="app1" />
</xsl:when>
<xsl:when test="@name = 'file2.txt'">
<File taskId="{@taskId}" name="{@name}" renameTo="file2_renamed.txt"
todo="toSend" from="app2" />
</xsl:when>
<xsl:when test="@name = 'file3.txt'">
<File taskId="{@taskId}" name="{@name}" renameTo="file3_renamed.txt"
todo="toDownload" from="app3" />
</xsl:when>
<xsl:when test="@name = 'file4.txt'">
<File taskId="{@taskId}" name="{@name}" renameTo="file4_renamed.txt"
todo="toDownload" from="app4" />
</xsl:when>
</xsl:choose>
</xsl:for-each>
</WexflowProcessing>
</root>
</xsl:template>
</xsl:stylesheet>

Execution Graph

This workflow loads the file C:\WexflowTesting\file1.txt then uploads it to an FTP server then moves it to


C:\WexflowTesting\Sent\ folder.

<Workflow xmlns="urn:wexflow-schema" id="6" name="Workflow_Ftp_upload"


description="Workflow_Ftp_upload">
<Settings>
<Setting name="launchType" value="trigger" />
<Setting name="enabled" value="true" />
</Settings>
<Tasks>
<Task id="1" name="FilesLoader" description="Loading files" enabled="true">
<Setting name="file" value="C:\WexflowTesting\file1.txt" />
</Task>
<Task id="2" name="Ftp" description="Uploading files" enabled="true">
<Setting name="protocol" value="ftp" />
<Setting name="command" value="upload" />
<Setting name="server" value="127.0.1" />
<Setting name="port" value="21" />
<Setting name="user" value="user" />
<Setting name="password" value="password" />
<Setting name="path" value="/" />
<Setting name="selectFiles" value="1" />
</Task>
<Task id="3" name="FilesMover" description="Moving files to Sent folder"
enabled="true">
<Setting name="selectFiles" value="1" />
<Setting name="destFolder" value="C:\WexflowTesting\Sent\" />
</Task>
</Tasks>
<ExecutionGraph>
<Task id="1"><Parent id="-1" /></Task>
<Task id="2"><Parent id="1" /></Task>
<Task id="3"><Parent id="2" /></Task>
</ExecutionGraph>
</Workflow>

First of all, the FilesLoader task loads the file C:\WexflowTesting\file1.txt then the Ftp task loads that file and
uploads it to the FTP server. Finally, the FilesMover task moves that file to the folder C:\WexflowTesting\Sent\.

By convention, the parent task id of the first task to be executed must always be -1. The execution graph of this workflow will
execute the tasks in the following order:

However, if the execution graph is modified as follows:

<ExecutionGraph>
<Task id="1"><Parent id="-1" /></Task>
<Task id="3"><Parent id="1" /></Task>
<Task id="2"><Parent id="3" /></Task>
</ExecutionGraph>

The tasks will be executed as follows:


If the execution graph is modified as follows:

<ExecutionGraph>
<Task id="3"><Parent id="-1" /></Task>
<Task id="2"><Parent id="3" /></Task>
<Task id="1"><Parent id="2" /></Task>
</ExecutionGraph>

The tasks will be executed as follows:

Two things are forbidden in the execution graph:

1. Infinite loops.
2. Parallel tasks.

Here is an example of an infinite loop:

<ExecutionGraph>
<Task id="1"><Parent id="-1" /></Task>
<Task id="2"><Parent id="1" /></Task>
<Task id="1"><Parent id="2" /></Task>
</ExecutionGraph>

Here is an example of parallel tasks:

<ExecutionGraph>
<Task id="1"><Parent id="-1" /></Task>
<Task id="2"><Parent id="1" /></Task>
<Task id="3"><Parent id="1" /></Task>
</ExecutionGraph>

Flowchart Workflows
A flowchart workflow is a workflow that contains at least one flowchart node (If/While/Switch) in its execution graph. A flowchart
node takes as input a flowchart task and a set of tasks to execute in order, one by one. The order of the execution of the tasks can
be altered by modifying the execution graph of the flowchart node.

If
The following workflow is a flowchart workflow that is triggered by the file file.trigger. If the file file.trigger is found on the file
system then this workflow will upload the file file1.txt to an FTP server then it will notify customers that the upload was successful.
Otherwise, if the trigger file.trigger is not found on the file system then the workflow will notify customers that the upload failed.

<Workflow xmlns="urn:wexflow-schema" id="7" name="Workflow_If" description="Workflow_If">


<Settings>
<Setting name="launchType" value="trigger" />
<Setting name="enabled" value="true" />
</Settings>
<Tasks>
<Task id="1" name="FilesLoader" description="Loading files" enabled="true">
<Setting name="file" value="C:\WexflowTesting\file1.txt" />
</Task>
<Task id="2" name="Ftp" description="Uploading files" enabled="true">
<Setting name="protocol" value="ftp" />
<Setting name="command" value="upload" />
<Setting name="server" value="127.0.1" />
<Setting name="port" value="21" />
<Setting name="user" value="user" />
<Setting name="password" value="password" />
<Setting name="path" value="/" />
<Setting name="selectFiles" value="1" />
</Task>
<Task id="3" name="FilesLoader" description="Loading emails (OK)" enabled="true">
<Setting name="file" value="C:\WexflowTesting\Emails\Emails.xml" />
</Task>
<Task id="4" name="MailsSender" description="Notifying customers (OK)" enabled="true">
<Setting name="selectFiles" value="3" />
<Setting name="host" value="127.0.0.1" />
<Setting name="port" value="587" />
<Setting name="enableSsl" value="true" />
<Setting name="user" value="user" />
<Setting name="password" value="password" />
</Task>
<Task id="5" name="FilesLoader" description="Loading emails (KO)" enabled="true">
<Setting name="file" value="C:\WexflowTesting\Emails\Emails.xml" />
</Task>
<Task id="6" name="MailsSender" description="Notifying customers (KO)" enabled="true">
<Setting name="selectFiles" value="5" />
<Setting name="host" value="127.0.0.1" />
<Setting name="port" value="587" />
<Setting name="enableSsl" value="true" />
<Setting name="user" value="user" />
<Setting name="password" value="password" />
</Task>
<Task id="99" name="FileExists" description="Checking trigger file" enabled="true">
<Setting name="file" value="C:\WexflowTesting\file.trigger" />
</Task>
</Tasks>
<ExecutionGraph>
<If id="100" parent="-1" if="99">
<Do>
<Task id="1"><Parent id="-1" /></Task>
<Task id="2"><Parent id="1" /></Task>
<Task id="3"><Parent id="2" /></Task>
<Task id="4"><Parent id="3" /></Task>
</Do>
<Else>
<Task id="5"><Parent id="-1" /></Task>
<Task id="6"><Parent id="5" /></Task>
</Else>
</If>
</ExecutionGraph>
</Workflow>

By convention, the parent task id of the first task to execute in <Do> and <Else> nodes must always be -1.

You can add If flowchart nodes pretty much wherever you want in the execution graph. Also, you can add as mush as you want.
You can also add them in the event nodes OnSuccess, OnWarning and OnError.

An If can be inside an If, a While and a Switch.

While

This workflow is triggered by the file file.trigger. While the file file.trigger exists, this workflow will upload the file file1.txt to an FTP
server then it will notify customers then it will wait for 2 days then it will start again.

<Workflow xmlns="urn:wexflow-schema" id="8" name="Workflow_While" description="Workflow_While">


<Settings>
<Setting name="launchType" value="trigger" />
<Setting name="enabled" value="true" />
</Settings>
<Tasks>
<Task id="1" name="FilesLoader" description="Loading files" enabled="true">
<Setting name="file" value="C:\WexflowTesting\file1.txt" />
</Task>
<Task id="2" name="Ftp" description="Uploading files" enabled="true">
<Setting name="protocol" value="ftp" />
<Setting name="command" value="upload" />
<Setting name="server" value="127.0.1" />
<Setting name="port" value="21" />
<Setting name="user" value="user" />
<Setting name="password" value="password" />
<Setting name="path" value="/" />
<Setting name="selectFiles" value="1" />
</Task>
<Task id="3" name="FilesLoader" description="Loading emails" enabled="true">
<Setting name="file" value="C:\WexflowTesting\Emails\Emails.xml" />
</Task>
<Task id="4" name="MailsSender" description="Notifying customers" enabled="true">
<Setting name="selectFiles" value="3" />
<Setting name="host" value="127.0.0.1" />
<Setting name="port" value="587" />
<Setting name="enableSsl" value="true" />
<Setting name="user" value="user" />
<Setting name="password" value="password" />
</Task>
<Task id="5" name="Wait" description="Waiting for 2 days..." enabled="true">
<Setting name="duration" value="02.00:00:00" />
</Task>
<Task id="99" name="FileExists" description="Checking trigger file" enabled="true">
<Setting name="file" value="C:\WexflowTesting\file.trigger" />
</Task>
</Tasks>
<ExecutionGraph>
<While id="100" parent="-1" while="99">
<Task id="1"><Parent id="-1" /></Task>
<Task id="2"><Parent id="1" /></Task>
<Task id="3"><Parent id="2" /></Task>
<Task id="4"><Parent id="3" /></Task>
<Task id="5"><Parent id="4" /></Task>
</While>
</ExecutionGraph>
</Workflow>

By convention, the parent task id of the first task to be executed in the <While> node must always be -1.

You can add While flowchart nodes pretty much wherever you want in the execution graph. Also, you can add as mush as you
want. You can also add them in the event nodes OnSuccess, OnWarning and OnError.

A While can be inside a While, an If and a Switch.

Switch

This workflow starts every 24 hours. On Monday, it uploads files to an FTP server and on Wednesday it notifies customers.

<Workflow xmlns="urn:wexflow-schema" id="43" name="Workflow_Switch"


description="Workflow_Switch">
<Settings>
<Setting name="launchType" value="periodic" />
<Setting name="period" value="1.00:00:00" />
<Setting name="enabled" value="true" />
</Settings>
<Tasks>
<Task id="1" name="Now" description="Getting current day" enabled="true">
<Setting name="culture" value="en-US" />
<Setting name="format" value="dddd" />
</Task>
<Task id="2" name="FilesLoader" description="Loading files" enabled="true">
<Setting name="file" value="C:\WexflowTesting\file1.txt" />
</Task>
<Task id="3" name="Ftp" description="Uploading files" enabled="true">
<Setting name="protocol" value="ftp" />
<Setting name="command" value="upload" />
<Setting name="server" value="127.0.1" />
<Setting name="port" value="21" />
<Setting name="user" value="user" />
<Setting name="password" value="password" />
<Setting name="path" value="/" />
<Setting name="selectFiles" value="1" />
</Task>
<Task id="4" name="FilesLoader" description="Loading emails" enabled="true">
<Setting name="file" value="C:\WexflowTesting\Emails\Emails.xml" />
</Task>
<Task id="5" name="MailsSender" description="Notifying customers" enabled="true">
<Setting name="selectFiles" value="3" />
<Setting name="host" value="127.0.0.1" />
<Setting name="port" value="587" />
<Setting name="enableSsl" value="true" />
<Setting name="user" value="user" />
<Setting name="password" value="password" />
</Task>
</Tasks>
<ExecutionGraph>
<Switch id="100" parent="-1" switch="1">
<Case value="Monday">
<Task id="2"><Parent id="-1" /></Task>
<Task id="3"><Parent id="2" /></Task>
</Case>
<Case value="Wednesday">
<Task id="4"><Parent id="-1" /></Task>
<Task id="5"><Parent id="4" /></Task>
</Case>
<Default />
</Switch>
</ExecutionGraph>
</Workflow>

By convention, the parent task id of the first task to be executed in the Case/Default nodes must always be -1.

You can add Switch flowchart nodes pretty much wherever you want in the execution graph. Also, you can add as mush as you
want. You can also add them in the event nodes OnSuccess, OnWarning and OnError.

A Switch can be inside a While, an If and a Switch.

Approval workflows
Approval workflows are workflows marked as approval through approval setting option. They can be marked as approval whether
from the Designer page in the back end or by XML editing:

<Workflow xmlns="urn:wexflow-schema" id="125" name="Workflow_Approval"


description="Workflow_Approval">
<Settings>
<Setting name="launchType" value="trigger" />
<Setting name="enabled" value="true" />
<Setting name="approval" value="true" />
</Settings>
<LocalVariables />
<Tasks />
</Workflow>
Approval workflows must contain at least one Approval task. Approval tasks can be put wherever you want in the workflow and can
be multiple. You can create workflows where some tasks get done then the workflow waits for approval then the users are notified
for example.

Workflows are being approved whether from Wexflow Manager or from Approval page in the back end or from Wexflow Android
Manager or from Wexflow iOS Manager.

If the workflow is disapproved the OnDisapproved workflow event is raised and the tasks after Approval task are not executed.

The disapproval of workflows can be done by clicking on disapprove button whether from Approval page in the back end or from
Wexflow Manager or from Wexflow Android Manager or from Wexflow iOS Manager.

Simple approval workflow

To give you a hint on how approval workflows work, here is a very simple example:

<Workflow xmlns="urn:wexflow-schema" id="131" name="Workflow_Approval"


description="Workflow_Approval">
<Settings>
<Setting name="launchType" value="trigger" />
<Setting name="enabled" value="true" />
<Setting name="approval" value="true" />
</Settings>
<LocalVariables />
<Tasks>
<Task id="1" name="Approval" description="Waiting for approval" enabled="true" />
<Task id="2" name="Wait" description="Waiting for 2 seconds" enabled="true">
<Setting name="duration" value="00.00:00:02" />
</Task>
</Tasks>
</Workflow>

This simple workflow is an approval workflow that waits for approval in order to start. Once approved, this workflow waits for 2
seconds. This workflow can be approved or disapproved whether from Wexflow Manager or from Approval page in the back end or
from Wexflow Android Manager or from Wexflow iOS Manager.

OnDisapproved workflow event

Here is another simple approval workflow:


<Workflow xmlns="urn:wexflow-schema" id="132" name="Workflow_Approval_Disapprove"
description="Workflow_Approval_Disapprove">
<Settings>
<Setting name="launchType" value="trigger" />
<Setting name="enabled" value="true" />
<Setting name="approval" value="true" />
</Settings>
<LocalVariables />
<Tasks>
<Task id="1" name="Approval" description="Waiting for approval" enabled="true" />
<Task id="2" name="Wait" description="Waiting for 2 seconds" enabled="true">
<Setting name="duration" value="00.00:00:02" />
</Task>
<Task id="3" name="Wait" description="Waiting for 3 seconds" enabled="true">
<Setting name="duration" value="00.00:00:03" />
</Task>
</Tasks>
<ExecutionGraph>
<Task id="1"><Parent id="-1" /></Task>
<Task id="2"><Parent id="1" /></Task>
<OnDisapproved>
<Task id="3"><Parent id="-1" /></Task>
</OnDisapproved>
</ExecutionGraph>
</Workflow>

This simple workflow is an approval workflow that waits for approval in order to start. Once approved, this workflow waits for 2
seconds. If this workflow is disapproved, the task 2 is not executed and the task 3 is executed. In other words, if this workflow is
disapproved it waits for 3 seconds. This workflow can be approved or disapproved whether from Wexflow Manager or
from Approval page in the back end or from Wexflow Android Manager or from Wexflow iOS Manager.

YouTube approval workflow

Here is a more professional approval workflow:


<Workflow xmlns="urn:wexflow-schema" id="132" name="Workflow_YouTube"
description="Workflow_YouTube">
<Settings>
<Setting name="launchType" value="trigger" />
<Setting name="enabled" value="true" />
<Setting name="approval" value="true" />
</Settings>
<LocalVariables />
<Tasks>
<Task id="1" name="FilesLoader" description="Loading YouTube videos" enabled="true">
<Setting name="file" value="C:\WexflowTesting\YouTube\YouTube.xml" />
</Task>
<Task id="2" name="YouTube" description="Uploading YouTube videos" enabled="true">
<Setting name="selectFiles" value="1" />
<Setting name="user" value="username" />
<Setting name="applicationName" value="Wexflow" />
<Setting name="clientSecrets" value="C:\Wexflow-dotnet-core\client_secrets.json" />
</Task>
<Task id="3" name="Approval" description="Waiting for approval" enabled="true" />
<Task id="4" name="FilesLoader" description="Loading notification mails" enabled="true">
<Setting name="file" value="C:\WexflowTesting\Mails\mails.xml" />
</Task>
<Task id="5" name="MailsSender" description="Sending notification mails" enabled="true">
<Setting name="selectFiles" value="4" />
<Setting name="host" value="smtp.gmail.com" />
<Setting name="port" value="587" />
<Setting name="enableSsl" value="true" />
<Setting name="user" value="user" />
<Setting name="password" value="password" />
</Task>
</Tasks>
</Workflow>

This workflow starts by uploading videos to YouTube then it waits for approval in order to check that videos have been effectively
uploaded with success to YouTube and edited by the management team. Then, if this workflow is approved from Approval page in
the back end or from Wexflow Manager or from Wexflow Android Manager or from Wexflow iOS Manager a notification mail is
being sent in order to notify the management team that YouTube videos have been effectively uploaded with success to YouTube.

When this workflow arrives to Approval task, it suspends its jobs and waits for approval process until it's being approved and then
continues its tasks.
Form submission approval workflow

Here is another interesting approval workflow:

<Workflow xmlns="urn:wexflow-schema" id="134" name="Workflow_FormSubmission"


description="Workflow_FormSubmission">
<Settings>
<Setting name="launchType" value="trigger" />
<Setting name="enabled" value="true" />
<Setting name="approval" value="true" />
</Settings>
<Tasks>
<Task id="1" name="ProcessLauncher" description="Form submission" enabled="true">
<Setting name="processPath" value="C:\Program Files
(x86)\Google\Chrome\Application\chrome.exe" />
<Setting name="processCmd"
value="https://docs.google.com/forms/d/1sHnPCJ05GLecqvZb0MNeFkFK0eMuVqBUyWAo5uurEQ8/prefill" />
<Setting name="hideGui" value="false" />
<Setting name="generatesFiles" value="false" />
</Task>
<Task id="2" name="Approval" description="Waiting for approval" enabled="true" />
<Task id="3" name="Wait" description="Waiting for 2 seconds" enabled="true">
<Setting name="duration" value="00.00:00:02" />
</Task>
<Task id="4" name="Wait" description="Waiting for 3 seconds" enabled="true">
<Setting name="duration" value="00.00:00:03" />
</Task>
</Tasks>
<ExecutionGraph>
<Task id="1"><Parent id="-1" /></Task>
<Task id="2"><Parent id="1" /></Task>
<!-- You can add other tasks here depending on your need. -->
<Task id="3"><Parent id="2" /></Task>
<OnDisapproved>
<!-- You can add other tasks here depending on your need. -->
<Task id="4"><Parent id="-1" /></Task>
</OnDisapproved>
</ExecutionGraph>
</Workflow>

This approval workflow opens a submission form and waits for approval. If the submission is correct, the workflow is approved and
waits for 2 seconds (this is just a simple task for testing but you can add email tasks or whatever). Otherwise, if the submission is
incorrect, the workflow is disapproved and waits for 3 seconds (this is just a simple task for testing but you can add email tasks or
whatever). This workflow works on the .NET Core version of Wexflow only because the .NET version of Wexflow does not support
opening GUI from ProcessLauncher task since Wexflow server is running in a Windows service in the .NET version.

Approval workflows are very useful when some tasks get done then you have to wait for approval to check that previous tasks have
been done with success then users are notified for example. This is just an example, but you can create and imagine other examples
as you want and as you need.

Workflow Events
After a workflow finishes its job, its final result is either success, or warning or error. If its final result is success, the OnSuccess event
is triggered. If its final result is warning, the OnWarning event is triggered. If its final result is error, the OnError event is triggered. An
event contains a set of tasks and/or flowchart nodes to execute in order, one by one. The order of the execution of the tasks and/or
flowchart nodes can be altered by modifying the execution graph of the event.

This workflow uploads the file1.txt to an FTP server then notifies customers in case of success.

<Workflow xmlns="urn:wexflow-schema" id="9" name="Workflow_Events"


description="Workflow_Events">
<Settings>
<Setting name="launchType" value="trigger" />
<Setting name="enabled" value="true" />
</Settings>
<Tasks>
<Task id="1" name="FilesLoader" description="Loading files" enabled="true">
<Setting name="file" value="C:\WexflowTesting\file1.txt" />
</Task>
<Task id="2" name="Ftp" description="Uploading files" enabled="true">
<Setting name="protocol" value="ftp" />
<Setting name="command" value="upload" />
<Setting name="server" value="127.0.1" />
<Setting name="port" value="21" />
<Setting name="user" value="user" />
<Setting name="password" value="password" />
<Setting name="path" value="/" />
<Setting name="selectFiles" value="1" />
</Task>
<Task id="3" name="FilesLoader" description="Loading emails" enabled="true">
<Setting name="file" value="C:\WexflowTesting\Emails\Emails.xml" />
</Task>
<Task id="4" name="MailsSender" description="Notifying customers" enabled="true">
<Setting name="selectFiles" value="3" />
<Setting name="host" value="127.0.0.1" />
<Setting name="port" value="587" />
<Setting name="enableSsl" value="true" />
<Setting name="user" value="user" />
<Setting name="password" value="password" />
</Task>
</Tasks>
<ExecutionGraph>
<Task id="1"><Parent id="-1" /></Task>
<Task id="2"><Parent id="1" /></Task>
<OnSuccess>
<Task id="3"><Parent id="-1" /></Task>
<Task id="4"><Parent id="3" /></Task>
</OnSuccess>
</ExecutionGraph>
</Workflow>

The flowchart event nodes OnWarning, OnError and OnDisapproved can be used in the same way. You can put If and
While flowchart nodes in event nodes.

For OnDisapproved workflow event, the workflow must be an approval workflow and must contain at least one Approval task.
The OnDisapproved workflow event is raised once the end user clicks on disapprove button whether from the Approval page in
the back end or from Wexflow Manager or from Wexflow Android Manager or from Wexflow iOS Manager.

These are simple and basic workflows to give an idea on how to make your own workflows. However, if you have multiple
systems, applications and automations involved in a workflow, the workflow could be very interesting.

How To Create A Custom Task?

General
Custom tasks are a must in a workflow engine and allow systems and applications to interact.

To create a custom task MyTask for example you will need to proceed as follows:

1. Create a class library project in Visual Studio and name it Wexflow.Tasks.MyTask.


2. Reference Wexflow.Core.dll and its dependencies through nuget package manager:

PM> Install-Package Wexflow

     3. Create a public class MyTask that implements the abstract class Wexflow.Core.Task.

Wexflow.Tasks.MyTask code should look like as follows:

using System.Threading;
using System.Xml.Linq;
using Wexflow.Core;

namespace Wexflow.Tasks.MyTask
{
public class MyTask : Task
{
public MyTask(XElement xe, Workflow wf) : base(xe, wf)
{
// Task settings goes here
}

public override TaskStatus Run()


{
try
{
// Task logic goes here

return new TaskStatus(Status.Success);


}
catch (ThreadAbortException)
{
throw;
}
}
}
}

Each task returns a TaskStatus object when it finishes performing its job. TaskStatus is composed of the following
elements:

public Status Status { get; set; }


public bool Condition { get; set; }
public string SwitchValue { get; set; }

The Status can be one of the followings:

public enum Status


{
Success,
Warning,
Error
}

For example, if a task performs an opetation on a collection of files and if this operation succeeds for all the files then its Status
should be Success. Otherwise if this operation succeeds for some files and fails for others then its Status should be
Warning. Otherwise if this operation fails for all the files then its Status should be Error.
The Condition property is designed for flowchart tasks. In addition to the Status of the task, a flowchart task returns either
true or false after performing its operation.
The Condition property should always be set to false for sequential tasks.

The SwitchValue is designed to be used by Switch flowchart nodes. If you set a value in the SwitchValue property and
use this task in a Switch flowchart node, the case corresponding to the value will be executed. Otherwise, if the Default case is
set, it will be executed.

You can use the TaskStatus constructor that suits your needs.

To retrieve settings, you can use the following methods:

string settingValue = this.GetSetting("settingName");


string settingValue = this.GetSetting("settingName", defaultValue);
string[] settingValues = this.GetSettings("settingName");

To select the files loaded by the running instance of a workflow through the selectFiles settings option, you can do it as
follows:

FileInf[] files = this.SelectFiles();

To select entities loaded by the running instance of a workflow through the selectEntities settings option, you can do it as
follows:

Entity[] entities = this.SelectEntities();

The Entity class could be very useful when working with custom tasks that manipulate objects from a database or Web Services
for example.

To load a file within a task, you can do it as follows:

this.Files.Add(new FileInf(path, this.Id));

To load an entity within a task, you can do it as follows:

this.Entities.Add(myEntity);
Finally if you finished coding your custom task, compile the class library project and copy the assembly Wexflow.Tasks.MyTask.dll
in C:\Program Files\Wexflow\ or in C:\Wexflow\Tasks\. The path of the folder C:\Wexflow\Tasks\ can be configured
through tasksFolder setting in the configuration file C:\Wexflow\Wexflow.xml.

Your custom task is then ready to be used as follows:

<Task id="$int" name="MyTask" description="My task description" enabled="true">


<Setting name="settingName" value="settingValue" />
</Task>

That's it. That's all the things you need to know to start coding your own custom tasks.

To test the custom task, create a new workflow (new XML file) and put the configuration of the custom task in it as follows:

<Workflow xmlns="urn:wexflow-schema" id="99" name="Workflow_MyWorkflow"


description="Workflow_MyWorkflow">
<Settings>
<Setting name="launchType" value="trigger" /> <!-- startup|trigger|periodic|cron -->
<Setting name="enabled" value="true" /> <!-- true|false -->
</Settings>
<Tasks>
<Task id="1" name="MyTask" description="My task description" enabled="true">
<Setting name="settingName" value="settingValue" />
</Task>
</Tasks>
</Workflow>

Then, place that XML file in C:\Wexflow\Workflows\.

The workflow will then appear in the list of workflows in Wexflow Manager. You can then launch it from there.

Logging
The following methods are available from the Task class for logging:

public void Info(string msg);


public void InfoFormat(string msg, params object[] args);
public void Debug(string msg);
public void DebugFormat(string msg, params object[] args);
public void Error(string msg);
public void ErrorFormat(string msg, params object[] args);
public void Error(string msg, Exception e);
public void ErrorFormat(string msg, Exception e, params object[] args);

Files

Files can be loaded in a task by calling the methods Add or AddRange:

this.Files.Add(myFile);
this.Files.AddRange(myFiles);

Then the files loaded can be selected in other tasks by their task Id as follows:

<Setting name="selectFiles" value="$taskId" />

To select the files loaded by the running instance of a workflow through the selectFiles settings option, you can do it as follows:

FileInf[] files = this.SelectFiles();

Entities
Entity is an abstract class having the Id of the task as property:

namespace Wexflow.Core
{
public abstract class Entity
{
public int TaskId { get; set; }
}
}

The entity class is designed to be inherited by other classes such as objects retrieved from a database or a web service or an API or
whatever. Then, these objects can be loaded in a task by calling the methods Add or AddRange:

this.Entities.Add(myEntity);
this.Entities.AddRange(myEntities);

Then, the entities loaded can be selected in other tasks by their task Id as follows:

<Setting name="selectEntities" value="$taskId" />

Entities are designed to be used in custom tasks.

To select entities loaded by the running instance of a workflow through the selectEntities settings option, you can do it as follows:

Entity[] entities = this.SelectEntities();

The Entity class could be very useful when working with custom tasks that manipulate objects from a database or Web Services for
example.

Shared Memory
Tasks contains a Hashtable that can be used as a shared memory between them.

To add an object to the Hashtable, simply proceed as follows:

this.Hashtable.Add("myKey", myObject);

To retrieve an object from the Hashtable, simply proceed as follows:

var myObject = this.Hashtable["myKey"];

To remove an object from the Hashtable, simply proceed as follows:

this.Hashtable.Remove("myKey");

Designer
To make your custom task MyTask appear in the dropdown of the designer, simply open the file C:\Wexflow\TasksNames.json and
add "MyTask" in it as follows:

[
...
"MyTask"
]

You must also add the settings by opening the file C:\Wexflow\TasksSettings.json and adding your custom settings as follows:

{
...
"MyTask": ["settingName"]
}

That's it. MyTask will show up in the designer dropdowns and when selected its settings will show up too.

Debugging
To debug custom tasks, you can use logging.

You can also clone this Wexflow's repository and open Wexflow.sln in Visual Studio 2019 and follow these guidelines to debug
Wexflow server. Then, you can create your custom task in the solution and debug it. Of course, to debug it you have to proceed as
follows:

1. Create your custom task.


2. Reference your custom task in Wexflow.Server.
3. Create a workflow using your custom task (see the documentation).
4. Place your workflow in C:\Wexflow\Workflows.
5. Open Wexflow Manager or the backend and trigger your workflow from there.

How To Debug Wexflow?


To debug Wexflow, proceed as follows:

Clone the source down to your machine:

git clone https://github.com/aelassas/Wexflow.git

Install Microsoft .NET Framework 4.6.1 SDK or higher.


Install Microsoft Sync Framework 2.1 SDK if you want to debug Sync task.
Install Visual Studio 2019.
.NET version: Copy the folders "Wexflow" and "WexflowTesting" in C:\. You can download them from here.
.NET Core version: Copy the folders "Wexflow-dotnet-core" and "WexflowTesting" in C:\. You can download them
from here.
If you installed Wexflow, Make sure that Wexflow Windows Service is stopped.
Restore nuget packages through the following command:

nuget restore Wexflow.sln

Open Wexflow.sln in Visual Studio.


Make sure that Wexflow.Server is set as a startup project.
Debug the project Wexflow.Server to start Wexflow Server in debug mode.
Debug the project Wexflow.Clients.Manager to start Wexflow Manager in debug mode or you can open the backend and
trigger your workflows from there.

That's it. I hope you enjoyed reading this article. If you have any thoughts to improve Wexflow or if you face any issues or if you
want to contribute to this project please let me know in the comments or in GitHub.

Libraries Used By Wexflow


Here is the list of the libraries used by Wexflow:

FluentFTP: An FTP client supporting FTP and FTPS(exmplicit/implicit) written in C# and under MIT license.
SSH.NET: An SSH library for .NET written in C# and under MIT license.
SharpZipLib: A Zip, GZip, Tar and BZip2 library written in C# and under MIT license.
Saxon-HE: An XSLT and XQuery Processor that provides implementations of XSLT (2.0), XQuery (1.0, 3.0, and 3.1), and XPath
(2.0, 3.0, and 3.1) at the basic level of conformance defined by W3C. It's an open source library available under the Mozilla
Public License version 1.0.
log4net: A port of the famous Apache log4j framework to the Microsoft .NET runtime. It's under the Apache license version
2.0.
TweetSharp: A fast and clean wrapper around the Twitter AP written in C#.
Microsoft Sync Framework 2.1: A data synchronization platform that allows to synchronize data across multiple data stores.
Json.NET: A high-performance JSON framework for .NET written in C# and under MIT license.
Hammock: an HTTP library that simplifies consuming and wrapping RESTful services.
Mono.Security: A library that provides the missing pieces to .NET security.
Oracle Data Access Components (ODAC): Oracle database client for .NET.
MySQL Connector/Net: A fully-managed ADO.NET driver for MySQL.
System.Data.SQLite: An ADO.NET provider for SQLite.
Npgsql: An open source ADO.NET Data Provider for PostgreSQL written in C# and under the PostgreSQL License, a liberal
OSI-approved open source license.
.NET Data Provider for Teradata: An ADO.NET provider for Teradata.
Eto.Forms: A cross platform GUI framework for desktop and mobile applications in .NET.
highlight.js: Javascript syntax highlighter.
Cytoscape.js: Graph theory / network library for analysis and visualization.
OpenPop.NET: An open source implementation of a POP3 client and a robust MIME parser written in C#. It allows developers
easy access to email on a POP3 server in a matter of minutes.
iTextSharp: .NET port of the iText library.
DiffPlex: A Netstandard 1.0 C# library to generate textual diffs.
MonoTorrent: A cross-platform library implementing the BitTorrent protocol. It is based on the Mono implementation of the
.NET Framework.
Quartz.NET: A port of Java Quartz which is an enterprise class job sheduling system.
SharpCompress: A fully managed C# library to deal with many compression types and formats.
DiscUtils: Utility libraries to interact with discs, filesystem formats and more.
SevenZipSharp: Managed 7-zip library written in C# that provides data (self-)extraction and compression (all 7-zip formats
are supported). It wraps 7z.dll or any compatible one and makes use of LZMA SDK.
7-Zip: 7-Zip is a file archiver with a high compression ratio.
Selenium WebDriver: A set of different software tools each with a different approach to supporting browser automation.
ChromeDriver: An open source tool for automated testing of webapps across many browsers.
NUglify: A HTML, JavaScript and CSS minification Library for .NET.
SharpScss: A portable cross-platform pinvoke .NET wrapper around libsass to convert SCSS to CSS.
libsass: A C/C++ implementation of a Sass compiler.
YamlDotNet: A .NET library for YAML.
LiteDB: A .NET NoSQL Document Store in a single data file.
Nancy: Lightweight, low-ceremony, framework for building HTTP based services on .Net and Mono.
Kestrel: A cross platform web server for ASP.NET Core.
YouTube Dat API: Allows to add YouTube features to an application, including the ability to upload videos, create and
manage playlists, and more.
Tweetinvi: an intuitive Twitter C# library for the REST and Stream API. It supports .NET, .NETCore, UAP and Portable Class
Libraries (Xamarin).
InstagramApiSharp: A complete Private Instagram API for .NET (C#, VB.NET).
Ace: An embeddable code editor written in JavaScript.
Reddit.NET: A Reddit API library for .NET Standard with OAuth support. Written in C#.
Vimeo API: Vimeo's API supports flexible, high-quality video integration with custom apps.
SlackAPI: .NET Implementation of the Slack team communication platform API.
MongoDB.Driver: MongoDB driver.
RavenDB.Client: RavenDB driver.
Microsoft.Azure.DocumentDB: CosmosDB driver.
commandline: The best C# command line parser that brings standardized *nix getopt style, for .NET.

History
05 Jan 2017:

Released version 1.0.

09 Jan 2017: 

Released version 1.0.1.


Created Wexflow Windows Service.
Created Tar, Tgz and Sql tasks.
Updated Wexflow Manager.
Fixed some bugs.

16 Jan 2017:

Released version 1.0.2.


Created Wmi and ImagesTransformer tasks.
Updated Wexflow Manager.

23 Jan 2017:

Released version 1.0.3.


Created Http, Sync, FilesRenamer, FilesExist and Wait tasks.
Created file tags functionality.
Added list, download and delete commands to Ftp task (FTP/FTPS(explicit/implicit)/SFTP).
Added retryCount and retryTimeout setting options to Ftp task.
Updated Wexflow manager.
Updated Wexflow engine.
Fixed some bugs.
Updated setup file.
Updated article content.

26 Jan 2017:

Released version 1.0.4.


Created XSD validation of worklfow files before loading them.
Created tasks execution graph.
Created flowchart workflows (DoIf and DoWhile).
Created workflow events (OnSuccess, OnWarning and OnError).
Created FileExists flowchart task.
Updated setup.
Updated article content.

30 Jan 2017:

Released version 1.0.5.


Created Wexflow Web Manager: a lightweight JavaScript API (~6Kb) for managing workflows.
Created Wexflow Manager GUI for Linux.
Updated Wexflow Manager for Windows.
Updated setup for Windows.
Created a setup for Linux.

06 Feb 2017:

Released version 1.0.6.


Created Wexflow Android Manager: an Android application for managing workflows.
Updated Wexflow Web Manager.
Updated Wexflow Manager (Windows and Linux).
Updated Wexflow Engine.

17 Feb 2017:

Released version 1.0.7.


Created Movedir task.
Updated Wexflow Web Manager.
Updated Wexflow Manager (Windows, Linux and Android).
Updated Wexflow Engine.
Fixed some bugs.

06 Mar 2017:

Released version 1.0.8.


Created Swictch/Case flowchart node.
Created Now task.
Created Wexflow Manager for macOS.
Updated If and While flowchart nodes syntax.
Updated setup projects.
Now, an If flowchart node can be inside an If, a While and a Switch flowchart nodes.
Now, a While flowchart node can be inside an If, a While and a Switch flowchart nodes.
Now, a Switch flowchart node can be inside an If, a While and a Switch flowchart nodes.
Code refactoring.
Fixed some bugs.

07 Apr 2017:
Released version 1.0.9.
Fixed Switch flowchart node children execution.
Fixed WCF service configuration issue.

22 May 2017:

Released version 1.1.


Created Workflow task. This task allows to start, suspend, resume or stop a list of workflows.
Performance optimization.
Code refactoring.

07 Oct 2017:

Released version 1.2.


Implemented mail attachments in MailsSender task.
Changed encoding to UTF-8 in logging and Wexflow Web Service client.
Hot reload of workflows:

If a workflow XML file is added to Workflows folder, It is automatically loaded without having to restart
Wexflow Windows service.
If a workflow XML file is deleted from Workflows folder, It is automatically stopped and removed without
having to restart Wexflow Windows service.
If a workflow XML file is changed. It is automatically reloaded without having to restart Wexflow Windows
service.

Fixed empty Default node issue in Switch flowchart node.


Updated Windows, macOS and Linux manager apps.

11 Oct 2017:

Released version 1.3.


Implemented Wexflow Web Designer in read-only mode. The edit mode will be implemented in future versions.
Fixed some bugs.

13 Oct 2017:

Released version 1.4.


Implemented Wexflow Designer edit mode:

Now it is possible to edit the workflow configuration through Wexflow Designer.


Now it is possible to edit tasks configuration and settings through Wexflow Designer.

15 Oct 2017:

Released version 1.5.


Added new features to Wexflow Designer:

Add a task setting.


Remove a task setting.
Add an attribute to selectFiles and selectAttachments task settings.
Remove an attribute from selectFiles and selectAttachments task settings.
Add a task to a linear workflow.
Remove a task from a linear workflow.

16 Oct 2017:

Released version 1.6.


Now we can create linear workflows in Wexflow Designer.

17 Oct 2017:

Released version 1.7.


Now we can delete workflows in Wexflow Designer.
Enhanced task settings edition.
Updated the documentation of MailsSender task.
Fixed some bugs in Wexflow Designer.
Updated Windows setup project.

18 Oct 2017:

Released version 1.8.


Implemented the visualization of the execution graph of a linear workflow in Wexflow Designer.
Updated Windows setup project.

19 Oct 2017:

Released version 1.9.


Added new features and fixed some issues in Wexflow Designer:

Implemented the visualization of the execution graph of a non lienar workflow.


Displayed the xml button after saving a new workflow.
Fixed an issue of editing the id of a new workflow after saving it.
Fixed an issue regarding the value of the workflow file path after saving a new workflow and editing its name.
Fixed an issue of changing the id of a selected workflow.

20 Oct 2017:

Released version 2.0.


Added a new feature and fixed some issues in Wexflow Web Designer:

Changed the style of Wexflow Web Designer.


Fixed an issue when saving an existing workflow.
Fixed an issue when changing the id of an existing workflow multiple times.

Added new features to Wexflow Web Manager:

Changed the style of Wexflow Web Manager.


Added a confirm dialog when stopping a workflow.

Added regexPattern option in the task FilesLoader.


Added recursive load option in the task FilesLoader.
Updated the documentation of the task FilesLoader.
Updated Wexflow web service.
Updated the workflow Workflow_FilesLoader.
Updated the folder samples\WexflowTesing.
Updated Windows setup project.
Updated the documentation of the task FilesRenamer.

27 Oct 2017:

Released version 2.1.


Added new tasks:

Sha1: This task generates SHA-1 hashes of a collection of files and writes the results in an XML file.
Sha256: This task generates SHA-256 hashes of a collection of files and writes the results in an XML file.
Sha512: This task generates SHA-512 hashes of a collection of files and writes the results in an XML file.
FilesConcat: This task concatenates a collection of files.
FilesSplitter: This task splits files into chunks.
FilesInfo: This task generates files information of a collection of files and writes the results in an XML file.
MediaInfo: This task generates the most relevant technical and tag data for video and audio files and outputs
the results in an XML file.
MailsReceiver: This task fetches a collection of emails.
ProcessKiller: This task kills a process.

Implemented unit tests (vs2017).


Updated samples\WexflowTesting folder.
Updated samples\Workflows folder.
Updated the documenttaion of the tasks FilesExist and Xslt.
Updated Windows installer.

05 Nov 2017:

Released version 2.2.


Added Designer and Logs buttons in Wexflow Manager.
Added Help and About menus in Wexflow Manager.
Added the task description in the execution graph in Wexflow Designer.
Fixed an issue in Wexflow Designer: We cannot save a workflow because of a typo in wexflow-designer.js
Created Wexflow.Core nuget package.
Added new tasks:

Unzip: This task extracts ZIP archives.


Untar: This task extracts TAR archives.
Untgz: This task extracts TAR.GZ archives.
ProcessInfo: This task shows information about a process.
TextToPdf: This task generates PDF files from TEXT files.
HtmlToPdf: This task generates PDF files from HTML files.
SqlToXml: This task executes a collection of SQL scripts (select queries) and outputs the results in XML files.
SqlToCsv: This task executes a collection of SQL scripts (select queries) and outputs the results in CSV files.
Guid: This task generates Guids and outputs the result in an XML file.

Added extension setting in the task Xslt.


Updated the task FilesCopier.
Fixed an issue in Task.GetSetting.
Added new unit tests.
Updated ImagesTransformer and ProcessKiller unit tests.
Updated samples\WexflowTesting folder.
Updated samples\Workflows folder.
Updated Windows installer.
Code refactoring.

14 Nov 2017:

Released version 2.3.


Wexflow Designer:

Moved tasks names and tasks settings to external files (C:\Wexflow\TasksNames.json and
C:\Wexflow\TasksSettings.json).
Added Xml and Documentation buttons for tasks.

Added Hashtable as shared memory for tasks.


Added deleteMessages setting to the task MailsReceiver.
Fixed some issues in Sql, SqlToCsv and SqlToXml tasks.
Documented Wexflow.Core.
Updated Wexflow.Core nuget package.
Updated the way we debug Wexflow Windows Service and Wexflow Manager.
Fixed the issue #36.
Fixed an issue in Wexflow engine.

12 Oct 2018:

Released version 2.4.


Files renamed via FilesRenamer task were not accessed via successive tasks. Now, the files renamed via
FilesRenamer can be accessed via successive tasks.
SqlToCsv task is now more configurable:
Added a setting to write the header or not, defaults to true.
Added setting for quote character such as " so columns can be quoted, eg "column1","column2", defaults to
empty string.
Added the ability to have multiple result tables to be exported to a single file.
Refactored code to write each row to the output file because writing very large data sets to a single
StringBuilder will use excessive memory and fail. Perhaps the best trade off is to use original
StringBuilder approach and write every 50,000 or 100,000 records, but for code that functions for all
use cases is preferred over code that does not.

Zip task: Now, if the zip file name is left blanked, the RenameToOrName of the first file in the collection will be
taken as the zip file name. For example if the RenameToOrName of the first file is file1.txt, the zip file name will be
file1.zip.

18 Oct 2018:

Released version 2.5.


Created the new following tasks:

Torrent: this task downloads torrent files.


FilesDiff: this task calculates the diff of two files.
FilesEqual: this task allows to check whether two files are the same.

Added Refresh button and scrolling in Wexflow Manager.


Updated Android app:

Updated app style.


Added Refresh button.
Fixed an issue in the UI.

XmlToCsv task is now more configurable:

Added a setting to write the seperator character, defaults to ;


Added setting for quote character such as " so columns can be quoted, eg "column1","column2", defaults to
empty string.
Refactored code to write each row to the output file because writing very large data sets to a single
StringBuilder will use excessive memory and fail. Perhaps the best trade off is to use original StringBuilder
approach and write every 50,000 or 100,000 records, but for code that functions for all use cases is preferred
over code that does not.

MailsSender task is now more configurable:

Cc is now optional.
Added Bcc. It is also optional.

Fixed an issue of downloading files over HTTPS in Http task.

20 Oct 2018:

Released version 2.6.


Created 64 bit version of Wexflow.
Added "Restart server" button in Wexflow Manager: This button allows to restart Wexflow Windows service from
Wexflow Manager.
Created the new following tasks:

ImagesResizer: This task resizes a collection of images.


ImagesCropper: This task crops a collection of images.

23 Oct 2018:

Released version 2.7.


Added cron scheduling: Now a workflow can starts depending on a cron expression.

Updated Wexflow Engine.


Updated Wexflow Server.
Updated Wexflow Manager.
Updated Wexflow Web Manager.
Updated Wexflow Designer.

Added period field validation in Wexflow Designer for periodic workflows.


Added cron expressions validation in Wexflow Designer for cron workflows.
Upgraded Sql, SqlToXml and SqlToCsv tasks to Oracle.ManagedDataAccess (#59).
Fixed a graphical issue in Wexflow Manager.
Fixed some issues in Wexflow Designer.
Fixed an issue when stopping Wexflow Server.
Fixed an issue when a periodic or a cron workflow is deleted or modified in Wexflow Engine.
Fixed System.Data.SQLite.dll issue (#61).
Updated nuget package to version 2.7.2.

29 Oct 2018:

Released version 2.8.


Now periodic workflows are launched using Quartz.NET scheduler.
Now Wexflow Server restarts in an asynchronous way from Wexflow Manager.
Fixed a typo in Wexflow Manager.
Fixed an issue in MediaInfo task.
Fixed an issue about logging in Workflow task.
Fixed an issue in FilesMover unit test.
Updated the task FileExists.
Updated nuget package to version 2.8.1.
Created the new following tasks:

FilesEncryptor: This task encrypts files.


FilesDecryptor: This task decrypts the encrypted files by the task FilesEncryptor.
TextsEncryptor: This task encrypts text based files.
TextsDecryptor: This task decrypts the files crypted by the task TextsEncryptor.
Unrar: This task extracts RAR archives.
UnSevenZip: This task extracts 7Z archives.
ImagesConcat: This task concatenates images.
ImagesOverlay: This task overlays images.
CsvToSql: This task converts CSV files to SQL scripts.
DatabaseBackup: This task backups databases.
DatabaseRestore: This task restores databases.
IsoCreator: This task creates a .iso from a source folder.
IsoExtractor: This task extracts .iso files.
SevenZip: This task creates a .7z from a collection of files.
TextToSpeech: This task converts text files to speech files.
SpeechToText: This task converts audio files to text files.
FileMatch: This is a flowchart task that checks whether a file exists or not in a directory by using a regex
pattern.

04 Nov 2018:

Released version 2.9.


Added search function in the RESTful API.
Added search functionality in Wexflow Manager, Wexflow Web Manager and Wexflow Web Designer.
Fixed an issue about scrolling in Wexflow Manager.
Updated the style of Wexflow Web Designer.
Created the new following tasks:

WebToScreenshot: This task takes screenshots from urls.


WebToHtml: This task retrieves HTML sources from urls.
UglifyJs: This task uglifies JavaScript files.
UglifyCss: This task compresses and minifies CSS files.
UglifyHtml: This task compresses and minifies HTML files.
HtmlToText: This task extracts text from HTML files.
ScssToCss: This task converts SCSS files to CSS files.
YamlToJson: This task converts YAML files to JSON files.
JsonToYaml: This task converts JSON files to YAML files.
CsvToJson: This task converts CSV files to JSON files.
CsvToYaml: This task converts CSV files to YAML files.
HttpGet: This task executes GET requests.
HttpPost: This task executes POST requests.
HttpPut: This task executes PUT requests.
HttpPatch: This task executes PATCH requests.
HttpDelete: This task executes DELETE requests.
Ping: This is a flowchart task that checks whether a server responds to a ping request or not.
ExecCs: This task executes C# scripts.
ExecVb: This task executes Visual Basic scripts.

07 Nov 2018:

Released version 3.0.


Created Wexflow's back office which allows:

To have real-time statistics on workflows.


To manage workflows with ease.
To design workflows with ease.
To track workflows with ease.

09 Nov 2018:

Released version 3.1.


Created user profiles.
Created "Users" page in the back office.
Added authentication to Wexflow Manager.
Created global variables for workflows.

12 Nov 2018:

Released version 3.2.


Added authentication to the Android application.
Added the page "forgot-password.html" in the back office.
Added "Forget password?" link in Wexflow Manager.
Fixed an issue in Wexflow Manager about authentication.
Fixed an issue in Wexflow Manager about security (Restrict Wexflow Manager to administrators only).
Fixed an issue in SpeechToText and TextToSpeech tasks.
Fixed an issue in DatabaseBackup and DatabaseRestore tasks.

16 Nov 2018:

Released version 3.3.


Ported Wexflow workflow engine to .NET Core 2.1.

Here are the instructions to install the .NET Core version on Windows.


Here are the instructions to install the .NET Core version on Linux.

Fixed an issue regarding entries and history entries in the back office.
Fixed an issue in the tasks ImagesConcat and ImagesOverlay.
Fixed an issue in the tasks Sha256 and Sha512.
Fixed a validation issue in the designer.
Updated the Template task.
Updated Wexflow Web Manager.

19 Nov 2018:

Released version 3.4.


Created local variables for workflows.
Created .NET Core macOS installer.
Created the following .NET Core tasks:

Zip: This task creates a .zip from a collection of files.


Unzip: This task extracts .zip archives.
Ftp: This task allows to list, upload, download or delete files over FTP, FTPS or SFTP.

Fixed some issues in the back office.

23 Nov 2018:

Released version 3.5.


Added local variables in the designer.
Created the task EnvironmentVariable (.NET and .NET Core): This is a flowchart task that retrieves the value of an
environment variable.
Updated Wexflow Manager.
Updated Workflow.xsd and Workflow.xml.
Updated nuget package to version 3.5.0.

28 Nov 2018:

Released version 3.6.


Added local variables edition in the designer.
Added global variables in the designer.
Fixed an issue when changing an existing task in the designer.
Fixed an issue regarding selectAttachments setting in the designer.
Fixed an issue in Wexflow Manager.
Fixed an issue in Workflow.xsd.
Fixed a typo in logging.
Code refactoring.
Updated nuget package to version 3.6.0.

03 Dec 2018:

Released version 3.7.


Allowed for custom dlls to be in a different folder from installation folder.
Upgraded Ftp task to FluentFTP 19.2.2.
Upgraded to Newtonsoft.Json 12.0.1.
Updated nuget package to version 3.7.0.

10 Dec 2018:

Released version 3.8.


Enhanced database performance.
Fixed macOS issues.
Updated nuget package to version 3.8.0.

14 Jul 2019:

Released version 3.9.


Fixed the issues #82 and #84.
EndOfLine is now configurable in SqlToCsv task.
Updated the documentation.

29 Jul 2019:

Released version 4.0.


Upgraded to .NET Core 2.2.
Created the flowchart task MessageCorrect.
Updated ProcessLauncher task to load multiple files.
Added HLS workflow.
Added a favicon to backend pages.
Updated FluentFTP and nuget packages.
Updated the documentation.

01 Aug 2019:

Released version 4.1.


Upgraded the .NET version to Microsoft .NET Framework 4.5.2.
Upgraded to MySQL 8.0.17.
Updated System.Data.SQLite.

05 Aug 2019:

Released version 4.2.


Performance enhancements and under the hood updates.
Upgraded the .NET version of Wexflow to .NET 4.6.1.
YouTube integration through the new following tasks:

YouTube: This task uploads videos to YouTube.


YouTubeSearch: This task searches for content on YouTube.
YouTubeListUploads: This task retrieves a list of videos uploaded to a YouTube channel.

Instagram integration through the new following tasks:

InstagramUploadImage: This task uploads images to Instagram.


InstagramUploadVideo: This task uploads videos to Instagram.

Twitter integration through the new following task:

Twitter: This task sends tweets.

Allowed HTML in email body in MailsSender task (#101).


Fixed the issues #99 and #100.
Fixed some issues in .NET Core packages.
Fixed a CSS issue in the backend.
Updated the database.
Upgraded to Newtonsoft.Json 12.0.2.
Upgraded to FluentFTP 27.0.1.
Updated nuget package to version 4.2.1.
Updated the documentation.

13 Aug 2019:

Released version 4.3.


Major performance enhancements and under the hood updates.
Allowed XML editing of workflows from the designer.
Added XML validation of workflows in the designer.
Added XML themes in the designer.
Updated the behavior of the designer.
Added the ability to format date and time in the backend through DateTimeFormat setting option.
Enhanced the style of the backend.
Added toggle password visibility in the login page of the backend.
Created the new following flowchart tasks:

FolderExists: This task checks whether a folder exists or not.


FileContentMatch: This task checks whether the content of a file matches a regex pattern.

Added a setting option in SqlToCsv task to not generate the file if the result set is empty.
Updated Android app.
Updated nuget package to version 4.3.0.
Fixed date and time issues in the backend.
Fixed file locks issues.
Fixed FileSystemWatcher issues.
Fixed an issue when deleting a workflow from the designer in the .NET Core version.
Upgraded to FluentFTP 27.0.2.
Upgraded to ServiceStack.Kestrel 5.6.0.
Upgraded to Newtonsoft.Json 12.0.2.
Upgraded to Google.APis.YouTube.v3 1.40.3.1663.
Updated the documentation.

23 Aug 2019:

This brand new version is a major and stable release that includes brand new features, bug fixes, major performance
enhancements and under the hood updates.

Below are the release notes:

Brand new features, bug fixes, major performance enhancements and under the hood updates.
Added approval workflows.
Added OnDisapproved workflow event.
Added form submission processes.
Added approval status and buttons to Android app.
Added search feature (CTRL+F) in XML Web editor.
Added replace feature (CTRL+H) in XML Web editor.
Added go to line feature (CTRL+L) in XML Web editor.
Added settings menu feature (CTRL+,) in XML Web editor.
Added keyboard shortcuts feature (CTRL+ALT+H) in XML Web editor.
Added 34+ themes in XML Web editor.
Added an option in the installers to whether install workflow samples or not.
Added maxRetries and retryTimeout setting options.
Added the new following tasks:

Approval: This task marks the current workflow as needing approval.


Reddit: This task sends posts and links to Reddit.
RedditLisPosts: This task retrieves Reddit post history.
RedditListComments: This task retrieves Reddit comment history.

Added .NET Core unit tests.


Enhanced error handling in Twitter task.
Updated the style of XML Web editor.
Updated the style of login page in the back end.
Updated the style of password reset page in the back end.
Updated Android app.
Updated nuget package to version 4.4.0.
Updated the documentation.
Upgraded to Autofac 4.9.4.
Upgraded to MSTest 1.4.0.
Upgraded to Microsoft.NET.Test.Sdk 16.2.0.
Fixed a bug related to variables parsing.
Fixed a bug related to workflow files loading.
Fixed a bug related to the result status of sequential workflows.
Fixed a bug in Twitter task on Linux.
Fixed a bug in encrypting tasks.
Fixed some bugs in the designer.
Fixed some bugs in Wexflow Manager.
Fixed a bug in password reset page.
Fixed a layout bug in Android app.
Fixed a bug in macOS package.

07 Sep 2019:

Released version 4.5.


Bug fixes, performance enhancements and under the hood updates.
Created iOS app. Here are the installation instructions.
Created the new following tasks available for both .NET and .NET Core versions:

Vimeo: This task uploads videos to Vimeo.


VimeoListUploads: This task retrieves a list of videos uploaded to a Vimeo channel.
Fixed a bug in TasksNames.json and TasksSettings.json in the .NET version.
Fixed a bug in TasksNames.json and TasksSettings.json in the .NET Core version.
Fixed a bug in Android app.
Updated Android app.
Updated the documentation.

16 Sep 2019:

Released version 4.6.


Added new features, bug fixes, performance and security enhancements, and under the hood updates.
Stored workflows in the database for better performance.
Enhanced security of RESTful API.
Added user profiles.
Added queuing of workflow jobs.
Added select/delete in the designer page.
Added the task Slack for both .NET and .NET Core.
Added RESTful API documentation.
updated Workflow task.
Updated the style of login page in the back end.
Updated Wexflow Manager.
Updated Android app.
Updated iOS app.
Updated nuget package to version 4.6.0.
Updated the documentation.
Upgraded to FluentFTP 27.1.1.
Upgraded to Google.Apis.YouTube.v3 1.41.1.1699.
Upgraded to TweetinviAPI 4.0.2.
Upgraded to Newtonsoft.json 12.0.2.
Fixed issues in the designer.
Fixed issues regarding macOS compatibility. Now, Wexflow runs 100% on macOS.

21 Sep 2019:

Released version 4.7.


Added MongoDB database layer.
Added RavenDB database layer.
Added CosmosDB database layer.
Added command line client.
Added support for ODBC connections in Sql, SqlToCsv and SqlToXml Tasks.
Updated nuget package to version 4.7.0.
Updated the documentation.

License
This article, along with any associated source code and files, is licensed under The MIT License

About the Author


Akram El Assas
Architect
Morocco

Akram El Assas graduated from the french engineering school ENSEIRB located in Bordeaux, a city in the south of France, and got
his diploma in software engineering in 2010. He worked in France for Mediatvcom, a company specialized in audiovisual, digital
television and new technologies. Mediatvcom offers services such as consulting, project management, audit and turnkey
solutions adapted to the needs of customers. Akram worked mainly with Microsoft technologies such as C#, ASP.NET and SQL
Server but also with JavaScript, jQuery, HTML5 and CSS3. Akram worked on different projects around digital medias such as
Media Asset Management systems, Digital Asset Management systems and sometimes on HbbTV apps.

GitHub profile
Follow on Twitter
Website

Comments and Discussions


151 messages have been posted for this article Visit https://www.codeproject.com/Articles/1164009/Wexflow-Open-
source-workflow-engine to post and view comments on this article, or click here to get a print view with messages.

Permalink Article Copyright 2017 by Akram El Assas


Advertise Everything else Copyright © CodeProject, 1999-
Privacy 2019
Cookies
Terms of Use Web06 2.8.190921.1

Вам также может понравиться