{
  "markdown": "<p align=\"center\">\n  <img src=\"Design/giggly-dazzling-duckling.png\" alt=\"GDD\" width=\"180\" />\n</p>\n\n<h1 align=\"center\">GDD — Giggly-Dazzling-Duckling</h1>\n\n<p align=\"center\">\n  <strong>AI-controlled browser farm on your machine</strong><br>\n  Simulate multiple real users across 22 device types — test your site like it's launch day.\n</p>\n\n<p align=\"center\">\n  <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>\n  <img src=\"https://img.shields.io/badge/platform-Windows%20%7C%20Linux%20%7C%20macOS-0078D6?style=flat-square\" alt=\"Platforms\" />\n  <a href=\"https://modelcontextprotocol.io/\"><img src=\"https://img.shields.io/badge/MCP-compatible-44CC11?style=flat-square\" alt=\"MCP\" /></a>\n  <a href=\"https://registry.modelcontextprotocol.io\"><img src=\"https://img.shields.io/badge/MCP%20Registry-listed-44CC11?style=flat-square\" alt=\"MCP Registry\" /></a>\n  <a href=\"LICENSE\"><img src=\"https://img.shields.io/badge/license-free%20for%20personal%20use-blue?style=flat-square\" alt=\"License\" /></a>\n</p>\n<p align=\"center\">\n  <img src=\"https://img.shields.io/badge/Works%20with-Claude%20Code-F97316?style=flat-square\" alt=\"Claude Code\" />\n  <img src=\"https://img.shields.io/badge/Works%20with-Cursor-007ACC?style=flat-square\" alt=\"Cursor\" />\n</p>\n\n---\n\n## How It Works\n\n> **You:** Open 3 iPhones and a desktop, navigate to myapp.com, test the signup form on all devices\n>\n> **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.\n\n```text\ngdd_add_players(3, device=\"iPhone 15 Pro\")    → players [1, 2, 3]\ngdd_add_players(1, device=\"Desktop 1080p\")    → player  [4]\ngdd_navigate(1, \"https://myapp.com\")          → all 4 browsers open your app\ngdd_tap(1, \"#signup-btn\")                     → taps signup on iPhone\ngdd_screenshot(1)                             → captures the result\ngdd_get_console(1, level=\"error\")             → checks for JS errors\n```\n\nGDD runs N isolated Chromium instances, each with its own profile, cookies, device emulation, geolocation, and network conditions. It exposes **39 MCP tools** via HTTP on `localhost:9700`.\n\n<p align=\"center\">\n  <img src=\"Design/gdd-video-wall.png\" alt=\"GDD Video Wall — 3 devices testing simultaneously\" width=\"900\" />\n</p>\n\n---\n\n## Install\n\nGDD comes in two flavours. The **Server** is headless — it's just the MCP backend, runs anywhere (including boxes with no display), and is all you need for pure AI automation. The **Desktop app** adds a GUI: a live grid of browser thumbnails you can click into to take over a session by hand. The Server runs on port `9700`, the Desktop app on `9800` — so you can run both side by side.\n\n**Server (headless)** — the MCP backend:\n\n| Platform | Download | Run |\n|----------|----------|-----|\n| **Linux** | [GDD-Server-Linux.tar.gz](https://github.com/Cap-of-tea/GDD/releases/latest/download/GDD-Server-Linux.tar.gz) | `chmod +x GDD.Headless && ./GDD.Headless` |\n| **macOS ARM** | [GDD-Server-macOS-ARM.tar.gz](https://github.com/Cap-of-tea/GDD/releases/latest/download/GDD-Server-macOS-ARM.tar.gz) | `bash Scripts/setup-macos.sh && ./GDD.Headless` |\n| **macOS Intel** | [GDD-Server-macOS-Intel.tar.gz](https://github.com/Cap-of-tea/GDD/releases/latest/download/GDD-Server-macOS-Intel.tar.gz) | `bash Scripts/setup-macos.sh && ./GDD.Headless` |\n| **Windows** | [GDD-Server-Windows.zip](https://github.com/Cap-of-tea/GDD/releases/latest/download/GDD-Server-Windows.zip) | `.\\GDD.Headless.exe` |\n| **Docker** | `ghcr.io/cap-of-tea/gdd` | `docker run -p 9700:9700 ghcr.io/cap-of-tea/gdd` |\n| **Claude Desktop** | [Win](https://github.com/Cap-of-tea/GDD/releases/latest/download/GDD-Server-Windows.mcpb) / [Mac ARM](https://github.com/Cap-of-tea/GDD/releases/latest/download/GDD-Server-macOS-ARM.mcpb) / [Mac Intel](https://github.com/Cap-of-tea/GDD/releases/latest/download/GDD-Server-macOS-Intel.mcpb) (.mcpb) | Open `.mcpb` file — installs as desktop extension |\n\n**Desktop app (GUI)** — a live grid of browser thumbnails you can click into:\n\n| Platform | Download | Run |\n|----------|----------|-----|\n| **Windows** | [GDD-Desktop-Windows.zip](https://github.com/Cap-of-tea/GDD/releases/latest/download/GDD-Desktop-Windows.zip) | Extract, run `GDD.exe` ([WebView2](https://developer.microsoft.com/en-us/microsoft-edge/webview2/) required) |\n| **Linux** | [GDD-Desktop-Linux.tar.gz](https://github.com/Cap-of-tea/GDD/releases/latest/download/GDD-Desktop-Linux.tar.gz) | `bash Scripts/install-deps.sh && ./GDD.Desktop` |\n| **macOS ARM** | [GDD-Desktop-macOS-ARM.tar.gz](https://github.com/Cap-of-tea/GDD/releases/latest/download/GDD-Desktop-macOS-ARM.tar.gz) | `bash Scripts/setup-macos.sh && ./GDD.Desktop` |\n| **macOS Intel** | [GDD-Desktop-macOS-Intel.tar.gz](https://github.com/Cap-of-tea/GDD/releases/latest/download/GDD-Desktop-macOS-Intel.tar.gz) | `bash Scripts/setup-macos.sh && ./GDD.Desktop` |\n\nThe Windows app uses WebView2; the Linux/macOS app (built with Avalonia) drives real Chromium windows parked off-screen. Self-contained binary, ~70 MB. No .NET installation needed. Chromium downloads automatically on first launch.\n\n**One-liner (Linux):**\n\n```bash\ncurl -sL https://github.com/Cap-of-tea/GDD/releases/latest/download/GDD-Server-Linux.tar.gz | tar xz && chmod +x GDD.Headless && ./GDD.Headless\n```\n\n<details>\n<summary><strong>Docker</strong></summary>\n\n```bash\n# Run (headless, port 9700)\ndocker run -p 9700:9700 ghcr.io/cap-of-tea/gdd\n\n# Or build locally\ndocker build -t gdd .\ndocker run -p 9700:9700 gdd\n```\n\nThe Docker image runs in headless mode with all Chromium dependencies pre-installed.\n\n</details>\n\nBy default, browsers launch in **headed** mode (visible windows). Add `--headless` for CI/CD. Other flags: `--stealth` and `--stealth-max` for anti-bot masking, `--update` to self-update, `--version` and `--help`. The **Configuration** section below lists every flag and environment variable.\n\n---\n\n## Connect to Your AI Client\n\nAdd to `.mcp.json` and restart your AI client:\n\n```json\n{\n  \"mcpServers\": {\n    \"gdd\": {\n      \"url\": \"http://localhost:9700/mcp\"\n    }\n  }\n}\n```\n\nThat's it. Start GDD, tell Claude or Cursor to test your app.\n\n> **Claude Desktop users:** Download the `.mcpb` file from [Releases](https://github.com/Cap-of-tea/GDD/releases/latest) and open it — GDD installs as a one-click desktop extension. No manual config needed.\n\n<details>\n<summary><strong>Config file locations</strong></summary>\n\n| Client | Project config | Global config |\n| ------ | -------------- | ------------- |\n| Claude Code | `<project>/.mcp.json` | `~/.claude/.mcp.json` |\n| Cursor | `<project>/.cursor/mcp.json` | `~/.cursor/mcp.json` |\n| VS Code / Windsurf / Antigravity | `<project>/.vscode/mcp.json` | IDE `settings.json` |\n\nGlobal and project configs are merged — servers from both are available simultaneously. Changes are picked up only when restarting the AI client session.\n\n</details>\n\n<details>\n<summary><strong>VS Code-based IDEs (Windsurf, Antigravity, Copilot)</strong></summary>\n\nVS Code-based IDEs use a different config format than Claude Code / Cursor.\n\n**Project config** — `.vscode/mcp.json`:\n\n```json\n{\n  \"servers\": {\n    \"gdd\": {\n      \"type\": \"http\",\n      \"url\": \"http://localhost:9700/mcp\"\n    }\n  }\n}\n```\n\n**Global config** — open via `Cmd+Shift+P` → \"Open User Settings (JSON)\":\n\n```json\n{\n  \"mcp\": {\n    \"servers\": {\n      \"gdd\": {\n        \"type\": \"http\",\n        \"url\": \"http://localhost:9700/mcp\"\n      }\n    }\n  }\n}\n```\n\nGlobal `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.).\n\n**stdio-proxy** alternative (`.vscode/mcp.json`):\n\n```json\n{\n  \"servers\": {\n    \"gdd\": {\n      \"type\": \"stdio\",\n      \"command\": \"bash\",\n      \"args\": [\"/absolute/path/to/Scripts/mcp-proxy.sh\"]\n    }\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>Permissions (Claude Code)</strong></summary>\n\nBy default, Claude Code asks for confirmation on every MCP tool call. To allow GDD tools without prompts, add to `~/.claude/settings.json`:\n\n```json\n{\n  \"permissions\": {\n    \"allow\": [\n      \"mcp__gdd__*\"\n    ]\n  }\n}\n```\n\nThis single wildcard covers all 39 GDD tools. Restart Claude Code after editing.\n\n</details>\n\n<details>\n<summary><strong>Auto-launch via stdio proxy (alternative)</strong></summary>\n\nProxy scripts start GDD automatically when your AI client connects:\n\n**Windows:**\n\n```json\n{\n  \"mcpServers\": {\n    \"gdd\": {\n      \"command\": \"powershell\",\n      \"args\": [\"-ExecutionPolicy\", \"Bypass\", \"-File\", \"C:/path/to/Scripts/mcp-proxy.ps1\"]\n    }\n  }\n}\n```\n\n**Linux / macOS:**\n\n```json\n{\n  \"mcpServers\": {\n    \"gdd\": {\n      \"command\": \"bash\",\n      \"args\": [\"/path/to/Scripts/mcp-proxy.sh\"]\n    }\n  }\n}\n```\n\nAdd `\"--headless\"` to the `args` array for CI/CD.\n\n> **Tip:** On first launch, GDD downloads Chromium (~80 MB). If your AI client times out, run GDD manually first, then reconnect.\n\n</details>\n\n<details>\n<summary><strong>Autostart as service (macOS / Linux)</strong></summary>\n\n**macOS (launchd):**\n\n```bash\nbash Scripts/install-launchd.sh            # headed (default)\nbash Scripts/install-launchd.sh --headless  # for CI/CD\n```\n\nManage: `launchctl list | grep gdd` / `bash Scripts/install-launchd.sh --uninstall`\n\n**Linux (systemd):**\n\n```bash\nmkdir -p ~/.config/systemd/user\ncat > ~/.config/systemd/user/gdd.service << 'EOF'\n[Unit]\nDescription=GDD Multi-Browser Testing Server\n[Service]\nExecStart=/path/to/GDD.Headless\nWorkingDirectory=/path/to/gdd-directory\nRestart=on-failure\n[Install]\nWantedBy=default.target\nEOF\n\nsystemctl --user daemon-reload\nsystemctl --user enable --now gdd\n```\n\n</details>\n\n<details>\n<summary><strong>Direct HTTP (without AI client)</strong></summary>\n\n```bash\ncurl -X POST http://localhost:9700/mcp -H \"Content-Type: application/json\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"gdd_add_players\",\"arguments\":{\"count\":1}}}'\n```\n\nGDD uses standard JSON-RPC 2.0 — works with `curl`, Python, Node.js, or any HTTP client.\n\n</details>\n\n---\n\n## Features\n\n- **Multi-device** — Run N isolated Chromium instances with 22 device presets (phones, tablets, desktops)\n- **AI-native** — 39 MCP tools for Claude Code, Cursor, or any MCP-compatible client\n- **Cross-platform** — Native GUI with a live video wall on Windows, Linux & macOS, plus a headless server for CI/CD\n- **Full interaction** — Navigate, tap, type, press keys and shortcuts, drag, swipe, scroll, hover, handle dialogs, take screenshots\n- **Real keyboard** — Typing sends genuine, trusted keystrokes (the full keydown→input chain), so input masks, autocomplete and `maxlength` behave exactly as they do for a real user, and rich-text (`contenteditable`) editors work; `gdd_press` handles single keys and shortcuts like Enter, Tab, Escape and Ctrl+A\n- **Physical keyboard layouts** — Keystrokes carry the real `code`/`keyCode` of the emulated locale's keyboard: Russian ЙЦУКЕН puts «а» on the physical `KeyF`, French AZERTY and German QWERTZ remap their keys, dead-key accents and AltGr symbols work. The layout follows `gdd_set_language` automatically (US, RU, DE, FR)\n- **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\n- **Anti-bot stealth** — opt-in `--stealth` masks the usual automation tells (`navigator.webdriver`, etc.); `--stealth-max` adds headless/datacenter evasions (coherent user-agent client hints, a plausible WebGL vendor, realistic device metrics) — on a headless container this halved CreepJS's headless score\n- **Proxy support** — Route every browser through an upstream proxy with `GDD_PROXY` (with optional auth)\n- **Header rewriting** — `gdd_set_headers` can strip `X-Frame-Options`/CSP `frame-ancestors` to load a site in an iframe, or add/replace response headers\n- **Device emulation** — Screen size, DPR, touch, user agent, geolocation, timezone, language\n- **Network control** — Simulate 4G, Fast 3G, Slow 3G, or offline per browser\n- **Diagnostics** — Console errors, network traffic, performance metrics, push notifications\n- **Error beacon** — Every tool response warns about JS errors across all browsers automatically\n- **Docker-ready** — Official image on GHCR (`ghcr.io/cap-of-tea/gdd`), listed on the [MCP Registry](https://registry.modelcontextprotocol.io)\n- **Self-updating** — Built-in version check and one-command update\n\n---\n\n## MCP Tools (39)\n\n### Player Management\n\n| Tool | Description |\n|------|-------------|\n| `gdd_add_players` | Add N browser instances with optional device preset |\n| `gdd_remove_player` | Remove a browser instance by player ID |\n| `gdd_list_windows` | List all active browsers with current state |\n\n### Navigation\n\n| Tool | Description |\n|------|-------------|\n| `gdd_navigate` | Navigate to a URL |\n| `gdd_wait` | Wait for a CSS selector to appear (with timeout) |\n| `gdd_reload` | Reload page (`hard=true` bypasses cache) |\n| `gdd_back` | Navigate back |\n| `gdd_forward` | Navigate forward |\n\n### Interaction\n\n| Tool | Description |\n|------|-------------|\n| `gdd_tap` | Tap 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 |\n| `gdd_swipe` | Swipe gesture (up/down/left/right) |\n| `gdd_drag` | Drag an element to (x, y) or onto another element via real pointer events (drives dnd-kit & HTML5 drag-and-drop) |\n| `gdd_scroll` | Scroll page or element |\n| `gdd_type` | Type text with real, trusted keystrokes (CDP dispatchKeyEvent — masks, autocomplete and maxlength behave as for a real user; works on contenteditable). Physical key codes follow the emulated layout (US/RU/DE/FR); `humanize=true` adds per-key jitter; `paste=true` inserts in one shot |\n| `gdd_press` | Press a single key or shortcut (Enter, Tab, Escape, Arrow keys, F1–F12, or a character) with optional modifiers (Control/Alt/Shift/Meta); character keys follow the emulated layout |\n| `gdd_hover` | Hover over element. `humanize=true` adds a continuous human-like cursor path |\n| `gdd_select` | Select option from `<select>` dropdown |\n| `gdd_dialog` | Handle JS alert/confirm/prompt dialogs |\n\n### Reading & Screenshots\n\n| Tool | Description |\n|------|-------------|\n| `gdd_read` | Read text content of an element |\n| `gdd_read_all` | Read text from all matching elements |\n| `gdd_screenshot` | Capture JPEG screenshot at CSS pixel resolution |\n\n### Emulation\n\n| Tool | Description |\n|------|-------------|\n| `gdd_set_device` | Set device preset (22 devices: phones, tablets, desktops) |\n| `gdd_set_viewport` | Set custom viewport dimensions |\n| `gdd_set_location` | Set geolocation, timezone, and locale |\n| `gdd_set_network` | Set network conditions (4G, 3G, offline) |\n| `gdd_set_language` | Set browser language |\n| `gdd_set_headers` | Rewrite response headers — strip X-Frame-Options/CSP to allow framing |\n\n### State & Diagnostics\n\n| Tool | Description |\n|------|-------------|\n| `gdd_get_state` | Browser state: URL, title, device, auth status |\n| `gdd_get_console` | Console output and uncaught exceptions |\n| `gdd_get_network` | Network requests with timing and status |\n| `gdd_get_notifications` | Received push notifications |\n| `gdd_get_performance` | Performance metrics (JS heap, DOM nodes, FPS) |\n| `gdd_clear_logs` | Clear console and/or network logs |\n\n### Auth & Execution\n\n| Tool | Description |\n|------|-------------|\n| `gdd_quick_auth` | Auto-register and login with generated credentials |\n| `gdd_execute_js` | Execute JavaScript and return result |\n\n### Browser Storage\n\n| Tool | Description |\n|------|-------------|\n| `gdd_storage` | Read/write/clear localStorage/sessionStorage |\n| `gdd_cookies` | Read or clear browser cookies |\n\n### Help & Updates\n\n| Tool | Description |\n|------|-------------|\n| `gdd_get_manual` | Full GDD manual for AI self-learning |\n| `gdd_check_update` | Check for newer versions |\n| `gdd_update` | Download and install update (restarts GDD) |\n\n---\n\n<details>\n<summary><strong>Device Presets (22)</strong></summary>\n\n### Phones (11)\n\n| Device | Resolution | Scale | Touch |\n|--------|-----------|-------|-------|\n| iPhone SE | 375 x 667 | 2.0x | Yes |\n| iPhone 14 | 390 x 844 | 3.0x | Yes |\n| iPhone 15 Pro | 393 x 852 | 3.0x | Yes |\n| iPhone 15 Pro Max | 430 x 932 | 3.0x | Yes |\n| iPhone 16 Pro | 402 x 874 | 3.0x | Yes |\n| iPhone 16 Pro Max | 440 x 956 | 3.0x | Yes |\n| Pixel 9 | 412 x 915 | 2.625x | Yes |\n| Pixel 9 Pro | 412 x 915 | 2.625x | Yes |\n| Galaxy S24 | 360 x 780 | 3.0x | Yes |\n| Galaxy S24 Ultra | 412 x 915 | 3.0x | Yes |\n| OnePlus 12 | 412 x 915 | 3.5x | Yes |\n\n### Tablets (6)\n\n| Device | Resolution | Scale |\n|--------|-----------|-------|\n| iPad Mini | 744 x 1133 | 2.0x |\n| iPad Air | 820 x 1180 | 2.0x |\n| iPad Pro 11\" | 834 x 1194 | 2.0x |\n| iPad Pro 13\" | 1024 x 1366 | 2.0x |\n| Galaxy Tab S9 | 800 x 1280 | 2.0x |\n| Pixel Tablet | 800 x 1280 | 2.0x |\n\n### Desktops (5)\n\n| Device | Resolution | Scale |\n|--------|-----------|-------|\n| Laptop HD | 1366 x 768 | 1.0x |\n| Laptop HiDPI | 1440 x 900 | 2.0x |\n| Desktop 1080p | 1920 x 1080 | 1.0x |\n| Desktop 1440p | 2560 x 1440 | 1.0x |\n| Desktop 4K | 3840 x 2160 | 2.0x |\n\n</details>\n\n---\n\n## Architecture\n\n```text\nClient (AI agent / curl / script)\n         │ POST /mcp (JSON-RPC 2.0)\n         ▼\n    McpServer (:9700)\n    Streamable HTTP + SSE\n         │\n         ▼\n    McpToolRegistry (39 tools)\n    Player · Navigation · Interaction · Read\n    Emulation · Auth · State · Diagnostics\n         │\n         ▼\n    IPlayerManager\n    MainViewModel (WPF) / DesktopPlayerManager (Avalonia) / HeadlessPlayerManager\n         │\n         ▼\n    IBrowserEngine Instances\n    WebView2 (Win GUI)  |  Playwright (Desktop GUI + headed/headless server)\n    Each: own profile, CDP session, emulation\n```\n\n### Editions\n\nGDD 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 39 MCP tools.\n\n| | Windows GUI | Desktop GUI | Server |\n|---|---|---|---|\n| Binary | `GDD.exe` | `GDD.Desktop` | `GDD.Headless` (add `--headless` for no windows) |\n| Engine | WebView2 | Playwright (headed) | Playwright (headed/headless) |\n| UI | WPF video wall | Avalonia video wall | none — HTTP API only |\n| MCP port | 9700 | 9800 | 9700 |\n| Platforms | Windows | Linux, macOS | Windows, Linux, macOS |\n\n### Tech Stack\n\n| Layer | Technology |\n|-------|-----------|\n| Runtime | .NET 8.0 (self-contained) |\n| UI (Windows) | WPF + CommunityToolkit.Mvvm |\n| UI (Linux/macOS) | Avalonia + CommunityToolkit.Mvvm |\n| Browser (Windows GUI) | Microsoft WebView2 |\n| Browser (Desktop GUI + Server) | Microsoft Playwright |\n| Protocol | MCP (Model Context Protocol) |\n| Browser Control | Chrome DevTools Protocol (CDP) |\n| Logging | Serilog |\n\n<details>\n<summary><strong>Project Structure</strong></summary>\n\n```text\nBrowserXn.sln\n├── src/\n│   ├── GDD.Core/              ← Shared library (net8.0)\n│   │   ├── Abstractions/      ← IBrowserEngine, IPlayerManager, ...\n│   │   ├── Mcp/               ← MCP server, tools, protocol\n│   │   ├── Models/            ← Device, Location, Network presets\n│   │   ├── Services/          ← CDP, Emulation, Monitoring services\n│   │   └── Collections/       ← RingBuffer\n│   ├── BrowserXn/             ← Windows GUI (WPF + WebView2)\n│   │   ├── Engines/           ← WebView2ControlAdapter\n│   │   ├── ViewModels/        ← MVVM (MainViewModel : IPlayerManager)\n│   │   ├── Views/             ← XAML + VideoWallPanel\n│   │   └── ...\n│   ├── GDD.Desktop/           ← Linux/macOS GUI (Avalonia + Playwright)\n│   │   ├── Engines/           ← PlaywrightHeadedEngine (headed, parked off-screen)\n│   │   ├── ViewModels/        ← MainViewModel (DesktopPlayerManager)\n│   │   ├── Views/             ← AXAML + VideoWallPanel\n│   │   └── Scripts/           ← mcp-proxy.sh, setup-macos.sh, install-deps.sh\n│   └── GDD.Headless/          ← Cross-platform server (Playwright)\n│       ├── Engines/           ← PlaywrightEngine\n│       ├── Platform/          ← HeadlessPlayerManager\n│       └── Scripts/           ← mcp-proxy.sh, mcp-proxy.ps1\n└── .github/workflows/         ← CI/CD (8 build targets + auto-release)\n```\n\n</details>\n\n---\n\n<details>\n<summary><strong>Configuration</strong></summary>\n\n`appsettings.json` next to the executable:\n\n```json\n{\n  \"GDD\": {\n    \"FrontendUrl\": \"about:blank\",\n    \"BackendUrl\": \"http://localhost:8080/api/v1\",\n    \"BotToken\": \"\",\n    \"McpPort\": 9700,\n    \"DataFolderRoot\": \"\",\n    \"Stealth\": false\n  }\n}\n```\n\n| Key | Description | Default |\n|-----|-------------|---------|\n| `FrontendUrl` | Default URL for new browsers | `about:blank` |\n| `BackendUrl` | Backend API for auth service | `http://localhost:8080/api/v1` |\n| `BotToken` | Telegram bot token (for TG testing) | — |\n| `McpPort` | MCP server port (auto-fallback +1..+9) | `9700` |\n| `DataFolderRoot` | Browser profile storage root | `%LOCALAPPDATA%\\GDD\\Profiles` (Win), `~/.local/share/GDD/Profiles` (Linux/macOS) |\n| `Headed` | Visible browser windows | `true` (override with `--headless`) |\n| `Stealth` | Opt-in anti-bot masking — launches Chromium with AutomationControlled disabled and hides the usual automation tells (`navigator.webdriver`, etc.). Playwright engines (GDD.Desktop, GDD Server) only | `false` |\n\n### Command-line flags\n\n| Flag | Description |\n|------|-------------|\n| `--headed` | Visible browser windows (default) |\n| `--headless` | No UI — for CI/CD |\n| `--stealth` | Enable anti-bot masking (same as `GDD_STEALTH=true`) |\n| `--stealth-max` | Full stealth — client-hints UA metadata, WebGL/device/timezone spoofing; implies `--stealth` (same as `GDD_STEALTH_MAX=true`) |\n| `--update` | Check for a newer version and install it if available |\n| `--version` | Print the version and exit |\n| `--help` | Show usage and exit |\n\n### Environment variables\n\nHandy for Docker and CI, where an `appsettings.json` file is awkward:\n\n| Variable | Description |\n|----------|-------------|\n| `GDD_STEALTH` | `true`/`1` to enable anti-bot masking (same as `--stealth`) |\n| `GDD_STEALTH_MAX` | `true`/`1` for full stealth (same as `--stealth-max`) |\n| `GDD_PROXY` | Upstream proxy for every browser, e.g. `http://host:3128` or `socks5://host:1080` (Server / Playwright engines) |\n| `GDD_PROXY_USER` / `GDD_PROXY_PASS` | Credentials for an authenticated proxy |\n| `GDD_CHROME_CHANNEL` | Launch an installed Chrome build (e.g. `chrome`, `chrome-beta`) instead of bundled Chromium |\n| `GDD_TRACE` | `true`/`1` for verbose trace logging |\n\n</details>\n\n<details>\n<summary><strong>Building from Source</strong></summary>\n\nRequires [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0).\n\n```bash\n# Windows GUI (requires Windows 10/11 + WebView2)\ndotnet publish src/BrowserXn/BrowserXn.csproj -c Release -p:PublishSingleFile=true -o ./publish/win-gui\n\n# Cross-platform headless\ndotnet publish src/GDD.Headless/GDD.Headless.csproj -c Release -r linux-x64 --self-contained -o ./publish/linux-x64\ndotnet publish src/GDD.Headless/GDD.Headless.csproj -c Release -r osx-arm64 --self-contained -o ./publish/osx-arm64\ndotnet publish src/GDD.Headless/GDD.Headless.csproj -c Release -r win-x64 --self-contained -o ./publish/win-x64\n```\n\nChromium installs automatically on first run.\n\n</details>\n\n---\n\n## Documentation\n\n- [GDD-MANUAL.md](GDD-MANUAL.md) — Full usage manual with workflow examples\n- [GDD-ARCHITECTURE.md](GDD-ARCHITECTURE.md) — Architecture deep-dive\n- [GDD-PROMPT.md](GDD-PROMPT.md) — Claude agent instructions for MCP integration\n- [DEPLOY-RAILWAY.md](DEPLOY-RAILWAY.md) — Host GDD as a remote MCP server on Railway (behind a token-auth proxy)\n- [CONTRIBUTING.md](CONTRIBUTING.md) — Contribution guidelines\n\n## Privacy\n\n<details>\n<summary><strong>Privacy Policy</strong></summary>\n\nGDD runs **entirely on your local machine**. No telemetry, no analytics, no data collection.\n\n- **No data leaves your machine** — all browser profiles, screenshots, logs, and cookies stay in local storage\n- **Browser profiles** — stored in `%LOCALAPPDATA%\\GDD\\Profiles` (Windows) or `~/.local/share/GDD/Profiles` (Linux/macOS)\n- **No third-party services** — GDD does not contact any external APIs except GitHub Releases for optional update checks\n- **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`\n- **MCP server** — listens on `localhost` only (default port 9700), never exposed to the network\n\nContact: **[2vsmirnov@gmail.com](mailto:2vsmirnov@gmail.com)**\n\n</details>\n\n---\n\n## License\n\n**imVS©, free for personal use.**\n\nSource Available — Non-Commercial. Free for personal use, education, and research. Commercial use requires a paid license. See [LICENSE](LICENSE) for full terms.\n\nCommercial licensing: **[2vsmirnov@gmail.com](mailto:2vsmirnov@gmail.com)**\n",
  "bytes": 25247,
  "sha": "b426e2022d5dff7006eb4d565a7dd646aa11953693d1d269afafc40087a18aad",
  "repo_slug": "cap-of-tea/gdd",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_imvsmirnov_gdd_e51a4d1e/readme"
}