# Project export: Inspector

This document was generated by HackStack to give an AI agent context about a hackathon project. Sections are labeled with their provenance; content marked as truncated was cut to keep this document small.

## Project metadata

- Hackathon: UC Berkeley AI Hackathon 2026
- Tagline: Multi-agent Computer-use QA
- Devpost: https://devpost.com/software/inspector-23ser6
- GitHub: https://github.com/wlu03/LoopBack
- Video: https://www.youtube.com/embed/henhBbmB9KU?enablejsapi=1&hl=en_US&rel=0&start=&version=3&wmode=transparent
- Result: winner (Finalist; Hacker's Choice Award)
- Team: 3 GitHub contributor(s) — 0xwlu (31 commits), Claude Opus 4.6 (27 commits), Tiffany Yung (3 commits)

## Devpost submission (written by the team)

### Inspiration

AI coding agents made developers 100x faster, but bug rates are up 41%. The problem is simple: your agent writes the code, then hands it back to you. You launch the app, click around, find what's broken, describe the bug, and wait for a fix. You are the QA engineer. We wanted to close that loop. Let the agent see its own work, find the bugs, and fix them without a human in the middle.

### What it does

Inspector is an MCP server that gives your coding agent (Claude Code, Cursor, or any MCP client) the ability to autonomously test the app it just built. It launches your app in a cloud sandbox, uses computer-use to operate it like a real user (screenshots, element detection, clicks), and maps the UI into regions. Each region gets its own agent that tests in parallel. Findings are independently verified with 2-of-2 replay agreement, de-duplicated, and sent back as a structured fix list. The coding agent patches the code and Inspector re-verifies. It works across web, Electron, Android, and iOS through pure pixel-level interaction. Anything that renders to a screen, Inspector can test. Inspector surfaces the errors found back to the coding agent in the terminal. Additionally, from the dashboard, you can copy a prompt with full context to paste into Claude Code, or send Devin to open a PR automatically.

### How we built it

The core is a Python MCP server built on FastMCP that exposes tools like launch_app, observe, act, and verify. The architecture has three layers: the host coding agent (the brain), the Inspector control plane (eyes and hands), and sandboxed execution planes where apps run. Inside the control plane, five roles form the pipeline: a Mapper that clusters detected UI elements into bounded regions using OmniParser (YOLOv8 + Florence-2), a Coordinator that spawns one region-agent per region, the Region-Agents themselves that run hypothesis-driven testing (navigate, capture, trigger, measure), a Verifier that replays findings independently, and a Merger that de-duplicates and outputs the fix list. For execution, web and Electron apps run in E2B cloud sandboxes, Linux microVMs with a virtual desktop where Chrome is launched in app mode and interaction happens via xdotool and screenshots. Android and iOS run on local emulators on the developer's machine. All four surfaces implement one SurfaceAdapter interface, so the entire core never branches on surface type. The dashboard is a Next.js app that displays runs, findings, screenshots, and replay traces. It includes a Bug Ledger that tracks issues across runs with evidence-based status (open, verified, fixing, dismissed) and a Devin integration for automated PR creation.

### Challenges we ran into

The biggest challenge was getting the computer to traverse the UI intelligently and reliably resurface bugs. A single agent wandering the entire app would get lost, miss regions, or repeat the same actions without finding anything new. We solved this by adding a planning stage: a short session launches the app, observes the screen, and the agent decomposes the UI into different regions to test. It then dispatches agents with their own isolated sandbox to target each region independently, and finally verifies the bugs through independent replay. This turned unreliable wandering into structured, parallel, thorough coverage.

### Accomplishments we're proud of

The multi-agent region decomposition is the design decision we're most proud of. Instead of one agent wandering the entire UI, each region-agent is confined to its bounding box and can't stray. This makes testing parallel, thorough, and deterministic. The SurfaceAdapter abstraction lets us support four completely different platforms (web, Electron, Android, iOS) with zero branching in the core. The MCP tools, session manager, perception pipeline, detection engine, and loop controller are all written once. The verify-after-act pattern, where every action returns the post-action screenshot and a changed flag, gives the agent self-correction without needing a DOM. This is the single most important reliability mechanism in the system.

### What we learned

Computer-use is powerful but fragile without grounding. Raw pixel coordinate clicking fails constantly on dense UIs. Grounding-by-ID through Set-of-Mark (numbered element boxes from OmniParser) makes it reliable. The MCP protocol is a great fit for this kind of tool. Long-running operations (app builds, test loops) map cleanly onto the Tasks pattern, and the tool interface keeps Inspector composable while the host agent supplies all the reasoning.

### What's next

Making the dashboard production-ready and hosting it as a service. Right now it runs locally. We want to deploy it so teams can share runs, track bugs across projects, and manage the Devin integration from one place.

## README (from the GitHub repository)

# Inspector

![Python](https://img.shields.io/badge/python-3.12+-blue.svg)
![MCP](https://img.shields.io/badge/protocol-MCP-6f42c1.svg)
![Surfaces](https://img.shields.io/badge/surfaces-web%20%7C%20electron%20%7C%20android%20%7C%20ios-0aa.svg)
![Status](https://img.shields.io/badge/status-building-orange.svg)
![Tests](https://img.shields.io/badge/tests-100%2B-green.svg)
![License](https://img.shields.io/badge/license-MIT-green.svg)

**An MCP server that lets your coding agent see, click, and test the app it just built, then hand back reproducible findings so it can fix bugs on its own. Works on web, Electron, Android, and iOS.**

Inspector plugs into Claude Code, Cursor, or any MCP coding agent. It spins up a sandbox, launches your app with your own dev command, and gives the agent real eyes and hands: screenshot, find the element, click, verify. One loop, every surface.

## What makes it good

- **One loop for every surface.** A single `SurfaceAdapter` runs the same observe, act, verify loop on web, Electron, Android, and iOS. Pixel-level computer-use reaches canvas, WebGL, and native UI that DOM selectors can't touch.
- **Clicks that land.** Cheap element detection numbers every interactive element (Set-of-Mark). The agent picks an id, Inspector clicks it. No more misfired coordinate guesses.
- **Hard evidence, not vibes.** `audit_dom` runs axe-core over the live DOM for real pass/fail on accessibility, broken images, and unlabeled inputs, while vision still catches the visual breakage the DOM hides.
- **Findings point at your code.** Every bug ties back to `file:line` with a repro trail, so the agent goes straight to the fix.
- **Built to break things.** Three rounds of planning and a per-feature attack catalog push edge inputs, double-submits, keyboard nav, bad routes, and mobile overflow. The goal is to break the app, not confirm it works.
- **Safe and reproducible.** Apps run in isolated VMs with full lifecycle. Every run writes a trace that replays as HTML and video, and findings move `open` to `fixed` to `verified`.

## How it compares

| | Raw computer-use | Browser agents | Playwright-class | **Inspector** |
|---|:--:|:--:|:--:|:--:|
| Web | ✅ | ✅ | ✅ | ✅ |
| Electron / native mobile | ⚠️ | ❌ | ❌ | ✅ one loop |
| Canvas / WebGL / pixel-only UI | ✅ | ✅ | ❌ | ✅ |
| Deterministic checks (axe, console) | ❌ | ❌ | ✅ | ✅ |
| Sees visual breakage | ✅ | ✅ | ❌ | ✅ |
| Precise clicks | ❌ | ❌ | ✅ | ✅ |
| Findings link to source | ❌ | ❌ | ❌ | ✅ |
| Reproducible replay | ❌ | ❌ | ✅ | ✅ |
| Adversarial by default | ❌ | ❌ | ⚠️ | ✅ |
| Isolated sandbox | ❌ | ⚠️ | ⚠️ | ✅ |

## Status

Web is live and proven end to end. Pure-Python core with 13+ MCP tools, `audit_dom`, adversarial planning, and findings plus replay (100+ tests). Electron is one refactor out; Android and iOS adapters are in progress. All four surfaces are in scope as a personal dev tool (no hosting or payments yet).

## Quickstart

```bash
pip install -e ".[dev]"     # runtime plus dev tools
cp .env.example .env        # set REPLICATE_API_TOKEN; E2B_API_KEY optional
inspector-mcp doctor        # verify env and keys
inspector-mcp serve         # run the MCP server (stdio)
pytest -q                   # unit tests
```

## Layout

```
inspector/     # core plus adapters (web, electron, android, ios) plus perception
infra/         # how each VM is provisioned
examples/      # one buggy sample app per surface
docs/          # design docs 01 through 13
scripts/       # run helpers, doctor, probes
```

## Docs

Full design docs live in [`docs/`](docs/), covering vision, architecture, the MCP contract, the core loop, detection, data schema, roadmap, and the agentic test loop. Start with [01. Vision & Strategy](docs/01-vision-and-strategy.md) and [08. Build Plan](docs/08-roadmap.md). See [TESTING.md](TESTING.md) to validate with a real Claude Code agent.


## Detected evidence (automated analysis)

Indexed codebase: 258 recognized source files, 981 KB.
- Anthropic (technology) — detected in the code
- C (language) — detected in the code
- CSS (language) — detected in the code
- Dart (language) — detected in the code
- HTML (language) — detected in the code
- Java (language) — detected in the code
- JavaScript (language) — detected in the code
- Kotlin (language) — detected in the code
- Next.js (technology) — detected in the code
- Python (language) — detected in the code
- React (technology) — detected in the code
- Swift (language) — detected in the code
- Tailwind CSS (technology) — detected in the code
- TypeScript (language) — detected in the code
- AI coding agent: Claude Code — evidence: config files committed to the repository; commit authorship or trailers
- AI coding agent: Codex — evidence: config files committed to the repository

## Codebase structure (from repository index)

### Files (120 of 321)

```
.devin/wiki.json
.env.example
.github/ISSUE_TEMPLATE/bug_report.md
.github/ISSUE_TEMPLATE/feature_request.md
.github/PULL_REQUEST_TEMPLATE.md
.github/workflows/ci.yml
.gitignore
.mcp.json.example
benchmarks/manifests/fetch-demo-app.sh
benchmarks/manifests/super-productivity.json
CHANGELOG.md
CONTRIBUTING.md
docs/01-vision-and-strategy.md
docs/02-architecture.md
docs/03-mcp-contract.md
docs/04-core-loop.md
docs/05-detection-and-feedback.md
docs/06-data-schema.md
docs/07-dashboard.md
docs/08-roadmap.md
docs/09-risks-and-open-questions.md
docs/10-research-notes.md
docs/11-implementation-steps.md
docs/12-accounts-and-services.md
docs/13-agentic-test-loop.md
docs/14-ios-macos-adapter-plan.md
docs/15-multi-agent-bug-finding.md
docs/16-devin-integration.md
docs/index.md
docs/tool-reference.md
examples/sample-buggy-android-native/.gitignore
examples/sample-buggy-android-native/app/build.gradle
examples/sample-buggy-android-native/app/src/main/AndroidManifest.xml
examples/sample-buggy-android-native/app/src/main/java/com/inspector/sample/MainActivity.java
examples/sample-buggy-android-native/app/src/main/res/layout/activity_main.xml
examples/sample-buggy-android-native/build.gradle
examples/sample-buggy-android-native/gradle.properties
examples/sample-buggy-android-native/gradle/wrapper/gradle-wrapper.properties
examples/sample-buggy-android-native/gradlew
examples/sample-buggy-android-native/gradlew.bat
examples/sample-buggy-android-native/README.md
examples/sample-buggy-android-native/settings.gradle
examples/sample-buggy-android/android/.gitignore
examples/sample-buggy-android/android/app/build.gradle
examples/sample-buggy-android/android/app/debug.keystore
examples/sample-buggy-android/android/app/proguard-rules.pro
examples/sample-buggy-android/android/app/src/debug/AndroidManifest.xml
examples/sample-buggy-android/android/app/src/main/AndroidManifest.xml
examples/sample-buggy-android/android/app/src/main/java/com/inspector/samplebuggyandroid/MainActivity.kt
examples/sample-buggy-android/android/app/src/main/java/com/inspector/samplebuggyandroid/MainApplication.kt
examples/sample-buggy-android/android/app/src/main/res/drawable/ic_launcher_background.xml
examples/sample-buggy-android/android/app/src/main/res/drawable/rn_edit_text_material.xml
examples/sample-buggy-android/android/app/src/main/res/values-night/colors.xml
examples/sample-buggy-android/android/app/src/main/res/values/colors.xml
examples/sample-buggy-android/android/app/src/main/res/values/strings.xml
examples/sample-buggy-android/android/app/src/main/res/values/styles.xml
examples/sample-buggy-android/android/build.gradle
examples/sample-buggy-android/android/gradle.properties
examples/sample-buggy-android/android/gradle/wrapper/gradle-wrapper.properties
examples/sample-buggy-android/android/gradlew
examples/sample-buggy-android/android/gradlew.bat
examples/sample-buggy-android/android/settings.gradle
examples/sample-buggy-android/App.js
examples/sample-buggy-android/app.json
examples/sample-buggy-android/bugs.json
examples/sample-buggy-android/BUGS.md
examples/sample-buggy-android/package.json
examples/sample-buggy-android/README.md
examples/sample-buggy-app/bugs.json
examples/sample-buggy-app/index.html
examples/sample-buggy-app/main.js
examples/sample-buggy-app/package.json
examples/sample-buggy-app/README.md
examples/sample-buggy-app/styles.css
examples/sample-buggy-counter/bugs.json
examples/sample-buggy-counter/index.html
examples/sample-buggy-counter/main.js
examples/sample-buggy-counter/package.json
examples/sample-buggy-counter/renderer.js
examples/sample-buggy-electron/bugs.json
examples/sample-buggy-electron/BUGS.md
examples/sample-buggy-electron/index.html
examples/sample-buggy-electron/main.js
examples/sample-buggy-electron/package.json
examples/sample-buggy-electron/preload.js
examples/sample-buggy-electron/README.md
examples/sample-buggy-electron/renderer.js
examples/sample-buggy-flutter/.gitignore
examples/sample-buggy-flutter/.metadata
examples/sample-buggy-flutter/analysis_options.yaml
examples/sample-buggy-flutter/bugs.json
examples/sample-buggy-flutter/BUGS.md
examples/sample-buggy-flutter/ios/.gitignore
examples/sample-buggy-flutter/ios/Flutter/AppFrameworkInfo.plist
examples/sample-buggy-flutter/ios/Flutter/Debug.xcconfig
examples/sample-buggy-flutter/ios/Flutter/Release.xcconfig
examples/sample-buggy-flutter/ios/Runner.xcworkspace/contents.xcworkspacedata
examples/sample-buggy-flutter/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
examples/sample-buggy-flutter/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
examples/sample-buggy-flutter/ios/Runner/AppDelegate.swift
examples/sample-buggy-flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
examples/sample-buggy-flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
examples/sample-buggy-flutter/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
examples/sample-buggy-flutter/ios/Runner/Base.lproj/LaunchScreen.storyboard
examples/sample-buggy-flutter/ios/Runner/Base.lproj/Main.storyboard
examples/sample-buggy-flutter/ios/Runner/Info.plist
examples/sample-buggy-flutter/ios/Runner/Runner-Bridging-Header.h
examples/sample-buggy-flutter/ios/Runner/SceneDelegate.swift
examples/sample-buggy-flutter/ios/RunnerTests/RunnerTests.swift
examples/sample-buggy-flutter/lib/main.dart
examples/sample-buggy-flutter/pubspec.lock
examples/sample-buggy-flutter/pubspec.yaml
examples/sample-buggy-flutter/README.md
examples/sample-buggy-flutter/test/widget_test.dart
examples/sample-buggy-ios/bugs.json
examples/sample-buggy-ios/BUGS.md
examples/sample-buggy-ios/project.yml
examples/sample-buggy-ios/README.md
examples/sample-buggy-ios/run.sh
examples/sample-buggy-ios/Sources/AboutView.swift
[201 more files omitted for size]
```

### Dependencies

- examples/sample-buggy-android/package.json: expo@~53.0.0, react@19.0.0, react-native@0.79.2
- examples/sample-buggy-app/package.json: vite@^5.0.0
- examples/sample-buggy-counter/package.json: electron@^33.0.0
- examples/sample-buggy-electron/package.json: electron@^33.0.0
- examples/sample-buggy-web/package.json: vite@^5.4.0
- pyproject.toml: anthropic@>=0.40, e2b-desktop@>=2.0, fastmcp@==3.4.4, httpx@>=0.27, inspector-mcp[e2b,anthropic], pillow@>=10.0, pydantic@>=2.0, pytest@>=8.0, python-dotenv@>=1.0, replicate@>=0.25, ruff@>=0.5, websocket-client@>=1.7
- web/package.json: @tailwindcss/postcss@^4, @types/node@^20, @types/react@^19, @types/react-dom@^19, eslint@^9, eslint-config-next@16.2.9, framer-motion@^12.40.0, next@16.2.9, react@19.2.4, react-dom@19.2.4, tailwindcss@^4, typescript@^5

### Recent commits (newest first)

- refactor: remove dead launch/readiness.py module
- docs: rewrite README to be shorter and add badges
- Merge pull request #17 from wlu03/phase-6-docs
- docs: add MkDocs Material site config over docs/ + the tool reference
- docs: add .devin/wiki.json to steer the DeepWiki page hierarchy
- docs: fix README drift (tool count, test count, verify->check, doc index)
- docs: generate the MCP tool reference from the server
- Merge pull request #16 from wlu03/research-eval
- Merge pull request #15 from wlu03/phase-2a-contract
- eval: make sample-buggy-app scoreable (semantic judge + fixture contract)
- eval: score the system under test (test_app or test_feature)
- eval: one-to-one bipartite matching of findings to bugs
- contract: typed output schemas for the core tools
- contract: rename verify -> check, three-valued status
- contract: raise a real MCP ToolError on unexpected tool failure
- contract: use non-deprecated local_provider.remove_tool for profile gating
- contract: reduce the default tool surface via INSPECTOR_PROFILE
- contract: add server-level usage instructions
- contract: correct tool annotations (honest read-only / write / open-world)
- Merge pull request #13 from wlu03/phase-2b-security

## Key source files (fetched from GitHub, selected and truncated for size)

### SECURITY.md

```markdown
# Security Policy

Inspector drives real applications and can spawn sandboxes, read repository paths,
and (optionally) run dev commands, so we take security reports seriously.

## Reporting a vulnerability

**Please do not report security vulnerabilities through public GitHub issues.**

Use GitHub's private vulnerability reporting on this repository
(**Security → Report a vulnerability**). Include a description, reproduction steps,
the affected version/commit, and the impact. We aim to acknowledge within a few days
and will keep you updated through the fix.

## Known hardening in progress

Inspector is pre-1.0 and actively being hardened. Current caveats:

- **HTTP transport has no authentication yet.** Non-loopback binds are refused; run
  on `127.0.0.1` and front it with an authenticated proxy/tunnel.
- **`execution=local` runs the app on the host** with no sandbox isolation. Prefer
  the sandboxed planes for untrusted apps.
- **`repo_path` and `dev_command` are powerful.** Only point Inspector at
  repositories and commands you trust.

The roadmap's security phase tracks the full plan (auth, path canonicalization,
command restriction, deterministic sandbox teardown).

```

### CONTRIBUTING.md

```markdown
# Contributing to Inspector

Thanks for helping improve Inspector — an MCP server that lets a coding agent see,
operate, and test the app it just built, across web, Electron, Android, and iOS.

## Development setup

```bash
python -m venv .venv && . .venv/bin/activate
pip install -e ".[dev]"        # runtime + pytest + ruff
cp .env.example .env           # add keys only if you run cloud surfaces
pytest -q                      # pure unit tests (no cloud SDKs needed)
ruff check inspector tests
```

Heavy SDKs (fastmcp / e2b / replicate / anthropic) are lazy-imported, so the package
and the pure tests run with only `pydantic` + `pillow`.

## Workflow

- Branch off `main` (`fix/…`, `feat/…`, `chore/…`).
- Keep changes focused; add or update tests for behavior you change.
- Run `pytest -q` and `ruff check inspector tests` before opening a PR.
- Describe **what** changed, **why**, and **how you verified it** in the PR.

## Conventions

- Python ≥ 3.12, fully typed. Ruff is the linter/formatter of record.
- Match the surrounding code's naming and comment density.
- Never commit secrets, personal paths, or large third-party apps. Demo apps are
  fetched on demand — see `benchmarks/manifests/`.

## Reporting

- Functional bugs → open a GitHub issue (bug template).
- Security vulnerabilities → **do not** open a public issue; see [SECURITY.md](SECURITY.md).

```

### pyproject.toml

```
[project]
name = "inspector-mcp"
version = "0.1.0a1"
description = "An MCP server that lets a coding agent see, operate, and test the app it built — across web, Electron, Android, and iOS — via pure computer-use."
readme = "README.md"
license = "MIT"
license-files = ["LICENSE"]
requires-python = ">=3.12"
authors = [{ name = "Wesley Lu" }]
keywords = ["mcp", "model-context-protocol", "testing", "qa", "computer-use", "agent", "electron", "android", "ios"]
classifiers = [
  "Development Status :: 3 - Alpha",
  "Intended Audience :: Developers",
  "Programming Language :: Python :: 3.12",
  "Programming Language :: Python :: 3.13",
  "Operating System :: OS Independent",
  "Topic :: Software Development :: Testing",
  "Topic :: Software Development :: Quality Assurance",
]
dependencies = [
  # Pinned to the tested FastMCP (the 2.x→3.x line moves fast; FastMCP itself
  # recommends exact pins for servers). Bump deliberately + re-run the suite.
  "fastmcp==3.4.4",
  "pydantic>=2.0",
  "httpx>=0.27",
  "pillow>=10.0",
  "python-dotenv>=1.0",
  "replicate>=0.25",        # OmniParser detector (Set-of-Mark grounding) — the default detector
  "websocket-client>=1.7",  # CDP console/network capture for web/Electron
]

[project.optional-dependencies]
# E2B is the OPTIONAL isolated sandbox plane for web/Electron. NOT required to start —
# without it, web/Electron run locally (execution=local).
e2b = ["e2b-desktop>=2.0"]
# Optional autonomous-autopilot brain (the host coding agent is the brain by default).
anthropic = ["anthropic>=0.40"]
# Development tooling only.
dev = ["pytest>=8.0", "ruff>=0.5"]
# All optional RUNTIME add-ons (sandbox + autopilot brain). Does NOT pull dev tools.
all = ["inspector-mcp[e2b,anthropic]"]

[project.urls]
Homepage = "https://github.com/wlu03/Inspector"
Repository = "https://github.com/wlu03/Inspector"
Issues = "https://github.com/wlu03/Inspector/issues"

[project.scripts]
inspector-mcp = "inspector.cli:main"
inspector = "inspector.cli:main"

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.hatch.build.targets.wheel]
packages = ["inspector"]

[tool.pytest.ini_options]
# Only collect the real suite — keeps pytest from importing scripts/test_*.py helpers
# (which run project-detection at import and aren't tests).
testpaths = ["tests"]

[tool.ruff]
line-length = 100
target-version = "py312"

```

### web/package.json

```
{
  "name": "web",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "eslint"
  },
  "dependencies": {
    "framer-motion": "^12.40.0",
    "next": "16.2.9",
    "react": "19.2.4",
    "react-dom": "19.2.4"
  },
  "devDependencies": {
    "@tailwindcss/postcss": "^4",
    "@types/node": "^20",
    "@types/react": "^19",
    "@types/react-dom": "^19",
    "eslint": "^9",
    "eslint-config-next": "16.2.9",
    "tailwindcss": "^4",
    "typescript": "^5"
  }
}

```

### examples/sample-buggy-app/package.json

```
{
  "name": "sample-buggy-app",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite"
  },
  "devDependencies": {
    "vite": "^5.0.0"
  }
}

```

### examples/sample-buggy-counter/package.json

```
{
  "name": "sample-buggy-counter",
  "private": true,
  "version": "0.0.0",
  "main": "main.js",
  "scripts": {
    "dev": "electron ."
  },
  "devDependencies": {
    "electron": "^33.0.0"
  }
}

```

### examples/sample-buggy-electron/package.json

```
{
  "name": "sample-buggy-electron",
  "private": true,
  "version": "0.0.0",
  "main": "main.js",
  "scripts": {
    "dev": "electron ."
  },
  "devDependencies": {
    "electron": "^33.0.0"
  }
}

```

### examples/sample-buggy-web/package.json

```
{
  "name": "sample-buggy-web",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  },
  "devDependencies": {
    "vite": "^5.4.0"
  }
}

```

### examples/sample-buggy-android/package.json

```
{
  "name": "sample-buggy-android",
  "private": true,
  "version": "0.0.0",
  "main": "node_modules/expo/AppEntry.js",
  "scripts": {
    "start": "expo start",
    "android": "expo run:android",
    "ios": "expo run:ios"
  },
  "dependencies": {
    "expo": "~53.0.0",
    "react": "19.0.0",
    "react-native": "0.79.2"
  }
}

```

### infra/android-redroid/docker-compose.yml

```yaml
# Redroid (Android-in-a-container) for the Inspector Android surface.
# Host prereq: binder_linux + ashmem_linux kernel modules — run ./setup-host.sh first.
services:
  redroid:
    image: redroid/redroid:12.0.0_64only-latest
    privileged: true
    ports:
      - "5555:5555"            # adb
    volumes:
      - ./data:/data           # persist installed apps/state (drop for ephemeral CI)
    command:
      - androidboot.redroid_width=1080
      - androidboot.redroid_height=1920
      - androidboot.redroid_dpi=420
      - androidboot.redroid_gpu_mode=guest   # software render; use 'host' if a GPU is available

```

[239 more indexed source files omitted to keep this export small. The full file list is in the Codebase structure section above.]