by flytohub
The open-source execution engine for AI agents. 412 modules, MCP-native, triggers, queue, versioning, metering.
# Add to your Claude Code skills
git clone https://github.com/flytohub/flyto-coreA debuggable automation engine. Trace every step. Replay from any point.
pip install flyto-core[browser] && playwright install chromium
flyto recipe competitor-intel --url https://github.com/pricing
Step 1/12 browser.launch ✓ 420ms
Step 2/12 browser.goto ✓ 1,203ms
Step 3/12 browser.evaluate ✓ 89ms
Step 4/12 browser.screenshot ✓ 1,847ms → saved intel-desktop.png
Step 5/12 browser.viewport ✓ 12ms → 390×844
Step 6/12 browser.screenshot ✓ 1,621ms → saved intel-mobile.png
Step 7/12 browser.viewport ✓ 8ms → 1280×720
Step 8/12 browser.performance ✓ 5,012ms → Web Vitals captured
Step 9/12 browser.evaluate ✓ 45ms
Step 10/12 browser.evaluate ✓ 11ms
Step 11/12 file.write ✓ 3ms → saved intel-report.json
Step 12/12 browser.close ✓ 67ms
✓ Done in 10.3s — 12/12 steps passed
Screenshots captured. Performance metrics extracted. JSON report saved. Every step traced.
No comments yet. Be the first to share your thoughts!
With a shell script you re-run the whole thing. With flyto-core:
flyto replay --from-step 8
Steps 1–7 are instant. Only step 8 re-executes. Full context preserved.
# Competitive pricing: screenshots + Web Vitals + JSON report
flyto recipe competitor-intel --url https://competitor.com/pricing
# Full site audit: SEO + accessibility + performance
flyto recipe full-audit --url https://your-site.com
# Web scraping → CSV export
flyto recipe scrape-to-csv --url https://news.ycombinator.com --selector ".titleline a"
Every recipe is traced. Every run is replayable. See all 32 recipes →
pip install flyto-core # Core engine + CLI + MCP server
pip install flyto-core[browser] # + browser automation (Playwright)
playwright install chromium # one-time browser setup
Here's what competitive pricing analysis looks like in Python:
Python — 85 lines
import asyncio, json, time
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch()
page = await browser.new_page()
await page.goto("https://competitor.com/pricing")
# Extract pricing
prices = await page.evaluate("""() => {
const cards = document.querySelectorAll(
'[class*="price"]'
);
return Array.from(cards).map(
c => c.textContent.trim()
);
}""")
# Desktop screenshot
await page.screenshot(
path="desktop.png", full_page=True
)
# Mobile
await page.set_viewport_size(
{"width": 390, "height": 844}
)
await page.screenshot(
path="mobile.png", full_page=True
)
# Performance
perf = await page.evaluate("""() => {
const nav = performance
.getEntriesByType('navigation')[0];
return {
ttfb: nav.responseStart,
loaded: nav.loadEventEnd
};
}""")
# Save report
report = {
"prices": prices,
"performance": perf,
}
with open("report.json", "w") as f:
json.dump(report, f, indent=2)
await browser.close()
asyncio.run(main())
flyto-core — 12 steps
name: Competitor Intel
steps:
- id: launch
module: browser.launch
- id: navigate
module: browser.goto
params: { url: "{{url}}" }
- id: prices
module: browser.evaluate
params:
script: |
JSON.stringify([
...document.querySelectorAll(
'[class*="price"]'
)
].map(e => e.textContent.trim()))
- id: desktop_shot
module: browser.screenshot
params: { path: desktop.png, full_page: true }
- id: mobile
module: browser.viewport
params: { width: 390, height: 844 }
- id: mobile_shot
module: browser.screenshot
params: { path: mobile.png, full_page: true }
- id: perf
module: browser.performance
- id: save
module: file.write
params:
path: report.json
content: "${prices.result}"
- id: close
module: browser.close
No trace. No replay. No timing. If step 5 fails, re-run everything.
Full trace. Replay from any step. Per-step timing. Every run is debuggable.
site to url) and suggests alternatives when a non-existent module is requestedfields are specified, browser.extract now returns the text content of matched elements by default (previously returned empty objects)channel: 'chrome' to browser.launch to use the system-installed Chrome instead of bundled Chromium, useful for bypassing anti-bot detection on sites that fingerprint headless browsers| Category | Count | Examples |
|----------|-------|----------|
| browser.* | 38 | launch, goto, click, extract, screenshot, fill forms, wait |
| flow.* | 24 | switch, loop, branch, parallel, retry, circuit breaker, rate limit |
| array.* | 15 | filter, sort, map, reduce, unique, chunk, flatten |
| string.* | 11 | reverse, uppercase, split, replace, trim, slugify, template |
| api.* | 11 | OpenAI, Anthropic, Gemini, Notion, Slack, Telegram |
| object.* | 10 | keys, values, merge, pick, omit, get, set, flatten |
| image.* | 9 | resize, convert, crop, rotate, watermark, OCR, compress |
| data.* | 8 | json/xml/yaml/csv parse and generate |
| file.* | 8 | read, write, copy, move, delete, exists, edit, diff |
| stats.* | 8 | mean, median, percentile, correlation, standard deviation |
| validate.* | 7 | email, url, json, phone, credit card |
| docker.* | 6 | run, ps, logs, stop, build, inspect |
| archive.* | 6 | zip create/extract, tar create/extract, gzip, gunzip |
| math.* | 6 | calculate, round, ceil, floor, power, abs |
| k8s.* | 5 | get_pods, apply, logs, scale, describe |
| crypto.* | 4 | AES encrypt/decrypt, JWT create/verify |
| network.* | 4 | ping, traceroute, whois, port scan |
| pdf.* | 4 | parse, extract text, merge, compress |
| aws.s3.* | 4 | upload, download, list, delete |
| google.* | 4 | Gmail send/search, Calendar create/list events |
| cache.* | 4 | get, set, delete, clear (memory + Redis) |
| ssh.* | 3 | remote exec, SFTP upload, SFTP download |
| git.* | 3 | clone, commit, diff |
| sandbox.* | 3 | execute Python, Shell, JavaScript |
| dns.* | 1 | DNS lookup (A, AAAA, MX, CNAME, TXT, NS) |
| monitor.* | 1 | HTTP health check with SSL cert verification |
See the Full Module Catalog for every module, parameter, and description.
| | Playwright / Selenium | Shell scripts | flyto-core |
|-|----------------------|---------------|------------|
| Step 8 fails | Re-run everything | Re-run everything | flyto replay --from-step 8 |
| What happened at step 3? | Add print(), re-run | Add echo, re-run | Full trace: input, output, timing |
| Browser + API + file I/O | Write glue code | 3 languages | All built-in |
| Share with team | "Clone my repo" | "Clone my repo" | pip install flyto-core |
| Run in CI | Wrap in pytest/bash | Fragile | flyto run workflow.yaml |
# Run a built-in recipe
flyto recipe site-audit --url https://example.com
# Run your own YAML workflow
flyto run my-workflow.yaml
# List all recipes
flyto recipes
pip install flyto-core
claude mcp add flyto-core -- python -m core.mcp_server
Or add to your MCP config:
{
"mcpServers": {
"flyto-core": {
"command": "python",
"args": ["-m", "core.mcp_server"]
}
}
}
Your AI gets all modules as tools.
pip install flyto-core[api]
flyto serve
# ✓ flyto-core running on