A generic, extensible workflow engine in Go, supporting state machines, pluggable actions (API calls, message broker, functions, callbacks), and a simple API server with dashboard visualization.
- Register workflows and actions dynamically via HTTP API
- Group workflows by domain
- Visualize workflows and transitions in a web dashboard (Mermaid.js)
- Easily extend with new action types
cd cmd
go run api_server.go
The server will start on http://localhost:8080.
curl -X POST http://localhost:8080/register-workflow \
-H "Content-Type: application/json" \
-d '{"domain":"ticket","name":"ticket_flow","initial_state":"open"}'
curl -X POST http://localhost:8080/register-action \
-H "Content-Type: application/json" \
-d '{"domain":"ticket","workflow":"ticket_flow","state":"open","event":"start_progress","action_type":"function","function_name":"example"}'
curl -X POST http://localhost:8080/register-action \
-H "Content-Type: application/json" \
-d '{"domain":"ticket","workflow":"ticket_flow","state":"open","event":"start_progress","action_type":"script","script":"result = ticket_id + \\" started by \\\" + user;"}'
You can use any parameter passed to the action (e.g., ticket_id
, user
) in your script. The last evaluated value (e.g., result
) will be returned as the action result.
Open your browser and go to:
http://localhost:8080/dashboard
Enter the domain and workflow name, then click Visualize to see the state diagram.
cmd/api_server.go
— API server entry pointinternal/api/
— API handlers, dashboard, visualizationinternal/domain/
— State machine, types, modelsinternal/usecase/
— Workflow orchestrationinternal/actions/
— Pluggable action implementations
- Add new action types in
internal/actions/
- Register new actions via the API
- To add new Go functions for use in function actions, add them to the
FunctionRegistry
ininternal/actions/function_action.go
.
- You can register JavaScript code as a workflow action using the
script
action type. The script will be executed in a sandboxed JS interpreter (otto) with all action parameters available as variables.
MIT