引言
"你的思想就是你阅读的内容------我们已经被嘈杂的信息流困扰太久了!"
这是"一天一个开源项目"系列的第19篇文章。今天带你了解的项目是 Folo (GitHub)。
在信息爆炸的时代,我们每天面对海量的 RSS 源、新闻网站、博客和社交媒体内容。传统的 RSS 阅读器要么功能单一,要么界面复杂,要么缺乏智能化能力。Folo 应运而生,它是一个AI 驱动的下一代信息阅读器,将各种内容源(RSS、列表、集合)统一聚合到一条时间线上,让你在一个地方就能追踪所有重要信息。更重要的是,它内置了 AI 能力,支持翻译、摘要、智能推荐等功能,让阅读变得更加高效和愉悦。
为什么选择这个项目?
- 📰 统一信息聚合:RSS、列表、集合等多种内容源统一管理
- 🤖 AI 增强阅读:内置翻译、摘要、智能推荐等 AI 功能
- 📱 全平台支持:Web、iOS、Android、macOS、Windows、Linux 全覆盖
- 🎨 现代化界面:简洁美观,专注阅读体验
- 🔄 实时同步:多端数据实时同步,随时随地阅读
- 🌐 社区驱动:支持列表分享、集合探索,打造开放的信息社区
- 🎯 无噪音设计:智能过滤,只关注真正重要的内容
你将学到什么
- Folo 的核心架构和 Monorepo 设计
- 如何实现多端统一的阅读体验
- AI 功能在阅读器中的应用
- RSS 订阅源的管理和同步机制
- 与 Feedly、Inoreader 等传统 RSS 阅读器的对比
- 信息聚合和内容管理的技术实现
- 实际使用场景和最佳实践
前置知识
- 对 RSS 协议有基本了解
- 了解现代前端开发(React、TypeScript)
- 对 Monorepo 架构有基本概念(可选)
- 对 AI 应用集成感兴趣(可选)
项目背景
项目简介
Folo (Follow Everything)是一个开源的 AI 驱动信息阅读器 ,由 RSSNext 团队开发。它不仅仅是一个 RSS 阅读器,更是一个统一的信息聚合平台,将 RSS 订阅、用户创建的列表、社区集合等多种内容源整合到一条时间线上,让用户能够在一个地方追踪所有重要信息。
项目解决的核心问题:
- 信息源分散:RSS、新闻网站、博客、社交媒体内容分散在各个平台
- 传统阅读器功能单一:缺乏 AI 增强、多端同步等现代功能
- 信息过载:海量内容难以筛选,缺乏智能过滤机制
- 阅读体验差:界面老旧,缺乏现代化设计
- 社区互动不足:无法分享和发现优质内容源
面向的用户群体:
- 需要追踪多个信息源的新闻工作者和内容创作者
- 希望统一管理阅读内容的普通用户
- 需要多端同步阅读的移动用户
- 对 AI 增强功能感兴趣的技术爱好者
- 希望分享和发现优质内容源的社区用户
作者/团队介绍
团队:RSSNext
- 背景:专注于信息聚合和阅读体验的开源团队
- 代表作品:Folo
- 理念:让信息获取更加高效、智能、开放
- 技术栈:TypeScript、React、React Native、Electron、Node.js
项目数据
- ⭐ GitHub Stars: 37.1k+(持续增长中)
- 🍴 Forks: 2k+
- 📦 版本: v1.2.6(持续更新中,6,571+ commits)
- 📄 License: AGPL-3.0(开源协议,部分图标资源有特殊版权)
- 🌐 官网 : app.folo.is
- 💬 社区 : Discord、GitHub Issues
- 👥 贡献者: 147位贡献者,活跃的社区参与
项目发展历程:
- 2024年:项目创建,实现核心 RSS 阅读功能
- 持续迭代:添加 AI 功能、多端支持、列表分享等特性
- 社区增长:达到 37.1k+ Stars,成为最热门的开源 RSS 阅读器之一
- 全平台覆盖:支持 Web、iOS、Android、桌面端(macOS、Windows、Linux)
- 229个版本发布:持续的功能更新和 bug 修复
技术栈分布:
- TypeScript: 95.7%(主要开发语言)
- Swift: 2.3%(iOS 原生部分)
- JavaScript: 0.7%
- CSS: 0.6%
- HTML: 0.3%
- Kotlin: 0.2%(Android 原生部分)
- 其他: 0.2%
主要功能
核心作用
Folo 的核心作用是提供一个统一的信息聚合和阅读平台,主要功能包括:
- 多源订阅管理:支持 RSS/Atom 订阅源、用户列表、社区集合
- 统一时间线:将所有内容源聚合到一条时间线,按时间顺序展示
- AI 增强功能:翻译、摘要、智能推荐等 AI 能力
- 多端同步:Web、移动端、桌面端数据实时同步
- 内容管理:标记已读、收藏、分类管理
- 社区功能:分享列表、探索集合、发现优质内容
- 多媒体支持:支持文章、视频、图片、音频等多种内容格式
- 无干扰阅读:专注阅读体验,减少噪音干扰
使用场景
Folo 适用于多种信息阅读和管理场景:
-
新闻追踪
- 订阅多个新闻源,统一管理
- 通过时间线快速浏览最新资讯
- 使用 AI 摘要快速了解文章要点
-
技术博客聚合
- 订阅多个技术博客和开发者社区
- 在一个地方追踪所有技术更新
- 收藏重要文章,建立个人知识库
-
多语言阅读
- 使用 AI 翻译功能阅读外文内容
- 自动识别语言并提供翻译选项
- 支持多种语言的内容源
-
内容发现
- 浏览社区分享的优质列表
- 探索不同主题的内容集合
- 发现新的优质内容源
-
移动阅读
- 在手机上随时随地阅读
- 离线下载文章,无网络也能阅读
- 多设备同步,无缝切换
快速开始
安装方式
Folo 提供多种安装方式,覆盖所有主流平台:
Web 版本(最简单)
bash
# 直接访问官网即可使用
# https://app.folo.is
桌面应用
bash
# macOS - App Store
# 搜索 "Folo" 或访问:
# https://apps.apple.com/us/app/folo-follow-everything/id6739802604
# Windows - Microsoft Store
# 搜索 "Folo" 或访问:
# https://apps.microsoft.com/detail/9nvfzpv0v0ht
# Linux - 下载 AppImage
# 访问 GitHub Releases 页面下载
# https://github.com/RSSNext/Folo/releases/latest
移动应用
bash
# iOS - App Store
# 搜索 "Folo" 或访问:
# https://apps.apple.com/us/app/folo-follow-everything/id6739802604
# Android - Google Play
# 搜索 "Folo" 或访问:
# https://play.google.com/store/apps/details?id=is.follow
社区维护的安装方式
bash
# Arch Linux
yay -S folo-appimage # 由 timochan 和 grtsinry43 维护
# Nix
nix-env -iA nixos.follow # 由 iosmanthus 维护
# macOS Homebrew
brew install --cask folo # 由 realSunyz 维护
# Windows Scoop
scoop install folo # 由 cscnk52 维护
基本使用
1. 创建账户
首次使用需要创建账户,支持邮箱注册或第三方登录。
2. 添加订阅源
bash
# 方式一:直接添加 RSS 链接
1. 点击"添加订阅源"
2. 输入 RSS/Atom 链接
3. 系统自动识别和验证
# 方式二:搜索发现
1. 使用内置的源发现功能
2. 浏览热门订阅源
3. 一键添加
# 方式三:导入 OPML
1. 从其他阅读器导出 OPML
2. 在 Folo 中导入
3. 批量添加订阅源
3. 开始阅读
bash
# 时间线浏览
- 所有订阅源的内容按时间顺序展示
- 支持标记已读/未读
- 支持收藏重要文章
# AI 功能使用
- 点击文章,使用"摘要"功能快速了解要点
- 使用"翻译"功能阅读外文内容
- 根据阅读习惯获得智能推荐
4. 管理内容
bash
# 分类管理
- 创建文件夹组织订阅源
- 按主题分类管理
- 设置自动标记规则
# 同步设置
- 开启多端同步
- 设置同步频率
- 管理离线下载
核心特性
-
统一时间线
- 将所有订阅源的内容聚合到一条时间线
- 按时间顺序展示,最新内容优先
- 支持过滤和搜索,快速找到目标内容
-
AI 增强阅读
- 智能摘要:自动生成文章摘要,快速了解要点
- 多语言翻译:支持多种语言的实时翻译
- 智能推荐:根据阅读习惯推荐相关内容
- 内容理解:AI 分析文章主题和关键信息
-
多端同步
- Web、iOS、Android、桌面端数据实时同步
- 阅读进度、收藏、标记状态全平台同步
- 离线下载支持,无网络也能阅读
-
列表和集合
- 个人列表:创建和管理个人内容列表
- 列表分享:分享优质列表给其他用户
- 集合探索:浏览社区创建的优质内容集合
- 发现新源:通过社区发现新的优质内容源
-
现代化界面
- 简洁美观的设计,专注阅读体验
- 支持深色/浅色主题切换
- 响应式布局,适配各种屏幕尺寸
- 流畅的动画和交互体验
-
多媒体支持
- 支持文章、视频、图片、音频等多种格式
- 内置媒体播放器
- 支持富文本和 Markdown 渲染
-
无噪音设计
- 智能过滤重复和低质量内容
- 可自定义的过滤规则
- 专注重要内容,减少干扰
-
开放生态
- 支持 RSS/Atom 标准协议
- 支持 OPML 导入导出
- API 接口支持(如有)
- 插件系统(如有)
项目优势
与传统 RSS 阅读器和其他信息聚合工具的对比:
| 对比项 | Folo | Feedly | Inoreader | |
|---|---|---|---|---|
| 开源 | ✅ 完全开源 | ❌ 闭源 | ❌ 闭源 | ❌ 闭源 |
| AI 功能 | ✅ 内置翻译、摘要 | ⚠️ 部分功能需付费 | ⚠️ 部分功能需付费 | ❌ 无 |
| 多端同步 | ✅ 全平台免费 | ⚠️ 高级功能需付费 | ⚠️ 高级功能需付费 | ✅ 免费 |
| 社区功能 | ✅ 列表分享、集合探索 | ❌ 无 | ❌ 无 | ❌ 无 |
| 界面设计 | ✅ 现代化、简洁 | ⚠️ 功能丰富但复杂 | ⚠️ 功能丰富但复杂 | ✅ 简洁 |
| 本地部署 | ✅ 可自托管 | ❌ 仅云端 | ❌ 仅云端 | ❌ 仅云端 |
| 价格 | ✅ 完全免费 | ⚠️ 基础免费,高级付费 | ⚠️ 基础免费,高级付费 | ✅ 免费 |
为什么选择 Folo?
- 🆓 完全免费:所有功能免费使用,无订阅费用
- 🔓 开源透明:代码完全开源,可审查、可定制
- 🤖 AI 增强:内置 AI 功能,提升阅读效率
- 🌐 全平台:一个账户,所有设备同步
- 👥 社区驱动:通过社区发现和分享优质内容
- 🎨 现代设计:简洁美观,专注阅读体验
- 🔒 隐私保护:可自托管,数据完全掌控
项目详细剖析
架构设计
Folo 采用 Monorepo 架构,使用 pnpm workspaces 和 Turbo 进行管理,实现了代码的高度复用和统一维护。
Monorepo 结构
csharp
Folo/
├── apps/
│ ├── ssr/ # 服务端渲染应用(Hono + React)
│ ├── desktop/ # Electron 桌面应用
│ └── mobile/ # React Native 移动应用(Expo)
├── packages/
│ └── internal/ # 核心逻辑复用库
│ ├── 状态管理
│ ├── 数据库层(Drizzle ORM)
│ ├── UI 组件库
│ └── 业务逻辑
├── api/ # API 服务层
├── plugins/ # 插件系统
└── scripts/ # 构建和部署脚本
核心架构特点
1. 代码复用最大化
packages/internal包含所有可复用的核心逻辑- Web、桌面、移动端共享相同的业务逻辑和状态管理
- UI 组件库统一,保证跨平台体验一致
2. 多端统一体验
- Web 端:基于 Hono 的 SSR 应用,支持服务端渲染和客户端交互
- 桌面端:基于 Electron,复用 Web 代码,提供原生体验
- 移动端:基于 React Native(Expo),共享业务逻辑,原生 UI 组件
3. 技术栈选择
typescript
// 前端技术栈
- React 18+:UI 框架
- TypeScript:类型安全
- Tailwind CSS:样式方案
- Drizzle ORM:数据库操作
- Hono:轻量级 Web 框架
// 移动端
- React Native(Expo):跨平台移动开发
- 原生模块:iOS(Swift)、Android(Kotlin)
// 桌面端
- Electron:跨平台桌面应用
- 原生集成:系统通知、快捷键等
核心模块
1. 订阅源管理模块
功能:
- RSS/Atom 订阅源的添加、验证、更新
- 订阅源的分类和文件夹管理
- 订阅源的导入导出(OPML)
技术实现:
typescript
// 订阅源验证
async function validateFeed(url: string) {
try {
const response = await fetch(url);
const xml = await response.text();
const feed = parseRSS(xml);
return {
valid: true,
title: feed.title,
description: feed.description,
items: feed.items
};
} catch (error) {
return { valid: false, error };
}
}
// 订阅源更新
async function updateFeed(feedId: string) {
const feed = await db.feeds.findById(feedId);
const newItems = await fetchFeedItems(feed.url);
const unreadItems = filterUnreadItems(newItems, feed.lastUpdate);
await db.items.bulkInsert(unreadItems);
await db.feeds.updateLastUpdate(feedId);
}
2. 时间线聚合模块
功能:
- 将所有订阅源的内容按时间聚合
- 支持过滤、搜索、排序
- 实时更新新内容
技术实现:
typescript
// 时间线生成
async function generateTimeline(filters: TimelineFilters) {
const feeds = await getSubscribedFeeds(filters.folderId);
const items = await db.items.findByFeeds(feeds, {
unreadOnly: filters.unreadOnly,
dateRange: filters.dateRange,
search: filters.search
});
return items
.sort((a, b) => b.publishedAt - a.publishedAt)
.slice(filters.offset, filters.offset + filters.limit);
}
3. AI 功能模块
功能:
- 文章摘要生成
- 多语言翻译
- 智能推荐
- 内容理解
技术实现:
typescript
// AI 摘要生成
async function generateSummary(articleId: string) {
const article = await db.items.findById(articleId);
const content = extractTextContent(article.content);
// 调用 AI API(如 OpenAI、Claude 等)
const summary = await aiService.summarize({
text: content,
maxLength: 200,
language: 'zh-CN'
});
await db.summaries.save(articleId, summary);
return summary;
}
// 多语言翻译
async function translateContent(
articleId: string,
targetLanguage: string
) {
const article = await db.items.findById(articleId);
const translated = await aiService.translate({
text: article.content,
from: article.language,
to: targetLanguage
});
return translated;
}
4. 同步模块
功能:
- 多端数据同步
- 阅读进度同步
- 收藏和标记状态同步
- 离线数据管理
技术实现:
typescript
// 同步服务
class SyncService {
async syncToServer(localChanges: LocalChanges) {
// 上传本地变更
await api.sync.upload(localChanges);
// 获取服务器变更
const serverChanges = await api.sync.download({
lastSyncTime: this.lastSyncTime
});
// 合并变更
const merged = this.mergeChanges(localChanges, serverChanges);
// 应用合并结果
await this.applyChanges(merged);
this.lastSyncTime = Date.now();
}
private mergeChanges(local: LocalChanges, server: ServerChanges) {
// 冲突解决策略
// 1. 时间戳优先
// 2. 用户操作优先
// 3. 智能合并
return conflictResolver.merge(local, server);
}
}
5. 列表和集合模块
功能:
- 用户创建和管理个人列表
- 列表分享功能
- 社区集合浏览
- 内容发现和推荐
技术实现:
typescript
// 列表管理
class ListService {
async createList(userId: string, listData: ListData) {
const list = await db.lists.create({
...listData,
userId,
public: listData.isPublic
});
if (listData.isPublic) {
await this.indexListForDiscovery(list);
}
return list;
}
async shareList(listId: string, shareOptions: ShareOptions) {
const list = await db.lists.findById(listId);
const shareLink = generateShareLink(listId, shareOptions);
if (shareOptions.toCommunity) {
await db.communityCollections.add(list);
}
return shareLink;
}
}
关键技术实现
1. 多端代码复用
Folo 通过 Monorepo 和共享包实现了最大化的代码复用:
typescript
// packages/internal/src/feed-manager.ts
// 所有平台共享的订阅源管理逻辑
export class FeedManager {
// 业务逻辑,不依赖平台
async addFeed(url: string) { /* ... */ }
async updateFeed(feedId: string) { /* ... */ }
}
// apps/ssr/src/routes/feeds.ts
// Web 端使用
import { FeedManager } from '@folo/internal';
// apps/desktop/src/main/feed-handler.ts
// 桌面端使用
import { FeedManager } from '@folo/internal';
// apps/mobile/src/services/feed-service.ts
// 移动端使用
import { FeedManager } from '@folo/internal';
2. 状态管理
使用统一的状态管理方案(可能是 Zustand、Jotai 或 Redux):
typescript
// packages/internal/src/store/feed-store.ts
import { create } from 'zustand';
interface FeedState {
feeds: Feed[];
selectedFeed: Feed | null;
addFeed: (feed: Feed) => void;
selectFeed: (feedId: string) => void;
}
export const useFeedStore = create<FeedState>((set) => ({
feeds: [],
selectedFeed: null,
addFeed: (feed) => set((state) => ({
feeds: [...state.feeds, feed]
})),
selectFeed: (feedId) => set((state) => ({
selectedFeed: state.feeds.find(f => f.id === feedId) || null
}))
}));
3. 数据库设计
使用 Drizzle ORM 进行类型安全的数据库操作:
typescript
// packages/internal/src/db/schema.ts
import { pgTable, text, timestamp, boolean } from 'drizzle-orm/pg-core';
export const feeds = pgTable('feeds', {
id: text('id').primaryKey(),
url: text('url').notNull(),
title: text('title').notNull(),
description: text('description'),
lastUpdate: timestamp('last_update'),
folderId: text('folder_id')
});
export const items = pgTable('items', {
id: text('id').primaryKey(),
feedId: text('feed_id').references(() => feeds.id),
title: text('title').notNull(),
content: text('content'),
link: text('link').notNull(),
publishedAt: timestamp('published_at').notNull(),
read: boolean('read').default(false),
starred: boolean('starred').default(false)
});
4. AI 集成
统一的 AI 服务接口,支持多种 AI 提供商:
typescript
// packages/internal/src/ai/ai-service.ts
interface AIService {
summarize(text: string, options: SummaryOptions): Promise<string>;
translate(text: string, options: TranslateOptions): Promise<string>;
recommend(userId: string, context: Context): Promise<Item[]>;
}
class OpenAIAdapter implements AIService {
async summarize(text: string, options: SummaryOptions) {
const response = await openai.chat.completions.create({
model: 'gpt-4',
messages: [{
role: 'system',
content: '你是一个专业的文章摘要生成器...'
}, {
role: 'user',
content: text
}]
});
return response.choices[0].message.content;
}
}
扩展机制
插件系统
Folo 支持插件扩展(如果已实现):
typescript
// 插件接口
interface FoloPlugin {
name: string;
version: string;
init(context: PluginContext): void;
onFeedUpdate?(feed: Feed): void;
onItemRead?(item: Item): void;
}
// 插件示例:自动标签
class AutoTagPlugin implements FoloPlugin {
name = 'auto-tag';
version = '1.0.0';
init(context: PluginContext) {
context.onItemRead((item) => {
const tags = this.extractTags(item);
context.addTags(item.id, tags);
});
}
private extractTags(item: Item): string[] {
// 使用 AI 或规则提取标签
return [];
}
}
项目地址与资源
官方资源
- 🌟 GitHub : github.com/RSSNext/Fol...
- 🌐 官网 : app.folo.is
- 📱 iOS App Store : apps.apple.com/us/app/folo...
- 🤖 Android Google Play : play.google.com/store/apps/...
- 🪟 Windows Microsoft Store : apps.microsoft.com/detail/9nvf...
同类项目对比
如果你想了解更多 RSS 阅读器和信息聚合工具:
- Feedly:商业 RSS 阅读器,功能丰富但需付费
- Inoreader:老牌 RSS 阅读器,功能强大
- NetNewsWire:macOS/iOS 开源 RSS 阅读器
- FreshRSS:可自托管的 RSS 阅读器
- Miniflux:极简的 RSS 阅读器,可自托管
适用人群
Folo 适合以下开发者:
- 前端开发者:学习 Monorepo 架构、多端代码复用、React 生态
- 全栈开发者:了解 SSR、API 设计、数据库操作
- 移动开发者:学习 React Native、跨平台开发
- 产品设计师:了解信息聚合产品的设计思路
- 开源贡献者:参与大型开源项目的开发和维护
- RSS 阅读器用户:寻找现代化、AI 增强的阅读工具
学习价值:
- ✅ Monorepo 架构设计和实践
- ✅ 多端代码复用策略
- ✅ AI 功能集成和实现
- ✅ 实时同步和冲突解决
- ✅ 现代化前端技术栈
- ✅ 开源项目协作和社区建设
欢迎来我中的个人主页找到更多有用的知识和有趣的产品