Skip to content
dsh.fish
Bundle

dsh-mobile-upgrade

Mobile UI fixes for the DeepSeek Harness web profile: composer attachment upload, a restart row, input-modality switches, a narrow-screen drawer and settings tabs, a full-width model menu, a stuck-request network chip, and a throttled reaction to streaming message storms.

Source
langyo
stars
1 stars
License
SySL-1.0
Updated
Updated 19 hours ago

Readme

# dsh-mobile-upgrade

English | [简体中文](docs/zh-Hans/README.md) | [繁體中文](docs/zh-Hant/README.md) | [日本語](docs/ja/README.md) | [한국어](docs/ko/README.md) | [Español](docs/es/README.md) | [Français](docs/fr/README.md) | [Deutsch](docs/de/README.md) | [Русский](docs/ru/README.md)

Mobile quality-of-life fixes for the [DeepSeek Harness](https://github.com/deepseek-ai/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 `dsh` process, 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 `input` array into `settings.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 `dsh-mobile-upgrade` section 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):

| | |
|---|---|
| ![Floating chip](res/shot-floating-chip.png) | ![Session drawer](res/shot-drawer.png) |
| ![Settings tabs](res/shot-settings-tabs.png) | ![Composer attach](res/shot-composer-attach.png) |

## Install

```sh
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 → dsh-mobile-upgrade.

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 → dsh-mobile-upgrade (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.

## Community Links

- [Linux.Do](https://linux.do) — A community for sharing and discussing technology.

## License

Distributed under the [Synthetic Source License (SySL), Version 1.0](LICENSE).

> NOTICE: This software includes code generated by artificial intelligence. See the LICENSE file for the Synthetic Source License terms, including model disclosure requirements.

Install

dsh plugin --profile web add github:langyo/dsh-mobile-upgrade

Profile: web

  • This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.
Source