dsh-nav-rail

September 1, 2026 · View on GitHub

A minimal left-edge rail navigator for the DeepSeek Harness web GUI.

Every user question in the current session renders as one thin bar pinned to the conversation column's left edge. Hovering ripples the bars like water, a floating card previews the full question text, and clicking smooth-scrolls the conversation to that message.

Features

  • Minimal rail — no panel, no header: just a column of 2px bars pinned to the left edge of the conversation area (auto re-anchors on layout changes).
  • Uniform bars, capped window — bars are equal length by default; the rail shows at most 7 at a time (wheel to scroll, edge fade hints overflow, hovered bar auto-scrolls into view).
  • Hover ripple — the hovered bar stretches and brightens; neighboring bars stretch with distance falloff (46 / 36 / 28 / 22 / 18 → 16 px).
  • Scroll-spy — scrolling the conversation highlights the bar of the question currently in view.
  • Hover preview — a stable-position floating card shows the full question text (anchored to the rail, never covering the bars).
  • Click-to-jump — smooth-scrolls to the message via stable data-chat-anchor-key anchors.
  • Steering aware — interrupt (steering) questions render in amber.
  • Theme aware — all colors come from --dsw-* tokens, so light/dark themes apply automatically.

Install

From a local checkout:

dsh plugin --profile web add file:/path/to/dsh-nav-rail

Or manually: place the package under ~/.dsh/ext/dsh-nav-rail, add it to the web profile's dependencies and dsh.profile.bundles in ~/.dsh/profiles/web/package.json, run pnpm install there, then restart the dsh web process.

How it works

  • Bundle patch (cordis.patch.yml) inserts one Loader row naming this package, so the client-modules scan picks up the dsh.client declaration and serves lib/client.js into window.__DSH_BOOT__.
  • The browser half registers an additive entry in the shell.overlay slot (no shipped UI is replaced), reads the current session through the official sessions.binding(id).session face (ConversationSnapshot), and lists user / steering chat nodes.
  • The rail position tracks [data-conversation-scroll] via a ResizeObserver; the scroll-spy listens to the conversation scrollport with requestAnimationFrame throttling.
  • Pure UI plugin: zero server-side dependencies (lib/index.js is an empty apply so the package shows up in Settings → Plugins).

Remove

dsh plugin --profile web remove dsh-nav-rail

License

MIT