现代化 Windows 代理客户端
融合 v2rayN 自由直观的节点路由编辑 与 Clash Verge Rev 般优雅现代 UI。
由 mihomo (Clash.Meta) 内核驱动,以节点为中心,面向 24/7 长期不间断运行深度优化。
核心特性 • 技术架构 • 快速开始 • 长期运行稳定性 • 系统服务与自启 • 开源许可
"Draft One" —— 一份自用的思路草案与概念实现。
- 个人创意自用:本项目纯属个人日常使用场景下的灵感试验与自用工具,核心思路是将直观的节点路由控制与现代化 UI 进行组合实现。
- 无维护计划 (No Maintenance):本项目为阶段性自用产物,不承诺、亦无后续长期维护计划。不对任何环境下的运行状况、兼容性或更新负责。
- 不接收 PR 与 Issues:不开放/不处理 Pull Request 及 Issues,请勿提交功能建议、Bug 反馈或合并请求。如需二次开发或修改,请自行 Fork 探索。
本项目站在了巨人的肩膀上。没有以下优秀的开源项目与核心开发者的付出,就没有本项目的诞生。在此致以诚挚的感谢与崇高的敬意:
- mihomo (Clash.Meta):提供了强悍、稳健且高度可扩展的底层代理核心驱动。
- v2rayN:为本项目带来了“以真实节点为中心”与自由路由控制的直观交互灵感。
- Clash Verge Rev:极具美感且优雅的现代桌面客户端交互典范。
- 抛弃复杂抽象的 Clash 嵌套分组(Proxy Group 树),以真实代理节点为主视图。
- 节点列表支持按订阅分组过滤、批量/单个测速、实时上/下行速率与累计用量显示。
- 点击任意节点直接秒级切换活动出站节点,零感无缝切换。
- 支持同时绑定管理多个机场订阅,独立存储在本地,互不覆盖。
- 自动抓取并解析
Subscription-Userinfo套餐配额:直观展示已用/总流量进度条与到期时间。 - 支持单个订阅启用/禁用开关、单订阅刷新、一键更新所有订阅、修改订阅备注与链接。
- 智能节点聚合:自动聚合所有已启用订阅的节点,同名节点自动注入订阅前缀防冲突。
- 支持主流协议单条/多条链接导入:
- VMess (
vmess://Base64 JSON,支持 ws/grpc/tls) - VLESS (
vless://,完整支持 Reality public-key/short-id、TLS、Flow) - Shadowsocks (
ss://,支持 SIP002 与标准 Base64 格式) - Trojan (
trojan://,支持 SNI 与 WebSocket) - Hysteria 2 (
hysteria2:///hy2://)
- VMess (
- 支持一键从系统剪贴板粘贴多行链接或整段 Base64 订阅文本自动逆解码解析。
- 自定义分流规则:域名后缀、域名关键字、进程名、IP-CIDR、GeoSite、GeoIP、外部规则集、兜底 MATCH。一条规则的载荷可用逗号、分号或换行拆成多条 mihomo 规则;禁用的规则不会写入配置。
- 路由页分成三块:自定义规则、广告拦截、直连。自定义在最前。直连里有游戏下载、局域网、微信、中国大陆,以及
geosite:cn和中国 IP。内核每 24 小时用直连更新那四条远程名单。 - 出站目标支持
DIRECT、REJECT、PROXY,以及任意具体节点名称(如GEOSITE,openai,Singapore-S1)。 - 添加规则后,载荷停顿 400ms 再写入配置并热重载;增删、排序和开关立刻保存。规则库页和路由页的「更新规则库」下载地理库、anti-AD 和四条直连名单。每条操作对应的 IPC 见 ARCHITECTURE.md 第 6 节。
- 设置里的自动更新开关只保存偏好,当前版本没有 24 小时或每周的后台拉取任务。内核自己的 anti-AD
interval仍是 86400 秒。
- 实时全局上行/下行速率监测与动态图表。
- 单节点流量消耗统计。流量页每 2 秒向内核取连接表,按连接增量刷新域名和 IP。累计记在
data\traffic-stats.json,重启和升级后还在。DIRECT算国内直连,其余非拦截节点算海外。 - Top 50 域名 / IP 访问流量排行与匹配规则下钻分析。
- 主机表超过 1500 条时保留流量最高的 800 条。节点累计超过 600 个时保留流量最高的 400 个。界面日志从
data\logs\app.log装回最近 2000 条。app.log和service.log各自最多 4 个文件,每个 4MB。
- 安装范围是全体用户。安装包要求管理员权限,默认目录是
C:\Program Files\draft-one。没有单独的当前用户安装模式。可执行文件在这个目录里。配置、规则和日志在旁边的data\。app.log和service.log各自最多 4 个文件,每个 4MB。浏览器缓存、GPU 缓存和 TEMP 仍放在系统常规位置。卸载会删掉data\、服务、登录项、计划任务和本程序加过的防火墙规则。 - Windows 服务是开机路径。安装时注册
DraftOneService,以本地系统账户启动旁边的mihomo.exe。用户登录后,服务在该用户的桌面里启动draft-one.exe --silent,由这个进程创建托盘。服务进程自己在 Session 0,不能创建托盘。 - 登录启动项:安装器写入
HKCU\...\Run,参数--silent,作为托盘的备份。设置页可以开关这一项。 - 系统服务页可以手动创建
DraftOne_AutoStart。它在当前用户登录时以最高权限运行,只在该用户已登录时启动,不限制必须使用交流电源,任务配置是 Windows 10。页面可以打开taskschd.msc查看这条任务。没有交互登录限制的旧最高权限任务,界面启动后仍会删掉。安装器升级和轻量升级都保留这条任务。卸载才会删掉它。 - 内核管理:确认后结束本机所有
mihomo.exe,并关闭系统代理。也可以结束后立即重新启动本程序的内核。 - 网络修复工具箱:刷新 DNS 缓存(
ipconfig /flushdns)、重置 Winsock(先恢复系统代理,完成后需要重启计算机)、修复防火墙入站规则(DraftOne_App、DraftOne_Core)、只清理名为DraftOneTun的网卡、为 Microsoft Store 应用写入回环豁免。
针对家庭软路由旁路、开发机、办公电脑等长期开机不间断运行场景做了针对性深度优化:
- 内核守护与单次拉起:
- 主进程监听
mihomo子进程退出。非手动停止且不是端口冲突时,只自动重启 1 次,间隔 1 秒。再次失败后停止重试,界面弹出内核异常条,并只发一次系统通知。端口 7890/9090 被占用时不循环重启,弹出确认框;能认出监听进程时,确认后只结束那个 PID。DraftOneService拉起的内核按 1 秒、2 秒、4 秒退避,最多 5 次。 - 每 10 秒探测
127.0.0.1:9090。探测成功会清掉异常条。
- 主进程监听
- 睡眠唤醒探测:
powerMonitor的resume事件会再做一次控制端口健康检查。健康检查失败时,只结束本进程自己启动的内核,并走上面的异常提示。服务托管的内核不会被这个检查杀掉。
- 退出与未捕获异常时还原系统代理:
before-quit、will-quit、exit、SIGINT、SIGTERM和uncaughtException会把系统代理和 PAC 恢复成打开之前的设置,并通知 Windows 重新读取,然后停止内核。没有备份时只把ProxyEnable写回0。- 内核掉线但主程序仍在运行时,不会自动关掉系统代理。界面给出手动关闭代理或重启内核的操作。
- 内存上限:
- 域名流量表超过 1500 条时保留流量最高的 800 条,节点累计超过 600 个时保留流量最高的 400 个,并写在
data\traffic-stats.json。连接结束后丢掉该连接的字节读数,已经累计的流量保留。界面只展示流量最高的 50 个主机。内核日志从app.log装回最近 2000 条。app.log和service.log各自最多 4 个文件、每个 4MB,启动后每 10 分钟再清一次多余的旧文件。
- 域名流量表超过 1500 条时保留流量最高的 800 条,节点累计超过 600 个时保留流量最高的 400 个,并写在
- 代理内核:
mihomo(Clash.Meta) Windows x64 - 桌面应用:
Electron 33+electron-vite - 前端界面:
React 18+TypeScript+Tailwind CSS+lucide-react+@dnd-kit。界面状态放在App.tsx,经 preload IPC 交给主进程;zustand在依赖里,当前页面没有使用。 - 构建测试:
Node.js test runner。test/src-modules.test.mjs直接 importsrc/main。test/unit-test.mjs仍有一份平行实现。打包用electron-builder - 界面分页:控制面板、节点中心、流量统计、路由分流、规则库、DNS 策略、内核日志、系统服务与工具、应用设置。系统代理和 TUN 只在控制面板。广告域名在路由规则里,RULE-SET 载荷是
anti-ad,默认关闭。各页到内核的链路见 ARCHITECTURE.md 第 6 节。
- Windows 10 / 11 64位操作系统(或 WSL2 环境下协同开发)
- Node.js >= 20.x,pnpm >= 9.x
- 内核文件名是
resources/binaries/mihomo.exe。pnpm build:win会先跑scripts/prepare-binaries.mjs,缺文件时下载 mihomov1.19.32(可用环境变量MIHOMO_VERSION覆盖),并准备geoip.dat、geosite.dat、country.mmdb和anti-ad.yaml。发布 CI 强制重新下载这些文件,并在anti-ad.yaml缺失或小于 100KB 时失败。安装包内置这份名单,首次启动再拷到安装目录的data\。 - TUN 偏好保存在
user-settings.json。DraftOneService正在运行时才会把tun.enable: true写进正在使用的config.yaml。仓库不单独提交wintun.dll;prepare-binaries.mjs也只复制内核 exe,并在旁边写下mihomo.sha256。若当前 mihomo 构建没有内嵌 Wintun,需要自行把 x64wintun.dll放到resources/binaries/。
# 1. 安装依赖
pnpm install
# 2. 运行自动化全套类型检查与单元测试
pnpm test
# 3. 启动开发服务器并拉起桌面窗口
pnpm dev针对 WSL 开发者提供了自动化免切环境脚本:
./scripts/install.sh # 在 Windows 宿主环境执行 pnpm install
./scripts/test.sh # 自动化执行类型检查与单元测试
./scripts/dev.sh # 启动开发服务器并在 Windows 桌面弹出原生窗口
./scripts/build.sh # 生产打包构建# NSIS 安装包 + x64 zip。会先准备内核与规则库文件。
pnpm build:win
# 同上,并额外打增量更新包
pnpm build:release输出目录位于 dist/。本地 pnpm run build:pack 打全量加增量。升级时会按进程名结束本机的 mihomo。
Git 标签去掉 v 之后必须等于 package.json 的 version。
- 开发版标签带
-dev,例如v1.0.23-dev.1。CI 标成预发布,附件是draft-one-Setup-<版本>-Update.exe和draft-one-Windows-<版本>-Update-x64.zip。 - 正式版标签不带
-dev,例如v1.0.23。CI 另外附上draft-one-Setup-<版本>.exe和draft-one-Windows-<版本>-x64.zip。
配置和日志写在程序目录的 data\。缓存和 TEMP 仍用系统常规位置。关闭窗口只会隐藏到托盘,退出时才停内核。
本项目基于 MIT License 开源。