DeepSeek Harness Plugin

longisland-icetea/dsh-lan-access

Stars ★ 0 Category Remote & Mobile Added 2026-09-11

Configurable LAN access for the DSH Web GUI: a settings tab binds the server to all interfaces, trusts only the addresses you configure, sets the browser session lifetime or removes the token login, and repairs the settings layer on non-loopback visits.

Install

# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)

dsh plugin --profile web add github:longisland-icetea/dsh-lan-access

Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).

README

Who this is for: users who already run a virtual LAN (EasyTier / Tailscale / WireGuard / ZeroTier …), or who only want to reach the dsh Web UI from a trusted LAN (home or office network).

⚠️ Security: enabling LAN access means anyone who can reach that address can operate your Harness — remote code execution exposed to that network segment. Only enable it on a network you control; never on public Wi-Fi, campus or shared lab networks. Never forward the token-bearing URL printed at startup.

🤖 About this repository: every line of code, doc, and commit here was generated by an AI coding agent; the author has not reviewed it line by line. Read cordis.patch.yml and lib/client.js (they touch dsh internals) before you rely on it. Issues and PRs welcome.

Open the DeepSeek Harness Web GUI's LAN access fences so other machines on a (virtual) LAN can reach it directly via LAN-IP:port, with a settings tab to choose which LAN IP is used.

See README.zh.md (Chinese) for the full guide; the English summary:

  • What it changes: binds the webserver to 0.0.0.0 when enabled (the host schema only allows 127.0.0.1 / 0.0.0.0), makes the /api browser-trust fence accept only your configured authorities (falling back to dsh's automatic LAN trust when you configure none), and prints the token-bearing LAN URL at boot.
  • Strict fence (0.2.0, breaking): dsh itself trusts every non-internal IPv4 while the server binds 0.0.0.0; 0.1.x unioned that in, so a host you removed stayed trusted. Since 0.2.0 a non-empty configuration is the policy.
  • Remote (non-loopback) visits: dsh runs its settings layer in memory mode there, so nothing can be read or persisted. The plugin shadows the shipped welcome notice and repairs the settings mirror; opt out of the latter with rescueSettings: false in the lan-access section of settings.yaml.
  • Session lifetime: sessionDays (default 30, range 1–3650) sets how long a device stays authenticated after one token visit. Cookies are per access address and survive a dsh web restart (the signing secret is persisted); they die on expiry, on deleting .credentials.yaml, or when the browser clears them. Needs a restart to change.
  • No authentication (0.4.0): noAuth: true removes the browser session gate altogether — no launch token, no cookie, no 401. The Host/Origin trust fence stays (hosts outside accessHosts are still 403); everything else becomes your network's job. Needs a restart. sessionDays has no meaning while it is on.
  • Install: dsh plugin --profile web add github:longisland-icetea/dsh-lan-access (dsh plugin --profile web update dsh-lan-access to upgrade), then restart dsh web. ⚠️ The dsh-lan-access package on npm is a different project by another author — this plugin is only distributed from GitHub, not npm.
  • Use: Settings → “LAN Access” tab → enable, enter the LAN IP(s) (or pick from the detected list), save, restart.
  • How it works (0.6.0): static composition — zero runtime row ownership. The bundle patch overrides the official webserver/connection rows with loader !!js expressions that decide the bind and the fence ONCE per boot from two bits composed before activation: the lan-access entry's disabled state (the very state dshmarket's toggle writes) and the settings-tab toggle (settings.yaml lan-access.enabled). No entry.update, no fiber restarts, no boot rewrites; toggling the plugin — in the settings tab or in the market — only starts/stops its fiber, and the binding changes on the next restart, exactly what the settings tab says. The expressions fail closed: any evaluation error yields the official defaults (loopback bind, the deployment fence) and can never fail the boot.
  • Upgrades: the overrides are patches by id; a renamed or restructured official row is skipped by the composer with a warning (dsh still boots, fully official), and the boot-time self-check reports the drift instead of pretending. Only brand-new upstream guardrails (e.g. a webserver schema dropping 0.0.0.0) can defeat it. The one place that touches a dsh internal (a prototype patch to revive already-bound settings scopes, and the noAuth gate swap) is wrapped in try/catch and can be switched off entirely.

License

MIT

Content from the project README on GitHub ↗

Links

More in this category

View the whole category →

Community comments

Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.