English | Π ΡΡΡΠΊΠΈΠΉ
Automate anything. Write less code. Ship faster.
A modern, cross-platform automation framework with elegant YAML DSL.
Build workflows in minutes, not days.
Stop writing boilerplate automation scripts. Define your workflows in clean YAML and let the engine handle the complexity.
schema_version: 1
name: fetch_and_process
tasks:
main:
steps:
- parallel:
max_concurrency: 5
steps:
- step: { id: users, uses: http.request, with: { url: "${api}/users" } }
- step: { id: posts, uses: http.request, with: { url: "${api}/posts" } }
- step: { id: comments, uses: http.request, with: { url: "${api}/comments" } }That's it. 3 parallel HTTP requests with automatic error handling, logging, and reporting.
| Feature | What it means for you |
|---|---|
| YAML DSL | Describe workflows declaratively β no complex code |
| Parallel Execution | Run independent steps concurrently β 5x faster workflows |
| Exponential Backoff Retry | Auto-retry with smart delays β resilient by default |
| Secrets Management | Inject secrets safely β auto-masked in logs & reports |
| Lifecycle Hooks | Intercept any event β full observability |
| Browser Automation | Playwright-powered β test any web app |
| SQLite Persistence | Full execution history β audit everything |
Install the AutoFlow.NET extension for the best development experience:
Features:
| Feature | Description |
|---|---|
| π¨ Syntax Highlighting | Keywords, variables, control flow |
| π‘ IntelliSense | Keywords, arguments, outputs, variables |
| π Code Navigation | Go to Definition, Find References, Workspace Symbols |
| βοΈ Code Editing | Quick Fixes, Signature Help, Code Folding |
| π₯οΈ UI | Status Bar, Tree View, Document Links |
| π Snippets | 20+ workflow patterns |
| π CLI Integration | Run, validate, history, stats |
# Download from releases and install
code --install-extension autoflow-1.1.0.vsixSee vscode-autoflow/README.md for full documentation.
# Clone and run in 30 seconds
git clone https://github.com/chelslava/autoflow-net.git
cd autoflow-net
dotnet run --project src/AutoFlow.Cli -- run examples/flow.yamlPrerequisites: .NET 10 SDK
For browser automation workflows, install Playwright browsers:
# Build the CLI first
dotnet build src/AutoFlow.Cli
# Install browsers (Chromium, Firefox, WebKit)
pwsh src/AutoFlow.Cli/bin/Debug/net10.0/playwright.ps1 install
# Or install only Chromium (faster, ~150 MB)
pwsh src/AutoFlow.Cli/bin/Debug/net10.0/playwright.ps1 install chromiumRun browser example:
dotnet run --project src/AutoFlow.Cli -- run examples/browser_login.yaml| File | Shows |
|---|---|
examples/flow.yaml |
Smallest possible workflow with log.info |
examples/file_roundtrip.yaml |
Local file automation with files.write, files.exists, files.read, datetime.now, and if |
examples/http_json_report.yaml |
HTTP request + JSON extraction + local report generation |
examples/excel_summary.yaml |
Downloading an Excel file and reading rows with excel.read |
examples/imports_report.yaml |
Focused imports example with shared variables and imported tasks |
examples/parallel_fetch_report.yaml |
Focused parallel example that writes a summary report |
examples/report_cli_demo.yaml |
Simple workflow intended for JSON/HTML report generation from the CLI |
examples/advanced_flow.yaml |
if, foreach, call, and file reads |
examples/advanced_features.yaml |
parallel, retry, on_error, and finally |
examples/imports/main.yaml |
Workflow imports and reusable tasks |
examples/browser_login.yaml |
Browser login flow |
examples/browser_ecommerce.yaml |
Browser e-commerce scenario |
examples/rpa_challenge.yaml |
Full 10-round RPA Challenge run until Congratulations! |
examples/reframework/main.yaml |
REFramework-style structure for the RPA Challenge |
Quick start for the new examples:
dotnet run --project src/AutoFlow.Cli -- run examples/file_roundtrip.yaml
dotnet run --project src/AutoFlow.Cli -- run examples/http_json_report.yaml
dotnet run --project src/AutoFlow.Cli -- run examples/excel_summary.yaml
dotnet run --project src/AutoFlow.Cli -- run examples/imports_report.yaml
dotnet run --project src/AutoFlow.Cli -- run examples/parallel_fetch_report.yaml# JSON report
dotnet run --project src/AutoFlow.Cli -- run examples/report_cli_demo.yaml --output reports/report_cli_demo.json
# HTML report
dotnet run --project src/AutoFlow.Cli -- run examples/report_cli_demo.yaml --output reports/report_cli_demo.htmlschema_version: 1
name: data_pipeline
variables:
api_base: https://api.example.com
tasks:
main:
on_error:
- step: { id: alert, uses: log.info, with: { message: "β Pipeline failed!" } }
finally:
- step: { id: cleanup, uses: log.info, with: { message: "π§Ή Cleanup done" } }
steps:
# Fetch in parallel β 3 concurrent requests
- parallel:
id: fetch_data
max_concurrency: 3
steps:
- step:
id: users
uses: http.request
with: { url: "${api_base}/users", method: GET }
save_as: { body: users_data }
- step:
id: posts
uses: http.request
with: { url: "${api_base}/posts", method: GET }
save_as: { body: posts_data }
# Auto-retry with exponential backoff
- step:
id: unstable_endpoint
uses: http.request
with: { url: "${api_base}/flaky", method: GET }
retry:
attempts: 5
type: exponential
delay: "1s"
max_delay: "30s"schema_version: 1
name: login_test
tasks:
main:
steps:
- step:
id: open_browser
uses: browser.open
with: { browser: chromium, headless: true }
save_as: { browserId: browser_id }
- step:
id: navigate
uses: browser.goto
with: { browserId: "${browser_id}", url: "https://app.example.com/login" }
- step:
id: fill_credentials
uses: browser.fill
with:
browserId: "${browser_id}"
selector: "#email"
value: "${secret:TEST_USER_EMAIL}"
- step:
id: submit
uses: browser.click
with: { browserId: "${browser_id}", selector: "button[type=submit]" }
- step:
id: verify
uses: browser.assert_text
with: { browserId: "${browser_id}", selector: ".welcome", expected: "Welcome" }# Run a workflow
dotnet run --project src/AutoFlow.Cli -- run workflow.yaml
# Generate HTML report
dotnet run --project src/AutoFlow.Cli -- run workflow.yaml --output report.html
# Validate before running
dotnet run --project src/AutoFlow.Cli -- validate workflow.yaml
# View execution history
dotnet run --project src/AutoFlow.Cli -- history --status Failed
# Get statistics
dotnet run --project src/AutoFlow.Cli -- stats --days 7
# List available keywords
dotnet run --project src/AutoFlow.Cli -- list-keywords| Keyword | Description |
|---|---|
http.request |
HTTP/HTTPS requests with full control |
json.parse |
Extract values from JSON |
| Keyword | Description |
|---|---|
files.read |
Read file contents |
files.write |
Write to files |
files.exists |
Check file existence |
files.delete |
Delete files |
| Keyword | Description |
|---|---|
browser.open |
Launch Chromium/Firefox/WebKit |
browser.goto |
Navigate to URL |
browser.click |
Click elements |
browser.fill |
Fill form fields |
browser.wait |
Wait for elements |
browser.screenshot |
Capture screenshots |
browser.assert_text |
Verify page content |
browser.evaluate |
Execute JavaScript |
| Keyword | Description |
|---|---|
if |
Conditional execution |
for_each |
Loop over items |
parallel |
Concurrent execution |
call |
Reusable tasks |
group |
Logical grouping |
File operations automatically reject ../ and absolute paths outside allowed directories.
HTTP requests to localhost, 192.168.x.x, 10.x.x.x blocked by default. Enable explicitly with allowPrivateNetworks: true.
Secrets are automatically masked in logs and reports:
[INFO] Calling API with token: ***
[Keyword("slack.notify", Category = "Notifications", Description = "Send Slack message")]
public class SlackNotifyKeyword : IKeywordHandler<SlackNotifyArgs>
{
public async Task<KeywordResult> ExecuteAsync(
KeywordContext context,
SlackNotifyArgs args,
CancellationToken ct = default)
{
// Your logic here
return KeywordResult.Success(new { messageId = "msg_123" });
}
}Register and use:
- step:
id: notify_team
uses: slack.notify
with:
channel: "#deployments"
message: "Deploy complete! π"βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β YAML Workflow β
βββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββ
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Parser (AST) β
βββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββ
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Validation β
βββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββ
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Runtime Engine β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β Secrets β β Hooks β β Variables β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
βββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββ
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Keyword Executors β
β ββββββββββ ββββββββββ ββββββββββ ββββββββββ β
β β HTTP β β Files β βBrowser β β Custom β β
β ββββββββββ ββββββββββ ββββββββββ ββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
AutoFlow.NET/
βββ src/
β βββ AutoFlow.Abstractions/ # Core contracts
β βββ AutoFlow.Runtime/ # Execution engine
β βββ AutoFlow.Parser/ # YAML β AST
β βββ AutoFlow.Validation/ # Schema validation
β βββ AutoFlow.Reporting/ # JSON/HTML reports
β βββ AutoFlow.Database/ # SQLite persistence
β βββ AutoFlow.Cli/ # Command-line tool
βββ libraries/
β βββ AutoFlow.Library.Http/ # HTTP keywords
β βββ AutoFlow.Library.Files/ # File keywords
β βββ AutoFlow.Library.Browser/ # Browser keywords
βββ tests/ # Test projects
| Feature | Status |
|---|---|
| YAML Parser | β |
| Control Flow (if/foreach/call) | β |
| Parallel Execution | β |
| Lifecycle Hooks | β |
| Secrets Management | β |
| Browser Automation | β |
| SQLite Persistence | β |
| Expression Language | π§ |
| Visual Workflow Editor | π Planned |
| Cloud Execution | π Planned |
We welcome contributions! See CONTRIBUTING.md for guidelines.
- Fork the repo
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'feat: add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
MIT License β use it for anything, commercial or personal.
- Issues: GitHub Issues
- Discussions: GitHub Discussions
Made with β€οΈ for automation engineers