Reverse tunnel for the DSH Web GUI: exposes a `dsh --profile web` deployment at a public frp URL and switches the directory picker to the in-app browser, so a phone or remote machine can open and manage the workspace.
Install
# from npm (prebuilt)
dsh plugin --profile web add @froststarinquire/dsh-remote-access-web
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:wikkd/dsh-remote-access-web#path:/packages/bundle/remote-access-web
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. Only install sources you trust, and pin a commit (github:owner/repo#sha).
README
English | 中文
The dsh browser-surface remote-access bundle. cordis.patch.yml rides over the official dsh-web-app surface: it inserts the @froststarinquire/dsh-remote-access host row, which manages an outbound reverse tunnel so a remote device can reach the harness web service. The tunnel backend is selected by the provider config; the shipped driver is the frp provider (provider: 'frp'), running an frpc-compatible client. The browser surface (phone drawer layout, remote-auth pair gate) is carried by dsh-web-app; this bundle only adds tunnel management and the launch contract that admits the tunnel through the /api browser-trust fence.
The host plugin is adapted from @deepseek-ai/dsh-remote-access in the DeepSeek Harness source (MIT), published here under the @froststarinquire scope.
A profile installs this bundle after dsh-web-app in dsh.profile.bundles. Because a bundle patch replaces a whole row's config, the inserted row reads every value from the deployment environment (DSH_REMOTE_ACCESS_*), never literal config. An unconfigured install stays inert: the plugin's provider default is none, so a profile that adds this bundle before owning a tunnel spawns nothing.
The patch also pins the directory picker to the in-app -browse interaction. Through a reverse tunnel the native OS dialog is unavailable, so dsh-web-app's adaptive chooser would leave the remote operator with no way to add a workspace. This bundle disables that chooser and mounts dsh-host-directory-picker-browse plus its dsh-client-ui-directory-picker-browse surface.
Configuration
The row honors the deployment env (all optional; provider defaults to none):
| Env | Meaning |
|---|---|
DSH_REMOTE_ACCESS_PROVIDER |
Tunnel backend; frp mounts a tunnel through an frpc-compatible client, absent keeps the schema default none (inert). The field is deployment-configurable so other backends can be added |
DSH_REMOTE_ACCESS_FRPC_PATH |
absolute path to frpc (or compatible); required when provider is frp |
DSH_REMOTE_ACCESS_FRP_ARGS |
frp fast-start value for -f, i.e. <access-secret>:<tunnel-id> |
DSH_REMOTE_ACCESS_CWD |
working directory for the tunnel child; defaults to the process cwd |
DSH_REMOTE_ACCESS_PUBLIC_URL |
public URL surfaced once the tunnel is up; the plugin's trustedAuthority() canonicalizes it for the trust fence |
When provider is frp but frpcPath/frpArgs are absent, the owning plugin refuses to activate loud rather than silently running without a tunnel.
The tunnel's connection address is yours to supply — the plugin never ships a default endpoint. Set the env above to your own provider's public host (DSH_REMOTE_ACCESS_PUBLIC_URL) and launch credential (DSH_REMOTE_ACCESS_FRP_ARGS); without them, an install stays inert.
Launch contract
The tunnel's public authority must reach the /api browser-trust fence at boot — the fence samples trust once when dsh-web-app provides webRuntime, so a runtime plugin cannot retrofit it. Put your own tunnel authority in place of <your-tunnel-host> and launch (and open the remote surface as desired):
dsh --profile web \
--trusted-host <your-tunnel-host:port> \
--allow-remote-privileged \
--remote-auth
--allow-remote-privileged lets the loopback-pinned methods (settings, credentials, native dialogs) accept the trusted authority; --remote-auth enforces the paired-session gate on non-loopback /api. Some tunnel providers (including typical frp edges) are HTTPS-only and return 501 on http://, so open the phone on the https:// public URL.
Known Limitations and Deferred Work
- The remote surface is not authenticated by this bundle —
--remote-authenables the pairing gate indsh-web-app; without it, the tunnel exposes the harness to anyone who can reach the public authority. Only run on a tunnel you trust. - The trust fence is a boot-time snapshot — the tunnel authority must be passed via
--trusted-hostat launch; it cannot be added after boot from this bundle's runtime.
Links
More in this category
strukto-ai/mirage#dsh★ 3416
Swaps the filesystem and bash providers for a mirage virtual workspace: file tools and shell commands run over mounted resources (RAM, S3, Redis, Slack, Gmail, Notion, Postgres) instead of the host disk, with per-mount read/write/exec modes, per-command sandbox routing (monty, pyodide, quickjs in process; docker, e2b, daytona remote), and installed CLIs (git, gh, slack, linear, ntn, gws, or one you register) as head words in the virtual terminal.
hust-open-atom-club/oh-dsh★ 171
Community distribution: TUI, desktop, and Web UI as one bundle with layered installation.
Jayden-X-L/forkprobe★ 65
Compare multiple skills on the same task and pick the winner.
vlln/plugin-registry★ 37
Ecosystem infrastructure: a thin browser console for managing official repository plugins (zero patches) plus a make-dsh-plugin skill for guided plugin development.
forrestchang/dsh-multica-runtime★ 32
Run the dsh runtime on Multica.
DietCokewithSugar/dsh-user-experience★ 18
Finds potential UX issues in your project: automatically reviews React/TypeScript code, pinpoints each problem, and gives concrete suggestions.