把本地 DeepSeek Harness WebUI 搬到手机上:局域网代理桥接、移动端 UI 适配、设备审批,外加原生 Android 外壳。
30.7/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/18 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查有告警:未发布到 npm registry,仅可从源码安装;安装清单取自 netmon/package.json。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add cuteG41cute/dsh-mobile该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · ui
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 17 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(unknown · 2026/11/2) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意未发布到 npm registry,仅可从源码安装;安装清单取自 netmon/package.json
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包dsh-netmon(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/11 22:23:12
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件写入剪贴板(不计风险)读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 35 处,展示前 27 条)
- 读取本地文件bridge/bridge.cjs:61
if (fs.existsSync(LOG_FILE) && fs.statSync(LOG_FILE).size > 1024 * 1024) fs.truncateSync(LOG_FILE, 0); - 写入本地文件bridge/bridge.cjs:64
fs.appendFileSync(LOG_FILE, "[" + new Date().toISOString() + "] " + message + "\n"); - 发起网络请求bridge/bridge.cjs:176
const probe = http.request({ - 读取密钥环境变量bridge/bridge.cjs:220
const TOKEN_DAYS = Number(process.env.DSH_BRIDGE_TOKEN_DAYS || 7); - 读取密钥环境变量bridge/bridge.cjs:234
if (process.env.DSH_BRIDGE_ACCESS_TOKEN) return process.env.DSH_BRIDGE_ACCESS_TOKEN; - 读取本地文件bridge/bridge.cjs:308
const stat = fs.statSync(file); - 读取本地文件bridge/bridge.cjs:311
const text = fs.readFileSync(file, "utf8"); - 读取本地文件bridge/bridge.cjs:388
const parsed = JSON.parse(fs.readFileSync(DEVICE_STORE_FILE, "utf8")); - 写入本地文件bridge/bridge.cjs:407
try { fs.writeFileSync(DEVICE_STORE_FILE, JSON.stringify(deviceStore, null, 2) + "\n"); } - 读取本地文件bridge/bridge.cjs:1021
const text = fs.readFileSync(CREDENTIALS, "utf8"); - 读取本地文件bridge/bridge.cjs:1074
try { body = fs.readFileSync(file); } - 发起网络请求bridge/bridge.cjs:1492
const request = http.request({ - 发起网络请求bridge/bridge.cjs:1522
const q = http.request({ hostname: TARGET.hostname, port: TARGET.port || 80, method: "GET", path: SETTINGS_DESCRIBE_PATH, headers: { host: qrHosts().l - 发起网络请求bridge/bridge.cjs:1682
const proxied = http.request({ - 发起网络请求bridge/mobile-panel.js:98
return fetch(API + (host ? '?host=' + encodeURIComponent(host) : ''), { cache: 'no-store' }) - 发起网络请求bridge/mobile-panel.js:102
return fetch(path + '?id=' + encodeURIComponent(id) + (extra || ''), { method: 'POST' }).then(function (r) { return r.json(); }); - 写入剪贴板bridge/mobile-panel.js:243
if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(text); return; } - 发起网络请求bridge/mobile-panel.js:270
fetch('/__wan?url=' + encodeURIComponent(url || ''), { method: 'POST' }) - 发起网络请求bridge/mobile-panel.js:279
fetch('/__wan?rotate=1', { method: 'POST' }) - 发起网络请求bridge/mobile-panel.js:322
fetch('/__display?locale=' + encodeURIComponent(lang), { method: 'POST' }) - 发起网络请求bridge/mobile-panel.js:333
fetch('/__display?' + q.join('&'), { method: 'POST' }) - 发起网络请求bridge/mobile-tweaks.js:558
fetch("/__display", { credentials: "same-origin" }).then(function (r) { return r.json(); }).then(function (info) { - 发起网络请求netmon/lib/client.js:15
return fetch('/dsh-netmon/api', { - 写入剪贴板netmon/lib/client.js:65
try { if (navigator.clipboard && navigator.clipboard.writeText) navigator.clipboard.writeText(text); } catch (e) { } - 发起网络请求netmon/lib/index.js:54
const res = await fetch(url, Object.assign({ signal: controller.signal }, init || {})) - 发起网络请求netmon/lib/index.js:94
const req = https.request({ - 执行外部命令来自配置/变量netmon/lib/index.js:201
const child = spawn(process.execPath, [file].concat(args), {
扫描于 2026/11/3(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 局域网代理桥接
- 移动端UI适配
- 设备审批
README
由 DeepSeek 最新模型翻译生成DSH 手机端(DeepSeek Harness Mobile)
DSH 手机端——把本地 DeepSeek Harness 接入手机
把本机的 DeepSeek Harness WebUI 接到手机上用:局域网扫码即用,需要时再通过任意 frp 隧道从外网接入。
Bring your local DeepSeek Harness WebUI to your phone — over LAN by QR code, over WAN through any frp tunnel.
截图
| 深色(跟随系统) | 浅色 | 会话界面 |
| 深色首屏 | 浅色首屏 | 会话界面 |
界面右侧的圆球是实时网络往返延迟(绿 <150ms / 黄 <400ms / 红更慢);点一下进 App 设置,长按刷新页面,可拖到任意位置并吸附边缘。深色 / 浅色既支持「跟随系统」(系统切深浅时实时跟着变),也支持按设备单独指定。
App 设置与文件浏览
| 首次打开就是这一页(App 设置) | 文件浏览(DSH 自身的「文件」页面) |
| App 设置 | 文件预览 |
还没填地址时,App 直接停在设置页:扫码连接、从相册里的二维码图片连接、保持屏幕常亮、快捷操作(展开/收起会话列表、刷新页面、在系统浏览器中打开),底部是版本号与当前服务器地址。
展开完整文档(README 剩余 1 节)
DSH 手机端(DeepSeek Harness Mobile) DSH 手机端——把本地 DeepSeek Harness 接入手机 把本机的 DeepSeek Harness WebUI 接到手机上用:局域网扫码即用,需要时再通过任意 frp 隧道从外网接入。 Bring your local DeepSeek Harness WebUI to your phone — over LAN by QR code, over WAN through any frp tunnel. 截图 | 深色(跟随系统) | 浅色 | 会话界面 | | 深色首屏 | 浅色首屏 | 会话界面 | 界面右侧的圆球是实时网络往返延迟(绿 <150ms / 黄 <400ms / 红更慢);点一下进 App 设置,长按刷新页面,可拖到任意位置并吸附边缘。深色 / 浅色既支持「跟随系统」(系统切深浅时实时跟着变),也支持按设备单独指定。 App 设置与文件浏览 | 首次打开就是这一页(App 设置) | 文件浏览(DSH 自身的「文件」页面) | | App 设置 | 文件预览 | 还没填地址时,App 直接停在设置页:扫码连接、从相册里的二维码图片连接、保持屏幕常亮、快捷操作(展开/收起会话列表、刷新页面、在系统浏览器中打开),底部是版本号与当前服务器地址。填好一次即长期使用,之后打开直达界面。右侧是 DSH 自带的文件浏览在手机上的样子——翻目录、看文件、改分辨率都不用换设备。 它做了什么 | 能力 | 说明 | | 手机接入桥 | 一个零依赖的 Node 反向代理(默认 0.0.0.0:8099 到 127.0.0.1:3080),替手机侧签发 harness 认证 cookie,并把请求 Host/Origin 归一化成受信任来源 | | 移动端适配 | 往页面注入移动端适配(☰ 抽屉、宽度门控、悬浮球),不改产品源码 | | 「手机端」设置面板 | 二维码(局域网/外网)、App 下载、设备管理(允许/拒绝/踢出/完全信任)、接入口 | | 设备身份与认证 | 粗粒度机型特征码(安卓 App 用 Android ID)→ 随机 ID;新设备在本机点「允许」才放行;口令每 7 天自动轮换,「完全信任」设备免口令 | | 按设备隔离的设置 | 外观 / 字号 / 语言按设备生效,不影响电脑 | | 传输优化 | 压缩透传 + 桥侧 brotli,首屏字节约为原来的 1/3 | | 外网接入 | 任何 frp / 内网穿透都行;自带 Let's Encrypt 证书自动续期脚本(HTTP-01,无需服务商 API 密钥) | | 下载到手机 | 「文件」面板每个文件行有 ⤓;预览里长按也能下载当前文件(含从会话点开的)。经桥的 /__file 以附件形式落到手机「下载」目录 | | 预览手势缩放 | 只对图片生效:预览默认适宽(一屏看全),双指捏合缩放,范围 10%–2000%,页面里不放任何常驻控件(不会挡输入框),长按菜单可切「适宽 / 1:1」。PDF 保持产品排版:分页与滚动原样,捏合不会再去改页面尺寸。| | 下载进度 | 悬浮球边缘一圈细环显示下载进度(原生实现,需 App 在 1.3.5 以上)| | 延迟探测不再被挡 | 悬浮球的 /__ping 是原生请求,1.3.5 起会把 WebView 的 cookie 一起带上——走隧道时不再每 5 秒被口令闸门拦下一次(日志不再刷屏)| | 返回键先关浮层 | 打开抽屉 / 右栏预览 / 插件面板 / 长按菜单时,按安卓返回键会收起它们,不会后退重载页面(页面位置不丢);都没有打开时才按「再按一次退出」处理。页面侧契约 window.__dshmBack(),由 App 在 1.3.5 起从 onBackPressed 调用,纯浏览器里不生效 | | 网络 / 隧道监视器 | 配套 DSH 插件(netmon/):会话头部一个「网络」芯片,点开看接入桥健康、内网入口、外网隧道真实可达性、证书剩余天数、设备在线情况 | | 抗更新退化 | 注入前清单自检 + /__selftest + 桌面启动器自检不过就回退官方端口 | 目录 bridge/ 手机接入桥(Node,零依赖)+ 手机端面板 + 移动端适配注入 + 证书脚本 app/ 安卓 App(原生 WebView 壳,无 Gradle/AndroidX,用 build-tools 直接构建) netmon/ 配套 DSH 插件:会话头部的「网络 / 隧道」监视器(含安装说明) docs/ 部署清单(换一台机器怎么装) 快速开始 前提:本机已能跑 dsh web(默认 127.0.0.1:3080),Node 在 18 以上。 1) 电脑:启动桥 node bridge/bridge.cjs # 默认 0.0.0.0:8099 到 127.0.0.1:3080 node bridge/bridge.cjs --port 8099 --target http://127.0.0.1:3080 2) 电脑:放行防火墙(Windows 管理员运行一次) powershell -ExecutionPolicy Bypass -File bridge/allow-firewall.ps1 3) 打开 http://127.0.0.1:8099/ ——「设置 → 手机端」里有二维码 手机与电脑同一 Wi-Fi 时,浏览器扫码即用;页面里可直接下载安卓 App(也可以在 App 内「扫一扫」直接连上)。 外网接入见 docs/SETUP.md(隧道 → 域名 → 证书 → 二维码)。 安卓 App app/dist/dsh-mobile-1.3.9.apk 是可直接安装的构建产物(自签名,仅供自用);也可以从 Releases 直接下载。装好后应用名是 DeepSeek Harness(桌面图标是一只虎鲸,左右各留 8% 空白)。自己改代码后重新构建: cd apppowershell powershell -ExecutionPolicy Bypass -File build.ps1 -VersionCode 10 -VersionName 1.4.0 需要本机有 Android SDK 和 build-tools(aapt2 / d8 / zipalign / apksigner)。签名密钥请自行生成(keystore/ 不入库)。 版本号以 AndroidManifest.xml 里的 versionCode/versionName 为准:实际 build.ps1 -VersionCode/-VersionName 只影响输出文件名,aapt2 的 --version-code 盖不住清单里的值。改版本请直接改清单,否则会出现「文件名 1.3.4、装上去还是 1.3.3」。 安全模型(请务必读) - 桥端口等价于本机 shell 权限:能打开它的人即可读写文件、执行命令。只暴露桥端口,绝不要暴露 3080。 - 三道闸门:接入口令(外网必须带)+ 设备认证(本机点 ✓)+ 可选「完全信任」(免口令,可随时撤销); - 自签证书(App v1.3.7 起):连到证书不被系统信任的服务器时,App 把 SHA-256 指纹摊给你核对,确认后只认这一张(TOFU)。没有「信任所有证书」这个开关——中间人换一张证书会立刻被拒。 - 桥不给页面注入任何远程代码:面板/适配脚本都是本地文件。 - 建议:只用在家用网络 + 自己的隧道;不要把端口映射到公网裸奔。 已知边界 - 依赖 DSH 的页面结构与启动清单;DSH 大版本更新后若结构变化,最坏情况是少个面板、页面照常(不会白屏)。 - /api/settings/describe 在新版 DSH 上已不存在,因此「按设备隔离」改走页面注入(见 bridge/README.md); - 语言切换在页面加载时解析,改完需刷新一次。 提个醒:两处设置别混淆 - 设置 → 通用设置 里的 语言 / 外观 / 字号是全局的:在任何设备上改,所有设备(含电脑)一起变。 - 设置 → 手机端 →「仅本设备的显示」只作用于当前这台设备:电脑不受影响,按设备保存(换浏览器、重装后仍沿用)。语言在页面加载时解析,改完刷新一次。 | 设置 → 通用设置(全局) | 设置 → 手机端(只影响这一台) | | 通用设置 | 手机端 | 宣传图 分享用(矢量源文件在 docs/,PNG 版同目录): | 横版 1280×640 | 竖版 1080×1920 | banner.png 可直接用作 GitHub 社交预览图;poster.png 底部的二维码指向本仓库(已用 ZXing 实测可扫)。 许可 本项目自己的代码是 MIT(见 LICENSE)。仓库里另有两个第三方文件(ZXing 的 Apache-2.0 jar、qrcode-generator 的 MIT 源码),逐项声明与许可全文见 THIRD-PARTY.md。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
cuteG41cute/dsh-mobile
把本地 DeepSeek Harness WebUI 搬到手机上:局域网代理桥接、移动端 UI 适配、设备审批,外加原生 Android 外壳。
相关插件 · UI / 主题
破甲增强版JeffKeeping/dsh-purge-plus
dsh-purge 的非官方分支fork:适配 DeepSeek Harness 0.2.1-rc.2、破甲内核…
★ 387已汉化DeepSeek 客户端
71.9
无代码业务系统平台nocobase/nocobase
NocoBase 是什么
★ 24,804已汉化DSH
71.8
1Panel 服务器面板1Panel-dev/1Panel
全球 250 万+ 自托管用户共同喜爱。
★ 37,344已汉化DSH
71.5
终端编码代理esengine/DeepSeek-Reasonix
· 指南 · ACP · 扩展开发 · 规格 · 官方网站 · Discord · QQ
★ 36,045已汉化DSH
71.2
工作状态行动态ccch1mneyyy/working-activity
作者:chimney@ccch1mneyyy。社区项目,非 DeepSeek 官方项目。
★ 664已汉化DSH
71.2
多模型配置管家farion1231/cc-switch
跨平台桌面一体化助手,支持 Claude Code、Codex、OpenCode、DeepSeek Harness 等工具,唯一官网 ccswitch.io
★ 151,202已汉化DSH
71.1
这是你的仓库?认领条目