Skip to content
dsh.fish
Bundle

dsh-vitals

Live hardware load panel for the DeepSeek Harness web GUI: a btop-style tab showing CPU load per core and overall, DRAM usage, CPU temperatures, and per-GPU temperature/load/power/VRAM. Reads /proc and nvidia-smi on the host and polls ~1s in the browser.

Source
JoblessJoe
License
MIT
Updated
Updated 2 hours ago

Readme

# dsh-vitals

A [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (dsh) Web-GUI plugin that shows **live hardware load** right in the web GUI — a self-contained, dependency-free companion to `btop`. Opens as a full tab next to Chat/Trajectory, or docked beside a session in the right sidebar.

## What it shows

- **CPU** — overall utilisation, a live 60s sparkline, highest temperature reading, and per-core load (every physical core, any count) — with per-thermal-zone detail when there's more than one sensor
- **Memory** — used / available / total with utilisation %
- **GPUs** — one card each: name, temperature, utilisation, power draw, and VRAM (used / total)

Data is sampled host-side on every poll (~0.5 s) and rendered live.

## How it works

- **Host** — a `GET`-only route registered on the dsh web server
  (`/plugins/dsh-vitals/data`) that reads the OS's own sources
  with **no privileged access** and returns JSON.
- **Client** — a single self-contained bundle that polls the route and draws
  the panels with inline styles (no CSS pipeline, no assets).

### Where it shows up

Two access points, both live the moment the plugin is bundled — no setup:

- **A full `Hardware` tab** next to **Chat** / **Trajectory** at the top of
  the conversation view. The dedicated way to watch the box while you're not
  actively chatting.
- **Docked in the right sidebar**, alongside a session: open the right
  sidebar, click **+** (add tab), pick **Hardware** from the Guide list. Lets
  you chat and watch load at the same time. (Every dsh "page type" plugin
  opens this way — nothing dsh-vitals-specific about the click path.)

### Platform support

| Signal | Primary source | Fallback |
| ------ | -------------- | -------- |
| CPU load | `/proc/stat` (Linux) | `os.cpus()` deltas (macOS / other) |
| Memory | `/proc/meminfo` (Linux) | `os.totalmem()` / `os.freemem()` |
| CPU temp | `/sys/class/thermal` | hidden when absent |
| GPUs | `nvidia-smi` (any count) | hidden when absent |

Everything degrades gracefully: a missing source simply hides that panel or
shows a placeholder rather than breaking the tab. Any number of GPUs is
supported; any CPU (core count and vendor) is handled.

## Install

From your dsh **web profile** (`web` below is the profile name; use whichever
profile backs your web GUI):

```bash
dsh plugin --profile web add dsh-vitals
```

This installs the package into the profile and adds it to
`dsh.profile.bundles` for you — no manual `package.json` editing. (No local
`dsh` binary? Run the equivalent by hand from the profile directory, e.g.
`~/.dsh/profiles/web/`: `pnpm add dsh-vitals`, then add `"dsh-vitals"` to
that `package.json`'s `dsh.profile.bundles` array yourself.)

The published package ships its built `lib/` output, so no build step runs
on install — nothing else to do before restarting.

Restart your dsh web service and open the web GUI — see
[Where it shows up](#where-it-shows-up) above for how to find it.

> New bundles are registered from the profile's `bundles` array, so a one-time
> service restart is required the first time you add it.

## Building from source

Requires Node 20+. Dependencies are dev-only (esbuild); the published package
has **zero runtime npm dependencies**.

```bash
git clone https://github.com/JoblessJoe/dsh-vitals.git
cd dsh-vitals
pnpm install
node scripts/build.mjs     # emits lib/index.js + lib/client.js
```

`package.json` declares a `build` script, so `pnpm build` works too.

## Configuration

None. The plugin reads whatever the host exposes; there is no config surface.

## Security

The data route sits outside the dsh web server's `/api` trust fence, so it
enforces that fence itself: `Sec-Fetch-Site: cross-site` requests are rejected
(403) and only `GET`/`HEAD` are served (405 otherwise). All sources are read-only.

## License

MIT

Install

dsh plugin --profile web add github:JoblessJoe/dsh-vitals

Profile: web

  • This package builds from source on install. pnpm will ask you to allow its build script — that is permission to run the package’s code on your machine, outside the agent sandbox. Only allow sources you trust.
  • This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.
Source