Karakeep(原 Hoarder)自托管书签应用入门指南:AI 自动打标签、全文搜索与功能全景
【免费下载链接】hoarderA self-hostable bookmark-everything app (links, notes and images) with AI-based automatic tagging and full text search项目地址: https://gitcode.com/GitHub_Trending/ho/hoarder
Karakeep(原名 Hoarder)是一款将"收藏一切"(Bookmark Everything)作为核心理念的开源应用:你可以把链接、笔记、图片与 PDF 统一收纳,再由 AI 自动为内容打标签、生成摘要。它以自托管为第一公民(self-hosting as a first class citizen)进行设计,适合在家庭服务器、NAS 或云主机上独立部署。读完本文,你将完整掌握该项目的功能清单、Demo 体验方式、技术栈与架构组成,并能顺着源码级证据深入理解其链接抓取与 AI 推理的底层实现。
项目定位:为"数字囤积者"而生的自托管应用
Karakeep 的前身是 Hoarder,作者在 README 中这样定位它:a self-hostable bookmark-everything app with a touch of AI for the data hoarders out there(一款面向数据囤积者的、带一点 AI 的自托管收藏应用)。项目的诞生源于作者本人的真实痛点:他经常在手机上刷 Reddit、Twitter 和 Hacker News,看到有价值的文章、工具就想存下来留到电脑前细读,因此需要一个"稍后阅读"类应用;在尝试过 Pocket、memos 等方案后,他发现既有工具要么无法自托管,要么缺少链接预览、自动打标签等关键能力,于是动手打造了 Karakeep。
与典型书签管理器不同,Karakeep 不只收藏链接,还覆盖了笔记、图片、PDF 等多样内容类型,并通过 AI 能力把"收藏"升级为"自动整理"——这正是它与普通收藏夹最本质的差异。
名字的由来:从"كراكيب"到 Karakeep
关于项目名称,官方文档专门做了解释:Karakeep 的灵感来自阿拉伯语单词"كراكيب"(karakeeb),这是一个口语化词汇,通常指杂七杂八的零碎物件、杂物堆——那些看似杂乱无章、却往往带着个人价值或隐藏用处的东西。它让人联想到一个塞满杂物的抽屉或遗忘的箱子,里面装满了你舍不得扔掉的东西——因为不知为何,它们就是有分量(更可能的原因是,你是个囤积者!)。这个命名恰好呼应了产品的核心场景:把散落在各处的信息碎片收集起来,让它们各得其所。
功能全景:收藏、整理、搜索与归档的完整闭环
项目文档(docs/docs/01-getting-started/01-intro.md)以一份功能清单勾勒出产品全貌。以下按能力维度逐项展开,并标注其在当前仓库中的对应实现。
收藏与内容抓取
- 多类型收藏:可以收藏链接(Bookmark links)、记录简单笔记(take simple notes)、存储图片与 PDF。
- 自动抓取元信息:添加链接后,系统会自动抓取链接的标题、描述和预览图。这一能力由爬虫模块实现——抓取流程的核心代码位于 apps/workers/workers/crawler/crawlPage.ts,它通过 Playwright 驱动的浏览器访问目标页面,提取 HTML、可选截图与 PDF 后交给后续解析流程。
- 全文页面归档:使用 monolith 技术进行整页归档(Full page archival),把页面完整保存下来以防链接失效(link rot)。
- 自动视频归档:集成 yt-dlp 自动下载并归档视频。
- RSS 自动收藏(Auto hoarding):订阅 RSS 源后,新内容会被自动抓进收藏,相关 worker 位于 apps/workers/workers/feedWorker.ts。
组织、协作与搜索
- 列表(Lists):把书签整理进列表,实现主题化分类。
- 协作(Collaborate):与他人协作维护同一个列表,适合团队共享资料库。
- 全文搜索:对所有已存储内容做全文检索。搜索功能基于 Meilisearch 实现(README 技术栈中明确列出),并由 apps/web 前端与 packages/trpc 的 tRPC 路由串联。
- OCR 提取:对图片进行 OCR 文字提取,让图片中的文字也可被搜索到。
- 高亮标记(Highlights):在收藏的内容上标记并保存高亮片段,相关 API 文档可见 docs/docs/api/create-highlight.api.mdx。
AI 能力:自动打标签与摘要
- AI 自动打标签与摘要:基于 LLM(文档中写作 chatgpt,即 OpenAI 兼容接口)自动为内容打标签并生成摘要;同时支持通过 Ollama 使用本地模型,数据不必离开你的服务器。
- 规则引擎(Rule-based engine):用自定义规则实现个性化的自动管理,例如按条件自动打标签、归类或触发动作。规则引擎 worker 位于 apps/workers/workers/ruleEngineWorker.ts。
客户端生态与导入导出
- 浏览器扩展:提供 Chrome 插件与 Firefox 插件,实现"一键收藏"(quick bookmarking);当前仓库中浏览器扩展的源码位于 apps/browser-extension。
- 移动端应用:提供 iOS 与 Android 应用,源码位于 apps/mobile。
- REST API 与多客户端:对外开放 REST API(OpenAPI 规范见 packages/open-api/karakeep-openapi-spec.json),同时官方提供 CLI(apps/cli)与 MCP 服务(apps/mcp)等客户端。
- 多语言支持:项目使用 Weblate 管理翻译,语言文件集中在 apps/web/lib/i18n。
- 批量操作:支持对多个书签进行批量动作(批量打标签、批量删除等),逻辑见 apps/web/lib/bulkActions.ts。
- SSO 支持:支持单点登录接入。
- 暗色模式:界面支持深色主题。
导入与同步
- 书签导入器:内置从 Chrome、Pocket、Linkwarden、Omnivore、Tab Session Manager 的书签导入器。
- 浏览器书签自动同步:可通过 floccus 与浏览器书签自动双向同步。
版本差异说明(v0.30.0 → 当前仓库)
本指南对应的 version-v0.30.0 介绍文档 在功能清单末尾将"移动端离线阅读、跨书签语义搜索"标注为Planned(计划中);而当前仓库的最新 README 中,这两项已升级为已实现能力——"Full text & semantic search"(全文 + 语义搜索)与"Mobile offline reading"(移动端离线阅读)均已列入正式功能清单,此外浏览器端还新增了 Safari 扩展。也就是说,语义搜索与离线阅读已从路线图落地为实际功能。
⚠️ 官方文档同时提醒:该应用目前处于快速迭代阶段(This app is under heavy development.),升级与配置时建议关注版本变更说明。
在线 Demo:5 秒体验核心功能
如果你想先看效果再动手部署,官方提供了在线演示站点。文档给出的访问方式如下:
- Demo 地址:https://try.karakeep.app
- 登录凭据:
- 邮箱:
demo@karakeep.app - 密码:
demodemo
- 邮箱:
Demo 站点预置了部分演示数据(seeded with some content),并运行在只读模式下以防滥用——这意味着你可以体验浏览、搜索、查看 AI 打标签结果等读操作,但不能写入或修改数据。
仓库根目录保存有产品首页的真实运行截图(screenshots/homepage.png),可以直观看到收藏卡片、标签与列表的界面形态:
技术栈与架构组成
README 的技术栈部分明确了项目的核心选型:
- Next.js:Web 应用框架,使用 App Router(apps/web)。
- Drizzle:数据库 ORM 与迁移工具(packages/db/schema.ts)。
- NextAuth:认证方案(apps/web/server/auth.ts)。
- tRPC:客户端与服务器之间的类型安全通信(packages/trpc)。
- Puppeteer / Playwright:用于爬取书签页面。需要说明的是:README 技术栈列表写的是 Puppeteer,而从当前抓取源码看,apps/workers/workers/crawler/crawlPage.ts 实际基于 Playwright 实现浏览器控制,可理解为 README 属于早期描述,以源码实现为准。
- OpenAI:AI 打标签与摘要的默认推理后端。
- Meilisearch:全文内容搜索的检索引擎。
三服务 Docker 编排:web + chrome + meilisearch
从 docker/docker-compose.yml 可以看到生产部署的最小拓扑,这也是理解架构组成最直观的入口:
services: web: image: ghcr.io/karakeep-app/karakeep:${KARAKEEP_VERSION:-release} restart: unless-stopped volumes: - data:/data ports: - 3000:3000 env_file: - .env environment: MEILI_ADDR: http://meilisearch:7700 BROWSER_WEB_URL: http://chrome:9222 DATA_DIR: /data # DON'T CHANGE THIS chrome: image: ghcr.io/karakeep-app/karakeep-chrome:release restart: unless-stopped init: true command: - --disable-gpu - --disable-dev-shm-usage - --hide-scrollbars - --disable-blink-features=AutomationControlled - --window-size=1440,900 meilisearch: image: getmeili/meilisearch:v1.41.0 restart: unless-stopped env_file: - .env environment: MEILI_NO_ANALYTICS: "true" volumes: - meilisearch:/meili_data volumes: meilisearch: data:三个服务各司其职:
- web:主应用容器,对外暴露
3000端口,数据落在data卷(映射到容器内/data,官方注释强调DATA_DIR的值不要随意改动,如需自定义目录应修改卷映射)。 - chrome:无头浏览器服务,通过
BROWSER_WEB_URL: http://chrome:9222被 web 容器调用,用于抓取网页内容;启动参数中关闭了 GPU、禁用了自动化特征检测,并固定了 1440×900 的视口。 - meilisearch:全文搜索引擎,通过
MEILI_ADDR连接,并显式关闭了遥测统计(MEILI_NO_ANALYTICS: "true")。
源码级纵深:链接抓取与 AI 推理是如何工作的
抓取链路:从浏览器抓取到内容解析
链接收藏后,爬虫 worker(apps/workers/workers/crawlerWorker.ts)会驱动 crawlPage.ts 完成页面抓取。从源码可以梳理出完整的抓取策略:
- 抓取模式选择:系统先查询当前用户的
browserCrawlingEnabled设置(可从数据库 users 表读取,或由调用方覆盖传入)。若用户关闭了浏览器抓取、或没有可用浏览器实例,则降级为browserless 模式——直接用普通 HTTP 请求拉取 HTML,此时截图与 PDF 会被禁用。 - 浏览器上下文准备:使用 Playwright 创建 1440×900 视口的新上下文,注入固定 User-Agent,禁用 Service Worker,并按需应用代理配置。
- 页面防护与净化:
setupPage阶段安装 CDP 层的重定向守卫(逐跳校验重定向目标、拦截指向内网等非法地址的跳转,并对代理认证挑战自动应答)、全局广告拦截、自动关闭 JavaScript 弹窗(alert/confirm/prompt)、拦截音视频与非法子请求(防 SSRF)。 - 导航与等待:以
domcontentloaded为导航完成标志,随后等待网络空闲(networkidle,超时 5 秒);若启用了 autoconsent(Cookie 同意横幅自动处理),还会等待其完成。 - 资产捕获:并行提取页面 HTML,并根据配置
storeScreenshot/storePdf决定是否截图(JPEG、quality 80、可选整页)与生成 PDF(A4、printBackground),截图/PDF 均带超时保护。 - 资源回收:页面与上下文关闭均带超时兜底,避免卡死阻塞任务;按需创建(connectOnDemand)的浏览器实例会一并关闭。
AI 推理:OpenAI 兼容接口与 Ollama 本地模型
AI 打标签与摘要的统一推理层位于 packages/shared/inference.ts。从源码可以看出:
- 推理客户端同时支持OpenAI SDK与Ollama SDK(文件头部同时引入
openai与ollama两个包),这与文档"支持使用 ollama 的本地模型"完全对应——你可以选择云端 API,也可以选择本地模型来保证数据私密性。 - 响应解析采用Zod 结构化输出(
zodResponseFormat),即强制模型按预定义 schema 返回 JSON,保证打标签/摘要结果的格式稳定性,便于后续流程直接消费。 - 推理层还包含embedding 维度校验:
validateEmbeddingDimensions会比对返回向量维度与EMBEDDING_DIMENSIONS配置,不一致即抛错——这是语义搜索(semantic search)可靠性的重要保障。
也就是说,文档里"AI-based automatic tagging and summarization"并非简单的字符串拼接,而是一套带结构化校验、支持本地化部署的完整推理管线。
从入门到实战:后续学习路径
看完本文,你可以按以下路径继续深入(均为仓库内文档,路径以仓库根目录为起点):
- 快速部署:Docker 安装指南(使用上面的 docker-compose 拓扑)、最小化安装
- 配置详解:环境变量参考、不同 AI 提供方配置(含 Ollama 本地模型)
- 日常使用:收藏书签、列表管理、标签体系、搜索查询语法、数据导入
- 生态集成:命令行工具 CLI、MCP 服务、RSS 订阅、Agent 技能
- 运维管理:安全注意事项、FAQ、故障排查
- 二次开发:开发环境搭建、目录结构、数据库说明、架构总览
结语
Karakeep 的定位非常清晰:一个把"收藏"这件事做到极致的自托管应用——链接、笔记、图片、PDF 全部收纳,AI 负责自动打标签与摘要,Meilisearch 负责全文与语义检索,再辅以规则引擎、OCR、高亮、RSS 自动收藏、整页与视频归档,构成一套完整的"信息收纳 → 自动整理 → 随时检索"闭环。对数据囤积者而言,它既是你的"数字杂物抽屉",也是一台可以完全掌控在自己手中的个人知识引擎。
【免费下载链接】hoarderA self-hostable bookmark-everything app (links, notes and images) with AI-based automatic tagging and full text search项目地址: https://gitcode.com/GitHub_Trending/ho/hoarder
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考