A developer-first automation engine with webhook triggers and linear step execution.
Webhook → API → Queue (BullMQ) → Workers → PostgreSQL/Redis
- Webhook triggers with optional HMAC signature verification
- Linear step execution: http, transform (JSONata), ai (LM Studio), delay
- Step-level retries with configurable backoff (fixed, linear, exponential)
- Idempotency support via
X-Idempotency-Keyheader - Dependency injection with Awilix
# Start dependencies
docker compose up -d
# Install and migrate
npm install
npm run migrate
npm run seed
# Run (3 terminals)
npm run dev # API server
npm run dev:worker # Execute worker
npm run dev:ai-worker # AI worker (optional)Copy .env.example to .env:
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/automation
REDIS_URL=redis://localhost:6379
PORT=3000
LM_STUDIO_URL=http://localhost:1234/v1POST /webhooks/:slug # Trigger workflowPOST /api/v1/workflows # Create workflow
GET /api/v1/workflows # List workflows
GET /api/v1/workflows/:id # Get workflow
PATCH /api/v1/workflows/:id # Update workflow
DELETE /api/v1/workflows/:id # Delete workflow
POST /api/v1/workflows/:id/steps # Add step
PATCH /api/v1/workflows/:id/steps/:stepId # Update step
DELETE /api/v1/workflows/:id/steps/:stepId # Delete stepGET /api/v1/runs # List runs
GET /api/v1/runs/:id # Get run
GET /api/v1/runs/:id/executions # Get step executions
POST /api/v1/runs/:id/cancel # Cancel run
POST /api/v1/runs/:id/retry # Retry failed run{
"type": "http",
"config": {
"method": "POST",
"url": "https://api.example.com/data",
"headers": { "Authorization": "Bearer {{trigger.body.token}}" },
"body": { "id": "{{trigger.body.id}}" }
}
}{
"type": "transform",
"config": {
"expression": "$.steps.fetchData.body.{ \"name\": name, \"email\": email }",
"outputKey": "user"
}
}{
"type": "ai",
"config": {
"model": "local-model",
"systemPrompt": "You are a helpful assistant.",
"prompt": "Summarize: {{steps.fetchData.body.content}}",
"outputKey": "summary"
}
}{
"type": "delay",
"config": {
"durationMs": 5000
}
}Access data via template expressions:
{{trigger.body.orderId}} # Webhook payload
{{trigger.headers.authorization}} # Headers
{{steps.validate.output}} # Previous step output
{{$now()}} # Current timestamp
{{$uuid()}} # Generate UUID
npm test # Run tests
npm run test:coverage # With coverage
npm run typecheck # Type checksrc/
├── api/ # Fastify routes + middleware
├── domain/ # Entities, errors, expression service
├── workers/ # Step handlers + processor
├── queue/ # BullMQ setup
├── storage/ # PostgreSQL repositories
└── container.ts # Awilix DI container