ZenFlow 是一个本地优先、隐私安全的桌面应用。它从 arXiv 订阅你关注的论文,通过分析你的阅读偏好,每天推荐你最可能感兴趣的内容。它还是一个论文深度阅读工具——一键提取全文,AI 自动生成综述,支持流式追问和逐段剖析。
大多数论文推荐工具的做法很粗暴:让 LLM 直接判断一篇论文"重不重要"、"值不值得读"。这种思路有两个致命缺陷:
- 忽略了你是谁。一篇关于大规模分布式训练的论文可能很重要,但如果你做的是理论机器学习,它对你毫无意义。LLM 不知道你的研究方向、你偏好的方法论、你讨厌的领域——它只能给出一个"普适的"重要性判断。
- 无法从你的行为中学习。你点了什么、赞了什么、踩了什么——这些信号在传统系统里全部被丢弃了。系统不会因为你连续踩了 10 篇 GAN 相关的论文就学会"这个人不喜欢 GAN",下次照样推。
ZenFlow 的核心思路不是"这篇论文重要吗",而是**"这篇论文对你来说有趣吗"**。
系统维护一个偏好文件(~/.zenflow/preferences.md),里面是 LLM 根据你的反馈行为自动总结的"你的画像"——感兴趣的主题、偏好的方法论、明确排斥的领域。每次评分时,LLM 把这个偏好文件作为上下文,读入待评分论文的标题和摘要,给出 0~1 的个性化匹配分数。
当你点击、点赞或点踩一篇论文时,LLM 会重新分析你的行为模式,更新偏好文件。整个过程是透明的——你可以随时打开偏好文件,看看 LLM 是怎么理解你的。
换句话说,ZenFlow 不是一个"论文排行榜",而是一个在逐渐理解你的阅读助手。
如果系统只推荐和你已知兴趣高度匹配的内容,你会被关在一个越来越窄的"信息茧房"里——你永远看不到那些可能改变你研究方向的、来自相邻领域的突破性工作。
ZenFlow 的每日推荐采用三维混合策略:
- 70% 兴趣匹配:和你兴趣紧密匹配的高分论文,确保核心需求被满足
- 15% 社区精选:在剩余论文中,按社区评价排序取 top——这些论文可能来自相邻领域,但经过社区验证的高质量工作同样值得关注
- 15% 加权随机:从剩余论文中随机采样,但社区评价高的论文采样概率更大——既保持探索性,又不过分牺牲质量
社区评价数据来自 HuggingFace Papers(用户点赞数)和 AlphaXiv(开放讨论区净投票数),系统每 12 小时自动同步一次,24 小时内不会重复抓取。这个比例可以在设置中调整。
你可能会觉得那 30% 很"吵",但真正有价值的跨领域发现往往就藏在里面——而社区投票能帮你在"噪音"中筛出"信号"。
- 完全 LLM 驱动:接入任何 OpenAI 兼容 API(SiliconFlow / Ollama / DeepSeek 等),LLM 读取你的偏好文件,为每篇论文生成个性化匹配分数
- LLM 自维护偏好:你只需像平常一样点击/点赞/点踩,LLM 自动分析反馈、归纳模式、更新偏好描述,无需手动标注标签
- 每日推荐批次:每天自动评分 + 生成推荐,按日期分组回溯,可配置每日推荐数量
- 社区投票参考:自动获取 HuggingFace Papers 和 AlphaXiv 的社区评价数据,辅助判断论文质量
- 定时后台任务:每小时自动检查 arXiv 更新,每天自动抓取新论文、同步社区投票并生成推荐
- 一键提取全文:优先从 arXiv HTML 版本解析,无 HTML 时回退到 LaTeX 源码编译,自动展开
\input/\include、剥离注释、展开宏 - 自动生成综述:AI 从研究动机、数学建模、实验设计、核心结论、Reviewer 锐评五个维度,生成结构化的深度解析文档,支持 LaTeX 公式渲染
- 滑动窗口多轮对话:综述完成后可以继续追问,保留最近 5 轮上下文,支持深入讨论论文细节
- 流式输出 + KaTeX 渲染:AI 回复实时流式展示,数学公式不完整时自动降级为纯文本,避免白屏
Cmd+,打开设置,Cmd+/-缩放字体,字号自动持久化- 文章卡片展示兴趣分、社区投票数和推荐类型标签(🏆 社区精选 / 🎲 随机探索)
- 新用户 4 步向导:选择 arXiv 分类 → 添加偏好论文 → 配置 LLM API → 完成初始化
- API Key 存储在系统密钥链(macOS 钥匙串 / Windows 凭据管理器 / Linux Secret Service),不落盘
┌─────────────────────────────────────────────────┐
│ Tauri v2 Desktop │
│ ┌──────────────┐ ┌──────────────────┐ │
│ │ React 19 │ IPC │ Rust Backend │ │
│ │ + TypeScript │ ◄──────► │ │ │
│ │ + Vite │ │ feed/fetcher │ │
│ │ │ │ llm/client │ │
│ │ Components: │ │ llm/scoring │ │
│ │ ArticleList │ │ llm/chat │ │
│ │ ChatPanel │ │ llm/preferences │ │
│ │ SettingsModal│ │ algorithm/score │ │
│ │ WelcomeWizard│ │ scheduler │ │
│ └──────────────┘ └────────┬─────────┘ │
│ │ │
│ ┌────────▼─────────┐ │
│ │ SQLite (本地) │ │
│ │ + 系统密钥链 │ │
│ └──────────────────┘ │
└─────────────────────────────────────────────────┘
- 前端:React 19 + TypeScript + Vite
- 后端:Rust (Tauri v2),异步运行时 tokio
- 数据库:SQLite 单文件(
~/.zenflow/zenflow.db) - AI 接入:OpenAI 兼容 API(支持 SiliconFlow、Ollama、DeepSeek 等任意服务)
- 论文提取:独立 crate
arxiv2text,HTML 解析 + LaTeX 源码编译双路径
- Rust toolchain(推荐通过 rustup 安装)
- Node.js 18+
- macOS / Windows / Linux
git clone https://github.com/your-org/ZenFlow.git
cd ZenFlow
# 安装前端依赖
cd src-tauri && npm install && cd ..
# 开发模式(前端 + 后端热重载)
just dev
# 构建生产版本
just bundlejust test # 运行所有单元测试(需单线程,因为共享全局内存 SQLite 连接池)
just test-llm # 运行 LLM 集成测试(需要本地 Ollama)
just check # 类型检查(Rust + TypeScript)
just clippy # Rust Clippy 检查
just bundle # 打包桌面应用ZenFlow/
├── src-tauri/
│ ├── src/ # React 前端
│ │ ├── App.tsx # 应用入口
│ │ ├── components/
│ │ │ ├── ArticleList.tsx # 文章列表
│ │ │ ├── ArticleCard.tsx # 文章卡片(含交互按钮)
│ │ │ ├── DateGroupedArticleList.tsx # 日期分组的每日推荐列表
│ │ │ ├── ChatPanel.tsx # 论文对话面板(流式输出 + KaTeX)
│ │ │ ├── SettingsModal.tsx # 设置弹窗
│ │ │ └── WelcomeWizard.tsx # 新用户初始化向导(4 步)
│ │ ├── hooks/
│ │ │ ├── useArticles.ts # 文章数据 hook
│ │ │ └── useChat.ts # 对话数据 hook
│ │ └── types/ # TypeScript 类型定义
│ └── src-tauri/ # Rust 后端
│ └── src/
│ ├── main.rs # Tauri 入口
│ ├── lib.rs # 模块注册 + 所有 Tauri Command 注册
│ ├── config.rs # 配置常量
│ ├── settings.rs # 用户设置管理(含系统密钥链存储)
│ ├── scheduler.rs # 后台定时任务(RSS 抓取 + 推荐生成)
│ ├── db/ # 数据库层
│ │ ├── schema.rs # SQL Schema
│ │ ├── pool.rs # 连接池
│ │ └── operations.rs # CRUD 操作
│ ├── feed/ # arXiv RSS 抓取
│ ├── algorithm/ # 推荐算法
│ │ ├── mod.rs # 模块入口
│ │ └── score.rs # LLM 驱动的评分 + 偏好更新
│ ├── llm/ # LLM 客户端
│ │ ├── client.rs # OpenAI 兼容 HTTP 客户端(含 SSE 流式)
│ │ ├── scoring.rs # 论文评分(偏好 + 批量论文 → 分数)
│ │ ├── chat.rs # 论文对话提示词 + 上下文构建
│ │ └── preferences.rs # 偏好文件读写 + LLM 偏好更新/初始化
│ ├── votes.rs # 社区投票 API(HuggingFace + AlphaXiv)+ 速率限制
│ ├── commands/ # Tauri Commands(前端 IPC 接口)
│ │ ├── article.rs # 文章抓取/列表/状态/推荐/翻译
│ │ ├── chat.rs # 论文对话会话管理
│ │ ├── extract.rs # 论文文本提取
│ │ ├── init.rs # 初始化向导
│ │ ├── votes.rs # 社区投票数据获取 + 状态查询
│ │ └── mod.rs
│ └── extractor.bak/ # 论文提取旧实现(已迁移至 arxiv2text crate)
├── arxiv2text/ # 论文提取独立 crate
├── PRD.md # 产品需求文档
├── PLAN.md # 开发计划
├── AGENTS.md # AI Agent 开发指南
├── justfile # 任务运行器
└── test_rss.xml # 本地测试用的 RSS 数据
- 所有数据存储在本地的
~/.zenflow/目录 - API Key 使用操作系统级密钥链加密存储,不落盘
- 不收集任何使用数据,不上传任何分析日志
- 偏好数据完全离线,可随时导出和迁移
- 论文评分和对话直接调用你配置的 LLM API,不经过任何中间服务器