 
 Serverless Workflow
Serverless Workflow presents a vendor-neutral, open-source, and entirely community-driven ecosystem tailored for defining and executing DSL-based workflows in the realm of Serverless technology.
The current version is 1.0.0, get the JSON Schema here: YAML or JSON
Learn MoreThe Serverless Workflow DSL is a high-level language that reshapes the terrain of workflow creation, boasting a design that is ubiquitous, intuitive, imperative, and fluent.
Usability
Designed with linguistic fluency, implicit default behaviors, and minimal technical jargon, making workflows accessible to developers with diverse skill levels and enhancing collaboration.
Event driven
Supports event-driven execution and various scheduling options, including CRON expressions and time-based triggers, to respond efficiently to dynamic conditions.
Interoperability
Seamlessly integrates with multiple protocols (HTTP, gRPC, OpenAPI, AsyncAPI), ensuring easy communication with external systems and services, along with support for custom interactions via scripts, containers, or shell commands.
Platform-Agnostic
Serverless Workflow enables developers to build workflows that can operate across diverse platforms and environments, eliminating the need for platform-specific adaptations.
Extensibility
Provides extensible components and supports defining custom functions and extensions, allowing developers to tailor workflows to unique business requirements without compromising compatibility.
Fault tolerant
Offers comprehensive data transformation, validation, and fault tolerance mechanisms, ensuring workflows are robust, reliable, and capable of handling complex processes and failures gracefully.
User-Friendly DSL: Workflows Made Simple
Async API Example
document:
  dsl: '1.0.0'
  namespace: default
  name: call-asyncapi
  version: '1.0.0'
do:
- findPet:
    call: asyncapi
    with:
      document:
        uri: https://fake.com/docs/asyncapi.json
      operationRef: findPetsByStatus
      server: staging
      message:
        payload:
          petId: ${ .pet.id }
      authentication:
        bearer:
          token: ${ .token }Container Example
document:
  dsl: '1.0.0'
  namespace: default
  name: run-container
  version: '1.0.0'
do:
  - runContainer:
      run:
        container:
          image: fake-imageEmit Event Example
document:
  dsl: '1.0.0'
  namespace: default
  name: emit
  version: '0.1.0'
do:
  - emitEvent:
      emit:
        event:
          with:
            source: https://petstore.com
            type: com.petstore.order.placed.v1
            data:
              client:
                firstName: Cruella
                lastName: de Vil
              items:
                - breed: dalmatian
                  quantity: 101For Example
document:
  dsl: '1.0.0'
  namespace: default
  name: for-example
  version: '0.1.0'
do:
  - checkup:
      for:
        each: pet
        in: .pets
        at: index
      while: .vet != null
      do:
        - waitForCheckup:
            listen:
              to:
                one:
                  with:
                    type: com.fake.petclinic.pets.checkup.completed.v2
            output:
              as: '.pets + [{ "id": $pet.id }]'Fork Example
document:
  dsl: '1.0.0'
  namespace: default
  name: fork-example
  version: '0.1.0'
do:
  - raiseAlarm:
      fork:
        compete: true
        branches:
          - callNurse:
              call: http
              with:
                method: put
                endpoint: https://fake-hospital.com/api/v3/alert/nurses
                body:
                  patientId: ${ .patient.fullName }
                  room: ${ .room.number }
          - callDoctor:
              call: http
              with:
                method: put
                endpoint: https://fake-hospital.com/api/v3/alert/doctor
                body:
                  patientId: ${ .patient.fullName }
                  room: ${ .room.number }gRPC Example
document:
  dsl: '1.0.0'
  namespace: default
  name: call-grpc
  version: '1.0.0'
do:
  - greet:
      call: grpc
      with:
        proto: 
          endpoint: file://app/greet.proto
        service:
          name: GreeterApi.Greeter
          host: localhost
          port: 5011
        method: SayHello
        arguments:
          name: '${ .user.preferredDisplayName }'HTTP Example
document:
  dsl: '1.0.0'
  namespace: default
  name: call-http
  version: '1.0.0'
do:
- getPet:
    call: http
    with:
      method: get
      endpoint: https://petstore.swagger.io/v2/pet/{petId}Listen Event Example
document:
  dsl: '1.0.0'
  namespace: default
  name: listen-to-all
  version: '0.1.0'
do:
  - callDoctor:
      listen:
        to:
          all:
          - with:
              type: com.fake-hospital.vitals.measurements.temperature
              data: ${ .temperature > 38 }
          - with:
              type: com.fake-hospital.vitals.measurements.bpm
              data: ${ .bpm < 60 or .bpm > 100 }Open API Example
document:
  dsl: '1.0.0'
  namespace: default
  name: call-openapi
  version: '1.0.0'
do:
  - findPet:
      call: openapi
      with:
        document: 
          endpoint: https://petstore.swagger.io/v2/swagger.json
        operationId: findPetsByStatus
        parameters:
          status: availableRaise Error Example
document:
  dsl: '1.0.0'
  namespace: default
  name: raise-not-implemented
  version: '0.1.0'
do: 
  - notImplemented:
      raise:
        error:
          type: https://serverlessworkflow.io/errors/not-implemented
          status: 500
          title: Not Implemented
          detail: ${ "The workflow '\( $workflow.definition.document.name ):\( $workflow.definition.document.version )' is a work in progress and cannot be run yet" }Script Example
document:
  dsl: '1.0.0'
  namespace: samples
  name: run-script-with-arguments
  version: 0.1.0
do:
  - log:
      run:
        script:
          language: javascript
          arguments:
            message: ${ .message }
          code: >
            console.log(message)Subflow Example
document:
  dsl: '1.0.0'
  namespace: default
  name: run-subflow
  version: '0.1.0'
do:
  - registerCustomer:
      run:
        workflow:
          namespace: default
          name: register-customer
          version: '0.1.0'
          input:
            customer: .userSwitch Example
document:
  dsl: '1.0.0'
  namespace: default
  name: switch-example
  version: '0.1.0'
do:
  - processOrder:
      switch:
        - case1:
            when: .orderType == "electronic"
            then: processElectronicOrder
        - case2:
            when: .orderType == "physical"
            then: processPhysicalOrder
        - default:
            then: handleUnknownOrderType
  - processElectronicOrder:
      do:
        - validatePayment:
            call: http
            with:
              method: post
              endpoint: https://fake-payment-service.com/validate
        - fulfillOrder:
            call: http
            with:
              method: post
              endpoint: https://fake-fulfillment-service.com/fulfill
      then: exit
  - processPhysicalOrder:
      do:
        - checkInventory:
            call: http
            with:
              method: get
              endpoint: https://fake-inventory-service.com/inventory
        - packItems:
            call: http
            with:
              method: post
              endpoint: https://fake-packaging-service.com/pack
        - scheduleShipping:
            call: http
            with:
              method: post
              endpoint: https://fake-shipping-service.com/schedule
      then: exit
  - handleUnknownOrderType:
      do:
        - logWarning:
            call: http
            with:
              method: post
              endpoint: https://fake-logging-service.com/warn
        - notifyAdmin:
            call: http
            with:
              method: post
              endpoint: https://fake-notification-service.com/notifyTry-Catch Example
document:
  dsl: '1.0.0'
  namespace: default
  name: try-catch
  version: '0.1.0'
do:
  - tryGetPet:
      try:
        - getPet:
            call: http
            with:
              method: get
              endpoint: https://petstore.swagger.io/v2/pet/{petId}
      catch:
        errors:
          with:
            type: https://serverlessworkflow.io/spec/1.0.0/errors/communication
            status: 404
        as: error
        do:
          - notifySupport:
              emit:
                event:
                  with:
                    source: https://petstore.swagger.io
                    type: io.swagger.petstore.events.pets.not-found.v1
                    data: ${ $error }
          - setError:
              set:
                error: $error
              export:
                as: '$context + { error: $error }'
  - buyPet:
      if: $context.error == null
      call: http
      with:
        method: put
        endpoint: https://petstore.swagger.io/v2/pet/{petId}
        body: '${ . + { status: "sold" } }'Wait Example
document:
  dsl: '1.0.0'
  namespace: default
  name: wait-duration-inline
  version: '0.1.0'
do: 
  - wait30Seconds:
      wait:
        seconds: 30Visit our GitHub repository for more examples or complete use cases.
Reach out to us!
Join our Meetings!
Add the schedule to your calendar and become a part of our discussions!
How To JoinContributions welcome!
We do a Pull Request contributions workflow on GitHub. New users are always welcome!
To RepositoryJoin us on Slack!
Chat with our community and follow announcements at #serverless-workflow
Open SlackOpen Source projects supporting our DSL
 
  Apache EventMesh Workflow
Apache EventMesh Workflow is a cloud vendor-independent, cloud-native-oriented Serverless Workflow Runtime based on Serverless Workflow specification, and provides durability, reliability, scalability, and observability capabilities.
Get Started 
  Apache KIE SonataFlow
SonataFlow is a powerful tool for building cloud-native workflow applications, enabling seamless orchestration and choreography of services and events.
Get Started 
  Lemline
Lemline is a highly scalable, native-binary runtime that plugs into any existing message broker (Kafka, RabbitMQ, etc.). Deployed as a message consumer and producer, it orchestrates serverless workflows without requiring any additional infrastructure.
Get Started 
  Synapse
Synapse is a vendor-neutral, free, open-source, and community-driven Workflow Management System (WFMS) implementing the Serverless Workflow specification. You can deploy Synapse on Docker, Kubernetes, or natively on Windows, Mac, and Linux.
Get StartedTrusted by top brands in workflow technologies
Already using Serverless Workflow? Join our list of top brands by letting us know here!
 
  Apache EventMesh
A new generation serverless event middleware for building distributed event-driven applications.
Learn More 
  Caf
Serverless Workflow is the core technology behind every KYC/KYB solution allowing them to customize it for their clients seamlessly.
Learn More 
  FaasNet
FaasNet makes it easy to deploy functions and API to Kubernetes without repetitive, boiler-plate coding.
Learn MoreFoxflow
Foxflow's AI agent development platform accelerates business process automation and software delivery through LLM-integrated declarative workflows
Learn More 
 Huawei
Huawei leverages Serverless Workflow with FunctionGraph for scalable, event-driven functions and ROMA Connect for all-domain hybrid integration, connecting applications for seamless digital transformation.
Learn More 
  Neuroglia
Neuroglia is a consultancy and solution design company for the digital transformation of companies and their services.
Learn MoreRed Hat
Red Hat sponsors Apache KIE SonataFlow, a tool for creating cloud-native workflows. SonataFlow supports service and event orchestration, integrating with your architecture using CloudEvents, REST calls, and other standard components.
Learn More 
  Warrify
Warrify offers a leading data platform for the retail industry. With "warrify Journeys" (powered by Serverless Workflows) retailers are discovering new ways how to engage their customers in real time.
Learn MoreSupport our Project
Our sponsors, along with our community, help our project grow and stay vendor-neutral through their donations.
 
  Neuroglia
Neuroglia is a consultancy and solution design company for the digital transformation of companies and their services.
Learn MoreInnovation in the Open
Serverless Workflow is an open-source project under the governance of the Cloud Native Computing Foundation (CNCF) and a part of the Linux Foundation.
The project is in the Application Definition & Image Build landscape.