Conversation node navigation bar for quick jumps between user messages.
Install
# from npm (prebuilt)
dsh plugin --profile web add @vlln/dsh-navbar
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:vlln/dsh-navbar
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
ARCHIVED (read-only) — The official DSH web shell shipped a built-in Turn navigation rail in the 0.1.2 series (npm @deepseek-ai/dsh ≥ 0.1.2-rc.1; upstream feat(ui-chat): full-session turn rail with load-and-jump, b3064cca): a TurnNavigator rail with hover previews, click-to-jump, reading-position tracking, and jump-loads for unloaded turns. The core capabilities of this plugin are now covered by the host, so this repository is archived. Historical implementation remains in docs/ and the git history.
An evenly spaced node strip along the right edge of the conversation area (one node per user message): the active pill follows your reading position, hovering shows a preview card (truncated at 6 lines), clicking smooth-scrolls with a brand-blue highlight ring, more than 30 nodes switch to a fixed 30-node window with count badges (↑N/N↓) at the ends showing how many are hidden, it stays invisible until hovered, and it auto-hides only when no user message is loaded — in that case it automatically loads earlier history until at least one user message appears (or history runs out). Implements the dsh-external/issues#144 spec. Form: an official bundle plugin (dsh.bundle + dshClient channel, browser-only, empty Node half), 0 patches.
Preview

Features
| Feature | Description |
|---|---|
| Node navigation rail | Vertical node strip on the right edge of the conversation area, one dot node per user message |
| Follows reading position | The active pill (22px brand-blue capsule) moves with your current reading position |
| Hover preview | Hovering a node shows a message preview card (6-line truncation, matching the official HoverCard look) |
| Continuous hover | The entire rail (including the gaps between nodes) responds to hover continuously: the preview switches to the nearest node and the corresponding pill elongates (gray) to indicate the click target — no dead zones |
| Scroll-wheel switching | With the cursor over the rail, scrolling the wheel moves up/down one message (blocking conversation-area scrolling) |
| Click to jump | The whole rail is clickable (including gaps, jumping to the nearest node) plus an enlarged pill hit area — no need to precisely aim at tiny dots |
| Fixed window + count badges | More than 30 nodes show a fixed 30-node window (the active node stays centered, clamped at the ends); count badges (↑N / N↓) at the window ends show how many are hidden — the visible node count stays constant. Pinned golden discs always stay visible (the window expands to include them) |
| Load earlier history | An ↑ button pinned at the top of the rail (visible only while the conversation has older history): click to load earlier messages — it forwards to the official load-older control, so your reading position is preserved. Hovering it instantly shows a hint card in the same style as the node previews (the official HoverCard look) |
| Auto-hide | Not shown with no user message loaded (or on non-conversation pages). With zero user messages loaded, the rail automatically loads earlier history until at least one user message appears (or history is exhausted) — so the rail always has something to navigate |
| Message pin | 📌 button on the assistant action bar (between copy and Good response); pinned turns render as a golden slim elliptical disc in the rail (always visible, the preview card carries a 📌 badge, clicking jumps straight to the pinned reply), persisted per session |
Zero data-channel dependencies: driven only by official anchor attributes (data-time-hover-root, on user rows since 0806) — no polling, no routing, no tools.
Installation
Recommended: one-line install from git source (build artifacts are committed, so git source does not trigger a build):
dsh plugin --profile web add "github:vlln/dsh-navbar#main" # one-line git-source install (build artifacts committed)
# or npm source: dsh plugin --profile web add @vlln/dsh-navbar@0.4.0
Or from a local directory (when you have the source): git clone, then cd dsh-navbar && dsh plugin --profile web add ..
Restart web after installing for it to take effect; you can disable/enable it in the Plugins panel on the Settings page.
Usage
Works out of the box — no commands, no tools. The node rail appears on the right edge of the conversation page (Chat view); hover for a preview, click to jump. Animations are disabled under prefers-reduced-motion.
Pin: hover an assistant message's action bar and click 📌 to pin that reply — the corresponding turn's navigation node becomes a golden slim elliptical disc (click to jump straight to that reply; the preview card shows a 📌 badge and the reply text). Pin state is saved per session in browser localStorage and survives refreshes; click again to unpin.
Load earlier history: when the open conversation still has older messages (its history window is not fully loaded), an ↑ button sits at the very top of the node rail. Click it to load the earlier messages — the rail then grows new nodes at the top. The button hides automatically once all history is loaded, and is disabled while a load is in flight. Hovering it instantly shows a hint card in the same style as the node previews (the official HoverCard look), and it reads "Loading…" while a load is in flight. The click is forwarded to the official load-older control, so your current reading position is preserved (no content jump).
Development
pnpm install
pnpm run build # tsdown: client bundle (lib/client.js)
- client:
src/client/index.ts(self-rendered DOM + official anchor contract; the pin button uses the officialconversation.chat.assistant-actionsslot, with React provided by the client runtime; ctx services accessed must be declared in the plugin object'sinject) - Node half:
src/index.mjs(empty apply, the bundle mount carrier)
License
MIT License (an example plugin in the DSH ecosystem).
Links
More in this category
zhu1090093659/dsh-web#packages/dsh-task-board★ 8076
Task board for the dsh web GUI: a sidebar multi-column kanban whose cards run in real DSH agent sessions and can also be scheduled with cron expressions, executed host-side even with the browser closed.
zhu1090093659/dsh-web#packages/dsh-web-all★ 8076
Plugin and skin collection for the DSH Web UI: task board, Git graph, right-side panel, remote mobile UI, pet, live token stats, and a skin center.
omdsh-dev/DSH-better-sidebar★ 3828
Full sidebar workbench with file rendering and editing, terminal, Git, and subagents; third-party plugins can register new tabs.
ccch1mneyyy/dsh-TUI★ 3661
Claude Code-style full-screen terminal UI: pixel-whale header, live status line, and streaming thought expansion.
MeteorNOX/DeepSeek-Balance-Whale-Widget★ 3277
A fixed-corner whale widget for the DSH web GUI — balance, today's usage and per-turn cost with peak/off-peak pricing, editable balance-alert and daily-budget bubbles, a module-based custom bubble queue with A/B weighted choices and random lines or images, 30+ vendor templates (OpenAI, OpenRouter, Kimi, SiliconFlow, Ark, Zhipu, MiniMax and more) with per-model balance and subscription quota, plus task-end sound, imported audio, custom roles and a resource manager. Local-only, no telemetry.
Devin-AXIS/deepseek-design#deepseek-idesign★ 1628
Visual design studio for websites, app prototypes, posters, cards, reports, and magazines, with templates, direct element editing, selection-aware AI draft handoff, and export.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.