Preface

DeepSeek Harness (dsh) is an open-source agent runtime developed by DeepSeek AI, with its architectural slogan being “Everything is a plugin”. Model adapters, tools, persistence, Agent loops, and even the Web UI itself are all mounted on Cordis as plugins. The quickest way to experience it from the official repository is to install Node.js and run:

npx @deepseek-ai/dsh web

The service listens on http://127.0.0.1:3080 by default. On desktop browsers, the interface uses a three-column layout: sessions/files on the left, chat interface in the middle, and details panel on the right. Dragging with the mouse works fairly well; but when you open the same page on a mobile phone, the sidebar, settings popup, trace table, and bottom statistics will crowd together, and the input tool bar is prone to wrapping into two rows.

The community plugin dsh-client-ui-mobile-adapt was created to solve this problem. Its maintainer Hotsteel2901 wrote directly in the repository: for developers coding in Android Termux, this plugin converts the three-column desktop layout into a single-column view. It does not modify the core of dsh, only adjusts the client layout under narrow viewports.

Two points need clarification before proceeding. First, DeepSeek Harness is currently in developer preview, and the official README explicitly notes that there will be breaking changes. Second, the plugin directory deepseek-harness-plugin.com is an independent community site with no official affiliation to DeepSeek / HyperMind, and should not be treated as an official app store.

What it is

dsh-client-ui-mobile-adapt is a UI enhancement client plugin maintained by Hotsteel2901, licensed under MIT, with the current repository version 0.1.0. Both the directory page and GitHub repository show 8 stars.

The problem it solves is specific: the default Web GUI is designed for a three-column desktop layout, which works poorly on mobile phones. The plugin switches to a full-width middle column when max-width: 768px, converts the sidebar into a left-side drawer, forces the input tool bar to a single row, and turns settings and trace details into scrollable full-screen or floating panels. When the viewport is wider than this threshold, the desktop layout remains unchanged.

From package.json, it declares dsh.client (platform: web) in the official client plugin format, and also includes dsh.bundle.patch, so it can be used either as a regular client plugin injection or mounted as part of a profile bundle. The entry point is lib/index.js (which is almost empty on the host side), while the actual logic runs in the browser via lib/client.js.

Peer dependencies are pinned to the 0.1.0-rc.6 client package generation of DeepSeek Harness, including @deepseek-ai/dsh-client-runtime, dsh-client-ui-slots, dsh-client-ui-layout, dsh-client-locale, and @deepseek-ai/cordis. The README also notes that the CSS class names correspond to the CSS Modules hashes from the 0.1.0-rc.6 frontend build. When dsh is upgraded and the frontend is rebuilt, these class names may no longer match, requiring re-verification.

Core Features

The repository README breaks down the changes in a table, and cross-referencing the injected styles and slots in lib/client.js confirms the following capabilities:

  1. Overall Layout. On mobile widths, the three-column Grid is rewritten as 0 minmax(0,1fr) 0, with the middle session area taking full width; the right details column and drag handle are hidden directly. The sidebar is removed from the normal document flow and converted into a fixed left drawer with a width of approximately min(320px, 86vw). Visibility is toggled using left position offset instead of transform, to avoid clipping fixed panels inside the drawer.
  2. Hamburger Button and Overlay. The plugin injects a top-left floating button (with safe area insets env(safe-area-inset-*)) into the shell.overlay slot, which calls layout.toggleSidebar() when clicked. A semi-transparent overlay appears when the drawer is open, and clicking the overlay will close it. Both elements are display: none on desktop.
  3. Session Header and Input Row. The header leaves left margin space for the hamburger button, and the title and actions allow line wrapping; the “Chat / Trace” tab is centered on the screen midline. The input tool bar (permissions, scheduling, attachments, model selection, context, send button) is forced to a single row, with trigger button width limited to 112px. The maximum width of model selectors, context details, and command menus is set to calc(100vw - 16px) to prevent popups from overflowing the screen.
  4. Settings and Plugin Panels. On mobile, the settings panel is converted to full screen: the top navigation becomes a horizontally scrollable single row, the content area scrolls on its own, and a close button is added. The running plugin list panel is converted to a fixed floating panel, with its bottom raised by ~130px to avoid blocking trigger buttons in the input area.
  5. Trace Page. The table takes full width; the details panel is no longer displayed side-by-side with the table, and instead becomes a fixed-height floating window near the bottom (min(52vh, 460px)), with internal scrolling.
  6. Bottom Statistics Pill. The plugin replaces the stats slot in the conversation input area conversation.composer.dock. It does not render when there is no data; when there are rounds or Token usage, it displays a pill showing a summary including round/steps count, cache hit rate, and input/output Tokens. Clicking it expands a full panel showing LLM latency, tool call latency, average first Token delay, decoding speed, cache read/write breakdown, etc. The copy includes both Chinese and English dictionaries, using the plugin’s own mobileAdapt language pack.
  7. Viewport and Safe Area. The html / body elements use 100dvh, and the input area adds padding for safe-area-inset-bottom. The README marks this as iOS adaptation; in the source code, these rules are wrapped under a max-width: 768px media query, so they will also apply to narrow Android screens. Additionally, the source code only compresses the session header padding for tablet widths between 769px–1024px, and does not enable the full single-column layout transformation.

It does not include message editing, multi-model search, PWA, or LAN exposure functions, only layout and statistics display changes. If you need those features, you will need to find other corresponding plugins, and should not expect this package to cover everything.

Installation and Activation

The installation command given on the community directory page is:

dsh plugin add github:Hotsteel2901/dsh-client-ui-mobile-adapt

For reproducible installations, the directory page recommends pinning a commit:

dsh plugin add github:Hotsteel2901/dsh-client-ui-mobile-adapt#<commit>

According to official documentation, dsh plugin actually forwards to pnpm in a specific profile directory. The common syntax for the Web UI includes --profile, for example installing to the default web profile:

dsh plugin --profile web add github:Hotsteel2901/dsh-client-ui-mobile-adapt

The maintainer’s README also offers two additional methods that better fit its dual nature as both a client plugin and a bundle.

Method 1: Create a separate webmobile profile. Place a package.json in $DSH_HOME/profiles/webmobile/, add this package to dependencies, and list @deepseek-ai/dsh-base, @deepseek-ai/dsh-web-app, and dsh-client-ui-mobile-adapt in order under dsh.profile.bundles. Then run:

cd ~/.dsh/profiles/webmobile
npm install
dsh --profile webmobile

The maintainer recommends using the GitHub archive tarball for dependency addresses instead of the github: shorthand:

https://github.com/Hotsteel2901/dsh-client-ui-mobile-adapt/archive/refs/heads/main.tar.gz

Method 2: Install into an existing profile. The command given in the README is:

dsh plugin --profile web <profile-name> add https://github.com/Hotsteel2901/dsh-client-ui-mobile-adapt/archive/refs/heads/main.tar.gz

You can also manually insert a line into the profile’s cordis.patch.yml (matching the patch included in the repository):

- insert:
    - id: ui-mobile-adapt
      name: 'dsh-client-ui-mobile-adapt'

Restart the corresponding dsh process after making changes. The repository states that “restarting will activate the changes”.

There is an installation conflict that needs to be addressed based on the source. The directory page promotes github:Hotsteel2901/dsh-client-ui-mobile-adapt; the maintainer’s README warns that newer npm versions will block git://, github:username/repo, and some remote tarballs by default (EALLOWGIT / EALLOWREMOTE), so it recommends using the .../archive/refs/heads/main.tar.gz format above. The official Packaging and Installing Plugins documentation additionally notes that when installing from git, if the package has a prepare build script, pnpm 10 and above may require adding the package name to allowBuilds in the profile’s pnpm-workspace.yaml. This repository already includes the pre-built lib/ directory, so build steps are not required for use. Refer to your local package manager’s error messages during actual installation, and using the tarball format from the README is usually more straightforward.

To update to the latest code, the cleanup method given in the README is:

npm cache clean --force
rm -rf node_modules/dsh-client-ui-mobile-adapt
npm install

How to use after installation

The plugin has no additional slash commands or configuration options. The usage is simply to open the Web UI in a narrow-screen browser.

  1. Start the service with npx @deepseek-ai/dsh web or dsh --profile webmobile. The official default address is still http://127.0.0.1:3080 on the local machine. If you are running dsh in Termux and accessing it with the same phone’s browser, you will use this loopback address; to access from another device, you will need to handle network exposure yourself, which is beyond the scope of this plugin, and the official Web UI also only binds to 127.0.0.1 by default.
  2. Open the page in a viewport no wider than 768px. You can rotate your mobile browser to portrait mode, or switch device mode in desktop developer tools to a common mobile phone width. When the width is greater than 768px, you should see an almost identical three-column desktop layout to when the plugin is not installed.
  3. Click the top-left hamburger button to open the sidebar for session lists and other content, and click the overlay to close it. When entering settings, the panel should fill the screen, with top categories that can be swiped horizontally and content that can be scrolled vertically. Switching to the trace page and clicking a record will display the details as a bottom floating window instead of a narrow right-hand column.
  4. After the session generates rounds or Token consumption, a statistics pill will appear below the input box. Click it to see round count, steps, latency, and Token details; click the × to close.

The repository does not provide screenshots or interactive screen recordings, and the steps above correspond to the feature table in the README and the slots in the client source code, rather than third-party usage reports.

Applicable Scenarios and Notes

This plugin is suitable for these use cases: running dsh in Android Termux and viewing the Web UI with a mobile browser; using dsh on a computer for personal use and occasionally checking the local page on a mobile phone for confirmation; already comfortable with the default Web GUI but frustrated by the poor three-column layout on narrow screens, and unwilling to switch to a completely different skin or TUI.

It is not suitable as a “mobile version of dsh”. It does not provide a standalone app, does not modify the Agent permission model, and does not change the service binding from 127.0.0.1 to be accessible over the local network. For tablet widths (769px to 1024px in the source code), it almost retains the desktop narrow-column layout, with only the header spacing compressed.

There are several hard constraints before use.

The plugin runs with the permissions of the current dsh process, and may execute code during installation. Both the directory page and official plugin documentation require reviewing the source code and license first; only install from repositories you have verified, and pin versions with commit hashes to avoid the main branch being silently updated with changes to your running instance. This package uses the MIT license, has a small codebase, and lib/client.js is mostly CSS and two slot components, making it relatively low-cost to audit, but you should still review it yourself.

It is tied to the frontend class names from 0.1.0-rc.6. DeepSeek Harness is still undergoing rapid iteration, and the official has explicitly noted that there will be incompatible changes. If the mobile layout suddenly stops working after upgrading dsh, first suspect that the CSS Modules hashes have changed, rather than a mobile browser issue.

There are other mobile adaptation plugins in the community, with different implementation methods and additional features. This article only introduces dsh-client-ui-mobile-adapt based on the directory page and this repository’s README / source code, and does not make unconfirmed comparisons with other plugins.

Summary

dsh-client-ui-mobile-adapt does very targeted work: below 768px, it converts DeepSeek Harness’s Web GUI to a single-column layout, turns the sidebar into a drawer, makes settings and trace panels scrollable, and condenses statistics into a clickable pill; it leaves the desktop layout unchanged. It is maintained by Hotsteel2901, licensed under MIT, current version 0.1.0, targeted at users running dsh in Termux or mobile browsers.

Directory page: https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-client-ui-mobile-adapt/

GitHub: https://github.com/Hotsteel2901/dsh-client-ui-mobile-adapt