dsh-side-memo
r48n34/dsh-side-memo
Toggleable Side Memo notes panel for DeepSeek Harness: labels/tags, resizable inline images, favorites pinned to the top, quick copy, drag a memo into the chat box to paste it, save a conversation or a single prompt as a memo, right-click memo actions, an
安装
dsh plugin --profile web add github:r48n34/dsh-side-memoREADME
Side Memo

Language: English · 简体中文 · 繁體中文

A lightweight, toggleable right-side notes panel for DeepSeek Harness. Jot memos while you chat — text, inline images, and labels — copy them with one click, star favorites to keep them pinned at the top, and move everything in or out as an Excel workbook. When a conversation is worth keeping, one click turns it into a memo.
Category: UI & Experience
Install
dsh-side-memo is published on npm. Install it through your DSH profile:
dsh plugin --profile web add dsh-side-memo
The same plugin can also be installed straight from this repository — use the GitHub form when you need a commit that is not on npm yet, or when npm is unreachable:
dsh plugin --profile web add github:r48n34/dsh-side-memo
If your DSH runs the Desktop profile, use the profile name shown in Settings → Plugins (for the Desktop app this is usually desktop):
dsh plugin --profile desktop add dsh-side-memo
After installing, the Side Memo icon is already available in the Session header — at the header's right edge, including before any Session exists (the first screen) and on the new-Session welcome screen. Open it from there, from the Session header's right-side utilities, or from the right sidebar's add/guide control. If the icon does not appear, restart DSH once so the new plugin bundle is loaded.
To remove it, use Settings → Plugins in DSH (or the equivalent dsh plugin command for your profile).
What it does
- Quick notes: Open notes beside your chat, or in a floating drawer before a Session starts.
- Drag into chat: Drag a memo from the list onto the chat box to paste its text into the message you are writing.
- Save a chat as a memo: Click the chat-to-memo button in the conversation header and pick Save whole conversation or Save only my prompts from the menu to copy the visible conversation into a new memo and open it in the panel.
- Save a single prompt: Hover one of your own messages and click the memo button that appears in its action row beside copy to save just that prompt as a new memo, without opening the header menu.
- Stay organized: Search notes, add labels, filter or group by label, and pin favorites.
- Add images: Paste or drag images into notes, or use the image button.
- Resize images: Select an inline image for a Photoshop-style transform box, then drag a handle, nudge with the arrow keys, or reset it to its original size.
- Copy and transfer: Copy notes in one click; import or export notes as Excel workbooks.
- Right-click actions: Right-click a memo — or press
Shift+F10— for Open, Copy, Duplicate, favorite and Delete, without leaving the list. Delete asks for a second click, like the editor. - Save locally: Notes and images stay in your browser and are available across Sessions.
- Stays fast: image data is read only when the notes panel or the pre-Session drawer first opens, never at plugin startup, and off-screen memo rows skip layout and paint when the chat column resizes. A 300-memo library stays responsive even with tens of megabytes of images.
Usage
- Click the Side Memo icon at the right of the conversation header to open or close the panel.
- Click New and start writing. Changes save automatically; you can also create a note from the editor.
- Add labels below the title, or paste, drag in, or insert an image. Click an image to select it: a brand-colored outline, eight resize handles and a
W × Hsize badge appear. Drag a handle to resize — corners and edges keep the aspect ratio,Shift-drag distorts freely andAlt-drag resizes from the center — press the arrow keys to step by 8 px (Shift+arrow changes one axis only), and double-click the image or click the overlay's reset button to restore its original size. PressEscapeor click elsewhere in the editor to deselect it. Use the star to pin a favorite and the copy icon to copy a note. Right-click a memo row — or focus it and pressShift+F10— to open the actions menu: Open, Copy, Duplicate, favorite and Delete (Delete needs a second click to confirm). - Search or use the label filters and Group by label to find notes. Use the toolbar's import/export icons to transfer notes as
.xlsxfiles. - While writing a message, drag a memo from the list onto the chat box; its text is inserted at the caret in your draft, and the memo's images stay in the panel.
- Click the chat-to-memo button next to the Side Memo toggle in the conversation header, then choose Save whole conversation (your prompts and the assistant's replies) or Save only my prompts (just what you sent). Only visible text is captured — reasoning, tool output and images are skipped. The transcript is capped at 8,000 characters, dropping the oldest turns first, and the new memo opens in the panel for editing.
- To keep just one question instead, hover the message you sent: a small memo button shows up in its action row next to copy. Clicking it saves that prompt as a memo titled from it and opens the memo in the panel.
Imports add new notes without overwriting existing ones. Images remain local and are not included in Excel exports. An image's chosen display size is saved with the memo, so it survives reloads; resizing only changes how the stored image is shown, not the stored image itself.
Compatibility
- DeepSeek Harness 0.2.x (developed and tested against 0.2.1-rc.3, Desktop profile).
- Web GUI and Desktop (Electron/Chromium). The client half relies on standard browser APIs:
localStorage, IndexedDB, Clipboard, File API,Blob/URL, Canvas, andDecompressionStream('deflate-raw')for reading compressed.xlsxfiles. - Uses the shipped right-sidebar plugin API (
@deepseek-ai/dsh-client-ui-sidebar-right); the panel is a normal right-sidebar tab, so a Session is required to host it. Before any Session exists the same notes UI is rendered by the plugin itself in the frame-level overlay layer (shell.overlay). In the pre-Session and new-Session phases the toggle mounts through the resident header'sconversation.header.leadingseat and positions itself at the header's right edge from the live header/panel-toggle geometry. - Uses the conversation client's composer insertion API (
inputActions) to paste a dragged memo into the chat draft as a single undoable edit. - Uses the chat client's standard
useChathook (@deepseek-ai/dsh-client-ui-chat) to read the visible conversation transcript. The chat-to-memo entry is registered in the session-scopedconversation.session.header.utilitiesslot next to the Side Memo toggle; like the rest of the header, it is not shown on a blank new Session. - TypeScript sources live under
src/;client.jsandindex.jsare the compiled browser and Host modules committed to the repository, so installing or running the plugin never needs a build step.
Permissions & privacy
- No network access and no external services.
- No Host data access and no agent-facing tools. The Host half is an empty
apply(). - Memos and images stay in this browser (
localStoragefor notes, under thedsh.side-memo.notes.v1key; IndexedDB for image data, under thedsh-side-memo-imagesdatabase); they are not encrypted or synced across devices. - Clipboard writes happen only when you click copy.
- Excel files are read from and written to your machine through the browser's file picker/download — they are never uploaded.
Known limitations
- Browser-local storage only: no cross-device or cross-browser sync.
- Without a Session the notes open in the plugin's own floating drawer (the right sidebar itself is Session-scoped); the drawer and the right-sidebar tab are alternative hosts for the same notes.
- Drag-to-compose needs an open Session with an editable chat box and pastes plain text only: memo images and labels are not transferred.
- Chat-to-memo captures plain text only: the visible user prompts and the assistant's text replies (or, when you pick the prompts-only entry, only what you sent). Reasoning, tool output and images are not included, the 8,000-character body limit drops the oldest turns first, and the memo title is taken from the first prompt (with a generic fallback title when there is none). The button in a message's action row saves only that one prompt's text; it appears for user messages whose visible text is non-empty.
- Text is plain text (no Markdown or rich-text formatting); images are the only rich content. Images are downscaled before storage and are not exported to Excel — the
Imagescolumn only holds a count. - Image support needs IndexedDB and Canvas. If the browser blocks IndexedDB, the text memos keep working and image insertion is disabled.
- Images are loaded the first time the notes panel or the pre-Session drawer opens in a page load. The text list appears immediately, and a very large image library can take a moment before images — and the editor's image controls — are ready.
- Excel import reads the first worksheet only; formulas import as their cached values, and rich-text cell formatting is ignored.
- Limits: 300 memos, 120-character titles, 8,000-character bodies, 12 labels per memo (24 characters each), 20 images per memo (source images up to 24 MB, downscaled to at most 1,400 px at quality 0.82 before storage; display sizes 24–1,400 px), 8 MB
.xlsximports (up to 32 MB expanded across at most 64 entries), and a 60 MB total image budget for the browser. - Labels are flat tags — no nesting, per-label colors, or separate tag manager — and each label is stored per memo, so renaming one means editing every memo that carries it.
- Favorites are pinned within the memo list; there is no separate favorites-only view yet.
Development
TypeScript sources live under src/ and compile to the committed client.js / index.js with the TypeScript compiler only (no bundler):
| File | Role |
|---|---|
package.json | Bundle/client manifest (dsh.bundle patch and dsh.client browser module) |
cordis.patch.yml | Inserts the dsh-side-memo Loader row |
index.js | Host half (no-op apply; generated from src/host/index.ts) |
client.js | Notes panel, tab type, always-available header toggle, pre-Session drawer, localStorage + IndexedDB store, inline-image editor with the resize/transform overlay, label tags/filter/grouping, editor top-bar new-memo button, drag-memo-to-composer paste, conversation-to-memo header button, .xlsx import/export (generated from src/client/) |
src/ | TypeScript sources for both halves |
tsconfig.json, scripts/build.mjs | Type-check configuration and the yarn build script |
locale/en.json, locale/zh.json | Plugin Manager title and description |
icon.svg | Plugin artwork |
Load it into a profile with the DSH Plugin Manager (install_bundle on this directory) or install it with the commands in Install. Package contents are limited to the published files — index.js, client.js, the locale files, icon.svg, package.json and cordis.patch.yml. The TypeScript sources, build script and config never ship, and the published tarball only adds the three READMEs and the LICENSE.
Tests
- Unit tests:
yarn testrunsnode --teston Node.js >=22 after rebuilding the artifacts (pretest). Runyarn installonce for the build toolchain —typescriptand@types/reactare the only dev dependencies and the published package has none — then the suite exercises the real helpers in the compiledclient.js. - Browser e2e (optional, dev-only; not part of
yarn test): seetest/e2e/README.mdfor the isolated-profile harness and its suites. - CI runs the unit suite on every push and pull request:
.github/workflows/ci.yml.
License
MIT © 2026 Reemo Studio