viewflow is a free, open source orchestration & scheduling project written in Python and released under AGPL-3.0. It has 2,874 GitHub stars, 413 forks and 19 open issues, and was last pushed 4 days ago. On this registry it ranks #39 of 64 tracked projects in Orchestration & Scheduling, with 5 head-to-head comparisons available.

What is viewflow?

What it is

Viewflow is reusable workflow library for Django. It lives in Python and Django ecosystem, category Infrastructure & Operations / Orchestration & Scheduling. It targets low-code business application building. It gives ready-made components for user management, workflows, and reporting. It ships as one package. Each part works on its own, but parts also work together. Project homepage is viewflow.io. Concrete problem: business applications need process state, form handling, reporting, and integration with existing systems. Custom Django code often repeats this plumbing. Viewflow provides base classes, BPMN process engine, CRUD views, and dashboard components. Developer writes less code, keeps full control, customizes behavior, and connects flows to existing systems. Repository age is 13 years, stars 2875, forks 413, open issues 19.

Key capabilities

  • Reusable workflow library for BPMN processes, with flow classes, steps, start views, update views, and end states.
  • Built-in CRUD for complex forms and data, using CreateProcessView and UpdateProcessView.
  • Process base model and jsonstore fields store data without extra database joins.
  • Reporting dashboard included for business application visibility.
  • Modern responsive interface with SPA-style navigation.
  • Small, easy-to-learn API.
  • Open-source Viewflow Core provides base classes; Viewflow PRO adds ready-to-use features and third-party integrations.

Who uses it and how

  • Django developers build business applications, such as pizza ordering workflow.
  • Teams define process data as Django models, then declare workflow steps in flows.py.
  • Developers register flows with Site, add URLs, and run migrations before starting Django server.
  • End users create and track process instances through browser forms and SPA-style interface.
  • Existing systems connect through custom Django code, because Viewflow gives full control over components.

Getting started

Install with pip install django-viewflow for Python 3.10+ and Django 4.2+, add viewflow and viewflow.workflow to INSTALLED_APPS, run migrations, start Django, and open browser. Viewflow PRO installs with pip install django-viewflow-pro --extra-index-url https://pypi.viewflow.io/ /simple/.

When to use it — and when not to

Use Viewflow when Django project needs BPMN-style workflow engine, low-code forms, dashboard, and AGPL-3.0 open-source base. Avoid if project cannot accept AGPL-3.0 or needs ready-to-use features and integrations without commercial license; Viewflow Core is base classes, while Viewflow PRO is commercial package. README does not list database, storage, SMTP requirements, so self-hosting needs remain outside provided facts. License is AGPL-3.0 with additional permissions.

project readme (upstream, from github) — read inline

Viewflow

The low-code for developers with yesterday's deadline

[![build]][build] [![coverage]][coverage] [![pypi-version]][pypi] [![py-versions]][pypi]

Viewflow is a low-code library for building business applications with Django. It gives you ready-made components for user management, workflows, and reporting. You write less code but keep full control. You can customize everything and connect it to your existing systems.

Build full-featured business applications in a few lines of code. Viewflow ships as one package with everything included. Each part works on its own, but they all work well together.

GPT assisted with Viewflow documentation: [Viewflow Pair Programming Buddy][gpt]

Viewflow comes in two versions:

  • Viewflow Core: Open-source library with base classes. Build your own solution on top.
  • Viewflow PRO: Full package with ready-to-use features and third-party integrations. Commercial license allows private forks and modifications.

Features

  • Modern, responsive interface with SPA-style navigation
  • Reusable workflow library for BPMN processes
  • Built-in CRUD for complex forms and data
  • Reporting dashboard included
  • Small, easy-to-learn API

Installation

Viewflow works with Python 3.10+ and Django 4.2+

Viewflow:

pip install django-viewflow

Viewflow PRO:

pip install django-viewflow-pro  --extra-index-url https://pypi.viewflow.io//simple/

Add to INSTALLED_APPS in settings.py:

    INSTALLED_APPS = [
        ....
        'viewflow',
        'viewflow.workflow',  # if you need workflows
    ]

Quick start

Here is a pizza ordering workflow example. Full runnable source: demo/helloworld.

1. Create a model for process data

Viewflow provides a Process base model. Use jsonstore fields to store data without extra database joins:


    from viewflow import jsonstore
    from viewflow.workflow.models import Process

    class PizzaOrder(Process):
        customer_name = jsonstore.CharField(max_length=250)
        address = jsonstore.TextField()
        toppings = jsonstore.TextField()
        tips_received = jsonstore.IntegerField(default=0)
        baking_time = jsonstore.IntegerField(default=10)

        class Meta:
            proxy = True

2. Create flows.py with your workflow

Define a flow class with steps. Use CreateProcessView and UpdateProcessView for the forms:


    from viewflow import this
    from viewflow.workflow import flow
    from viewflow.workflow.flow.views import CreateProcessView, UpdateProcessView
    from .models import PizzaOrder

    class PizzaFlow(flow.Flow):
        process_class = PizzaOrder

        start = flow.Start(
            CreateProcessView.as_view(
                fields=["customer_name", "address", "toppings"]
            )
        ).Next(this.bake)

        bake = flow.View(
            UpdateProcessView.as_view(fields=["baking_time"])
        ).Next(this.deliver)

        deliver = flow.View(
            UpdateProcessView.as_view(fields=["tips_received"])
        ).Next(this.end)

        end = flow.End()

3. Add URLs

Register the workflow with the frontend:


    from django.urls import path
    from viewflow.contrib.auth import AuthViewset
    from viewflow.urls import Application, Site
    from viewflow.workflow.flow import FlowAppViewset
    from my_pizza.flows import PizzaFlow

    site = Site(
        title="Pizza Flow Demo",
        viewsets=[
            FlowAppViewset(PizzaFlow, icon="local_pizza"),
        ]
    )

    urlpatterns = [
        path("accounts/", AuthViewset().urls),
        path("", site.urls),
    ]

4. Run migrations and start the server

Run migrations, start Django, and open the browser. You can now create and track pizza orders through the workflow.

Next steps: https://docs.viewflow.io/workflow/writing.html

Documentation

Latest version: http://docs.viewflow.io/

Version 1.xx: http://v1-docs.viewflow.io

Demo

http://demo.viewflow.io/

Cookbook

Code samples and examples: https://github.com/viewflow/cookbook

Stay updated

[Subscribe to our newsletter][newsletter] for release notes, Django low-code tips, and notes on shipping business apps fast.

License

Viewflow is an Open Source project licensed under the terms of the AGPL license - The GNU Affero General Public License v3.0 with the Additional Permissions described in LICENSE_EXCEPTION

The AGPL license with Additional Permissions is a free software license that allows commercial use and distribution of the software. It is similar to the GNU GCC Runtime Library license, and it includes additional permissions that make it more friendly for commercial development.

If you use Linux already, this package license likely won't bring anything new to your stack.

Viewflow PRO has a commercial-friendly license allowing private forks and modifications of Viewflow. You can find the commercial license terms in COMM-LICENSE.

Changelog

For older releases, see CHANGELOG.rst.

2.4.0 2026-07-30

The largest feature release of the 2.x line: complete BPMN 2.0 node coverage, document-oriented JSON Store fields, and a drop-in replacement for django-fsm.

Workflow and BPMN

  • New database-backed flow.Timer and flow.StartTimer(interval=...) nodes. The due moment is stored on the task row (new Task.scheduled field, migration included), so a timer survives a broker restart, unlike celery.Timer. Due timers fire from the workflow_timers management command or the workflow_fire_timers celery beat task
  • Boundary events, declared on the host task before .Next(): .OnTimeout(delay, then) for deadlines and escalation, .OnError(then, code=...) to catch a background task failure. Interrupting by default; interrupting=False starts a parallel path
  • flow.TerminateEnd() cancels all other active tasks and finishes the process; flow.ErrorEnd(code) fails it. Inside a subprocess, ErrorEnd marks the parent task ERROR, so the parent's .OnError(..., code=...) boundary catches it
  • Compensation: .CompensateWith(this.handler) registers an undo handler on any task, and flow.CompensateThrow() runs the handlers of completed tasks in reverse completion order, each at most once
  • New intermediate events: MessageCatch/MessageThrow, SignalCatch/SignalThrow (one throw releases every armed catch, across processes and flow classes), EscalationThrow with a non-interrupting .OnEscalation boundary, and ConditionalCatch, which waits until a condition over process data holds
  • New task types: flow.SendHandle, flow.BusinessRule, and flow.ManualTask for work done outside any system, marked done with a no-field confirmation. NSubprocess(..., sequential=True) runs one child process at a time
  • BPMN 2.0 export overhaul: exported files validate against the official OMG schema and open in bpmn.io and Camunda Modeler. Switch, Subprocess and NSubprocess are no longer dropped from the export, Handle maps to a receive task, celery Job to a service task, and the new nodes above to their real BPMN counterparts. Download a flow as .bpmn from the chart view, the REST API (?format=bpmn), the diagram dialog, or the flowexport command
  • Chart layout: empty grid rows and columns are collapsed, cell collisions resolved, parallel edge channels staggered and routed around node shapes, and If branches labeled yes/no
  • The flow diagram dialog is now pan- and zoom-able: scroll to zoom toward the cursor, drag to pan, pinch on touch, double-click to reset
  • Every built-in control node is cancellable, Flow.cancel raises the intended FlowRuntimeError instead of AttributeError for a node with no cancel transition, and the process cancel view refuses cleanly instead of returning a 500 when a task can't be cancelled
  • flow.View gained a reassign_view_class hook that finishes the built-in reassign transition and shows a "Reassign" action on the task (off by default)
  • New cookbook samples, all in application code with no core changes: substitute (reassignment), snooze (hide a task from the inbox until a chosen time, #219), and dynamic_subprocess (attach another NSubprocess child while the parent task still runs, #258)

JSON Store

  • Relation fields stored inside the JSON document, with no column, migration or join table: jsonstore.ForeignKey (pk under _id, lazy load, ModelChoiceField in forms), jsonstore.OneToOneField, and jsonstore.ManyToManyField (a manager with all/add/remove/set/clear/count). Non-integer primary keys, e.g. UUIDField, are supported (#366)
  • jsonstore.EmbeddedModel with EmbeddedField and EmbeddedListField: schema-only virtu

readme truncated — read the full docs on github

Frequently asked questions

Is viewflow free to use?

viewflow is open source under the AGPL-3.0 licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does viewflow do?

Reusable workflow library for Django

What is viewflow written in?

viewflow is primarily written in Python. Its source is publicly available at https://github.com/viewflow/viewflow, and it has 2,874 GitHub stars.