dsh-nav-rail
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