dsh-paperclip
August 24, 2026 Β· View on GitHub
A zero-intrusion bundle for DeepSeek Harness: π upload button with popover Β·
read_documentmulti-format reader Β· Settings β General toggle. Adapts to light / dark themes.
English | δΈζ
Features
- π Upload button + popover β Borderless π button in the composer. A small β΄ next to it shows the count; click to expand upward and see pending files (filename only). Click Γ to remove. Files are uploaded immediately and the server path is appended to the message on send.
read_documenttool β Readtxt / json / conf / md / ini / pdf / docx / xlsxwithoffset/limitpaging. Text formats work zero-dependency;pdf / docx / xlsxshow a hint when optional deps are missing.- One toggle β Settings β General has an βEnable file uploadsβ switch. Off hides the button and blocks uploads. No extra tabs.
- Theme-aware β Uses DSH design tokens, looks correct in light and dark mode.
- Zero-intrusion β Standard Cordis
bundleplugin, no DSH source changes.
Requirements
- DeepSeek Harness
dsh >= 0.1.0-rc.8(webprofile) - Node.js
>= 22
Install
git clone https://github.com/runfali/dsh-paperclip.git
cd dsh-paperclip
pnpm install
pnpm build # builds lib/client.js (browser bundle)
dsh plugin --profile web add .
# restart manually: dsh web
Uninstall:
dsh plugin --profile web remove dsh-paperclip
Restart dsh web to apply.
Configuration
Edit in Settings β Plugin Config β paperclip or override in ~/.dsh/profiles/web/cordis.patch.yml (full replacement):
| Field | Default | Description |
|---|---|---|
enabled | true | Show button and enable uploads |
maxBytes | 67108864 | Per-upload byte cap |
uploadDir | "" | Persist directory; empty β ~/.dsh/uploads/paperclip (content-addressed, deduped) |
allowedExtensions | [] | Whitelist (empty = allow all) |
readLimit | 2000 | read_document line window |
maxFileBytes | 67108864 | read_document per-file byte cap |
sheetRowLimit | 200 | xlsx rows kept per sheet |
Example:
- id: paperclip
config:
enabled: true
maxBytes: 67108864
uploadDir: ""
allowedExtensions: []
readLimit: 2000
maxFileBytes: 67108864
sheetRowLimit: 200
Usage
Upload: Click π to pick files. If needed, click β΄ to expand the list above the input; Γ removes a file. Type a message and Send β the list clears and paths are sent with the message.
Read: The model calls read_document({ file_path, format: "auto", offset: 1, limit: 2000 }).
Security
- Only loopback
Host, same-originOrigin,Sec-Fetch-Sitecheck; onlyPOST/DELETE. - Byte cap checked twice, filename sanitized,
DELETEconfined touploadDir. - Default dir
~/.dsh/uploads/paperclip, content-addressed and deduped.
Known Limitations
- Pending list is in-memory; reload clears it (files remain).
- No GC β only Γ deletes.
pdf / docx / xlsxneed optional deps (pnpm add pdf-parse mammoth xlsxinside the plugin directory); text formats work without them.