zmengle/dsh-plugin-sticky-wall: DSH Sidebar Sticky Wall Plugin

Preface

The philosophy of DSH (DeepSeek Harness) is “everything is a plugin,” achieved through host-side bundle patching and client-side slot injection. When building agent applications, you often encounter the need to jot down a temporary thought, make a quick list, or land the tasks generated by the model onto a visible wall, without wanting to mess up the formal task management system. The existing approach is to let the model call todo_write, but that is a management perspective of “what I have to do”; the problem is that some things are just “for now” and shouldn’t be immediately integrated into the process.

zmengle/dsh-plugin-sticky-wall handles this “for now” scenario: it adds a freely movable sticky note wall to the DSH sidebar. Notes can be dragged, resized, recolored, folded, and moved to the trash. At the same time, it exposes 5 model tools (sticky_wall_*). Just saying “remember on the sticky wall” gets the note onto the wall. The plugin is maintained by zmengle, classified as a client plugin, licensed under MIT, and the repository address is at the end of the article.

Below is an introduction to installation, features, and integration with the model.

Existing Materials

The writing is based on the plugin’s GitHub README and package.json. Version numbers, tool names, and endpoints are taken directly from the source material. The directory page (skillhub.cn) has limited scraped content and serves only as a source attribution reference.

Installation

The installation command comes from the original README:

dsh plugin add dsh-plugin-sticky-wall

After installation, restart DSH, and a sticky note icon will appear in the sidebar. The plugin has no configuration file, no login, and no internet connection; data is written by default to ~/.dsh/sticky-wall.json.

Supported environments come from the engines in package.json: Node >= 20, and DSH version in the range >=0.2.1-rc.4 <0.3.0-0.

Features: A Wall You Can Rearrange at Will

The sticky wall is registered as a sidebar panel (sidebar.panellist, id = sticky-wall). Click the icon to switch to the main panel. Notes can be dragged by their header to any position. Double-clicking empty space on the wall creates a new note there. The diagonal handle in the bottom right can be dragged to resize (width 196–560px, height increments by full rows); double-clicking resets to default.

Four types of line formats are mixed: Body, Todo (☐), Unordered (•), and Ordered (1.). Typing -, 1., or - [ ] at the start of a line immediately converts it to the corresponding format. There are also four format buttons at the bottom of the note when hovering; they act on the current line. Clicking ≡ returns to normal body text. Clicking the todo checkbox marks it as done (adds strikethrough), and the header displays progress like 1/3.

Each line is essentially an input box. Enter splits the line, Backspace at the start moves up to the previous line, and Arrow Up/Down moves between lines. Auto-save occurs after 0.65 seconds of typing, or immediately on blur, ⌘/Ctrl+Enter, or Esc.

The appearance of the note has several fixed options: 8 paper colors (bright for day, dark for night), optional ruled paper (14px/22px line height, independent per note), 8px rounded corners, and double-layered shadows. The plugin deliberately avoids rotation—text in a rotated layer loses subpixel anti-aliasing and looks blurry. The ∨ at the far left of the header folds the note to two lines; when folded, the body is read-only but allows direct word selection and copying. Folding only clips the height; it does not affect the width.

Deletion, Trash, and Backup

Deletion (via toolbar trash, clear wall, or model tool) only moves the note into the right-side trash; it is not destroyed immediately. In the trash drawer, you can restore individual notes or delete them permanently, or clear all at once. Notes can be pinned in the drawer. Preferences are stored locally. The toast message after deletion has an “Undo” button, and Esc also closes the drawer (when writing a note, Esc prioritizes the input field). When restoring, if the original position is occupied by another note (overlap exceeds 20% of its own area), it will automatically move to the first empty slot and prompt. The trash capacity is 500 notes / 30 days; items exceeding the limit are cleared upon loading.

When changing computers, you can export JSON (including trash) in the settings panel; the filename looks like sticky-wall-20261107-0216.json. When importing, it first shows how many notes will be imported, then lets you choose to merge (keep existing notes, automatically generate new IDs if IDs collide) or overwrite existing ones (full replacement, requires confirmation twice). The settings panel also displays the version, note count, data size, and storage path.

Model Tools

The plugin exposes 5 tools to the model:

Tool Purpose
sticky_wall_list Read notes on the wall (id, color, time, text; lists with - [ ] / 1. markers), filterable by pinned / query; notes in the trash are not listed
sticky_wall_add Stick a new note (text required, Markdown list supported, color, pinned optional)
sticky_wall_update Update content / color / pin status (content is re-parsed into lines, checkbox state is reset; notes in the trash must be restored first)
sticky_wall_remove Move to trash (soft delete)
sticky_wall_restore Restore a note from the trash back to the wall (appears on top after restoration)

The returned text includes short IDs like [n-xxxxxx] for subsequent use with update/remove. Markdown pasted by the model (- [ ], -, 1.) is automatically parsed into checkboxes and lists. When the panel is visible, notes pasted by the model appear on the wall within about 6 seconds.

Data Format and Configuration

Data is a single JSON file, default path ~/.dsh/sticky-wall.json. It uses atomic write (tmp + rename) and skips writing if content hasn’t changed. On write failure, it backs up the original file. The structure of each note is lines[] (kind/text/done for each line) plus color, position, pin, ruled line toggle, size, fold status, and trash flag; text is a derived readable copy. Old data (containing only text) can be read directly and will automatically upgrade to the line structure on the next save.

Limits: 500 notes max, 200 lines per note, 1000 characters per line, 4000 characters total. Exceeding the limit results in truncation rather than rejection. The save response includes truncated: true, and the panel will prompt “Content exceeded limit, truncated”.

To change the storage location, modify storePath in the plugin configuration and restart DSH:

# cordis.patch.yml
- insert:
    - id: sticky-wall
      name: dsh-plugin-sticky-wall
      config:
        storePath: D:/notes/sticky-wall.json

Absolute paths, ~/notes/..., or paths relative to $DSH_HOME are all supported. If the new file does not exist and the default file does, it will be copied over. The currently used path is displayed in the footer on the right; clicking it copies the path.

Implementation Details

The plugin has a dual structure: the Host side (index.js) starts a webServer with the /api/dsh-sticky-wall/* prefix, exposing endpoints like /snapshot, /upsert, /remove, /restore, /purge, /purge-all, /clear, GET /export, and POST /import; the Client side (client.js) uses same-origin fetch for read/write and does not touch typert/remote, thus avoiding version compatibility issues. Write operations include Sec-Fetch-Site / Origin verification; cross-site requests return 403, and POST only accepts application/json.

In terms of performance, each note is a React.memo component that only accepts note and focusId, does not subscribe to the store, and only the currently edited note re-renders while typing. The实测 data in the README is 42.7ms/key down to 6.7ms/key (with 200 notes; 4.5ms/key with 20 notes). There are two optimization channels: GET /snapshot?trash=0 only returns the count, not details; POST /upsert with light: true does not return the entire wall (save response size drops from ~1.1MB to a few KB).

Use Cases and Notes

It is suitable for DSH users who want to place a temporary place to jot things in the sidebar, especially agent application developers who want to truly land instructions like “remember on the sticky wall” onto the interface. The difference between this and the built-in Todo (todo_write) is the positioning: Todo is process management, while the sticky wall is a desktop for scratch notes. Typing - or 1. at the start of a line also turns it into a list on the spot.

A few notes:

  • The plugin runs with the permissions of the current DSH process. You should read the source code (index.js, client.js) and confirm the license (MIT) before installing.
  • Data is local only and offline; the exported backup file contains all content (including the trash), so handle it with care.
  • Exceeding the trash limit (500 items / 30 days) will cause data loss. “Loss” only occurs on visible deletion actions, not during file reading.

The value of the sticky wall lies in separating “remembering” from “doing”: things on the wall can be placed messily, can be folded, and can be retrieved within 30 days, while the model tools make “remember on the sticky wall” more than just an intent.

Project directory page: https://www.skillhub.cn/plugins/zmengle/dsh-plugin-sticky-wall
Source code: https://github.com/zmengle/dsh-plugin-sticky-wall

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye