Back to directory

dsh-ui-auth

In a curated listMaintenance: Active

0qwq0/dsh-ui-auth

Gate DSH HTTP and WebSocket access behind login and isolate user sessions and model configuration.

View on GitHub
$ dsh plugin --profile web add dsh-ui-auth

14

stars

6

forks

JavaScript

Language

MIT

License

2026-08-23

Created

2026-10-16

Last push

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

  1. 01

    Install from npm: `dsh plugin --profile web add dsh-ui-auth`

    $ dsh plugin --profile web add dsh-ui-auth

  2. 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

  3. 03

    Or install from a local directory: `dsh plugin --profile web add <本插件目录的绝对路径>`

    $ dsh plugin --profile web add <本插件目录的绝对路径>

  4. 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

DSH integrationNative runtime

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 key
  • Per-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 immediate
  • WebSocket 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 leak
  • Bilingual 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.
2026-08-232026-10-16v0.7.1

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.

08Data and sources

  • Author-claimedgithub.com6c5e87b44be4…

    本包是标准的 DSH profile bundle(声明了 `dsh.bundle.patch` 与 `dsh.client`), `dsh plugin` 会自动把它加入 profile 的 bundle 名单:

  • Author-claimedgithub.com6c5e87b44be4…

    在 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.

DSH Plugins is an independent community directory of DeepSeek Harness plugins. Not affiliated with or endorsed by DeepSeek. Third-party plugins are not security-audited — review the source before installing.

New DeepSeek Harness plugins, weekly. No spam.