<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>开源项目 on FXIO 技术博客</title><link>https://fxio.site/tags/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/</link><description>Recent content in 开源项目 on FXIO 技术博客</description><generator>Hugo -- 0.157.0</generator><language>zh-cn</language><lastBuildDate>Thu, 30 Jul 2026 07:50:00 +0800</lastBuildDate><atom:link href="https://fxio.site/tags/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/index.xml" rel="self" type="application/rss+xml"/><item><title>扔掉 Electron：一个人 + 一队 AI 代理，撸出双端原生 SSH 客户端 PixShell</title><link>https://fxio.site/posts/tools/pixshell-native-ssh-client/</link><pubDate>Thu, 30 Jul 2026 07:50:00 +0800</pubDate><guid>https://fxio.site/posts/tools/pixshell-native-ssh-client/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;摘要&lt;/strong&gt;：2026 年了，为什么还有人用 Electron 写 SSH 客户端？PixShell 的作者给出了另一种答案：同一个 monorepo，macOS 端用 Swift + AppKit + SwiftTerm + SwiftNIO 手写 SFTP v3 协议，Windows 端用 C# WPF + WebView2 + SSH.NET，双端原生、零 Electron。功能上它几乎照着 FinalShell 抄了一遍作业（同屏目录同步、chmod、打包传输、一键迁移），又加上了 2026 年的新东西：MCP、Agent Bridge、AI 工具一键接管 SSH。更有意思的是——这个项目几乎是一个人带着几个 AI 编码代理写出来的。本文拆解它的功能定位、架构取舍、协议实现细节和那些藏在注释里的踩坑记录。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一个-ssh-客户端的去-electron-化实验"&gt;一个 SSH 客户端的&amp;quot;去 Electron 化&amp;quot;实验&lt;/h2&gt;
&lt;p&gt;打开 FinalShell、Termius、Tabby 的进程列表，你大概率会看到一堆 &lt;code&gt;--type=renderer&lt;/code&gt; 的 Chromium 子进程。一个用来连服务器的工具，自己先吃掉 800MB 内存，这件事大家似乎已经习惯了。&lt;/p&gt;
&lt;p&gt;PixShell（&lt;a href="https://github.com/lyu0805/pixshell"&gt;github.com/lyu0805/pixshell&lt;/a&gt;）的作者显然没习惯。这个项目的前身就是一个 Electron 应用——仓库里的蓝图文档还留着旧账：renderer 约 1.6 万行 + main 约 5700 行 JS。从 v0.1.1 开始，他做了一个相当激进的决定：&lt;strong&gt;推倒重来，双端全原生，同一个 monorepo 维护&lt;/strong&gt;。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;平台&lt;/th&gt;
&lt;th&gt;UI&lt;/th&gt;
&lt;th&gt;终端渲染&lt;/th&gt;
&lt;th&gt;SSH/SFTP 栈&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🍎 macOS&lt;/td&gt;
&lt;td&gt;Swift / AppKit&lt;/td&gt;
&lt;td&gt;SwiftTerm（原生渲染）&lt;/td&gt;
&lt;td&gt;SwiftNIO + &lt;strong&gt;自研 SFTP v3&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🪟 Windows&lt;/td&gt;
&lt;td&gt;C# / WPF&lt;/td&gt;
&lt;td&gt;WebView2 + xterm.js&lt;/td&gt;
&lt;td&gt;SSH.NET&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;注意这张表里最反直觉的一点：macOS 端&lt;strong&gt;没有&lt;/strong&gt;用 xterm.js。Mac 的终端是 SwiftTerm 原生渲染的，只有 Windows 端因为 WPF 生态里没有像样的终端控件，才走了 WebView2 内嵌 xterm.js 这条路。作者在 README 里专门加了个警告框强调这件事——大概是被问烦了。&lt;/p&gt;</description></item></channel></rss>