Skip to content
A powerful workflow engine implemented in pure Python
Branch: master
Clone or download
Latest commit f0af7f5 Oct 9, 2018
Type Name Latest commit message Commit time
Failed to load latest commit information.
SpiffWorkflow fix cancelActivity parsing in BoundaryEventParser Jan 16, 2018
doc Fix circular call to president in nuclear.json Jul 18, 2018
.flake8 Support pep8. Nov 29, 2017
.travis.yml fix: travis would not detect failed tests Mar 28, 2017
Dockerfile add initial docker file Apr 2, 2017
TODO TODO updated. Oct 2, 2012
requirements.txt update build targets and version numbering scheme Apr 2, 2017

Spiff Workflow

Build Status Coverage Status Code Climate Documentation Status


Spiff Workflow is a workflow engine implemented in pure Python. It is based on the excellent work of the Workflow Patterns initiative.

Do you need commercial support?

Spiff Workflow is supported by Procedure 8. Get in touch if you need anything!

Main design goals

  • Spiff Workflow aims to directly support as many of the patterns of as possible.
  • Spiff Workflow uses unit testing as much as possible.
  • Spiff Workflow provides a clean Python API.
  • Spiff Workflow allows for mapping patterns into workflow elements that are easy to understand for non-technical users in a workflow GUI editor.
  • Spiff Workflow implements the best possible path prediction for workflows.

Spiff Workflow also provides a parser and workflow emulation layer that can be used to create executable Spiff Workflow specifications from Business Process Model and Notation (BPMN) documents.

Quick Intro

The process of using Spiff Workflow involves the following steps:

  1. Write a workflow specification. A specification may be written using XML (example), JSON, or Python (example).
  2. Run the workflow using the Python API. Example code for running the workflow:
from SpiffWorkflow.specs import WorkflowSpec
from SpiffWorkflow.serializer.prettyxml import XmlSerializer
from SpiffWorkflow import Workflow

# Load the workflow specification:
with open('my_workflow.xml') as fp:
    serializer = XmlSerializer()
    spec = WorkflowSpec.deserialize(serializer,

# Create an instance of the workflow, according to the specification.
wf = Workflow(spec)

# Complete tasks as desired. It is the job of the workflow engine to
# guarantee a consistent state of the workflow.

# Of course, you can also persist the workflow instance:
xml = wf.serialize(XmlSerializer, 'workflow_state.xml')


Full documentation is here:

You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.