{"repo":"browser-use/workflow-use","free":true,"listed":false,"github":"https://github.com/browser-use/workflow-use","clone":"git clone https://github.com/browser-use/workflow-use.git","description":"⚙️ Create and run workflows (RPA 2.0)","language":"Python","stars":4134,"topics":["browser-automation","browser-use-box","rpa","telegram-automation"],"license":"AGPL-3.0","category":"ai_agent_tool","readme_excerpt":"<picture>\n  <img alt=\"Workflow Use logo - a product by Browser Use.\" src=\"./static/workflow-use.png\"  width=\"full\">\n</picture>\n\n<br />\n\n<h1 align=\"center\">Deterministic, Self Healing Workflows (RPA 2.0)</h1>\n\n[![GitHub stars](https://img.shields.io/github/stars/browser-use/workflow-use?style=social)](https://github.com/browser-use/workflow-use/stargazers)\n[![Discord](https://img.shields.io/discord/1303749220842340412?color=7289DA&label=Discord&logo=discord&logoColor=white)](https://link.browser-use.com/discord)\n[![Cloud](https://img.shields.io/badge/Cloud-☁️-blue)](https://cloud.browser-use.com)\n[![Twitter Follow](https://img.shields.io/twitter/follow/Gregor?style=social)](https://x.com/gregpr07)\n[![Twitter Follow](https://img.shields.io/twitter/follow/Magnus?style=social)](https://x.com/mamagnus00)\n\n⚙️ **Workflow Use** is the easiest way to create and execute deterministic workflows with variables which fallback to [Browser Use](https://github.com/browser-use/browser-use) if a step fails. You just _show_ the recorder the workflow, we automatically generate the workflow.\n\n❗ This project is in very early development so we don't recommend using this in production. Lots of things will change and we don't have a release schedule yet. Originally, the project was born out of customer demand to make Browser Use more reliable and deterministic.\n\n## 🚀 NEW: Generation Mode\n\nAutomatically generate workflows from natural language! Describe your task, we run browser-use once, then create a reusable semantic workflow stored in a database.\n\n### Quick Commands\n\n```bash\n# Generate workflow from task description\npython cli.py generate-workflow \"Find GitHub stars for browser-use repo\"\n\n# List all workflows\npython cli.py list-workflows\n\n# Filter by generation mode\npython cli.py list-workflows --generation-mode browser_use\n\n# Run stored workflow\npython cli.py run-stored-workflow <workflow-id> --prompt \"Find stars for playwright repo\"\n\n# View workflow details\npython cli.py workflow-info <workflow-id>\n\n# Delete workflow\npython cli.py delete-workflow <workflow-id>\n```\n\n### How It Works\n\n1. **Describe**: Give a task in natural language\n2. **Execute**: Browser-use completes the task once\n3. **Generate**: Execution history → semantic workflow with parameters\n4. **Store**: Save to database with metadata\n5. **Reuse**: Run the workflow with different inputs, no AI needed\n\n### Advanced Options\n\n```bash\n# Custom models for generation\npython cli.py generate-workflow \"Your task\" \\\n  --agent-model \"gpt-4.1-mini\" \\\n  --extraction-model \"gpt-4.1-mini\" \\\n  --workflow-model \"gpt-4o\"\n\n# Use Browser-Use Cloud browser\npython cli.py generate-workflow \"Your task\" --use-cloud\n\n# Save to custom location\npython cli.py generate-workflow \"Your task\" --output-file ./my-workflow.json\n\n# Skip database storage\npython cli.py generate-workflow \"Your task\" --no-save-to-storage\n```\n\n### Storage\n\nWorkflows stored at `workflows/storage/`:\n- `metadata.json` - Searchable index of all workflows\n- `workflows/<id>.workflow.json` - Individual workflow files\n\n### Programmatic Usage\n\n```python\nfrom workflow_use.healing.service import HealingService\nfrom workflow_use.storage.service import WorkflowStorageService\nfrom browser_use.llm import ChatOpenAI\n\nhealing_service = HealingService(llm=ChatOpenAI(model='gpt-4.1'))\nstorage_service = WorkflowStorageService()\n\n# Generate workflow\nworkflow = await healing_service.generate_workflow_from_prompt(\n    prompt=\"Fill contact form on example.com\",\n    agent_llm=ChatOpenAI(model='gpt-4.1-mini'),\n    extraction_llm=ChatOpenAI(model='gpt-4.1-mini'),\n    use_cloud=True  # Optional: use Browser-Use Cloud\n)\n\n# Save to storage\nmetadata = storage_service.save_workflow(\n    workflow=workflow,\n    generation_mode='browser_use',\n    original_task=\"Fill contact form on example.com\"\n)\n\n# Retrieve and execute\nloaded_workflow = storage_service.get_workflow(metadata.id)\n```\n\n# Quick start\n\n```bash\ngit clone https://github.com/browser-use/workflow-use\n```\n\n## Build the extension\n\n```bash\ncd extension && npm install && npm run build\n```\n\n## Setup workflow environment\n\n```bash\ncd .. && cd workflows\nuv sync\nsource .venv/bin/activate # for mac / linux\nplaywright install chromium\ncp .env.example .env # add your OPENAI_API_KEY to the .env file\n```\n\n\n## Run workflow as tool\n\n```bash\npython cli.py run-as-tool examples/example.workflow.json --prompt \"fill the form with example data\"\n```\n\n## Run workflow with predefined variables\n\n```bash\npython cli.py run-workflow examples/example.workflow.json\n```\n\n## Record your own workflow\n\n```bash\npython cli.py create-workflow\n```\n\n## See all commands\n\n```bash\npython cli.py --help\n```\n\n# Usage from python\n\nRunning the workflow files is as simple as:\n\n```python\nfrom workflow_use import Workflow\n\nworkflow = Workflow.load_from_file(\"example.workflow.json\")\nresult = asyncio.run(workflow.run_as_tool(\"I want to search for 'workflow use'\"))\n```\n\n## Cloud Browser Support\n\nRun workflows in [Browser-Use Cloud](https://cloud.browser-use.com) (new signups get $10 free credits via OAuth or $1 via email) with semantic abstraction (no AI):\n(NOTE: Set BROWSER_USE_API_KEY environment variable)\n```python\nfrom workflow_use import Workflow\n\nworkflow = Workflow.load_from_file(\"workflow.json\", llm, use_cloud=True)\nresult = await workflow.run_with_no_ai()  # No LLM calls, uses semantic mapping\n```\n\nExamples:\n- `examples/cloud_browser_demo.py` - Load recorded workflow and run on cloud\n\n## Launch the GUI\n\nThe Workflow UI provides a visual interface for managing, viewing, and executing workflows.\n\n### Option 1: Using the CLI command (Recommended)\n\nThe easiest way to start the GUI is with the built-in CLI command:\n\n```bash\ncd workflows\npython cli.py launch-gui\n```\n\nThis command will:\n- Start the backend server (FastAPI)\n- Start the frontend development server\n- Automatically open http://localhost:5173 in your browser\n- Capture logs to the `./tmp/logs` directory\n\nPress Ctrl+C to stop both servers when you're done.\n\n### Option 2: Start servers separately\n\nAlternatively, you can start the servers individually:\n\n#### Start the backend server\n\n```bash\ncd workflows\nuvicorn backend.api:app --reload\n```\n\n#### Start the frontend development server\n\n```bash\ncd ui\nnpm install\nnpm run dev\n```\n\nOnce both servers are running, you can access the Workflow GUI at http://localhost:5173 in your browser. The UI allows you to:\n\n- Visualize workflows as interactive graphs\n- Execute workflows with custom input parameters\n- Monitor workflow execution logs in real-time\n- Edit workflow metadata and details\n\n# Demos\n\n## Workflow Use filling out form instantly\n\nhttps://github.com/user-attachments/assets/cf284e08-8c8c-484a-820a-02c507de11d4\n\n## Gregor's explanation\n\nhttps://github.com/user-attachments/assets/379e57c7-f03e-4eb9-8184-521377d5c0f9\n\n# Features\n\n- 🔁 **Record Once, Reuse Forever**: Record browser interactions once and replay them indefinitely.\n- ⏳ **Show, don't prompt**: No need to spend hours prompting Browser Use to do the same thing over and over again.\n- ⚙️ **Structured & Executable Workflows**: Converts recordings into deterministic, fast, and reliable workflows which automatically extract variables from forms.\n- 🪄 **Human-like Interaction Understanding**: Intelligently filters noise from recordings to create meaningful workflows.\n- 🔒 **Enterprise-Ready Foundation**: Built for future scalability with features like self-healing and workflow diffs.\n\n# Vision and roadmap\n\nShow computer what it needs to do once, and it will do it over and over again without any human intervention.\n\n## Workflows\n\n- [ ] Nice way to use the `.json` files inside python code\n- [ ] Improve LLM fallback when step fails (currently really bad)\n- [ ] Self healing, if it fails automatically agent kicks in and updates the workflow file\n- [ ] Better support for LLM steps\n- [ ] Take output from previous steps and use it as input for next steps\n- [ ] Expose workflows as MCP tools\n- [ ] Use Browser Use to automatically create workflows from websites\n\n## Developer experience\n\n- [ ] Improve CLI\n- [ ] Improve extension\n- [ ] Step editor\n\n## Agent\n\n- [ ] Allow Browser Use to use the workflows as MCP tools\n- [ ] Use workflows as website caching layer\n","default_branch":"main","files":188,"tree":[".github/workflows/lint.yml",".github/workflows/publish.yml",".gitignore","LICENSE","README.md","extension/.eslintignore","extension/.eslintrc.cjs","extension/.gitignore","extension/README.md","extension/components.json","extension/package-lock.json","extension/package.json","extension/src/assets/react.svg","extension/src/assets/tailwind.css","extension/src/components/ui/button.tsx","extension/src/entrypoints/background.ts","extension/src/entrypoints/content.ts","extension/src/entrypoints/sidepanel/components/error-view.tsx","extension/src/entrypoints/sidepanel/components/event-viewer.tsx","extension/src/entrypoints/sidepanel/components/initial-view.tsx","extension/src/entrypoints/sidepanel/components/logina-view.tsx","extension/src/entrypoints/sidepanel/components/recording-view.tsx","extension/src/entrypoints/sidepanel/components/stopped-view.tsx","extension/src/entrypoints/sidepanel/context/workflow-provider.tsx","extension/src/entrypoints/sidepanel/index.html","extension/src/entrypoints/sidepanel/index.tsx","extension/src/lib/message-bus-types.ts","extension/src/lib/types.ts","extension/src/lib/utils.ts","extension/src/lib/workflow-types.ts","extension/src/public/icon/128.png","extension/src/public/icon/16.png","extension/src/public/icon/32.png","extension/src/public/icon/48.png","extension/src/public/wxt.svg","extension/tsconfig.json","extension/vite.config.ts","extension/wxt.config.ts","lint.sh","static/workflow-use.png","ui/.eslintrc.cjs","ui/.github/dependabot.yml","ui/.gitignore","ui/index.html","ui/package-lock.json","ui/package.json","ui/public/browseruse.png","ui/public/favicon.ico","ui/src/App.tsx","ui/src/components/log-viewer.tsx","ui/src/components/no-workflow-message.tsx","ui/src/components/node-config-menu.tsx","ui/src/components/play-button.tsx","ui/src/components/sidebar.tsx","ui/src/components/workflow-item.tsx","ui/src/components/workflow-layout.tsx","ui/src/index.css","ui/src/lib/api/index.ts","ui/src/lib/api/openapi.json","ui/src/main.tsx","ui/src/types/log-viewer.types.ts","ui/src/types/node-config-menu.types.ts","ui/src/types/play-button.types.ts","ui/src/types/sidebar.types.ts","ui/src/types/workflow-layout.types.ts","ui/src/utils/json-to-flow.ts","ui/src/vite-env.d.ts","ui/tsconfig.json","ui/tsconfig.node.json","ui/vite.config.ts","workflows/.env.example","workflows/.gitignore","workflows/.python-version","workflows/.vscode/launch.json","workflows/.vscode/settings.json","workflows/BUGFIX_SUMMARY.md","workflows/IMPLEMENTATION_SUMMARY.md","workflows/QUICK_START_PROGRESS_TRACKING.md","workflows/README.md","workflows/backend/api.py","workflows/backend/routers.py","workflows/backend/service.py","workflows/backend/views.py","workflows/cli.py","workflows/docs/DETERMINISTIC.md","workflows/docs/PROGRESS_TRACKING.md","workflows/docs/VARIABLES.md","workflows/examples/README.md","workflows/examples/progress_tracking_example.py","workflows/examples/scripts/README.md","workflows/examples/scripts/demos/cloud_browser_demo.py","workflows/examples/scripts/demos/generation_mode_demo.py","workflows/examples/scripts/demos/hierarchical_selection_demo.py","workflows/examples/scripts/demos/semantic_extraction_demo.py","workflows/examples/scripts/demos/travel_booking_demo.py","workflows/examples/scripts/deterministic/auto_generate_workflow.py","workflows/examples/scripts/deterministic/create_deterministic_workflow.py","workflows/examples/scripts/deterministic/run_complete_test.py","workflows/examples/scripts/deterministic/test_custom_task.py","workflows/examples/scripts/deterministic/test_deterministic_workflow.py","workflows/examples/scripts/generate_workflow.py","workflows/examples/scripts/runner.py","workflows/examples/scripts/variables/create_workflow_with_variables.py","workflows/examples/scripts/variables/run_workflow_with_variables.py","workflows/examples/workflows/basic/example.workflow.json.bak","workflows/examples/workflows/basic/example.workflow.yaml","workflows/examples/workflows/basic/example_github_stars_workflow.yaml","workflows/examples/workflows/basic/example_workflow.yaml","workflows/examples/workflows/basic/example_workflow_with_default.yaml","workflows/examples/workflows/basic/pure_semantic.workflow.json.bak","workflows/examples/workflows/basic/pure_semantic.workflow.yaml","workflows/examples/workflows/form_filling/semantic_form_fill.workflow.json.bak","workflows/examples/workflows/form_filling/semantic_form_fill.workflow.yaml","workflows/examples/workflows/form_filling/v1.fully-semantic.json","workflows/examples/workflows/form_filling/v1.json","workflows/examples/workflows/parameterized/github_stars_parameterized.workflow.json.bak","workflows/examples/workflows/parameterized/github_stars_parameterized.workflow.yaml","workflows/migrate_json_to_yaml.py","workflows/pyproject.toml","workflows/storage/metadata.json","workflows/test_max_alternatives_bug_fix.py","workflows/tests/run_all_tests.py","workflows/tests/test_button_click.py","workflows/tests/test_element_finder.py","workflows/tests/test_go_back.workflow.yaml","workflows/tests/test_go_back_fix.py","workflows/tests/test_progress_tracking.py","workflows/tests/test_recorded_workflow.py","workflows/tests/test_selector_generator.py","workflows/tests/test_selector_generator_fix.py","workflows/tests/test_step_counter_without_callback.py","workflows/tests/test_wait_times.py","workflows/tests/test_workflow_execution.py","workflows/tests/test_xpath_optimization.py","workflows/uv.lock","workflows/workflow_use/__init__.py","workflows/workflow_use/builder/prompts.py","workflows/workflow_use/builder/service.py","workflows/workflow_use/builder/tests/build_workflow.py","workflows/workflow_use/controller/service.py","workflows/workflow_use/controller/utils.py","workflows/workflow_use/controller/views.py","workflows/workflow_use/healing/_agent/agent_prompt.md","workflows/workflow_use/healing/_agent/controller.py","workflows/workflow_use/healing/deterministic_converter.py","workflows/workflow_use/healing/prompts.py","workflows/workflow_use/healing/prompts/workflow_creation_prompt.md","workflows/workflow_use/healing/prompts/workflow_validation_prompt.md","workflows/workflow_use/healing/selector_generator.py","workflows/workflow_use/healing/service.py","workflows/workflow_use/healing/tests/constants.py","workflows/workflow_use/healing/tests/test_exploration_agent.py","workflows/workflow_use/healing/tests/test_generate_workflow.py","workflows/workflow_use/healing/tests/test_validator.py","workflows/workflow_use/healing/tests/test_variable_extractor.py","workflows/workflow_use/healing/tests/test_workflow_creation.py","workflows/workflow_use/healing/validator.py","workflows/workflow_use/healing/variable_extractor.py","workflows/workflow_use/healing/variable_utils.py","workflows/workflow_use/healing/views.py","workflows/workflow_use/healing/xpath_optimizer.py","workflows/workflow_use/mcp/service.py","workflows/workflow_use/mcp/tests/test_tools.py","workflows/workflow_use/recorder/recorder.py","workflows/workflow_use/recorder/semantic_converter.py","workflows/workflow_use/recorder/service.py","workflows/workflow_use/recorder/views.py","workflows/workflow_use/schema/views.py","workflows/workflow_use/storage/__init__.py","workflows/workflow_use/storage/service.py","workflows/workflow_use/workflow/element_finder.py","workflows/workflow_use/workflow/error_reporter.py","workflows/workflow_use/workflow/prompts.py","workflows/workflow_use/workflow/prompts/agent_step_system_prompt.md","workflows/workflow_use/workflow/semantic_executor.py","workflows/workflow_use/workflow/semantic_extractor.py","workflows/workflow_use/workflow/service.py","workflows/workflow_use/workflow/step_agent/controller.py","workflows/workflow_use/workflow/step_verifier.py","workflows/workflow_use/workflow/tests/run_workflow.py","workflows/workflow_use/workflow/tests/run_workflow_tool.py","workflows/workflow_use/workflow/tests/test_extract.py","workflows/workflow_use/workflow/tests/test_semantic_extractor.py","workflows/workflow_use/workflow/tests/test_variable_identifier.py","workflows/workflow_use/workflow/validation_utils.py","workflows/workflow_use/workflow/variable_config.py","workflows/workflow_use/workflow/variable_identifier.py","workflows/workflow_use/workflow/views.py"],"storefront":"/r/browser-use","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/browser-use/workflow-use/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}