Acsa is a production-grade, open-source workflow automation engine from Achsah Systems. It is being built as a local-first platform for YAML workflow-as-code, DAG execution, plugin-based extensibility, observability, and security-first automation.
This repository now contains:
- a Rust execution engine in
core/ - a Next.js visual editor in
ui/ - workflow definitions in
workflows/ - documentation in
docs/ - built-in trigger, logic, integration, AI, and human gate primitives
- workflow CRUD and manual run APIs for the editor
- a React Flow editor wired to real YAML load/save/run flows
- run history, log search, and metrics endpoints plus an execution view in the UI
- release-oriented build metadata, Docker packaging, install scripts, and self-hosting assets
- user, API, connector, UI, architecture, and community release documentation
- Phase 10 security hardening for signed webhooks, stricter connector/runtime limits, and log redaction
- Developer-first workflow authoring with YAML under version control
- Lightweight Rust runtime using Tokio, Serde, Petgraph, SQLx, Reqwest, and Extism
- Local-first execution model with a minimal visual editor
- Extensible connector runtime for subprocess and WASM plugins
- Observability with logs, metrics, and run history
- Security-first defaults around validation, redaction, and isolation
acsa/
├─ core/
├─ ui/
├─ deploy/
├─ packaging/
├─ scripts/
├─ connectors/
├─ workflows/
├─ docs/
└─ examples/
Run the fastest happy-path commands first:
# 0. Prepare the workspace once
./scripts/bootstrap-dev.sh
# 1. Validate the smallest workflow
cargo run -p acsa-core -- validate workflows/hello.yaml
# 2. Validate the flagship AI news demo
cargo run -p acsa-core -- validate workflows/ai-news-intelligence-demo.yaml
# 3. Exercise the sample connector without creating anything first
cargo run -p acsa-core -- connector-testThose three commands cover workspace bootstrap, workflow validation, and connector execution with working defaults.
If you want the fastest explanation of why Acsa exists, run the AI news intelligence demo:
cp .env.local.example .env.local
# edit .env.local with your real OpenAI and SMTP values
cargo run -p acsa-core -- validate workflows/ai-news-intelligence-demo.yaml
cargo run -p acsa-core -- run workflows/ai-news-intelligence-demo.yaml --db ./acsa-demo.db --json
cat data/demo/output/ai-news-intelligence-brief.mdacsa-core now loads .env.local automatically from the repository root. Exported shell
variables still win if both are present.
What it shows in one pass:
- live public AI/news input from official feeds plus Hacker News
- YAML workflow-as-code checked into Git
- real synthesis through the built-in OpenAI node
- secure subprocess connectors for source normalization and SMTP delivery
- a local archive plus delivered email as the final workflow outcome
See examples/demo/README.md for the full walkthrough and the example output.
For the full local stack, run:
./scripts/dev-stack.shRust is required to build and run the engine.
cargo run -p acsa-core -- validate workflows/hello.yaml
cargo run -p acsa-core -- list workflows
cargo run -p acsa-core -- --version
# Requires the demo env vars shown in the Demo section above
cargo run -p acsa-core -- run workflows/ai-news-intelligence-demo.yaml --db ./acsa.db
ACSA_WEBHOOK_SECRET=YOUR_SECRET_HERE cargo run -p acsa-core -- serve workflows --db ./acsa.db --port 3001
cargo run -p acsa-core -- connector-testNote: Generate strong webhook secrets for production with openssl rand -hex 32. Shared-secret headers use ACSA_WEBHOOK_SECRET; signed webhooks can additionally use ACSA_WEBHOOK_SIGNATURE_SECRET.
Remote engine exposure is opt-in: set ACSA_ALLOW_REMOTE_ENGINE=1 before binding to a non-loopback host. If you also set ACSA_ENGINE_AUTH_TOKEN, engine API routes require either Authorization: Bearer <token> or x-acsa-engine-token: <token>.
The current CLI can validate workflows, list workflow files, print build metadata, manually execute DAG workflows, serve cron plus webhook triggers, persist and resume human review tasks, scaffold connectors, and test connector manifests locally.
validate, list, and run also support --json for automation-friendly output.
The HTTP server now also exposes:
/metricsfor Prometheus-style metrics/api/runsfor paginated run history/api/runs/{run_id}for run, step, and human-task detail/api/runs/{run_id}/logsfor filtered execution logs
Included distribution assets:
scripts/bootstrap-dev.shfor one-command local setupscripts/dev-stack.shfor running engine + UI togetherscripts/install.shfor GitHub release installs with checksum verificationscripts/package-release.shfor local artifact packagingdeploy/docker/Dockerfileanddeploy/docker-compose.ymlfor containerized self-hostingdeploy/kubernetes/manifests for cluster deploymentpackaging/homebrew/acsa.rbandpackaging/scoop/acsa.jsonrelease manifests.github/workflows/release.ymlfor tagged release artifacts and checksums
Node.js 22+ is recommended for the UI.
./scripts/bootstrap-dev.sh
./scripts/dev-stack.shdev-stack.sh injects local webhook secrets automatically unless you override ACSA_WEBHOOK_SECRET or ACSA_WEBHOOK_SIGNATURE_SECRET.
The UI loads workflows from the engine API, edits YAML-backed workflow state, saves validated changes, starts manual runs, resolves persisted human tasks from the editor inbox, and shows run history, step timelines, log search, and execution metrics. It also includes a local connector manager for listing installed connectors, surfacing invalid manifests, scaffolding new connectors, and running sample manifest tests without leaving the editor. By default the Next.js app proxies /engine/* to http://127.0.0.1:3001/*; override that with ACSA_ENGINE_URL if your engine runs elsewhere.
The production UI is configured for Next.js standalone output so it can ship inside the Acsa container image or a packaged bundle.
- Product:
- Development and operations:
- Community and release:
- No secrets should be committed to this repository
- Workflows should reference environment-managed secrets instead of storing raw values
- Logs must redact sensitive values
- Webhook triggers support shared-secret headers and HMAC signatures
- HTTP and database nodes reject inline credentials in runtime configuration
- WASM connectors are disabled unless
ACSA_ENABLE_WASM_CONNECTORS=1 - Connector manifests enforce timeout, size, host, path, and env controls
- Unsafe Rust is avoided by default
- workflow directory loading and schema validation
- DAG planning with cycle detection
- bounded concurrent step execution
- retry-aware step execution with timeout control
- SQLite-backed run and step-attempt persistence
- SQLite-backed trigger state persistence
- persisted human task state with resumable approval and manual-input steps
- manual, cron, and webhook trigger dispatch
- workflow inventory, read, write, duplicate, delete, run, and node-catalog APIs for the UI
- run history, run detail, and filtered log APIs for the UI and automation tooling
- Prometheus-style metrics export with workflow and step duration histograms
- retention controls for runs and logs
- logic nodes for
condition,switch,loop, andparallel - integration nodes for HTTP, database, and file access
- AI primitives for completion, classification, extraction, embedding, and retrieval
- process and WASM connector loading from
connectors/ - connector scaffolding and local manifest testing commands
- a React Flow editor with workflow explorer, connector manager, node inspector, YAML preview, human-task inbox, and run history panel
- release profile tuning, embedded version metadata, and a
--versionCLI surface - standalone UI packaging plus Docker Compose, Kubernetes, installer, and release workflow assets
ACSA_LOG_PAYLOADS=0disables step payload display in run detail responsesACSA_LOG_FILE_PATH=/path/to/acsa.logmirrors structured engine logs to a fileACSA_LOG_RETENTION_DAYS=30purges old logs in the backgroundACSA_RUN_RETENTION_DAYS=14purges old finished runs and related records
Sensitive keys and common credential patterns are redacted before log persistence. See docs/dev/observability.md for the endpoint and retention reference, and docs/dev/security.md for the full hardening model.
The repository audit command is scripts/security-audit.sh, which carries the temporary Extism/Wasmtime exception list until upstream patched releases are available.
See docs/dev/self-hosting.md for binary installs, Docker, Kubernetes, and release packaging commands.
- Use issues for bugs, tracked enhancements, and connector proposals
- Use the issue templates and PR template in
.github/ - Follow CODE_OF_CONDUCT.md
- Start with CONTRIBUTING.md before opening a pull request
- Track planned direction in ROADMAP.md
- Track upstream Extism/Wasmtime security fixes as patched versions land
- Remove the temporary audit exceptions once Extism ships the patched dependency chain