Labsco
Cap-of-tea logo

GDD (Giggly-Dazzling-Duckling)

β˜… 11

from Cap-of-tea

AI-controlled browser farm β€” run N isolated Chromium instances with 36 MCP tools for device emulation, screenshots, network/geolocation simulation, and diagnostics. Cross-platform: Windows GUI + headed/headless on Linux/macOS.

πŸ”₯πŸ”₯πŸ”₯βœ“ VerifiedFreeNeeds API keys
<p align="center"> <img src="Design/giggly-dazzling-duckling.png" alt="GDD" width="180" /> </p> <h1 align="center">GDD β€” Giggly-Dazzling-Duckling</h1> <p align="center"> <strong>AI-controlled browser farm on your machine</strong><br> Simulate multiple real users across 22 device types β€” test your site like it's launch day. </p> <p align="center"> <a href="https://github.com/Cap-of-tea/GDD/releases/latest"><img src="https://img.shields.io/github/v/release/Cap-of-tea/GDD?style=flat-square&color=blue" alt="Release" /></a> <img src="https://img.shields.io/badge/platform-Windows%20%7C%20Linux%20%7C%20macOS-0078D6?style=flat-square" alt="Platforms" /> <a href="https://modelcontextprotocol.io/"><img src="https://img.shields.io/badge/MCP-compatible-44CC11?style=flat-square" alt="MCP" /></a> <a href="https://registry.modelcontextprotocol.io"><img src="https://img.shields.io/badge/MCP%20Registry-listed-44CC11?style=flat-square" alt="MCP Registry" /></a> <a href="LICENSE"><img src="https://img.shields.io/badge/license-free%20for%20personal%20use-blue?style=flat-square" alt="License" /></a> </p> <p align="center"> <img src="https://img.shields.io/badge/Works%20with-Claude%20Code-F97316?style=flat-square" alt="Claude Code" /> <img src="https://img.shields.io/badge/Works%20with-Cursor-007ACC?style=flat-square" alt="Cursor" /> </p>

How It Works

You: Open 3 iPhones and a desktop, navigate to myapp.com, test the signup form on all devices

Claude Code creates 4 browsers with device emulation, navigates each to your app, fills in the form, takes screenshots, checks console for errors β€” all in parallel.

Copy & paste β€” that's it
gdd_add_players(3, device="iPhone 15 Pro")    β†’ players [1, 2, 3]
gdd_add_players(1, device="Desktop 1080p")    β†’ player  [4]
gdd_navigate(1, "https://myapp.com")          β†’ all 4 browsers open your app
gdd_tap(1, "#signup-btn")                     β†’ taps signup on iPhone
gdd_screenshot(1)                             β†’ captures the result
gdd_get_console(1, level="error")             β†’ checks for JS errors

GDD runs N isolated Chromium instances, each with its own profile, cookies, device emulation, geolocation, and network conditions. It exposes 37 MCP tools via HTTP on localhost:9700.

<p align="center"> <img src="Design/gdd-video-wall.png" alt="GDD Video Wall β€” 3 devices testing simultaneously" width="900" /> </p>

Connect to Your AI Client

Add to .mcp.json and restart your AI client:

Copy & paste β€” that's it
{
  "mcpServers": {
    "gdd": {
      "url": "http://localhost:9700/mcp"
    }
  }
}

That's it. Start GDD, tell Claude or Cursor to test your app.

Claude Desktop users: Download the .mcpb file from Releases and open it β€” GDD installs as a one-click desktop extension. No manual config needed.

<details> <summary><strong>Config file locations</strong></summary>
ClientProject configGlobal config
Claude Code<project>/.mcp.json~/.claude/.mcp.json
Cursor<project>/.cursor/mcp.json~/.cursor/mcp.json
VS Code / Windsurf / Antigravity<project>/.vscode/mcp.jsonIDE settings.json

Global and project configs are merged β€” servers from both are available simultaneously. Changes are picked up only when restarting the AI client session.

</details> <details> <summary><strong>VS Code-based IDEs (Windsurf, Antigravity, Copilot)</strong></summary>

VS Code-based IDEs use a different config format than Claude Code / Cursor.

Project config β€” .vscode/mcp.json:

Copy & paste β€” that's it
{
  "servers": {
    "gdd": {
      "type": "http",
      "url": "http://localhost:9700/mcp"
    }
  }
}

Global config β€” open via Cmd+Shift+P β†’ "Open User Settings (JSON)":

Copy & paste β€” that's it
{
  "mcp": {
    "servers": {
      "gdd": {
        "type": "http",
        "url": "http://localhost:9700/mcp"
      }
    }
  }
}

Global settings.json location: macOS β€” ~/Library/Application Support/<IDE>/User/settings.json, Linux β€” ~/.config/<IDE>/User/settings.json, Windows β€” %APPDATA%/<IDE>/User/settings.json. Replace <IDE> with your editor name (Code, Windsurf, Antigravity, etc.).

stdio-proxy alternative (.vscode/mcp.json):

Copy & paste β€” that's it
{
  "servers": {
    "gdd": {
      "type": "stdio",
      "command": "bash",
      "args": ["/absolute/path/to/Scripts/mcp-proxy.sh"]
    }
  }
}
</details> <details> <summary><strong>Permissions (Claude Code)</strong></summary>

By default, Claude Code asks for confirmation on every MCP tool call. To allow GDD tools without prompts, add to ~/.claude/settings.json:

Copy & paste β€” that's it
{
  "permissions": {
    "allow": [
      "mcp__gdd__*"
    ]
  }
}

This single wildcard covers all 37 GDD tools. Restart Claude Code after editing.

</details> <details> <summary><strong>Auto-launch via stdio proxy (alternative)</strong></summary>

Proxy scripts start GDD automatically when your AI client connects:

Windows:

Copy & paste β€” that's it
{
  "mcpServers": {
    "gdd": {
      "command": "powershell",
      "args": ["-ExecutionPolicy", "Bypass", "-File", "C:/path/to/Scripts/mcp-proxy.ps1"]
    }
  }
}

Linux / macOS:

Copy & paste β€” that's it
{
  "mcpServers": {
    "gdd": {
      "command": "bash",
      "args": ["/path/to/Scripts/mcp-proxy.sh"]
    }
  }
}

Add "--headless" to the args array for CI/CD.

Tip: On first launch, GDD downloads Chromium (~80 MB). If your AI client times out, run GDD manually first, then reconnect.

</details> <details> <summary><strong>Autostart as service (macOS / Linux)</strong></summary>

macOS (launchd):

Copy & paste β€” that's it
bash Scripts/install-launchd.sh            # headed (default)
bash Scripts/install-launchd.sh --headless  # for CI/CD

Manage: launchctl list | grep gdd / bash Scripts/install-launchd.sh --uninstall

Linux (systemd):

Copy & paste β€” that's it
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/gdd.service << 'EOF'
[Unit]
Description=GDD Multi-Browser Testing Server
[Service]
ExecStart=/path/to/GDD.Headless
WorkingDirectory=/path/to/gdd-directory
Restart=on-failure
[Install]
WantedBy=default.target
EOF

systemctl --user daemon-reload
systemctl --user enable --now gdd
</details> <details> <summary><strong>Direct HTTP (without AI client)</strong></summary>
Copy & paste β€” that's it
curl -X POST http://localhost:9700/mcp -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"gdd_add_players","arguments":{"count":1}}}'

GDD uses standard JSON-RPC 2.0 β€” works with curl, Python, Node.js, or any HTTP client.

</details>

Features

  • Multi-device β€” Run N isolated Chromium instances with 22 device presets (phones, tablets, desktops)
  • AI-native β€” 37 MCP tools for Claude Code, Cursor, or any MCP-compatible client
  • Cross-platform β€” Native GUI with a live video wall on Windows, Linux & macOS, plus a headless server for CI/CD
  • Full interaction β€” Navigate, tap, type, drag, swipe, scroll, hover, handle dialogs, take screenshots
  • Human-like input β€” humanize=true drives a continuous cursor path (cubic BΓ©zier with easing and micro-jitter) that carries over between clicks, hovers and drags; taps fire a single device-appropriate input (touch or mouse), never both
  • Anti-bot stealth β€” opt-in Stealth mode masks the usual automation tells (navigator.webdriver, etc.) on top of real headed Chromium with trusted input events
  • Device emulation β€” Screen size, DPR, touch, user agent, geolocation, timezone, language
  • Network control β€” Simulate 4G, Fast 3G, Slow 3G, or offline per browser
  • Diagnostics β€” Console errors, network traffic, performance metrics, push notifications
  • Error beacon β€” Every tool response warns about JS errors across all browsers automatically
  • Docker-ready β€” Official image on GHCR (ghcr.io/cap-of-tea/gdd), listed on the MCP Registry
  • Self-updating β€” Built-in version check and one-command update

MCP Tools (37)

Player Management

ToolDescription
gdd_add_playersAdd N browser instances with optional device preset
gdd_remove_playerRemove a browser instance by player ID
gdd_list_windowsList all active browsers with current state

Navigation

ToolDescription
gdd_navigateNavigate to a URL
gdd_waitWait for a CSS selector to appear (with timeout)
gdd_reloadReload page (hard=true bypasses cache)
gdd_backNavigate back
gdd_forwardNavigate forward

Interaction

ToolDescription
gdd_tapTap element by CSS selector or coordinates; sends a single device-appropriate input (touch on touch devices, mouse on desktop), never both. humanize=true adds a continuous human-like cursor path
gdd_swipeSwipe gesture (up/down/left/right)
gdd_dragDrag an element to (x, y) or onto another element via real pointer events (drives dnd-kit & HTML5 drag-and-drop)
gdd_scrollScroll page or element
gdd_typeType text into input fields
gdd_hoverHover over element. humanize=true adds a continuous human-like cursor path
gdd_selectSelect option from <select> dropdown
gdd_dialogHandle JS alert/confirm/prompt dialogs

Reading & Screenshots

ToolDescription
gdd_readRead text content of an element
gdd_read_allRead text from all matching elements
gdd_screenshotCapture JPEG screenshot at CSS pixel resolution

Emulation

ToolDescription
gdd_set_deviceSet device preset (22 devices: phones, tablets, desktops)
gdd_set_viewportSet custom viewport dimensions
gdd_set_locationSet geolocation, timezone, and locale
gdd_set_networkSet network conditions (4G, 3G, offline)
gdd_set_languageSet browser language

State & Diagnostics

ToolDescription
gdd_get_stateBrowser state: URL, title, device, auth status
gdd_get_consoleConsole output and uncaught exceptions
gdd_get_networkNetwork requests with timing and status
gdd_get_notificationsReceived push notifications
gdd_get_performancePerformance metrics (JS heap, DOM nodes, FPS)
gdd_clear_logsClear console and/or network logs

Auth & Execution

ToolDescription
gdd_quick_authAuto-register and login with generated credentials
gdd_execute_jsExecute JavaScript and return result

Browser Storage

ToolDescription
gdd_storageRead/write/clear localStorage/sessionStorage
gdd_cookiesRead or clear browser cookies

Help & Updates

ToolDescription
gdd_get_manualFull GDD manual for AI self-learning
gdd_check_updateCheck for newer versions
gdd_updateDownload and install update (restarts GDD)

<details> <summary><strong>Device Presets (22)</strong></summary>

Phones (11)

DeviceResolutionScaleTouch
iPhone SE375 x 6672.0xYes
iPhone 14390 x 8443.0xYes
iPhone 15 Pro393 x 8523.0xYes
iPhone 15 Pro Max430 x 9323.0xYes
iPhone 16 Pro402 x 8743.0xYes
iPhone 16 Pro Max440 x 9563.0xYes
Pixel 9412 x 9152.625xYes
Pixel 9 Pro412 x 9152.625xYes
Galaxy S24360 x 7803.0xYes
Galaxy S24 Ultra412 x 9153.0xYes
OnePlus 12412 x 9153.5xYes

Tablets (6)

DeviceResolutionScale
iPad Mini744 x 11332.0x
iPad Air820 x 11802.0x
iPad Pro 11"834 x 11942.0x
iPad Pro 13"1024 x 13662.0x
Galaxy Tab S9800 x 12802.0x
Pixel Tablet800 x 12802.0x

Desktops (5)

DeviceResolutionScale
Laptop HD1366 x 7681.0x
Laptop HiDPI1440 x 9002.0x
Desktop 1080p1920 x 10801.0x
Desktop 1440p2560 x 14401.0x
Desktop 4K3840 x 21602.0x
</details>

Architecture

Copy & paste β€” that's it
Client (AI agent / curl / script)
         β”‚ POST /mcp (JSON-RPC 2.0)
         β–Ό
    McpServer (:9700)
    Streamable HTTP + SSE
         β”‚
         β–Ό
    McpToolRegistry (37 tools)
    Player Β· Navigation Β· Interaction Β· Read
    Emulation Β· Auth Β· State Β· Diagnostics
         β”‚
         β–Ό
    IPlayerManager
    MainViewModel (WPF) / DesktopPlayerManager (Avalonia) / HeadlessPlayerManager
         β”‚
         β–Ό
    IBrowserEngine Instances
    WebView2 (Win GUI)  |  Playwright (Desktop GUI + headed/headless server)
    Each: own profile, CDP session, emulation

Editions

GDD ships as three apps over one shared core. The two GUIs differ only in the desktop toolkit (WebView2 on Windows, Avalonia on Linux/macOS); all three expose the same 37 MCP tools.

Windows GUIDesktop GUIServer
BinaryGDD.exeGDD.DesktopGDD.Headless (add --headless for no windows)
EngineWebView2Playwright (headed)Playwright (headed/headless)
UIWPF video wallAvalonia video wallnone β€” HTTP API only
MCP port970098009700
PlatformsWindowsLinux, macOSWindows, Linux, macOS

Tech Stack

LayerTechnology
Runtime.NET 8.0 (self-contained)
UI (Windows)WPF + CommunityToolkit.Mvvm
UI (Linux/macOS)Avalonia + CommunityToolkit.Mvvm
Browser (Windows GUI)Microsoft WebView2
Browser (Desktop GUI + Server)Microsoft Playwright
ProtocolMCP (Model Context Protocol)
Browser ControlChrome DevTools Protocol (CDP)
LoggingSerilog
<details> <summary><strong>Project Structure</strong></summary>
Copy & paste β€” that's it
BrowserXn.sln
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ GDD.Core/              ← Shared library (net8.0)
β”‚   β”‚   β”œβ”€β”€ Abstractions/      ← IBrowserEngine, IPlayerManager, ...
β”‚   β”‚   β”œβ”€β”€ Mcp/               ← MCP server, tools, protocol
β”‚   β”‚   β”œβ”€β”€ Models/            ← Device, Location, Network presets
β”‚   β”‚   β”œβ”€β”€ Services/          ← CDP, Emulation, Monitoring services
β”‚   β”‚   └── Collections/       ← RingBuffer
β”‚   β”œβ”€β”€ BrowserXn/             ← Windows GUI (WPF + WebView2)
β”‚   β”‚   β”œβ”€β”€ Engines/           ← WebView2ControlAdapter
β”‚   β”‚   β”œβ”€β”€ ViewModels/        ← MVVM (MainViewModel : IPlayerManager)
β”‚   β”‚   β”œβ”€β”€ Views/             ← XAML + VideoWallPanel
β”‚   β”‚   └── ...
β”‚   β”œβ”€β”€ GDD.Desktop/           ← Linux/macOS GUI (Avalonia + Playwright)
β”‚   β”‚   β”œβ”€β”€ Engines/           ← PlaywrightHeadedEngine (headed, parked off-screen)
β”‚   β”‚   β”œβ”€β”€ ViewModels/        ← MainViewModel (DesktopPlayerManager)
β”‚   β”‚   β”œβ”€β”€ Views/             ← AXAML + VideoWallPanel
β”‚   β”‚   └── Scripts/           ← mcp-proxy.sh, setup-macos.sh, install-deps.sh
β”‚   └── GDD.Headless/          ← Cross-platform server (Playwright)
β”‚       β”œβ”€β”€ Engines/           ← PlaywrightEngine
β”‚       β”œβ”€β”€ Platform/          ← HeadlessPlayerManager
β”‚       └── Scripts/           ← mcp-proxy.sh, mcp-proxy.ps1
└── .github/workflows/         ← CI/CD (8 build targets + auto-release)
</details>
<details> <summary><strong>Configuration</strong></summary>

appsettings.json next to the executable:

Copy & paste β€” that's it
{
  "GDD": {
    "FrontendUrl": "about:blank",
    "BackendUrl": "http://localhost:8080/api/v1",
    "BotToken": "",
    "McpPort": 9700,
    "DataFolderRoot": "",
    "Stealth": false
  }
}
KeyDescriptionDefault
FrontendUrlDefault URL for new browsersabout:blank
BackendUrlBackend API for auth servicehttp://localhost:8080/api/v1
BotTokenTelegram bot token (for TG testing)β€”
McpPortMCP server port (auto-fallback +1..+9)9700
DataFolderRootBrowser profile storage root%LOCALAPPDATA%\GDD\Profiles (Win), ~/.local/share/GDD/Profiles (Linux/macOS)
HeadedVisible browser windowstrue (override with --headless)
StealthOpt-in anti-bot masking β€” launches Chromium with AutomationControlled disabled and hides the usual automation tells (navigator.webdriver, etc.). Playwright engines (GDD.Desktop, GDD Server) onlyfalse
</details> <details> <summary><strong>Building from Source</strong></summary>

Requires .NET 8 SDK.

Copy & paste β€” that's it
# Windows GUI (requires Windows 10/11 + WebView2)
dotnet publish src/BrowserXn/BrowserXn.csproj -c Release -p:PublishSingleFile=true -o ./publish/win-gui

# Cross-platform headless
dotnet publish src/GDD.Headless/GDD.Headless.csproj -c Release -r linux-x64 --self-contained -o ./publish/linux-x64
dotnet publish src/GDD.Headless/GDD.Headless.csproj -c Release -r osx-arm64 --self-contained -o ./publish/osx-arm64
dotnet publish src/GDD.Headless/GDD.Headless.csproj -c Release -r win-x64 --self-contained -o ./publish/win-x64

Chromium installs automatically on first run.

</details>

Documentation

Privacy

<details> <summary><strong>Privacy Policy</strong></summary>

GDD runs entirely on your local machine. No telemetry, no analytics, no data collection.

  • No data leaves your machine β€” all browser profiles, screenshots, logs, and cookies stay in local storage
  • Browser profiles β€” stored in %LOCALAPPDATA%\GDD\Profiles (Windows) or ~/.local/share/GDD/Profiles (Linux/macOS)
  • No third-party services β€” GDD does not contact any external APIs except GitHub Releases for optional update checks
  • Update checks β€” gdd_check_update makes a single read-only request to api.github.com. Opt out by not calling the tool, or set CheckForUpdates: false in appsettings.json
  • MCP server β€” listens on localhost only (default port 9700), never exposed to the network

Contact: 2vsmirnov@gmail.com

</details>

License

imVSΒ©, free for personal use.

Source Available β€” Non-Commercial. Free for personal use, education, and research. Commercial use requires a paid license. See LICENSE for full terms.

Commercial licensing: 2vsmirnov@gmail.com