Preface

DeepSeek Harness (hereinafter referred to as DSH) packages models, tools, sessions, and UI as plugins, with the official slogan of “Everything is a Plugin”. In the developer preview version, agents can already read and write files, run Shell commands, and perform basic web scraping, but these capabilities are insufficient for a very common type of task: launching a real browser, reading rendered pages, clicking buttons, filling out forms, and switching between multiple tabs.

The built-in HTTP scraping tool can only obtain static responses. If a page relies on JavaScript rendering, or operations must be performed in a browser (such as logged-in backends, multi-step forms, or lists that require waiting for loading), the agent needs a persistent browser controller rather than a one-off curl tool. Several community Playwright plugins have emerged, and this article introduces dsh-playwright-browser maintained by Clizo1209: it registers 10 browser_* tools into the DSH tool registry, driving pages through semantic positioning instead of asking the model to guess long CSS selectors.

Two points need to be clarified first. First, DSH is still in developer preview, and the plugin author notes that it has been tested against the 0.1.0-rc.6 package series, and subsequent core APIs may still be incompatible. Second, the DeepSeek Harness Plugin Repository is a community directory site and has no official affiliation with DeepSeek / Fang Tian. Do not treat it as an official app store.

What is this

dsh-playwright-browser is a Playwright browser automation plugin for DSH, maintained by GitHub user Clizo1209, with the repository address at Clizo1209/dsh-playwright-browser. The directory page categorizes it under “Interface Enhancement”, with an MIT license and the main language being TypeScript. The current published version on npm is 0.1.3 (2026-08-14), and the GitHub repository currently has 8 stars.

The problem it solves can be summarized in one sentence: providing DSH agents with a reusable browser context, allowing them to operate pages using accessibility snapshots and semantic positioning, rather than stuffing the entire page DOM into the context, and not providing arbitrary JavaScript eval.

The README states that the behavioral design references Codex Browser skills, but does not include Codex runtime code, nor does it rely on OpenAI’s browser bindings. The project documentation docs/CODEX_BROWSER_DESIGN.md clearly outlines this point—only mapping interaction principles such as “persistent bindings, explicit tabs, semantic clicks, post-operation observation”, and the browser process is launched by the plugin itself using Playwright.

Core Features

Ten Native browser_* Tools

The plugin hooks 10 model-callable tools into the DSH tool registry, with names and responsibilities subject to the repository README:

Tool Function
browser_open Open a tab and navigate to a URL simultaneously
browser_navigate Navigate in an existing tab
browser_snapshot Read a limited-length accessibility or visible text snapshot
browser_click Click a semantic target
browser_fill Replace input box content, with an optional Enter key press
browser_press Send Playwright keyboard keys
browser_wait Wait for a target, URL, or loading state
browser_history Go back, forward, or refresh
browser_screenshot Save a PNG file and return the absolute path
browser_tabs List, select, or close tabs

The architecture documentation outlines a very short call chain: the profile’s cordis.patch.yml hooks the plugin entry point, which in turn contributes to both the tool registry and system prompts, while the actual browser driver is the internal BrowserController. The controller starts the browser on demand, and tabs use monotonically increasing tab-N as stable IDs.

Semantic Positioning, CSS as a Last Resort

Page interactions prioritize semantic strings rather than asking the model to construct selectors. The recommended format given in the README is as follows:

role=button|Save
button|Save
label=Email
placeholder=Search
text=Settings
testid=submit
css=#legacy-button

role=button|Save and the snapshot-friendly shorthand button|Save are the same type of positioning. Version 0.1.3 in the CHANGELOG specifically added this | shorthand, because tests showed that agents often directly copied syntax like textbox|Name from accessibility snapshots, which failed to parse in older versions. CSS is still available, but the documentation marks it as a compatibility escape hatch.

After each open, navigate, or page change operation, the tool will return a new, length-limited snapshot (default maximum 40,000 characters). The system prompt requires agents to treat page content as untrusted data: observe first, act, then observe again after acting.

Lazy Startup, Fallback Browsers, Unified Cleanup

The browser does not start as soon as the plugin is loaded. The controller will only launch the process upon the first actual call to a browser tool. When no channel/executablePath is specified, the attempt order for Chromium is:
1. Playwright-managed Chromium
2. Locally installed Google Chrome
3. Locally installed Microsoft Edge

Explicitly configured channel or executablePath takes priority. Firefox and WebKit require their corresponding Playwright browsers or a valid executable file path. Playwright Chromium can be installed with the following command:

npx playwright install chromium

Cordis will close pages, contexts, and browser processes when the plugin is uninstalled. When closing a tab, it will cooperatively cancel any unfinished operations on that page. The plugin explicitly states that it does not provide arbitrary page JavaScript evaluation, which is a clear difference from some community browser plugins.

Installation and Activation

The installation command given on the community directory page is:

dsh plugin add github:Clizo1209/dsh-playwright-browser

This command is subject to the original text on the directory page. The dsh CLI will parse the plugin from GitHub and add it to the current configuration. For reproducible installations, the directory page recommends pinning the commit hash:

dsh plugin add github:Clizo1209/dsh-playwright-browser#commit

Replace commit with the actual hash.

The repository README also provides an npm installation method suitable for scenarios where a profile has already been specified. The current package name and version are dsh-playwright-browser@0.1.3:

dsh plugin --profile web add dsh-playwright-browser

To install from a source directory package:

npm install
npm pack
dsh plugin --profile web add ./dsh-playwright-browser-0.1.3.tgz

For headless profiles, replace web with headless. After installation, you can use the following command to check the combined configuration without actually starting a session:

dsh --profile web --dump-config

Git installation will run the package’s prepare script (i.e., TypeScript build). The README warns: pnpm 10 and above may require explicit permission for this build in the profile’s pnpm-workspace.yaml; precompiled npm packages or tarballs do not need to recompile the source code in the profile.

The environment requirements are also listed in the README: Node.js ^22.19.0 or >=24.0.0, and a usable DSH profile. You only need one of the three browsers: Playwright Chromium, system Chrome/Edge, or a configured executablePath.

Both the directory page and the plugin security note emphasize: The plugin runs with the permissions of the current dsh process, and may execute code during installation. You should inspect the source code repository and license before installing.

Configuration and Usage

DSH will apply user overrides after the installed bundle patches. Add a line similar to the following to the profile’s cordis.patch.yml (the repository’s examples/cordis.patch.yml matches the README):

- id: playwright-browser
  config:
    browser: chromium
    channel: chrome
    headless: true
    viewportWidth: 1440
    viewportHeight: 900
    screenshotDir: .dsh-browser/screenshots

The configuration items listed in the README are as follows (unlisted items use default values):

Configuration Item Default Value Purpose
browser chromium chromium, firefox, or webkit
headless true Whether to run in headless mode
channel Chromium channel such as chrome, msedge
executablePath Absolute path to the browser executable
userDataDir Persistent directory dedicated to the agent
viewportWidth 1280 Viewport width
viewportHeight 800 Viewport height
actionTimeoutMs 15000 Positioning and operation timeout
navigationTimeoutMs 30000 Navigation timeout
maxSnapshotChars 40000 Maximum character count for snapshots
screenshotDir .dsh-browser/screenshots Screenshot directory

Do not point userDataDir to your daily browser configuration directory. The documentation requires using a dedicated directory for the agent; the plugin will also not access personal browser cookies, passwords, or extension status.

After installation, these tools will appear in the current session’s tool registry and be called by the model according to tasks, rather than you typing browser_click commands one by one in the terminal. A valid operation sequence aligned with the documentation design is:
1. Use browser_open to open a page (or browser_navigate to jump to an existing tab)
2. Read the returned snapshot to confirm visible controls
3. Use role=, label=, text= and other forms to browser_click or browser_fill
4. Use browser_wait when needed, or browser_screenshot to save evidence
5. Use browser_tabs to switch between multiple pages, then close them when finished

Screenshots will be saved as local PNG files, and the tool will return the absolute path. Support for image attachments varies across DSH model routes, and the caller can pass this path to existing image reading tools.

Applicable Scenarios and Notes

This tool is suitable for users who need to let agents operate JavaScript-rendered pages, complete multi-step forms, compare information across multiple tabs, or require screenshots as operation evidence. It is not a complete web security sandbox. The architecture documentation states directly: this is browser automation, and operations teams still need to add egress rules, proxies, file system controls, and account permissions according to their environment.

Before use, you should verify the following boundaries one by one:
- Only accepts http:, https:, and about: navigation; URLs with embedded usernames or passwords will be rejected.
- Page content is observational data, not instructions for the agent.
- When involving credentials, downloads, purchases, permission pop-ups, account changes, or CAPTCHAs, you must obtain proper authorization first.
- The plugin will not silently download browsers in the background; it will first explain the minimum installation steps when the environment is missing, and will not modify the machine without authorization.
- Screenshots and logs may contain page content, and should be treated as sensitive data.
- Before the project reaches 1.0, security fixes will only cover the latest released 0.x version. The current latest repository release is 0.1.3.

DSH itself is still undergoing rapid iteration, and the plugin author notes that compatibility updates may be required to follow the core version. Before installing community plugins, it is recommended to open the GitHub repository to check LICENSE, SECURITY.md, and src/ to confirm that the license (MIT) and permission model are acceptable.

Summary

dsh-playwright-browser adds a semantic, multi-tab, cancellable Playwright control surface to DSH: 10 browser_* tools, limited-length accessibility snapshots, Chrome/Edge fallback support, and an explicit promise not to perform page eval. It is a community MIT project maintained by Clizo1209, not an official bundled capability from DeepSeek.

Directory page: https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-playwright-browser/

GitHub: https://github.com/Clizo1209/dsh-playwright-browser

npm: https://www.npmjs.com/package/dsh-playwright-browser