APP

Reference bridge: Puppeteer

Reference implementation of the Puppeteer bridge โ€” Node + puppeteer-core + Chrome for Testing for headful browser automation, multi-window, per-tab CDP screencast recording.

Reference bridge: Puppeteer
๐Ÿ’ฌ Sample prompts Paste any of these into Claude Code to use this app
Read puppeteer bridge source Download the puppeteer-bridge zip from the wiki and walk me through server.js
Add a browser verb Help me add a new browser_extract_pdfs verb to the puppeteer bridge
Open a window in pup adom-desktop browser_open_window with a test URL
Record a tab Record a 30-second video of a pup tab via browser_record_start/stop
Understand sessions Explain how pup session profiles isolate cookies + IndexedDB
โšก Open this app

Paste this into Claude Code (VS Code panel, Adom editor, or terminal) to install:

Open the Adom Wiki page for the "Reference bridge: Puppeteer" app at https://wiki-ufypy5dpx93o.adom.cloud/wiki/apps/adom-desktop-puppeteer-bridge and tell me how to use it.

Reference bridge: Puppeteer

Source code + contributing (2026-05)

The Puppeteer (Chrome) bridge moved out of adom-inc/adom-desktop's monorepo into its own dedicated repo so the community can extend it without coordinating with Adom Desktop's release cycle.

Where the source lives

The canonical repo is adom-inc/adom-bridge-puppeteer on GitHub. It's private today and will go public after a review pass.

In the meantime, the full source โ€” code, history, contributing guide, license โ€” is mirrored on this wiki page:

DownloadWhat it isHow to use
adom-bridge-puppeteer-source.tar.gzClean source tree, no .git directory. ~98 KB.tar xzf adom-bridge-puppeteer-source.tar.gz && cd adom-bridge-puppeteer/
adom-bridge-puppeteer.bundleGit bundle with full commit history. ~157 KB.git clone https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop-puppeteer-bridge/adom-bridge-puppeteer.bundle adom-bridge-puppeteer && cd adom-bridge-puppeteer && git log

No GitHub account needed to download either โ€” both URLs are public.

How to contribute

We accept community improvements. Most useful targets right now:

  • macOS / Linux ports โ€” bridge currently Windows-only; cross-platform PRs welcome.
  • New browser-automation verbs โ€” Puppeteer surface is big; we wrap a useful subset. Add more if you need them.
  • Recording features โ€” desktop recorder is new (v1.8.x); plenty of polish room (annotations, audio, GIF export).

Two contribution paths, depending on your access:

With a GitHub account (preferred): wait until we make the repo public, then fork on GitHub and open a PR. We're aiming to flip the repo public in the next maintenance pass.

Without GitHub access (patch-by-email-style, available right now): Clone the bundle, make your changes, generate a patch with git format-patch origin/main..HEAD --stdout > my-changes.patch, and email it to [email protected]. Adom maintainers will review and apply.

See CONTRIBUTING.md inside the tarball/bundle for the full PR + ship workflow.

How shipping works after merge

  1. Maintainer merges your PR into main
  2. Maintainer tags v<X.Y.Z> + runs bash scripts/release-bridge.sh puppeteer on their box
  3. New zip + manifest published to this wiki page (replaces current version)
  4. Every Adom Desktop install running v1.7.19+ auto-picks up your change within 4 hours OR immediately via adom-desktop refresh_bridges

No NSIS installer rebuild required. Your code reaches real users in ~30s after merge.

License

MIT โ€” see the LICENSE file in the tarball.


The Puppeteer bridge is one of three reference implementations bundled with Adom Desktop. It wraps puppeteer-core + Chrome for Testing to give Docker-side Claude full headful browser automation on the user's desktop โ€” multi-window, multi-tab, file uploads, network interception, video recording.

If you're authoring a new third-party bridge, see the bridge SDK guide first. Use this page when you want to see how a Node-based bridge is wired.

Quick facts

Namepuppeteer
DisplayPuppeteer (Chrome for Testing)
Spawn kindNode (server.js)
Port8851
Verb prefixesbrowser_*, desktop_recorder_*, desktop_record_* (22 verbs)
Source zippuppeteer-bridge-v1.0.0.zip
Manifestpuppeteer-bridge-manifest.json
User-facing skillpup-SKILL.md

What it does

  • Sessions + tabs โ€” browser_open_window spawns Chrome for Testing with a per-session profile (cookies, IndexedDB, localStorage isolated). browser_open_tab / browser_close_tab manage tabs within a session.
  • Navigation + introspection โ€” browser_navigate, browser_back/forward/reload, browser_screenshot (full-page or viewport), browser_evaluate (run JS, return result).
  • Input synthesis โ€” browser_click, browser_type, browser_press_key, browser_input_dispatch (low-level CDP Input.dispatchKeyEvent for cases where typing through React state handlers fails).
  • Recording โ€” browser_record_start per-tab via CDP Page.startScreencast, desktop_record_start for full-desktop via getDisplayMedia + MediaRecorder in a hidden Chrome window.
  • Network capture โ€” browser_fetch_url runs fetch() from inside the page context (uses session cookies); useful for endpoints that gate by SameSite/CORS.

bridge.json

{
  "manifest_version": 1,
  "name": "puppeteer",
  "displayName": "Puppeteer (Chrome for Testing)",
  "version": "1.0.0",
  "description": "Headful browser automation via puppeteer-core + Chrome for Testing. Multi-window, multi-tab, recording, file uploads, network interception.",
  "homepage": "https://github.com/adom-inc/adom-desktop",
  "author": "Adom Inc.",
  "license": "MIT",
  "spawn": {
    "kind": "node",
    "entrypoint": "server.js",
    "port": 8851,
    "healthEndpoint": "http://127.0.0.1:8851/status",
    "stopMethod": "kill",
    "killImageName": "node.exe"
  },
  "verbPrefixes": ["browser_", "desktop_recorder_", "desktop_record_"],
  "verbs": [
    "browser_open_window", "browser_open_tab", "browser_close_tab", "browser_close_window",
    "browser_navigate", "browser_back", "browser_forward", "browser_reload",
    "browser_click", "browser_type", "browser_press_key",
    "browser_screenshot", "browser_evaluate", "browser_fetch_url",
    "browser_input_dispatch",
    "browser_record_start", "browser_record_stop", "browser_record_status", "browser_record_list",
    "desktop_recorder_open", "desktop_record_start", "desktop_record_stop"
  ],
  "dependencies": { "node": ">=20", "chrome": ">=120" },
  "category": "Browser Automation",
  "tags": ["puppeteer", "chrome", "headful", "recording"]
}

Note: verbPrefixes is an array with THREE entries (browser_*, desktop_recorder_*, desktop_record_*). One bridge can own multiple prefixes.

Architecture highlights

puppeteer/
โ”œโ”€โ”€ server.js              โ† HTTP entry point; routes /command โ†’ handler functions
โ”œโ”€โ”€ credential_vault.js    โ† Per-session cookie/storage isolation
โ”œโ”€โ”€ adom-icon.svg          โ† Window icon for spawned Chrome instances
โ””โ”€โ”€ (npm install lays down node_modules + puppeteer-core)

The bridge intentionally keeps minimal on-disk state โ€” puppeteer-core does the heavy lifting and Chrome for Testing is downloaded into ~/.cache/puppeteer/ on first run. The bridge code itself is one large server.js (~2k lines) using http.createServer for the JSON-over-HTTP dispatch layer (same shape as the hello sample, just more handlers).

Session model

# Open a window for session "design-review" with its own Chrome profile
adom-desktop browser_open_window '{"sessionId":"design-review","profile":"design-review","url":"https://staging.example.com"}'

# Add a tab in the same window
adom-desktop browser_open_tab '{"sessionId":"design-review","url":"https://staging.example.com/cart"}'

# Screenshot the active tab
adom-desktop browser_screenshot '{"sessionId":"design-review"}'

# Evaluate JS in the page (returns the resolved value)
adom-desktop browser_evaluate '{"sessionId":"design-review","expr":"document.querySelectorAll(\"button\").length"}'

# Close the whole window when done
adom-desktop browser_close_window '{"sessionId":"design-review"}'

The sessionId is the persistence key โ€” close + reopen the same session and you get the cookies + localStorage from before. profile defaults to the sessionId but can be shared across sessions for IndexedDB / login state sharing.

Recording example

# Per-tab recording โ†’ CDP screencast โ†’ JPEG frames โ†’ ffmpeg-mux'd tar on stop
adom-desktop browser_record_start '{"sessionId":"design-review","tabId":"tab-1","fps":30}'
# โ€ฆ drive the page โ€ฆ
adom-desktop browser_record_stop '{"recordingId":"rec-tab-โ€ฆ"}'

# Full-desktop recording โ†’ hidden Chrome window with getDisplayMedia + MediaRecorder โ†’ WebM
adom-desktop desktop_recorder_open
adom-desktop desktop_record_start '{"reason":"Demoing the alignment dialog flow","monitor":"primary"}'
# โ€ฆ drive the desktop โ€ฆ
adom-desktop desktop_record_stop

Reason is required for desktop recording so the user always knows why the recorder activated โ€” it's shown in the HUD panel that opens.

Reference: install the source locally to read

curl -L https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop/puppeteer-bridge-v1.0.0.zip -o /tmp/puppeteer-bridge.zip
mkdir -p /tmp/puppeteer-bridge && cd /tmp/puppeteer-bridge && python3 -c "import zipfile; zipfile.ZipFile('/tmp/puppeteer-bridge.zip').extractall()"
ls -la

Open server.js to see the dispatch shape, recorder lifecycle, and per-session profile management.

Related

GZ
adom-bridge-puppeteer-source.tar.gz 5 days ago
Source tarball โ€” git archive of adom-inc/adom-bridge-puppeteer@main (working tree, no .git)
v1.8.31: source archive of the now-independent bridge repo, for community fork + contribution. No GitHub account required to read.John Lauer ยท 5 days ago
97.3 KB
BUND
adom-bridge-puppeteer.bundle 5 days ago
Git bundle โ€” full history of adom-inc/adom-bridge-puppeteer (use: git clone <bundle> <dir>)
v1.8.31: git bundle of the bridge repo with full commit history. Clone via: git clone https://wiki-ufypy5dpx93o.adom.cloud/static/apps/adom-desktop-puppeteer-bridge/adom-bridge-puppeteer.bundle <dir>John Lauer ยท 5 days ago
156.9 KB

Sub-Skills
?
What are Sub-Skills?

Sub-skills are community-contributed AI skill extensions for this component. They teach AI assistants about specific tools, configurators, or workflows.

Examples:

  • A manufacturer’s configuration tool for a motor controller
  • A community-written design guide for an amplifier circuit
  • An automated test/validation script for a sensor module

How to add one: Click Add Sub-Skill, provide the URL to your skill and a brief description. Submissions are reviewed by the Adom team before going live.

No sub-skills yet. Be the first to contribute one!

๐Ÿ”Ž How Claude finds this page (discovery snippet)

This page opts into Adom Wiki auto-discovery. When a user working in Claude Code mentions any of the trigger phrases below, Claude can proactively suggest this page. The pitch is exactly what Claude will say.

Pitch
"Reference implementation of the Puppeteer bridge โ€” Node + puppeteer-core + Chrome for Testing for headful browser automation. Multi-window, multi-tab, per-session profile isolation, per-tab CDP screencast recording, full-desktop MediaRecorder capture."
Triggers
"puppeteer bridge", "pup bridge", "puppeteer bridge source", "chrome automation bridge", "puppeteer-core", "chrome for testing", "browser_open_window", "browser_screenshot", "browser_record_start", "desktop_record_start", "pup session profile", "headful chrome", "browser bridge source", "fork the pup bridge", "node bridge example"

Recent activity

9 commits