dsh-lan-access
longisland-icetea/dsh-lan-access
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.
インストール
dsh plugin --profile web add github:longisland-icetea/dsh-lan-accessREADME
dsh-lan-access
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.ymlandlib/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.0when enabled (the host schema only allows127.0.0.1/0.0.0.0), makes the/apibrowser-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: falsein thelan-accesssection ofsettings.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 adsh webrestart (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: trueremoves the browser session gate altogether — no launch token, no cookie, no 401. The Host/Origin trust fence stays (hosts outsideaccessHostsare still403); everything else becomes your network's job. Needs a restart.sessionDayshas 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-accessto upgrade), then restartdsh web. ⚠️ Thedsh-lan-accesspackage 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/connectionrows with loader!!jsexpressions that decide the bind and the fence ONCE per boot from two bits composed before activation: thelan-accessentry's disabled state (the very state dshmarket's toggle writes) and the settings-tab toggle (settings.yamllan-access.enabled). Noentry.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 intry/catchand can be switched off entirely.
License
MIT