Fireflux —— 给 Firefly 博客配了一个本地管理客户端
写文章要开编辑器翻文件、改配置要读 TypeScript、发完还要回终端敲 git……于是做了一个只管「本地文件 + git」的 Windows 客户端,把动态发布、文章编辑、配置修改和一键上线收进同一个窗口,博客本身依然保持纯静态。

一个 Windows 桌面客户端,把「写动态、改文章、调配置、推上线」收进同一个窗口里。
🤔 起因
博客是 Astro 生成的静态站,日常维护却分散在好几个地方:写文章要在编辑器里翻 src/content/posts,改主题配置要打开 src/config 读 TypeScript,发动态要另开浏览器进 Memos,最后还要回到终端把改动 git push 出去。
这几件事都不难,但来回切换很碎。于是做了 Fireflux:它不做服务端、不建数据库,只做两件事 —— 按规则读写博客项目里的文件,以及调用本机的 git。
📦 它是什么
- 用 Electron 37 + electron-vite + Svelte 5 + TypeScript 写的桌面应用,界面用 Svelte 5 的 runes 语法
- 博客仍然是纯静态站:客户端只是让「编辑文件 + 提交推送」顺手一点,构建和部署链路完全不变
- 首个版本 v0.1.0,目前只提供 Windows x64 安装包
✨ 功能一览
💬 动态发布

远端模式直接把 Memos 嵌进窗口里,登录状态会被记住,发完刷新博客就能看到。
内嵌网页难免遇到图片裂开、证书不受信任这类问题,所以顺手做了加载状态、失败横幅和一个「连接诊断」面板:把失败请求的 URL 和 net::ERR_* 摆到界面上,不用再开 DevTools 猜是图源的问题还是服务端的问题。
不想用 Memos 的话可以切到本地模式,表单 + Markdown + 插图 + 从磁盘导入 md:

📄 文章管理

列表、编辑、分屏预览、新建都在同一个页面。新建文章时中文标题会自动转成拼音 slug,与主题自带的 new-post 脚本保持一致;支持插入本地配图(自动复制到约定目录并生成引用路径)和从磁盘导入已有的 md。项目展示、Spec 页面共用同一套编辑器,只是根目录不同。
🎛️ 配置中心

主题的 25 个配置文件全部图形化:下拉框、开关、列表增删排序、图片 / 音乐 / 视频 / 二维码导入。嵌套的子配置也能识别,比如看板娘的两块配置:

保存时用 ts-morph 只补丁改动的字段,注释和其余代码原样保留 —— 配置文件是写给人看的,不该被工具重新格式化一遍。
🚀 发布上线
改动清单、暂存、提交信息、一键「提交并推送」、从远程拉取最新、分支与远程仓库管理、整体 git diff 与单个文件的差异、提交历史,都在一页里完成。推送前会弹窗确认一次,避免手滑。
⚙️ 设置

主题色、壁纸与不透明度、数据目录、看板娘开关与大小位置、硬件加速渲染都在这里调,改完即时生效并记住。
🔧 几个折腾过的地方
- 软件渲染:看板娘只在鼠标在窗口里移动、指针停在它身上、点击互动时逐帧渲染,其余时间渲染完最后一帧就完全停住,静止态 CPU 基本归零;窗口背景在启动时预烘焙成一张 1<1>1> 的位图,拖拽时每帧只做一次 blit
- 配置补丁而不是重写:见上面配置中心那条,注释保留是硬要求
- 让内嵌网页可诊断:Chromium 只会把
net::ERR_*写到 stderr,既没有 URL 也不进界面,于是主进程把请求失败记录下来,通过一个 IPC 通道交给界面展示 - 看板娘:鼠标在窗口里移动时它会跟着看,点一下会说话,大小和位置都能拖
🔐 数据与边界
- 所有设置与壁纸都放在客户端自己的
data/目录,不写进博客项目、也不会被提交 - 只允许操作白名单目录:
src/content、src/config、public,主题源码不在其中 - 没有账号体系,也没有云端同步,所有操作都在本机完成
📥 获取
- 安装包在 GitHub Releases:https://github.com/loveFirefly-26710/Fireflux(Windows x64,NSIS 安装包)
- 也可以自行构建:
pnpm install之后跑pnpm dist
🙏 致谢
- 桌面看板娘的 Live2D 模型来自 Iskongkongyo/Firefly-live2d
- 博客主题是 Firefly(基于 Astro 的博客主题),客户端的「配置中心」正是围绕它的配置文件做的
















































































