Dinotty
为 AI 编程代理打造的多设备终端服务器:服务器端 VTE、会话持久化、文件浏览与插件系统,自托管,跨手机、平板、桌面无缝续接会话。
证据显示项目对安全有认真设计:Token/验证码双登录模式、细粒度 Token 权限系统、zeroize 处理敏感数据、紧急恢复路径、卸载通知插件时的 409 防锁定。但这些主要来自 README 的自述,服务端认证与权限的实际实现文件未提供,故多为 2 分。依赖安全扣分:Cargo.toml 未加锁文件证据、无 cargo-audit/deny 配置,且 russh-keys 使用 beta 版本(0.50.0-beta.7)。来源归属扣分:维护者署名为 'Dinotty Contributors <[email protected]>',匿名不可回溯。
CI 覆盖前端构建/类型检查、clippy -D warnings、cargo test;测试文件真实且细致(如 AboutTab 更新检查的多场景断言),前后端版本声明一致(0.25.1/示例 0.20.0 属测试数据)。扣分:错误信息质量仅在测试中间接体现,服务端失败路径(SSH 失败、PTY 崩溃恢复)无直接证据。
面向 AI coding agent 用户的多设备终端场景定位清晰,覆盖 macOS/Linux/Windows,提供 DINOTTY_SHELL 等环境适配与响应式布局;Web 预览反向代理可能使本地 dev server 暴露于登录保护之下,边界描述不够具体,故 trigger_precision 与 capability_boundaries 仅 2/1。
安装说明详尽(各平台安装、systemd、未签名 macOS 的 xattr 处理、验证码登录恢复流程)可达 3 分;MIT 许可证全文一致(但版权年份 2026 略异常)。信息架构有完整文档索引。扣分:无 CHANGELOG 文件证据,版本管理仅由发布指南链接描述;维护责任为个人仓库 + 匿名 deb maintainer,更新路径依赖 GitHub Releases,证据薄弱。
文本级传输对比远程桌面的价值主张明确且量化(~1-10 KB/s),'服务端 VTE 会话恢复'相对 ttyd/gotty 有清晰差异化;服务器端 VTE + 持久 PTY 属真实工程量。扣分:性能与带宽数字无基准测试证据支撑,仅是声明。
关键安全声明(验证码登录、Token 权限、审计 webhook)指向专门文档页可追溯,但核心实现源码不在提供的证据内,静态审查只能采信文档。README 中大量量化声明(带宽倍数、比较表)无法交叉验证;事实与推断的区分不足,比较文档(vs ttyd 等)可能含竞争性表述,需谨慎。
- 核心认证与权限系统的实现源码未在证据内提供,安全声明(验证码登录、Token 细粒度权限)应视为文档级承诺而非已验证事实。
- russh-keys 依赖为 0.50.0-beta.7 预发布版本,生产使用需自行评估稳定性。
- 服务默认监听 8999 端口并暴露终端、SFTP、SSH 凭据与文件系统访问,公网部署前必须配置反向代理/防火墙并核实认证实现。
- Web 预览反向代理和插件系统(可热加载 JS、订阅事件、HTTP API)扩大攻击面,第三方插件应视为不可信代码。
- 未发现 CHANGELOG 或第三方审计证据,版本间的行为变更需自行跟踪 Releases。
- Linux 一键安装脚本从 GitHub 下载并 sudo 安装,建议先核对下载内容的校验和。
这个 Agent 能做什么,适合哪些场景?
Dinotty 是一个用 Rust 编写的自托管多设备终端服务器,专为在任意设备上运行 Claude Code、opencode、Codex、OpenClaw 等 AI 编程代理而设计。后端基于 Axum 0.7 与 Tokio,使用 portable-pty 在服务器端运行完整 VTE 状态机,因此 PTY 进程在断连后依然存活,刷新页面即可恢复现场。前端采用 Vue 3、TypeScript 与 xterm.js 5,桌面客户端基于 Tauri。终端、插件、文件、SSH 与 Web 预览均为可拖拽的窗格,支持多工作区与 Mission Control 概览。数据仅传输文本(约 1–10 KB/s),不走中继、无订阅费用,适合在 3G/4G 弱网与移动场景下使用。
用户在服务器上启动 dinotty-server(默认端口 8999),浏览器访问 http://<ip>:8999 即可通过 Token 或 6 位验证码登录并接入 PTY 会话。服务器端 VTE 解析器持续维护精确屏幕状态,断线后自动指数退避重连,刷新页面恢复原会话。窗格系统支持终端、内置文件浏览器(代码高亮、Markdown 渲染、Office 预览、音视频播放)、SSH/SFTP 远程连接、Git 变更标记与 Web 预览(反向代理本地开发服务器)的组合与跨标签拖拽。广播模式可将一个窗格的输入同时执行到所有窗格;命令书签支持右键收藏与一键执行。插件系统支持 JS 热重载与 CLI 桥接,内置 CC Switch、JSON Formatter、Claude Code 会话管理器等。另有通知系统(终端响铃/OSC 检测、WebSocket 推送)、系统监控图表、命令面板、Open API HTTP 端点,以及内置 MCP JSON-RPC 服务器供 AI 助手操作终端会话。
- 在电脑上用 Claude Code 跑到一半任务,需要出门时用手机或 iPad 无缝接管同一会话继续工作。
- 运维或开发者通过内置 SSH 客户端与 SFTP 文件管理,把远程服务器会话当作本地终端使用。
- 需要在多台服务器间频繁切换的服务端工程师,使用服务器列表与多工作区隔离管理连接。
- 移动网络(3G/4G)下需要远程编程的用户,利用纯文本传输与自动重连避免远程桌面的高带宽与卡顿。
- 希望定制工作流的用户,通过热重载 JS 插件、命令书签、Open API(Stream Deck、快捷指令)扩展终端能力。
- 想让 AI 助手自动化操作终端的团队,通过内置 MCP 服务器让外部代理读写终端会话。
这个 Agent 有哪些优点和局限?
- 服务器端 VTE 而非 WebSocket-PTY 管道转发:PTY 进程在断连后存活,刷新页面即可精确恢复屏幕状态,这是相对 ttyd/gotty/Wetty 类方案的核心差异。
- 纯文本传输约 1–10 KB/s,比远程桌面(VNC/RDP/Parsec)低 100–1000 倍带宽,可在 3G/4G 弱网流畅使用且省电。
- 自包含环境:文件浏览器、Git 变更标记、SSH/SFTP、Web 预览、插件系统全部内置,无需额外拼装工具链。
- 自托管、无订阅、无中继费用,数据留在自己的机器上;MIT 许可。
- 可扩展性强:热重载 JS 插件、Open API HTTP 端点、内置 MCP 服务器、能力化多 Token 权限系统与审计日志/Webhook。
- macOS 安装包未签名,需手动执行 xattr 命令移除系统限制,对普通用户有额外门槛。
- 源码构建需要 Rust 工具链与 pnpm/Node.js 前端构建流程,编译成本不低。
- 验证码登录依赖已安装并订阅 auth.verification_code 事件的通知插件,插件被卸载有被拒(409)或锁死风险,需按文档做紧急恢复。
- 作为自托管服务,需要自行管理服务器部署(systemd/Docker)、端口暴露与 Token 安全。
- Windows 下默认 shell 检测依赖 DINOTTY_SHELL → pwsh.exe → powershell.exe → cmd.exe 的顺序,非 PowerShell 环境可能需要手动配置。
如何安装或部署这个 Agent?
方式一:从 GitHub Releases 下载安装包 —— macOS 使用 .dmg(因未签名,安装后需执行 xattr -cr /Applications/Dinotty.app 移除限制);Linux 使用 .deb(sudo dpkg -i dinotty_*.deb),可通过 systemctl start dinotty 启动并 systemctl enable dinotty 设为开机自启;Windows 运行 .exe(PowerShell 中执行 .\dinotty-server.exe -p 8999,可用 $env:DINOTTY_SHELL = "pwsh.exe" 指定默认 shell)。Linux 一键安装:VERSION=$(curl -s https://api.github.com/repos/xichan96/dinotty/releases/latest | sed -n 's/.*"tag_name": *"\([^"]*\)".*/\1/p' | sed 's/^v//') && curl -LO "https://github.com/xichan96/dinotty/releases/download/v${VERSION}/dinotty-server_${VERSION}-1_amd64.deb" && sudo dpkg -i "dinotty-server_${VERSION}-1_amd64.deb"。方式二:源码构建 —— git clone --depth 1 --single-branch -b dev [email protected]:xichan96/dinotty.git,进入 frontend 目录执行 pnpm install && pnpm run build,回到根目录 cargo run。需要 Rust 工具链与 pnpm/Node.js。
如何使用这个 Agent?
启动服务后,浏览器访问 http://<你的IP>:8999(默认端口 8999,可用 -p 参数自定义,如 dinotty-server -p 3000)。使用默认 Token 登录,或在「Security & Access」中切换为验证码登录(需先安装订阅了 auth.verification_code 事件的消息通知插件,如 feishu-notify;验证码 5 分钟有效、单次使用、错 5 次作废;若被锁死,可在服务器本机编辑 ~/.dinotty/settings.,Windows 为 %APPDATA%\dinotty\settings.,将 auth.login_method 改回 "token" 并重启服务)。登录后即可在窗格中运行 Claude Code、opencode、Codex 等代理;断线或刷新页面会话自动恢复。调试可用 RUST_LOG=debug cargo run 开启日志,前端类型检查用 npx vue-tsc --noEmit。
这个 Agent 与同类方案有什么区别?
README 明确提供了与远程桌面方案(VNC/RDP/Parsec)的对比:Dinotty 仅传输文本(典型 1–10 KB/s),而远程桌面需以 30–60 fps 传输全屏像素(约 1–10 MB/s);在弱网容忍、电量消耗、分辨率适配方面 Dinotty 均占优。另有专门文档对比 ttyd/gotty/Wetty 及其他 AI 编程远程方案(docs/en/getting-started/comparison.md),核心差异在于 Dinotty 是服务器端 VTE 状态机而非管道转发,会话可在断连后恢复。