一天一个开源项目(第19篇):Folo - AI驱动的下一代信息阅读器

引言

"你的思想就是你阅读的内容------我们已经被嘈杂的信息流困扰太久了!"

这是"一天一个开源项目"系列的第19篇文章。今天带你了解的项目是 FoloGitHub)。

在信息爆炸的时代,我们每天面对海量的 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 的核心作用是提供一个统一的信息聚合和阅读平台,主要功能包括:

  1. 多源订阅管理:支持 RSS/Atom 订阅源、用户列表、社区集合
  2. 统一时间线:将所有内容源聚合到一条时间线,按时间顺序展示
  3. AI 增强功能:翻译、摘要、智能推荐等 AI 能力
  4. 多端同步:Web、移动端、桌面端数据实时同步
  5. 内容管理:标记已读、收藏、分类管理
  6. 社区功能:分享列表、探索集合、发现优质内容
  7. 多媒体支持:支持文章、视频、图片、音频等多种内容格式
  8. 无干扰阅读:专注阅读体验,减少噪音干扰

使用场景

Folo 适用于多种信息阅读和管理场景:

  1. 新闻追踪

    • 订阅多个新闻源,统一管理
    • 通过时间线快速浏览最新资讯
    • 使用 AI 摘要快速了解文章要点
  2. 技术博客聚合

    • 订阅多个技术博客和开发者社区
    • 在一个地方追踪所有技术更新
    • 收藏重要文章,建立个人知识库
  3. 多语言阅读

    • 使用 AI 翻译功能阅读外文内容
    • 自动识别语言并提供翻译选项
    • 支持多种语言的内容源
  4. 内容发现

    • 浏览社区分享的优质列表
    • 探索不同主题的内容集合
    • 发现新的优质内容源
  5. 移动阅读

    • 在手机上随时随地阅读
    • 离线下载文章,无网络也能阅读
    • 多设备同步,无缝切换

快速开始

安装方式

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 复制代码
# 分类管理
- 创建文件夹组织订阅源
- 按主题分类管理
- 设置自动标记规则

# 同步设置
- 开启多端同步
- 设置同步频率
- 管理离线下载

核心特性

  1. 统一时间线

    • 将所有订阅源的内容聚合到一条时间线
    • 按时间顺序展示,最新内容优先
    • 支持过滤和搜索,快速找到目标内容
  2. AI 增强阅读

    • 智能摘要:自动生成文章摘要,快速了解要点
    • 多语言翻译:支持多种语言的实时翻译
    • 智能推荐:根据阅读习惯推荐相关内容
    • 内容理解:AI 分析文章主题和关键信息
  3. 多端同步

    • Web、iOS、Android、桌面端数据实时同步
    • 阅读进度、收藏、标记状态全平台同步
    • 离线下载支持,无网络也能阅读
  4. 列表和集合

    • 个人列表:创建和管理个人内容列表
    • 列表分享:分享优质列表给其他用户
    • 集合探索:浏览社区创建的优质内容集合
    • 发现新源:通过社区发现新的优质内容源
  5. 现代化界面

    • 简洁美观的设计,专注阅读体验
    • 支持深色/浅色主题切换
    • 响应式布局,适配各种屏幕尺寸
    • 流畅的动画和交互体验
  6. 多媒体支持

    • 支持文章、视频、图片、音频等多种格式
    • 内置媒体播放器
    • 支持富文本和 Markdown 渲染
  7. 无噪音设计

    • 智能过滤重复和低质量内容
    • 可自定义的过滤规则
    • 专注重要内容,减少干扰
  8. 开放生态

    • 支持 RSS/Atom 标准协议
    • 支持 OPML 导入导出
    • API 接口支持(如有)
    • 插件系统(如有)

项目优势

与传统 RSS 阅读器和其他信息聚合工具的对比:

对比项 Folo Feedly Inoreader Pocket
开源 ✅ 完全开源 ❌ 闭源 ❌ 闭源 ❌ 闭源
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 [];
  }
}

项目地址与资源

官方资源

同类项目对比

如果你想了解更多 RSS 阅读器和信息聚合工具:

  • Feedly:商业 RSS 阅读器,功能丰富但需付费
  • Inoreader:老牌 RSS 阅读器,功能强大
  • NetNewsWire:macOS/iOS 开源 RSS 阅读器
  • FreshRSS:可自托管的 RSS 阅读器
  • Miniflux:极简的 RSS 阅读器,可自托管

适用人群

Folo 适合以下开发者:

  • 前端开发者:学习 Monorepo 架构、多端代码复用、React 生态
  • 全栈开发者:了解 SSR、API 设计、数据库操作
  • 移动开发者:学习 React Native、跨平台开发
  • 产品设计师:了解信息聚合产品的设计思路
  • 开源贡献者:参与大型开源项目的开发和维护
  • RSS 阅读器用户:寻找现代化、AI 增强的阅读工具

学习价值

  • ✅ Monorepo 架构设计和实践
  • ✅ 多端代码复用策略
  • ✅ AI 功能集成和实现
  • ✅ 实时同步和冲突解决
  • ✅ 现代化前端技术栈
  • ✅ 开源项目协作和社区建设

欢迎来我中的个人主页找到更多有用的知识和有趣的产品

相关推荐
九.九10 小时前
ops-transformer:AI 处理器上的高性能 Transformer 算子库
人工智能·深度学习·transformer
春日见10 小时前
拉取与合并:如何让个人分支既包含你昨天的修改,也包含 develop 最新更新
大数据·人工智能·深度学习·elasticsearch·搜索引擎
恋猫de小郭10 小时前
AI 在提高你工作效率的同时,也一直在增加你的疲惫和焦虑
前端·人工智能·ai编程
deephub10 小时前
Agent Lightning:微软开源的框架无关 Agent 训练方案,LangChain/AutoGen 都能用
人工智能·microsoft·langchain·大语言模型·agent·强化学习
大模型RAG和Agent技术实践11 小时前
从零构建本地AI合同审查系统:架构设计与流式交互实战(完整源代码)
人工智能·交互·智能合同审核
老邋遢11 小时前
第三章-AI知识扫盲看这一篇就够了
人工智能
互联网江湖11 小时前
Seedance2.0炸场:长短视频们“修坝”十年,不如AI放水一天?
人工智能
PythonPioneer11 小时前
在AI技术迅猛发展的今天,传统职业该如何“踏浪前行”?
人工智能
冬奇Lab11 小时前
一天一个开源项目(第20篇):NanoBot - 轻量级AI Agent框架,极简高效的智能体构建工具
人工智能·开源·agent
阿里巴巴淘系技术团队官网博客12 小时前
设计模式Trustworthy Generation:提升RAG信赖度
人工智能·设计模式