Preface

DeepSeek Harness (dsh) is by default more like a coding agent: editing files, running shell commands, and occasionally performing online searches. Once a task becomes “open this website, click buttons, fill out forms, and preserve the login state”, relying solely on curl or headless browsers is insufficient—what is needed is a graphical browser running locally, along with an interface that can hand page operations back to the model.

Tabbit is an AI-native desktop browser. Its domestic site is tabbit.com, and its international site is tabbit.ai. Currently, installation packages for macOS and Windows are available. It comes with a Playwright CLI (tabbit-cli) and Runtime held by the browser, isolated per task. The Tabbit-Browser organization has packaged this pipeline into a DeepSeek Harness plugin: the repository is named dsh-plugin. After installing it into DSH, the agent can drive Tabbit to complete browsing tasks.

This article is organized after cross-checking with the plugin directory page, GitHub repository README, package.json, built-in Skill text, and the official DeepSeek Harness repository: what it is, what it can do after installation, how to install it, and which boundaries you should not expect it to bridge. DeepSeek Harness is currently in developer preview, with the official slogan “Everything is a plugin”; deepseek-harness-plugin.com is an independent community directory, not officially affiliated with DeepSeek / Huanfan. The installation commands below are based on the directory page and the original repository text.

What It Is

dsh-plugin is a community plugin maintained by Tabbit-Browser, with the GitHub repository Tabbit-Browser/dsh-plugin. The directory page categorizes it under “Interface Enhancement”; the npm package name in the repository is actually tabbit-browser, current version 0.1.0, and the package.json declares the MIT license (there is no separate LICENSE file in the repository root, so you should confirm against the source code yourself before installation). As of 2026-08-17, the GitHub API shows 76 stars; the directory page still shows 16 stars, so the latter is the inclusion snapshot, and the repository page shall prevail.

The problem it solves is very specific: allowing agents in DSH to control Tabbit already installed on the local machine, instead of launching Chrome, Ego, or switching to curl / bare CDP. The plugin itself does two things:
1. Automatically register a Skill named tabbit-browser with the bundle. The model can load the description using skill({ name: "tabbit-browser" }) or /tabbit-browser, without needing to install the Skill separately.
2. Register the tool tabbit_browser_install: detect the official version, verify the minimum version 1.9.0, check tabbit-cli and the Runtime; if the environment is insufficient, download the installation package for the corresponding region in the background.

Actual page operations do not use the “native browser tools” in the plugin. The README clearly states: it does not provide interfaces such as tabbit_browser_evaluate. The model calls tabbit-cli via the host’s Shell, and hands a Playwright-style JavaScript snippet into the Runtime held by the browser.

Core Features

Environment Pre-Check, Instead of Opening the Browser Directly

Before the first browsing operation in a single DSH agent session, the agent should first call tabbit_browser_install. The tool returns three states:
- ready: The local machine has an official version of at least 1.9.0, and both the tabbit-cli and Runtime processes are running. Then you also need to perform a connection probe using tabbit-cli tasks from the platform documentation, and the environment is only considered passed if the probe succeeds.
- restart-required: The version meets the requirement, but the Runtime is not running. The Skill requires only prompting the user to restart Tabbit once; the plugin will not start or restart the Runtime on its own.
- background: No official version is installed, or all installed official versions are lower than 1.9.0. The plugin will use ctx.jobs to start a background download task, write progress to the job output, and notify the absolute path of the installation package once completed.

Successful detection results will be cached within the same agent session. If the Runtime / launcher fails, the browser has just been installed or restarted, invalidate the cache with refresh: true. Do not repeat the pre-check for every small subsequent step.

Only Recognizes Two Official Versions

The detection logic is written in installer.js, and only recognizes the stable channel:
- International official version: Application name Tabbit (macOS bundle id com.tabbit-ai.Tabbit)
- Domestic official version: Application name Tabbit Browser (macOS bundle id com.tab-browser.Tabbit)

Installing either one with version >= 1.9.0 is sufficient. Development builds will not be recognized. On Windows, first check the fixed registry keys Tabbit / Tabbit Browser in the uninstall list, and scan the uninstall table if not found; on macOS, check /Applications and the user’s Applications directory. Linux is not on the detection and download list.

The path to tabbit-cli is also hardcoded:
- macOS: ~/.local/bin/tabbit-cli
- Windows: %LOCALAPPDATA%\Tabbit\LocalAgent\bin\tabbit-cli.exe

The Skill requires that the launcher must be the first token in the command line, do not wrap it with env, time, or sh -lc.

Download Installation Packages by Region When the Browser Is Missing, But Do Not Install on Behalf of the User

When no installation is detected or the version is too low, the plugin reads the system region: use defaults read -g AppleLocale on macOS, and the system region API on Windows. If the region code is CN, it uses the domestic source https://www.tabbit.com; for other regions or failed recognition, it uses the international source https://www.tabbit.ai. Installation packages are split by platform: Windows x64, macOS Apple Silicon, macOS Intel, and saved to the user’s Downloads directory.

It will verify HTTPS redirect hosts (tabbit.com and tabbit.ai under www / pkg / releases), limit the size to no more than 1 GiB, and check the MZ header of .exe or the koly footer of .dmg. It will not automatically open .dmg / .exe. When TABBIT_INSTALLER_READY appears after the job completes, tell the user the path, let them complete the system installation wizard themselves, and start Tabbit once more.

Drive Pages Using Task Spaces, Instead of Opening a New Browser Each Time

The Skill maps a single user request to a task space. The first tabbit-cli nodejs --task '...' will create an isolated Playwright runtime in the incognito-free Profile fixed to the current browser generation; subsequent calls with the same name and generation will reuse the page, globalThis, receipt, and login state. A browser restart will change the generation, and old named tasks will not be revived.

Evaluation code runs in a persistent Node environment, and you get real Playwright objects: browser, context, page, pages(), usePage(), as well as assert / expect. DOM-related logic must be placed inside page.evaluate(). There is also a frozen tabbit global on the page, providing bounded helpers such as observe(), safeClick(), and pasteText, which do not replace the native Playwright API.

The Skill divides daily operations into three workflows, which can be used in combination:
- Semantic workflow (default): For ordinary DOM pages, use locators and assertions
- Visual workflow: When canvas, maps, rich text, etc., do not match the visible editing target in the DOM, take a screenshot first then use mouse and keyboard, and perform a small probe before writing
- Page evaluation workflow: Perform compact DOM traversal or aggregation with one page.evaluate(), do not split a single calculation into multiple evaluations

When multiple Tabbit instances are open, the pre-check will still determine that the Runtime is available, and will not falsely report “not running”. The model needs to set TABBIT_PLAYWRIGHT_INSTANCE based on CLI selection errors.

Installation and Activation

First confirm that DSH is installed on the local machine. The check method from the repository README:

dsh --version

If this command does not exist, you need Node.js 20 or higher (the plugin’s engines also requires >=20), then install the CLI:

npm install -g @deepseek-ai/dsh

The quick start from the official DeepSeek repository is npx @deepseek-ai/dsh web, and the Web UI defaults to http://127.0.0.1:3080.

The original installation command on the community directory page is:

dsh plugin add github:Tabbit-Browser/dsh-plugin

The repository README states to install it into the web profile, then start the Web UI again:

dsh plugin --profile web add github:Tabbit-Browser/dsh-plugin
dsh web

The directory page reminds: the plugin runs with the permissions of the current dsh process, and may execute code during installation; if you need reproducible installation, pin the commit. As of 2026-08-17, the latest commit on the repository’s main branch is 1aa3157e3ed01641b86d7ee80da059b7140a317e, which can be written as:

dsh plugin --profile web add github:Tabbit-Browser/dsh-plugin#1aa3157e3ed01641b86d7ee80da059b7140a317e

The plugin’s declared peer dependencies include @deepseek-ai/cordis, @deepseek-ai/dsh-jobs, @deepseek-ai/dsh-skill, @deepseek-ai/dsh-tools. The README also requires that the current profile provides ctx.skills, ctx.tools, ctx.jobs, and Bash/Shell running on the host where Tabbit is located, and that this Shell can access the browser-held Runtime Service. dsh-tool-jobs needs to be able to perform background task control and completion notifications for the current Agent.

Typical Usage

After installing and starting dsh web, first let the model load the Skill, then perform the pre-check, and finally issue the tabbit-cli command.

Load the Skill:

skill({ name: "tabbit-browser" })

Or use /tabbit-browser in the chat.

Pre-check (only call before the first browsing operation in the session; use refresh if the environment changes):

tabbit_browser_install
tabbit_browser_install({ refresh: true })

The following snippet is from the built-in SKILL.md, opening the extensions page and reading the title in a task space named inspect extensions:

tabbit-cli nodejs --task 'inspect extensions' <<'EOF'
await page.goto('chrome://extensions', {waitUntil: 'domcontentloaded'});
return {title: await page.title(), url: page.url()};
EOF

The command will print a JSON, and the successful terminal result is in receipt.result.value. Values assigned to globalThis in the same task space can be reused later. Read-only probes can add --read-only:

tabbit-cli nodejs --task 'inspect extensions' --read-only <<'EOF'
globalThis.extensionCount = await page.locator('extensions-item').count();
return {extensionCount};
EOF

--foreground should only be added when the user explicitly requests to bring the task page to the foreground in the chat. --claim-tab is only used for tabs manually selected by the user. Important write operations are recommended to use a stable --request-id; do not resubmit the same code when the receipt is in queued or running, use tabbit-cli receipt to query, and use tabbit-cli checkpoint to view checkpoints after interruption.

End the task space after completion:

tabbit-cli finish --task 'inspect extensions'

By default, it will close the pages created by the task itself, and will not close tabs claimed by the user. Research, search, intermediate pages, blank pages, and error pages are not retained by default; only deliverables or pages for subsequent handover should use --keep.

Applicable Scenarios and Notes

It is suitable for users who already use Tabbit locally and want DSH agents to perform site interactions, information extraction, regression or benchmark testing. The scope described in the Skill description is: Tabbit browser automation, web interaction, extraction, QA and benchmarks, and do not silently switch to other browser backends.

It is not suitable for these situations:
- DSH’s Bash is running in E2B, a remote container, or any sandbox that cannot access the local GUI browser. The README clearly states: this Skill will not make Tabbit automation available in such environments.
- You only want to control the current Chrome tab, or need the plugin to directly expose evaluate-type tools. This package explicitly does not provide tabbit_browser_evaluate, and does not detect development builds.
- Linux. The detection and download list only includes Windows x64 and macOS.

There is another permission boundary on Windows. DSH’s read-only / workspace-write restricted tokens cannot write to the Runtime’s named pipes. The policy of the Skill and source code is: first run tabbit-cli tasks probe normally according to the default sandbox, and do not ask for permissions if it succeeds; only when the Browser, launcher, and Runtime are all detected but the connection returns BROWSER_RUNTIME_UNAVAILABLE, ask the user to change the current session to Full Permission, then immediately stop the task, do not retry or continue clicking pages. The unit test assertions in the same commit state that Windows’ cliSandboxMode is default; the README’s “Scope” section still writes that Windows returns danger-full-access, which is inconsistent with index.js, so refer to the source code and Skill.

Regarding installation security, the warning on the directory page should be taken seriously: the plugin runs with the permissions of the current dsh process, and may execute code during installation. Check the source code repository and license before installing; pin commits for production or reproducible environments. The community directory is not an official app store, and inclusion does not equal endorsement.

Summary

dsh-plugin does not implement another browser in DSH, but connects Tabbit’s own CLI and Runtime into Harness: pre-check the official version, download the installation package if necessary, reuse login states with task spaces, and hand page operations to the Playwright-style tabbit-cli.

Directory page: https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-plugin/ ; Source code: https://github.com/Tabbit-Browser/dsh-plugin