> **A slim minimap rail on the LEFT edge of the DeepSeek Harness Web GUI chat pane: every message you sent becomes a tick — hover for a preview, click to jump, drag to scan long sessions.**
[](LICENSE)
---
## 1. The problem it solves
In a long session, going back to "what did I say earlier?" means endless wheel scrolling. The assistant's replies are long and dense, and your own messages get buried in between.
This plugin adds a thin navigation rail on the **left edge** of the chat pane (like the VS Code minimap):
```
chat scroll pane (overflow-y: auto, long sessions are paged)
│ each user message = one tick (including not-yet-loaded history, from the session log)
│ ticks of in-viewport messages = bold highlight
│
▼ hover a tick → preview card (index / total + excerpt + time line)
▼ click a tick → smooth-scroll to that message (auto-pages up first if not rendered)
▼ click/drag the rail → proportional jump
```
**Read-only**: the client only reads the conversation DOM already rendered in the browser (chat nodes carry stable `data-chat-flow-kind` / `data-chat-flow-key` anchors) and scrolls the existing chat scroll container; the host half adds a single **read-only route** `GET /api/message-minimap-messages` that extracts **excerpts** of every user message (≤140 chars + timestamp) from the session log (`$DSH_HOME/sessions`) so the rail can cover history the "load older" paging hasn't rendered yet. It never modifies or deletes anything.
## 2. Features
- ✅ A **compact, vertically centered** rail on the chat pane's left edge (not full height) — zero layout interference.
- ✅ **One tick per user message**, evenly spaced on the rail (oldest at top, newest at bottom) — never scattered by message sizes.
- ✅ **Immune to history paging**: ticks cover ALL user messages (including history not yet rendered via "load older", sourced from the session log); clicking an unloaded tick **auto-pages up** and then smooth-scrolls to it (aligned exactly by message id — an intermediate page with no user messages no longer interrupts the jump, and API timing / steers / forked rows can never shift the target).
- ✅ **Ticks of the messages inside the viewport are auto-bolded**, following the scroll in real time.
- ✅ **Fisheye magnification while sweeping the rail**: the tick under the pointer grows longest, its neighbors grow by a cosine distance falloff (CSS-transitioned) — spot the target at a glance.
- ✅ **Hovering a tick** pops a preview card: `My message · 3 / 12` plus the message excerpt (up to 140 chars / 7 lines) on its own line, plus a dedicated time line.
- ✅ **Clicking a tick** smooth-scrolls to that message (parked ~18% below the pane top).
- ✅ **Clicking or dragging the rail background** jumps proportionally, like a scrollbar.
- ✅ Follows streaming output, history loading, session switches and window resizes automatically (MutationObserver + scroll/resize + polling fallback).
- ✅ Hides itself when the content doesn't overflow, when there are no user messages, or on the new-session hero screen — zero layout interference.
- ✅ Bilingual (zh/en) UI strings following the GUI language.
- ✅ Keyboard accessible: ticks are native `