
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-lan-share
Advanced tools
LAN sharing for DeepSeek Harness: discover other DSH devices on the local network, send text and files to a chosen device, receive text/files with accept-or-ask policy, and watch transfer progress — all from a 局域网服务 tab in the right sidebar. 局域网共享插件:发现同网段
Share text and files between DeepSeek Harness devices on the same local network — from a 局域网服务 tab in the right sidebar, or by asking the agent.
简体中文说明见 README.zh.md.
IP path for networks that filter both.lan_share_devices, lan_share_send_text,
lan_share_send_file, lan_share_inbox, lan_share_respond,
lan_share_rename_device, lan_share_settings) so the agent can do all of the
above in a conversation.dsh plugin --profile web add dsh-lan-share
DSH Desktop uses the web profile; restart the app afterwards, because the
host half only loads at boot.
If dsh is not on PATH, use the binary shipped with the desktop app:
$app = "<INSTALL_DIR>\DSH Desktop\resources\app"
node "$app\node_modules\@deepseek-ai\dsh\lib\bin.js" plugin --profile web add dsh-lan-share
profiles\web\package.json lists dsh-lan-share in dependencies and in
dsh.profile.bundles.profiles\web\node_modules\dsh-lan-share\lib\ contains index.js and
client.js.A LAN plugin is installed once per machine — it is not "install on one, the whole network has it". Two routes:
On the development machine:
npm run check # make sure the artifacts are current and the gates pass
npm pack # writes dsh-lan-share-<version>.tgz
Copy the .tgz to the target (USB, scp, or send it with this very plugin), then
on the target machine:
# The dsh bundled with the desktop app; DSH Desktop uses the `web` profile
$app = "<INSTALL_DIR>\DSH Desktop\resources\app"
& "$app\node_modules\node\bin\node.exe" "$app\node_modules\@deepseek-ai\dsh\lib\bin.js" `
plugin --profile web add "C:\path\to\dsh-lan-share-0.1.0.tgz"
Then quit and restart that machine's harness (tray → Quit for the desktop app,
Ctrl+C and re-run for dsh web).
lib/ is built into the tarball, so the target needs no Node toolchain, no
npm install, and no network. There is no src/ and no devDependency inside it.
npm publish --access public
Every machine is then one command, with nothing to copy:
dsh plugin --profile web add dsh-lan-share
# 1) the manifest
Select-String dsh-lan-share "$env:APPDATA\dsh-desktop\harness\profiles\web\package.json"
# 2) the built halves shipped with it
Test-Path "$env:APPDATA\dsh-desktop\harness\profiles\web\node_modules\dsh-lan-share\lib\client.js"
# 3) the LAN plane (no login needed; the port is in the startup log or the panel header)
curl.exe -s "http://127.0.0.1:48901/lan-share/v1/info"
# 4) the panel plane: 401 without a cookie, 200 with one
curl.exe -s -o NUL -w '%{http_code}' "http://127.0.0.1:43129/lan-share/api/state"
That 401/200 pair is the cheapest proof the trust gate is really working, and
it is worth re-running on every deployment.
/lan-share/api/state the instant the port opens answers 404; a second later
it answers 401. Do not read that as "the plugin did not install".lib/client.js — that harness must be restarted, because
the page keeps the old graph. The host half hot-mounts; the browser half does not.Open the tab from the sidebar's add-tab guide, or ask the agent to send something.
The 设置 tab chooses between 当前工作区目录 (the DSH process working
directory, or a path you set) and a 指定目录. The resolved absolute path is
shown at the top of the panel, so there is never a guess about where a file
landed. Partially received transfers live in <save dir>/.dsh-lan-share-incoming
and are removed once the file is complete.
| Port | Protocol | Purpose |
|---|---|---|
| 48900 | UDP | Beacons: multicast to 239.255.77.88, plus broadcast to 255.255.255.255 |
| 48901 | TCP | Transfer plane, bound to 0.0.0.0 |
Both are configurable in the composition patch row:
- insert:
- id: lan-share
name: 'dsh-lan-share'
config:
discoveryPort: 48900
transferPort: 48901
multicastGroup: '239.255.77.88'
checksumMaxBytes: 268435456
maxConcurrentInbound: 4
registerTools: true
If the port is taken (a second instance on the same machine), the plugin binds a free port instead, says so in the panel, and hand-added devices still work.
The transfer plane is not the DSH web server. The web server is
loopback-only and gated by a browser cookie; this plugin runs its own listener on
0.0.0.0 so a peer on the LAN can reach it, and gates every route with the
bearer token from the handshake. The panel, in contrast, uses same-origin routes
on the DSH web server and is gated by the host's own trust fence.
exe, bat, cmd, com, scr, msi, ps1, vbs, js, jar), whatever the policy says.An open LAN (no share code) means any device running this plugin on the same segment can send you files. That is the convenient default for a home network; set a code on an untrusted one.
npm install
npm test # tsc + tests/*.ts
npm run build # host half → lib/, browser half → lib/client.js
npm run typecheck
npm run check # tests + build + the two publish gates
Tests have no framework: each file under tests/ is a plain Node script that
prints N/M checks passed. They cover four layers — pure rules, two real nodes
over loopback sockets, UDP discovery, the assembled service twice over, and the
panel routes' trust gate. See AGENTS.md for the platform contracts
worth knowing before changing anything.
MIT
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.