dsh-mobile-upgrade
English | 简体中文 | 繁體中文 | 日本語 | 한국어 | Español | Français | Deutsch | Русский
Mobile quality-of-life fixes for the DeepSeek Harness (dsh) web profile, shipped as a single plugin. Everything renders through the host's own slots and state signals — no layout takeover, no floating widgets, no DOM polling of chat content.
What you get
- Composer attachment upload — a paperclip button beside the composer's tool row. Images go through the editor's native paste-attachment path; any other file is uploaded to the server and its absolute path is pasted into the draft so the agent can read it with its file tools.
- Restart row — a "Restart service" entry in Settings → General. Confirms first, restarts the
dshprocess, and reloads the page automatically once the service answers again. - Input-modality switches — text/image/video checkboxes on every model row of the native provider editor, writing the model's
inputarray intosettings.yaml(with a backup next to the file). Catalog models without a user-customised route show the switches read-only. - Narrow-screen drawer — below 1024px the sidebar collapses to a small corner chip that keeps the host's own toggle; expanding it floats the full sidebar as a drawer over full-width content, and picking a session closes it again.
- Narrow settings tabs — below 700px the settings dialog's side navigation becomes a row of horizontally scrollable tabs.
- Full-width model menu — below 700px the composer's model menu re-anchors to exactly the phone width (12px margins) instead of landing past the screen edge, while the host keeps owning the vertical placement above the trigger.
- Details-overlay settle — the fullscreen tool-details overlay whose close control is inert in the current host is not rendered on narrow screens, so it cannot trap the chat.
- Storm-safe reactivity — the drawer/menu observers and the settings poller react to a burst of streaming messages at a capped rate and back off while the host is unreachable, a rail remount during a reconnect keeps the drawer state instead of flapping it, and drawer close taps retry through a remount instead of landing on a stale toggle: many sessions streaming at once no longer freeze input or twitch the sidebar into unclickability, whether it is open or closed.
- Per-feature toggles — the plugin installs a
mobile-ui-fixsection in Settings → Plugins with a switch per feature.
Screenshots
The floating chip, the session drawer, the narrow-screen settings tabs and the composer attach button (annotated):
![]() |
![]() |
![]() |
![]() |
Install
dsh plugin --profile web add dsh-mobile-upgrade
Restart dsh web, then open the web profile on your phone: the paperclip sits in the composer, the restart row in Settings → General, and the feature toggles in Settings → Plugins → mobile-ui-fix.
Requires dsh 0.1.2-rc.1 or newer.
Configuration
The plugin's settings card takes:
| Key | Default | Meaning |
|---|---|---|
uploadDir |
<dsh home>/mobile-uploads |
Where non-image uploads are stored |
restartEnabled |
true |
Offer the restart row and its route |
Feature toggles
Every feature above can be switched in Settings → Plugins → mobile-ui-fix (effective on the next page load), or overridden per device with a localStorage key — mfx-attach, mfx-restart, mfx-settle, mfx-drawer, mfx-settings, mfx-modality, mfx-menus, mfx-net — where the value "0" turns a feature off.
Limitations
- The client hooks specific host UI elements by their hashed CSS class names (menu, drawer toggle, provider editor). A host build that renames them degrades individual features until this plugin catches up; everything else keeps working.
- Input-modality switches can only patch provider routes you have customised yourself; catalog-only routes are read-only by design, because fabricating a catalog section collapses the model directory.
Security notes
The plugin's HTTP routes (upload, restart, settings editing) perform no authentication of their own — they trust the dsh web surface they are loaded into. Put the deployment behind whatever gate protects the rest of the UI (reverse-proxy auth, loopback binding) before exposing it beyond localhost.
License
Distributed under the Synthetic Source License (SySL), Version 1.0.
NOTICE: This software includes code generated by artificial intelligence. See the LICENSE file for the Synthetic Source License terms, including model disclosure requirements.




No comments yet. Be the first to write one.