MIT-licensed native dsh bundle that wraps DSH’s HTTP server before route dispatch — 302 / 401 / dropped WS upgrades when unauthenticated — with TOTP, passkeys, invitation-only registration and per-user session, workspace and model-key isolation.
DSH integration
Native runtime
Author-claimed
Safety audit
Unaudited
Last verified
2026-11-10
License
MIT
01What can it help you accomplish?
Put a username / password gate in front of a DeepSeek Harness Web UI that is exposed to a LAN or the public internet
A login page and a session cookie; unauthenticated page requests 302 to the login page, API calls get 401, and WebSocket upgrades are dropped
Operators exposing the DSH panel beyond localhost who need an authentication layer before the panel itself
Keep several people on one DSH deployment from seeing each other’s sessions, workspaces and model keys
Per-user ownership on sessions and workspaces (403 on foreign objects), per-user model providers/keys encrypted with a passphrase-derived key, and admin-shared keys usable without exposing the secret
Teams or families sharing one DeepSeek Harness instance who need per-account isolation rather than a single shared login
02How to install into DeepSeek Harness
Prerequisites
- DSH `>=0.2.0-rc.2 <0.3.0` in the web profile — v0.7.0 dropped the legacy `0.1.1-rc.2` transport and fails closed without modern transport capability
- Node.js `^22.19.0 || >=24.0.0` (same as DSH)
- For passkeys: a modern WebAuthn browser and either `http://localhost:3080` or a domain over HTTPS — an IP address cannot be an RP ID
Installation steps
- 01
Install from npm: `dsh plugin --profile web add dsh-ui-auth`
$ dsh plugin --profile web add dsh-ui-auth
- 02
Or pin a GitHub release: `dsh plugin --profile web add github:0QwQ0/dsh-ui-auth#v0.7.0`
$ dsh plugin --profile web add github:0QwQ0/dsh-ui-auth#v0.7.0
- 03
Or install from a local directory: `dsh plugin --profile web add <本插件目录的绝对路径>`
$ dsh plugin --profile web add <本插件目录的绝对路径>
- 04
Restart the panel once — the bundle layer is applied at startup
Verify the integration
- Open the panel: it redirects to `/auth/login`
- Log in as `admin` with the random password printed in the console log (lines starting with `[dsh-ui-auth]`) or in `dsh-ui-auth-bootstrap.txt` in the panel working directory
Rollback
- `dsh plugin --profile web remove dsh-ui-auth` and restart the panel; the gateway, settings panel and client module disappear and the profile dependency/bundle list is restored
- Uninstalling does not delete account data; to clear it too, follow the README’s reset section
03DSH integration and capability boundaries
Native dsh profile bundle: the package declares `dsh.bundle.patch` and `dsh.client`, so `dsh plugin` adds it to the profile bundle list automatically. It wraps DSH’s HTTP server before route dispatch and gates `/api/*`, `/plugins/*`, HMR, the SPA fallback and the WebSocket upgrade path.
Full-surface interception
any HTTP request or WebSocket upgrade reaching DSH→302 for pages, 401 for APIs, dropped WS upgrades when unauthenticated; the original request passes through untouched once logged in
TOTP two-factor and passkeys
an authenticator app (RFC 6238) or a WebAuthn credential→password + dynamic code login, or passwordless sign-in with a passkey; one account can hold several passkeys
the private key never leaves the device — the server stores only the public keyPer-user model keys
each user’s own provider / model / API key in Settings → Models→a table with masked keys and balances; private keys are encrypted with a passphrase-derived key so the server cannot decrypt them while locked
balance lookup requires unlocking firstadmin shares are usable and show a balance but never the key, and revocation is immediateWebSocket mux proxy with per-frame filtering
`/api/remote.mux` upgrade from a logged-in client→a transparent proxy that drops or trims other users’ `baseline.items`, `upsert.workspace`, `order.workspaceIds` and session events while forwarding your own unchanged
`DSH_AUTH_MUX_PROXY=0` steps back to a straight pass-through for troubleshooting and reintroduces the leakBilingual login / registration UI
DSH’s locale setting or the browser’s `Accept-Language`→Chinese / English login, registration and onboarding pages that switch with DSH’s locale service
04Who is it for? When not to use it?
Good for
- Operators exposing the DSH panel beyond localhost who need an authentication layer before the panel itself
- Teams or families sharing one DeepSeek Harness instance who need per-account isolation rather than a single shared login
Not for
- v0.7.0 only supports the modern DSH 0.2.0 line. Without modern transport capability the plugin fails closed — the gateway is not established and the panel becomes unreachable — rather than falling back to the legacy transport or running unauthenticated.
- Browsers cannot use an IP address as a passkey RP ID: `http://127.0.0.1:3080` and `http://<LAN IP>:3080` cannot do passkeys. Use `http://localhost:3080` locally or a domain with HTTPS.
- Isolation covers DSH sessions and workspaces per logged-in user; it does not change DSH’s process permission model and cannot isolate a third-party plugin’s own data. Strong multi-tenant isolation needs support on the DSH side.
05Compatibility, maintenance and safety notes
- v0.7.0 only supports the modern DSH 0.2.0 line. Without modern transport capability the plugin fails closed — the gateway is not established and the panel becomes unreachable — rather than falling back to the legacy transport or running unauthenticated.
- Browsers cannot use an IP address as a passkey RP ID: `http://127.0.0.1:3080` and `http://<LAN IP>:3080` cannot do passkeys. Use `http://localhost:3080` locally or a domain with HTTPS.
- Isolation covers DSH sessions and workspaces per logged-in user; it does not change DSH’s process permission model and cannot isolate a third-party plugin’s own data. Strong multi-tenant isolation needs support on the DSH side.
- For public deployments put the panel behind an HTTPS reverse proxy that terminates TLS and preserves Host, and set `DSH_AUTH_TRUST_PROXY=1` there — otherwise login rate limiting aggregates everyone under the proxy IP.
- The first start writes `dsh-ui-auth-bootstrap.txt` containing the generated admin password. The README says to delete it once used, and it is removed automatically after any user changes their password successfully.
MIT · actively maintained (latest release v0.7.1, 2026-10-16) · legacy DSH 0.1.1-rc.2 support ended in v0.7.0
06Frequently asked questions
Which DSH versions does v0.7.x support?
DSH `>=0.2.0-rc.2 <0.3.0` in the web profile. The legacy `0.1.1-rc.2` transport was removed in v0.7.0: without modern transport capability the plugin fails closed — the gateway is not established and the panel is unreachable — instead of running unauthenticated.
How do I log in the first time?
When the user table is empty the plugin creates `admin` and prints a random password both in the panel console log (lines starting with `[dsh-ui-auth]`) and in `dsh-ui-auth-bootstrap.txt` in the panel working directory. The panel redirects to `/auth/login`; change the password right away in Settings → User Management, which also deletes the bootstrap file.
Why can’t I use a passkey on my LAN IP?
Browsers refuse an IP address as a WebAuthn RP ID, and plain HTTP is not a secure context. Use `http://localhost:3080` on the same machine or give the panel a domain with HTTPS.
Can ordinary users see other people’s sessions?
No. Sessions and workspaces record their owner at creation; list and search responses are filtered, direct access to someone else’s session returns 403, and the `/api/remote.mux` WebSocket is proxied with per-frame filtering. Admins see everything.
Does the plugin change DSH’s own permission model?
No. It isolates DSH session/workspace data per logged-in user but does not change DSH’s process permissions and cannot isolate a third-party plugin’s data. DSH’s DNS-rebinding fence on `/api` is explicitly not authentication — this plugin is the authentication layer in front of it.
07Related DSH workflows
cc-safety-net
by kenryu42
A pre-execution guard for AI coding agents. It blocks destructive Git and file system commands, plus common attempts to access sensitive files, before a tool call runs. Supports Amp Code, Antigravity CLI, Claude Code, Codex, Cursor, DeepSeek Harness, Devin CLI, GitHub Copilot CLI, Grok Build, Hermes Agent, Kimi Code, OpenClaw, OpenCode, and Pi.
dsh-uumit-remote
by uumit-ai
Connect to DSH from another device and selectively share the remote instance with invited users.
deltabox-lite
by delta-box
Lightweight, agent-native sandboxing with diff, commit and abort
tencentmeeting-cli
by tencentcloud
Tencent Meeting command-line tool with OAuth2 authorization for meeting, recording and attendance-report management.
08Data and sources
本包是标准的 DSH profile bundle(声明了 `dsh.bundle.patch` 与 `dsh.client`), `dsh plugin` 会自动把它加入 profile 的 bundle 名单:
在 DSH 路由分发之前包装其 HTTP 服务器,覆盖 `/api/*`、`/plugins/*`、HMR、 SPA fallback 与 WebSocket 升级通道,没有旁路。
This page is generated from the project’s public documentation, repository metadata and a structured parse of DSH Plugins; last verified on 2026-11-10. Found an error? Submit a correction.
Best DeepSeek Harness Plugins
Twelve plugins worth installing first — picked from the whole catalog, across every category.
