
Security News
Deno Goes the Way of the Dinosaur
Cloudflare is acquiring Deno’s team, which will provide another year of bug fixes and security updates before ending support for the runtime.
dsh-conversation-share
Advanced tools
Select a range of a DeepSeek Harness conversation and share it as a branded PNG long image, with draggable magnetically snapping range markers.
Install: dsh plugin --profile web add github:omdsh-dev/dsh-conversation-share
Render a selected range of a DeepSeek Harness conversation into a PNG long image with a branded footer, ready to share.
Conversation history lives inside the DSH Web UI, and sharing a meaningful part of it usually means screenshots spliced by hand — cropped, misaligned, with no brand or context. This plugin lets you pick an exact range of a conversation with two draggable, magnetically snapping markers and render it into a single polished PNG long image with a DeepSeek Harness branded footer.
[Cancel][Confirm] expanding to its left)[Cancel][Confirm] controls appearInstall into the web profile with the standard dsh plugin mechanism (no source changes, no manual package.json edits):
dsh plugin --profile web add github:omdsh-dev/dsh-conversation-share
# Or pin a branch/commit
dsh plugin --profile web add github:omdsh-dev/dsh-conversation-share#main
# Or install from a local checkout (development — rebuild and it takes effect)
dsh plugin --profile web add /path/to/your/dsh-conversation-share
Internally the command runs pnpm add <spec> in the profile directory and automatically appends packages that declare dsh.bundle to dsh.profile.bundles. The repository ships its build output (lib/), so no consumer-side build is needed.
After installing, restart web and hard-refresh the browser (Cmd+Shift+R) — old tabs do not load the new bundle.
dsh plugin add appends the bundle to dsh.profile.bundles, which is composed once at boot, so it needs a restart web. To load a plugin into a running dsh web without restarting, register it through the profile's own cordis.patch.yml (the user patch layer), which dsh web hot-reloads at runtime:
cd "$DSH_HOME/profiles/web" # usually ~/.dsh/profiles/web
pnpm add dsh-conversation-share@latest # install into the profile; DO NOT touch dsh.profile.bundles
Then register the plugin in that hot-reloaded user patch layer — append this to $DSH_HOME/profiles/web/cordis.patch.yml:
- insert:
- id: conversation-share
name: 'dsh-conversation-share'
Saving the patch file makes the running dsh web re-apply the user patch layer and mount the plugin — no restart. Or use the one-shot helper in this repo:
node scripts/install-hot.mjs --profile web --spec dsh-conversation-share@latest
Caveats:
dsh plugin add for the same package — a duplicate patch insert for the same id loads the plugin twice.dsh plugin --profile web update github:omdsh-dev/dsh-conversation-share
For a local-path installation, run add again against the replacement checkout, then restart web and hard-refresh.
dsh plugin --profile web remove dsh-conversation-share
The command runs pnpm remove <pkg> in the profile directory and removes it from dsh.profile.bundles. After uninstalling, restart web and hard-refresh the browser.
| Symptom | Resolution |
|---|---|
| Share capsule does not appear | The plugin only loads after restarting web and hard-refreshing the browser; verify the bundle row exists in the profile (`dsh --profile web --dump-config |
| Handles cannot cross or snap oddly | That is by design — the start handle snaps to top edges, the end handle to bottom edges, and they cannot cross; drag past an element to flip which edge binds |
| The page scrolls while dragging | Scrolling only happens in the 64px top/bottom edge zones; drag within the viewport to move the handle 1:1 without scrolling |
| Confirm does nothing / blank image | Ensure the selection covers at least one message; the capture pipeline chunks and stitches extra-long content, so very long ranges may take a moment |
| Copied image is missing from the clipboard | The browser may have blocked clipboard image writes; use Download PNG instead |
dsh-conversation-share/
├── src/
│ ├── index.ts # host half of the plugin (no-op)
│ ├── client/ # browser half (client bundle entry src/client/index.ts)
│ │ ├── index.ts # apply(ctx): mounts the share flow
│ │ ├── controller.ts # share button / cancel-confirm / mode switching / capture orchestration
│ │ ├── markers.ts # range marker handles (snapping, scrolling, state machine)
│ │ ├── snap-targets.ts # snap-target collection (rows/blocks/line-level text/content buttons + position dedup)
│ │ ├── capture.ts # capture pipeline (chunking, cropping, stitching, branded footer)
│ │ ├── brand.ts # brand SVG clone (var() baking + clip-path neutralization)
│ │ ├── modal.ts # preview modal + download/copy
│ │ └── dom.ts / theme.ts / icons.ts / toast.ts
│ └── vendor/html-to-image/ # vendored html-to-image 1.11.13 (MIT, see its LICENSE)
├── scripts/build.mjs # build script (links DSH checkout deps → tsc → tsdown)
├── lib/ # build output (client.js is the browser bundle, committed)
├── package.json # dsh.bundle + dsh.client declarations
├── cordis.patch.yml # bundle patch (inserts the conversation-share plugin)
└── tsconfig.json / tsdown.config.mjs
Requires a DSH checkout (the official repository or a snapshot directory both work):
DSH_CHECKOUT=/path/to/dsh-checkout node scripts/build.mjs
# or via pnpm:
DSH_CHECKOUT=/path/to/dsh-checkout pnpm run build
The script temporarily symlinks the DSH checkout's node_modules into this directory (cleaned up automatically when the build ends) and runs tsc (type check) then tsdown (producing lib/index.js + lib/client.js).
pnpm run check # tsc --noEmit
DSH_CHECKOUT=/path/to/dsh-checkout pnpm run build # -> lib/ (committed)
lib/ is committed so consumers install without building. Changes to the share flow (markers, snapping, capture, preview) should be exercised against a live web profile and the built bundle committed in the same change.
Make sure the build output is up to date:
DSH_CHECKOUT=/path/to/dsh-checkout node scripts/build.mjs
Bump the version, update CHANGELOG.md, commit and push to main, and tag the release:
git add . && git commit -m "release v0.1.x" && git push origin main
git tag v0.1.x && git push origin v0.1.x
BSD-3-Clause (the vendored html-to-image is MIT, see src/vendor/html-to-image/LICENSE).
FAQs

Security News
Cloudflare is acquiring Deno’s team, which will provide another year of bug fixes and security updates before ending support for the runtime.

Security News
Anthropic’s free OSS Scanner uses Mythos and other Claude models to find open source vulnerabilities and send maintainers reports with proposed fixes.

Security News
On Front Lines’ Early Adopters: CISO podcast, Andrew Becherer shares lessons from Datadog, weighs the long-term costs of AI-built tools, and explains how founders can actually gain a CISO’s trust.