Skip to main content

Surfari

Surfari is a modular, LLM-powered browser automation framework built on Playwright.
It enables secure, scriptable, and intelligent interactions with websites — perfect for data extraction, automated workflows, and AI-assisted navigation.


✨ Key Features

  • Automatic Record, Parameterize & Replay
    Surfari automatically records both the exact sequence of LLM actions and a generalized, parameterized workflow at the same time.
    When running new tasks, Surfari plugs in the new values, replays the known workflow, and invokes the LLM only for review or recovery.
    🔑 Unique: Replays are fast and stable, while parameterization makes them flexible and reusable for new but structurally similar tasks.

  • Self-Healing Replay
    If the recorded path fails due to layout drift, Surfari seamlessly switches to real-time LLM reasoning for that step, then resumes deterministic replay — combining stability with resilience.

  • Agent Delegation & Collaboration
    A Navigation Agent can pause its own run and delegate subtasks to another agent in a separate tab, then resume after the subtask completes.
    Enables branching workflows, multi-agent collaboration, and parallel subtasks — like a team of agents cooperating inside one browser.

  • Human-in-the-Loop Delegation
    When needed, Surfari can gracefully delegate control back to a human operator.
    You complete the missing step in the live browser, then the agent continues the workflow automatically.

  • Stable, Text-Based UI Targets
    Instead of brittle XPaths or random IDs, Surfari uses semantic text annotations as selectors.
    Enables highly stable record/replay with stable, meaningful UI targets.

  • Visual Decisioning (Action Box Overlay)
    Surfari can show the LLM’s reasoning and intended action in an on-page action box overlay next to the targeted element — making the agent’s decisions transparent, reviewable, and debuggable.

  • Configurable LLM Models (No Coding Required)
    Swap models like Google Gemini, OpenAI GPT, Anthropic Claude, just by name in config — no code changes needed.

  • Information Masking
    Automatically masks and unmasks account numbers, balances, and any digit-like strings, ensuring sensitive data remains protected during logs, prompts, and replays.

  • One or Multiple Actions Per Turn
    Choose between step-by-step interactivity (safer on dynamic sites) or multi-action per turn (faster on static or more predictable sites/workflows).

  • Custom Value Resolvers (Beyond Tool Calling)
    Unknown form values (inputs, select options, etc.) can be resolved automatically via direct APIs, retrieval-augmented search, or custom resolvers — without requiring tool calls through the LLM.

  • Tool Calling Integration

    • Python Tools: Easy integration via function calling.
    • MCP Tools: Stdio or HTTP servers supported for external integrations.
  • Screenshots for Grounding
    Use screenshots as additional context for the LLM to ensure accurate reasoning (a tad slower) Supports saving screenshots for later review.

  • PDF Download Automation
    Downloads PDFs from both direct download links and embedded Chrome PDF viewers.

  • Batch Execution from CSV
    Run or schedule multiple tasks in one batch — each task can target a different site, goal, or credential set, with its own settings (e.g., single vs. multi-action per turn, record/replay on/off, masking enabled/disabled, screenshots enabled/disabled).

  • OTP Handling
    Automatically solves text-message OTPs by setting up SMS forwarding from your phone to your Gmail, then auto-filling them during login.

  • Google Tools Integration
    Out-of-the-box support for Gmail, Google Sheets, and Google Docs.

  • Deployment Options

    • CLI Binaries: Platform-specific executables — no Python setup required. Just download and run.
    • Docker Deployment: Cloud mode with VNC-based browser streaming. Provision a VM and access the remote browser directly from your web browser.

🚀 Quick Start

Surfari can be used in two ways:

  1. Directly via the prebuilt CLI (no Python setup needed)
  2. From Python code (full flexibility in your own scripts)

Option 1: Run the CLI

  1. Download the prebuilt CLI zip for your platform (Linux, Windows, macOS) from the Surfari Releases page.
  2. Unzip the archive.
  3. Open a terminal / command prompt and change into the navigation_cli folder.
  4. Set your API key environment variable (example: Gemini):
    export GEMINI_API_KEY=your_api_key_here   # macOS / Linux
    set GEMINI_API_KEY=your_api_key_here      # Windows CMD
    

    Other supported keys:

    • OPENAI_API_KEY for OpenAI GPT models
    • ANTHROPIC_API_KEY for Anthropic Claude models
  5. Check the CLI help:
    ./navigation_cli --help        # macOS / Linux
    navigation_cli.exe --help      # Windows
    
  6. Adjust configuration (optional):
    • Edit _internal/surfari/util/config.json, or
    • Pass overrides with command-line arguments.

Option 2: Run from Python

  1. Install Surfari:

    pip install surfari
    # optionally install chromium. If chromium is not installed, system Chrome browser will be used.
    python -m playwright install chromium
    
  2. Set your API key as above (GEMINI_API_KEY, OPENAI_API_KEY, or ANTHROPIC_API_KEY).
    You can also put it in a .env file and load it with dotenv.

  3. Write a script (example below uses Expedia):

    import asyncio
    from dotenv import load_dotenv
    load_dotenv()  # load .env file if present
    
    from surfari.agents.navigation_agent import NavigationAgent
    
    async def main():
        site_name = "Expedia"
        task_goal = "Find cheapest direct flight ticket from SFO to New York leaving on first week of Nov 2025, returning 10 days later"
    
        nav_agent = NavigationAgent(site_name=site_name)
        answer = await nav_agent.run(task_goal=task_goal)
    
        print("Final answer:", answer)
    
    asyncio.run(main())
    
  4. Run your script:

    python my_script.py
    
  5. Switch models (optional):

    nav_agent = NavigationAgent(site_name="Expedia", model="gpt-5-mini")  # uses OPENAI_API_KEY
    

🔐 Credential Storage

  • Linux: Key stored in ~/.surfari/key_string with permissions rw------- (chmod 600).
  • macOS: Key stored in ~/.surfari/key_string or system keyring (via keyring library).
  • Windows: Key stored in system keyring (via keyring library).
  • Database: Encrypted SQLite in your Surfari environment.

🛠 Development

git clone https://github.com/surfari-ai/surfari.git
cd surfari
pip install -e .[dev]
python -m playwright install chromium

📂 Project Structure

src/surfari/
  ├── __init__.py
  ├── util/config.json
  ├── security/site_credential_manager.py
  ├── agents/
  │    └── navigation_agent/
  ├── view/html_to_text.js
  └── security/credentials.db

🤝 Contributing

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/new-thing)
  3. Commit changes (git commit -m "Add new thing")
  4. Push to branch (git push origin feature/new-thing)
  5. Open a Pull Request

📜 License

MIT License — see LICENSE for details.

Metadata

Release files for surfari 0.1.11

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for surfari 0.1.11
File Size Uploaded
surfari-0.1.11.tar.gz 143.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for surfari 0.1.11
File Interpreter ABI Platform
surfari-0.1.11-py3-none-any.whl Python 3 none any Details

Total release size: 294.2 kB

Release files / surfari-0.1.11.tar.gz

Download URL surfari-0.1.11.tar.gz
Size 143.3 kB
Tags Source
SHA-256 checksum
How to use checksums
fbc383fb8f8bd74010e3296bf8ee14d53f3d7723bda03aeb00165adeccf6f04d
BLAKE2b-256 checksum
How to use checksums
a0f42a22b23a634602e3045869351c6f01d237d11a5f10be679d11ae33afc3c5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.8

Release files / surfari-0.1.11-py3-none-any.whl

Download URL surfari-0.1.11-py3-none-any.whl
Size 150.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0cb44fc7cfaa31a942c098ad3e25e05d5439a225515c49552fd050a18c07e59b
BLAKE2b-256 checksum
How to use checksums
95e527297778d4411a4f534c3faac25ecaf5ed1783824d184005bf291efec932
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.8

Release history Release notifications | RSS feed

This release

0.1.11 This release

2 release files

0.1.10

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.6

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page