跳转到主要内容

这是本节的多页打印视图。 .

返回本页常规视图.

Crib 文档

Crib 的安装、搜索、阅读、资料库管理与集成说明。
文档对应开发构建

Crib 还没有公开安装包。这里描述的是当前开发构建的行为,正式发布前可能还会调整;进度见发布状态。

常用入口

文档地图

简介

Crib 是什么、收录哪些内容、怎样工作、现在到了哪一步。

Crib 是什么 · 收录内容 · 工作原理 · 发布状态

使用指南

从安装到日常使用的每一个功能。

安装与首次启动 · 搜索 · 阅读与双语对照 · 笔记、书签与本地更正 · 片段 · 快捷键

资料库

获取和管理文档版本,更新、回滚和恢复,以及资料包格式。

管理资料库 · 版本与别名 · 下载、更新与恢复 · 资料包格式

集成

让其他程序使用 Crib 里的文档。

本地 API · MCP · 系统服务与全局快捷键 · 深链接

参考

数据存放位置、内容来源和常见问题。

用户数据与迁移 · 来源与许可 · 常见问题

1 - 简介

Crib 是什么、收录哪些内容、怎样工作、现在到了哪一步。

1.1 - Crib 是什么

Crib 解决什么问题、适合谁用,以及它和在线手册、Dash 这类工具的区别。

Crib 是一款 macOS 应用,把 PostgreSQL 6.3 到 20devel 共 31 条版本线的中英文手册、一份结构化的 PostgreSQL Wiki,以及你自己的笔记和更正放在同一个本地资料库里。它不需要账号,不依赖网络,也不需要连接 PostgreSQL 服务器。

Crib 的主页:左侧是 PostgreSQL 资料分类,中间是 18.6 中文手册目录,右侧是搜索框和获取版本、资料库、搜索方案、快捷键四个入口
Crib 主页(2026-11-06 开发构建,深色外观)

它解决什么问题

查 PostgreSQL 文档时常见的几个麻烦:

  • 版本对不上。 生产库还在 9.6 或 12,网上搜到的却是最新版手册。Crib 收录每条版本线,搜索时可以直接写 PG96: vacuum。
  • 符号搜不到。 ->>、@@、\dC 这类写法在通用搜索引擎里会被当成标点丢掉。Crib 先按精确名称匹配,再搜正文。
  • 中英文来回找。 读中文手册遇到拿不准的句子,想看英文原文,往往要重新翻目录。Crib 一键切到另一种语言的同一节,也可以两栏对照。
  • 断网或内网环境。 机房、飞机、隔离网络里打不开在线文档。Crib 首次启动就能离线阅读和搜索。
  • 笔记散落各处。 排障时记下的结论和手册原文分开放,过一阵就找不到出处。Crib 的笔记、书签和更正挂在具体章节上,内容更新后会重新核对位置,找不到的单独列出。

适合谁

读者典型用法
DBA / SRE输入 pg12: max_connections 或“锁”,确认某个版本的参数和行为,把结论记成笔记
应用开发者查运算符、函数重载、psql 命令和 SQLSTATE,复制代码片段
中文读者与译者读中文,遇到疑问切英文同节;对译文写本地更正并导出
维护老系统的人对比旧版本和新版本的手册、版本发布与安全信息

和其他方式的区别

在线手册下载 HTML 或 PDFCrib
断网可用否是是
31 条版本线按版本分开浏览需要逐个下载同一个资料库
中英文同节切换否否是,基于章节标识对应
跨版本搜索依赖站内搜索否是,可按版本、语言、类型限定
笔记与更正否自行管理挂在章节上,可导出

Crib 借鉴了 Dash 的片段库、系统服务和本地 API 等用法。区别在于内容格式:Crib 的 .crib 资料包自带双语章节对应、版本信息和签名,不使用也不兼容 Dash docset。

它不做什么

  • 不连接数据库,不执行 SQL。
  • 不翻译。中文内容只来自已有的中文译本;某一节没有译文时,明确显示缺失,不拿英文冒充。
  • 不改写官方原文。你的更正存在个人资料库里,与原文并列显示。
  • 没有云同步。个人资料可以导出、导入和备份,但不会自动上传到任何地方。

现在的状态

Crib 还在开发中,没有公开安装包。本站文档描述的是当前开发构建的行为。已经完成和尚未完成的部分见发布状态。

接下来读什么

1.2 - 收录内容

Crib 收录的 31 条 PostgreSQL 版本线、62 套中英文手册和 30 个 Wiki 集合,以及每部分的来源与已知缺口。

Crib 的内容分两类:PostgreSQL 手册,每条版本线一个中英双语资料包;Wiki,一个独立的双语资料包。所有内容都来自固定版本的输入,构建时记录每个文件的来源和哈希,并用 Ed25519 签名。

手册

31 条版本线,每条一套英文、一套中文,共 62 套完整手册。每条线固定到一个确切的内容版本,不跟随上游自动更新;新的小版本发布后,以新的资料包修订号加入版本目录,旧版本保留。

版本线内容版本版本线内容版本版本线内容版本
6.36.3.28.28.2.231111.22
6.46.4.28.38.3.231212.22
6.56.5.38.48.4.221313.23
7.07.0.39.09.0.231414.24
7.17.1.39.19.1.241515.19
7.27.2.89.29.2.241616.15
7.37.3.219.39.3.251717.11
7.47.4.309.49.4.261818.6(默认)
8.08.0.269.59.5.251919rc1(预览版)
8.18.1.239.69.6.242020devel(开发快照)
1010.23
19 和 20 不是正式版

19 固定为 19rc1,20 是 2026-10-16 的 20devel 开发快照。它们不会成为默认版本:总别名 pg 只指向正式版。用 pg19:、pgdevel: 前缀可以单独搜索它们,见版本与别名。

来源

  • 英文手册:PostgreSQL 全球开发组发布的官方文档,按上表版本从固定的源码归档构建。19 和 20 缺少现成的 HTML 构建,从固定的源码输入补建。
  • 中文手册:pgdoc 收录的各版本简体中文译本。每套手册保留原有的译者署名和版权声明,例如 18.6 中文版署名“翻译:冯若航,Pigsty 项目组”。
  • 历史资源:6.3、6.4 等早期中文版缺失的 CSS 和图片,只从同一版本的另一语言版本或核实过的同版材料补齐,并逐个记录来源。

规模

项目数量
HTML 页面54,887
可检索章节409,439
中英文章节对应77,580 对
缺失的必需资源0

中英文章节对应只在两侧手册源码里都能找到唯一的章节声明、且 HTML 中有唯一的物理锚点时才建立;标题相同或自动生成的 ID 不算数。没有对应的章节,切换语言时回到最近的已对应父节,并明确提示。

已知缺口

  • 原始手册中有 80 处历史失效链接和 235 处重复锚点,Crib 保留原样并在资料包审计中列出,不臆造目标。
  • 本地 SVG 插图(PG 12–20 中的 GIN、页面布局、GEQO 等图)以静态图片显示,脚本与远程资源一律去除。

Wiki

Wiki 来自 pg.center 2026-10-24 的冻结快照,打成一个独立的双语资料包。它把散落在手册各处的对象整理成条目:一个配置参数、一个函数、一个等待事件各是一条,带类型、默认值、出现版本和来源。导航分六组共 30 个集合:

分组集合
查询语言SQL 命令、数据类型、函数、运算符、SQLSTATE
索引与存储系统目录、索引访问方法、表访问方法、操作符族、存储参数、存储结构、OID 类型
运行与诊断配置参数、执行计划、等待事件、锁、统计与指标、认证方法、预定义角色
客户端与协议psql 命令、命令行工具、连接参数、协议消息
扩展机制外部数据包装器、扩展钩子、过程语言、全文检索组件、排序规则与编码、逻辑解码插件
版本版本(汇总各版本的发布、安全公告与能力信息)

前五组是 29 种实体集合;“版本”是组合视图,把版本发布、CVE 与能力矩阵放在一起看。

项目数量
文档12,143
章节212,257
事实记录459,513
原始对象10,087

Wiki 的边界

  • 不是每个集合在每个版本、每种语言都有覆盖。部分扩展集合只覆盖 PG 10–20,表访问方法从 PG 12 开始。
  • “未观测到”和“已移除”是两回事。只有来源明确写出时才标记某项被移除,覆盖缺口不会被当成删除。
  • 每条事实显示来源、版本和观测时间;某种语言没有正文时显示缺失,不用另一种语言填充。
  • Wiki 中引用的外部网页和插图不随包下载。

你自己的资料

笔记、书签、标签、阅读历史、本地更正和片段不属于任何资料包,单独存放在用户目录里。卸载或更新文档版本不会删除它们。见笔记、书签与本地更正和用户数据与迁移。

1.3 - 工作原理

Crib 怎样把内容、搜索索引和个人资料分开存放,以及为什么导入或更新版本时旧窗口还能继续读。

Crib 由两部分组成:构建端用 Go 把手册和 Wiki 做成签名的资料包和预建索引;macOS 应用用 SwiftUI、少量AppKit、WKWebView 和 SQLite FTS5 读取它们。应用运行时不需要网络服务,也不启动本地 HTTP 服务器(本地 API 是可选功能,默认关闭)。

flowchart LR
  P["手册源码与 HTML<br>Wiki 冻结快照"] --> G["Go 构建工具<br>crib-pack"]
  G --> B["签名资料包<br>.crib"]
  G --> S["出厂搜索索引<br>seed"]
  B --> V["应用:验签与安全解包"]
  V --> W["后台构建新的搜索世代"]
  S --> A["当前世代"]
  W --> A
  A --> Q["搜索"]
  A --> R["阅读器 WKWebView"]
  U["个人资料<br>user.sqlite"] --> R
  U --> Q

三类数据分开存放

数据存放位置谁可以写
文档内容:HTML、资源、章节、双语对应、精确名称键只读的资料包只有构建端,写入后签名
搜索索引资料库里的“世代”(generation)应用的后台构建器,构建完成后不再修改
笔记、书签、标签、历史、本地更正用户目录中的 user.sqlite只有个人资料模块

资料包导入器不能写个人资料库,个人资料也不建立指向资料包的级联删除。所以卸载一个版本不会删掉挂在上面的笔记,只会让它们暂时显示为目标不可用。

资料包

每条 PostgreSQL 版本线是一个双语原子包,Wiki 是另一个。包里有 manifest.json、签名、来源清单、章节数据库、两种语言的文档和许可文件。同一个版本、同一个修订号的文件字节永远不变;内容有变化就发新的修订号。格式细节见资料包格式。

应用只接受签名有效的包:检查清单签名、文件长度和哈希、ZIP 边界和资源清单,拒绝绝对路径和路径穿越。

搜索世代

搜索时只查一个聚合的 SQLite 数据库,不同时挂接多个包的数据库。这样所有版本的正文用同一套统计排序,结果可以直接比较。

这个聚合数据库叫一个“世代”。它由当前启用的资料包组合唯一决定:

  • 完整离线版和 Core 版都随附一个出厂世代,首次启动直接使用,不需要建索引。
  • 导入、更新、启用或停用资料包时,应用在后台从各包流式读取章节,写一个新的世代。
  • 新世代验证通过后才原子切换。构建期间旧世代照常服务,已经打开的阅读窗口继续停在原来的世代上。
  • 构建失败、被取消或磁盘不足时,保留原来的世代,不会出现一半新一半旧的状态。

只移动版本别名(例如 pg18 从 18.6 指向 18.7)不需要重建世代;只有实际更换资料包才重建。

查询先解析成结构化条件:版本前缀和 lang:、kind: 等过滤器来自白名单,其余是文本。用户输入不会直接拼进 SQL。排序分层进行:

  1. 当前范围内的精确名称和别名(work_mem、->>、\dC、SQLSTATE 代码)。
  2. 名称前缀。
  3. 标题和章节名。
  4. 正文。

中文按连续汉字的重叠双字切分:“事务隔离”切成“事务、务隔、隔离”。单个汉字(例如“锁”)走标题和名称的字符索引,在有限范围内查,不扫描全库正文。构建端和应用使用同一个切分规则(analyzer),并用同一组测试样例核对。具体写法见搜索。

阅读器

正文是资料包里的 HTML,由 WKWebView 通过一个受限的内部地址读取:地址里带有资料包清单的摘要,只能访问该包内的文件,不能加载远程脚本或资源。切换语言时,按两种语言之间已验证的章节对应跳转,没有对应就回到父节并提示。

个人资料

user.sqlite 使用 WAL 和完整同步写入,每次保存在一个事务里比较修订号:两个编辑器同时改同一条笔记时,后保存的一方得到冲突提示,不会覆盖对方。迁移或备份使用 SQLite 在线备份,而不是复制正在使用的数据库文件。个人资料库打不开时,只停用个人功能,阅读和搜索照常工作。见笔记、书签与本地更正。

1.4 - 发布状态

Crib 已经完成了什么、正式发布前还差什么,以及本站文档的适用范围。
截至 2026-11-06:尚未发布

Crib 没有公开安装包,也没有公开源码。本页按项目内部的发布计划整理,每个阶段单独标注;一项完成不代表其他项完成。

已完成

这些是源码层面的里程碑,在本地开发构建上验证过:

  • 31 条版本线、62 套手册和 Wiki 全部构建、签名并通过完整性审计;完整离线版的出厂搜索索引可以直接使用。
  • 搜索、阅读、双语切换与对照、笔记、书签、本地更正、片段、资料包管理、本地 API、MCP 和系统服务均已实现。
  • 由 PGDash 改名为 Crib:产品、应用、用户目录和输出名称已统一;旧用户资料按一次性迁移复制,旧格式继续兼容。见用户数据与迁移。
  • 签名版本目录 v3:每个版本带生命周期(默认、常规、历史、开发、不再提供),别名、搜索、资料库和阅读器共用同一个版本模型。
  • Core 版加按需下载:内置 18.6 和启动索引,其余版本从签名目录下载,可断点续传。
  • 2026-11-06 完成界面与文案重设计,资料包扩展名改为 .crib(旧的 .pgdocpack 继续有效)。

尚未完成

事项现状
最终候选验收A01–A10 验收项尚未绑定到最终的 Crib 候选构建;历史验收不能直接沿用
真实桌面验收已有离屏快照与隐藏窗口测试;可见窗口、实体键盘与输入法、辅助功能、MCP 客户端实际接入仍待验收
系统服务错误提示服务菜单发现、查找和创建片段已在可见流程中验证;拒绝请求时的错误提示仍待证实
许可与再分发应用代码尚未选定许可证;手册译文、Wiki 文本、字体和图片的再分发许可尚未逐项核对
生产资料包目录计划发布在 repo.pigsty.io/doc/,尚未上传;需要验证匿名 HTTPS 下载、缓存和断点续传
正式签名内容目前使用开发密钥签名,应用为 ad-hoc 签名;生产密钥、Developer ID 签名和 Apple 公证尚未进行
平台支持只在 Apple Silicon、macOS 27 的开发机上实测;macOS 14 实机和 Intel Mac 尚未测试
安装与升级安装、更新、回滚和备份的端到端测试待完成

“发布就绪”和“已发布”是两个独立的状态,目前都为否。

本站文档的适用范围

  • 文档描述的是 2026-11-06 前后的开发构建。正式发布前,界面文字、默认快捷键和部分细节仍可能调整。
  • 标注“尚未实测”“待验收”的行为,不要当作已经保证。
  • 截图来自开发构建的离屏快照,与正式版可能略有差异。

进展更新发在开发日志。

2 - 使用指南

安装与首次启动、搜索语法、双语阅读、笔记与本地更正、片段和快捷键。

2.1 - 安装与首次启动

Crib 现在能不能装、需要什么系统、两种版本有什么区别,以及第一次打开时会发生什么。
还没有公开安装包

Crib 仍在开发中,没有公开下载,也没有确定价格和许可证。发布后安装包会放在下载页。本页描述的是当前开发构建的行为。开发构建只有临时签名,没有经过 Apple 公证。

系统要求

项目现状
部署目标macOS 14
已测试只在 Apple 芯片(arm64)的开发机上测试过
未测试实际运行在 macOS 14 上、Intel Mac
网络首次启动和日常阅读、搜索都不需要;只有下载其他版本时需要

部署目标是编译设置,不等于已经在 macOS 14 上验证过。正式发布前会单列实测过的系统和机型。

两种版本

完整离线版Core
内置手册全部 31 条版本线,中英文共 62 套PG 18.6 中英文手册
内置 Wiki有无,按需下载
搜索索引随应用附带,覆盖全部内置内容随应用附带 18.6 的索引;下载其他版本后在本机建立
其他版本不需要下载从签名的版本目录选择安装

两种版本的区别在于随应用附带多少内容。Core 下载的每个资料包都会先校验签名,再建立索引、切换到新内容;下载失败或取消时,已安装的内容照常可用。获取和管理版本见资料库。

说明

Core 按需下载所用的版本目录还没有在正式地址上线,在那之前 Core 无法联网下载其他版本。手头有 .crib 资料包文件时,可以在资料库中“导入资料包…”。

首次启动

  1. 打开 Crib。不需要账号,也不需要联网:两种版本都直接使用随应用附带的内容和索引。
  2. 窗口默认打开 PG 18 中文手册,内容版本是 18.6。搜索范围默认是“PG 18 · 简体中文 · 手册”。
  3. 按 ⌘ 加 L 开始搜索。搜索语法见搜索。
  4. 点工具栏的主页按钮(⇧ 加 ⌘ 加 H)可以回到主页,从“获取版本”“资料库”“搜索方案”“快捷键”四个入口继续设置。

本地 API 和三个全局快捷键默认关闭,不会在首次启动时请求权限。只有“搜索选中文字”全局快捷键需要辅助功能权限,开启时再授予。

个人资料放在哪里

设置、片段库、笔记、书签、更正、阅读历史和下载的资料包都存放在:

~/Library/Application Support/Crib/

这个目录不在应用包内。卸载某个文档版本不会删除挂在上面的笔记和更正。各文件的用途见用户数据与迁移。

从 PGDash 迁移

Crib 以前叫 PGDash。如果本机有 ~/Library/Application Support/PGDash/,Crib 启动时会把它复制一份到新目录,旧目录原样保留,不修改也不删除。

  • 迁移失败时,Crib 以只读方式运行:可以阅读和搜索内置内容,但笔记、书签、更正、阅读历史、下载和设置都不能修改。每次启动会重试;提示中也可以“重试迁移”或“跳过迁移…”。
  • 跳过迁移后,Crib 从空白的个人资料开始,旧资料原样留在原目录。
  • 已经有 Crib 资料时又发现旧资料,Crib 会提示“发现 PGDash 旧资料”,由你选择“迁移旧资料”或“不再提示”。选择迁移时,现有的 Crib 资料会整体移到一旁保留。

迁移的完整规则和恢复办法见用户数据与迁移。

2.2 - 搜索

用版本前缀和筛选条件把搜索限定到某个版本、语言或资料类型,查技术符号和中文词语,并在没有结果时调整范围。
搜索 work_mem 的结果:中间结果栏列出 14 条 PG 18.6 中文手册结果,每条标注版本、语言、资料类型和“精确”,底部是 Google 与 Stack Overflow 网页搜索;右侧阅读区是 PostgreSQL 18.6 中文手册
搜索 work_mem(2026-11-06 开发构建,深色外观)

按 ⌘ 加 L 聚焦工具栏中的搜索框,⌘ 加 K 是备用快捷键。结果随输入更新。

按键作用
↑ ↓选择结果
↩打开选中的结果;结果还没出来时,出来后打开第一条
⌘ 加 ↩在新标签页打开
Esc回到正文,查询保留

在结果上点右键可以“在新标签页打开”或“复制链接”。搜索框为空、或查询里只有筛选条件时,中间一栏显示当前范围的“目录”,而不是搜索结果。

搜索范围

工具栏下方的范围栏决定默认在哪里搜:

  • 搜索方案:保存的范围,见搜索方案。
  • 版本:例如“PG18 · 18.6”。选“默认版本”回到 PG 18;选“常规版本”搜索全部默认和常规版本。历史版本和开发版不在其中,在阅读区“版本”弹出框中打开“专家模式”后,这一项变为“全部已启用版本”,搜索也包含它们。
  • 语言:中文、English 或全部语言。
  • 资料类别:由左侧栏决定。“手册”只搜手册,“全部资料”包括 Wiki,点某个 Wiki 集合则只搜该集合。

新窗口的默认语言和版本在“设置 › 通用 › 默认搜索范围”中修改;设了默认搜索方案时以方案为准。

搜索语法

查询由关键词、版本前缀和筛选条件组成,顺序不限。前缀和筛选只作用于本次查询,并优先于范围栏。它们以“仅本次查询”标签显示在范围栏中,点标签可以单独移除;“清除筛选”移除全部筛选,保留关键词。

版本前缀

写法含义
pg18:PG 18。大小写不限,PG18: 相同
pg96:、pg9.6:PG 9.6。10 以前的版本可以省略点号
[email protected]:指定内容版本 18.6;本机装的不是这个小版本时提示未安装,不用其他小版本代替
pg:默认版本,目前是 PG 18
pgdevel:开发版,目前是 20devel

前缀后面可以不加空格,pg18:vacuum 等于 pg18: vacuum。

筛选条件

筛选取值作用
lang:en、zh-Hans只搜这种语言的正文
branch:版本号,如 18、9.6只搜这个版本;与版本前缀同时写时必须一致
domain:manual、wiki、release、security、capability、provenance只搜手册、Wiki、发布、安全、能力或来源资料
collection:Wiki 集合键,如 guc、func、sqlstate、psql、waitevent只搜这个 Wiki 集合
kind:集合键或 domain: 的取值写集合键等于 collection:,写资料类型等于 domain:
project:postgresql,可写 pg目前只有这一个项目
Wiki 集合筛选要离开“手册”

左侧栏选的是“手册”时,搜索限定在手册内,collection:guc 不会有结果。先在侧栏选“全部资料”,或在查询里加 domain:wiki;更直接的办法是在侧栏点该集合。

其他规则:

  • 同一种筛选写了两个不同的值,或版本前缀与 branch: 指向不同版本,搜索会报错,不会替你挑一个。
  • 中文输入法打出的全角冒号 : 和全角字母、数字可以直接用。
  • 不是筛选名的冒号按普通文字处理。粘贴报错时不必删掉 ERROR:、DETAIL:、错误: 的冒号;x::int、localhost:5432 也原样保留。
  • 用英文双引号括起的短语要求在原文中连续出现。
  • 查询最多 256 个字符。超过 32 个词时只用前 32 个,结果栏上方会提示。

示例

查询含义
work_mem找配置参数,名称完全一致的条目排在最前
PG96: vacuum在 PG 9.6 中搜 vacuum
[email protected]: max_connections lang:en在 18.6 英文手册中找 max_connections
SELECT branch:18 lang:en在 PG 18 英文资料中找 SELECT
->>、@@运算符,标点原样参与匹配
\d+、\dCpsql 命令,区分大小写,只做精确匹配
23505SQLSTATE 代码,按字符串匹配
复制延迟、事务隔离中文词语,按相邻两字匹配
锁单个汉字,只匹配标题和名称
domain:wiki SELECT只在 Wiki 中找 SELECT

匹配规则

结果先按名称匹配,再按标题和正文匹配。大致顺序是:名称、命令或定义完全一致,别名,名称前缀,章节标题,标题相关的章节,最后是正文。每条结果的说明行末尾标出匹配方式:精确、别名、前缀、标题、相关章节、正文或标题/名称;悬停可以看到解释。

  • 大小写:普通英文标识符不区分大小写,WORK_MEM 与 work_mem 相同。含标点的名称和 psql 命令区分大小写,\dC 与 \dc 是两个命令。
  • 反斜杠:查询中有以 \ 开头的词时,只做精确匹配,不退回正文搜索。
  • 英文词形:3 个字母以上的单词同时匹配常见词形,lock 也匹配 locks、locked、locking。末尾还没输完的英文词按前缀匹配,例如 transaction isol。
  • 中文:连续的汉字按相邻两字切分,“事务隔离”拆成“事务”“务隔”“隔离”,这几组都出现才算命中,不要求相邻。需要连续出现时加英文双引号。
  • 单个汉字:只输入一个字时(如 锁),只匹配标题和名称中含这个字的条目,结果标为“标题/名称”。和其他词一起出现的单字按词首近似匹配,结果栏会提示“单个汉字只按标题和词首匹配,输入完整词语更准确”。
  • 语言:英文标识符在中文手册里原样存在,在中文范围内搜 work_mem 也能命中中文手册。写了 lang:en 就不会返回中文正文。

多版本结果

搜索多个版本时,同一种语言下的同一个对象合成一组:Wiki 按同一概念,手册按同一章节标识。没有可靠对应关系的同名条目各自单列。

  • 结果栏顶部显示“N 组 · M 个版本”。
  • 分组标题下有版本摘要,点它或按 → 展开,按 ← 收起。
  • 折叠时按 ↩ 打开组内排在最前的一条。组内先列范围栏选定的版本,其余从新到旧。

搜索方案

范围栏最左边的“搜索方案”菜单保存常用范围:版本、语言、资料类别,以及可选的搜索框提示语和触发词。

  1. 调好范围栏,在菜单中选“将当前范围存为方案…”。
  2. 在“设置 › 搜索”中编辑、停用或删除方案,并可以指定“新窗口默认方案”。
  3. 给方案加触发词后,在搜索框输入 sql:select 或 sql select,这一次就按触发词为 sql 的方案搜索 select。删掉触发词即恢复范围栏原来的范围。

每个方案最多 8 个触发词,以英文字母开头,最长 32 个字符;不能使用 pg 开头的词和 lang、branch 等筛选名。方案里的“在结果中显示片段”可以单独关闭片段结果。

没有结果时

结果栏显示“没有结果”和实际搜索的关键词(不含筛选),并给出几个操作,都会保留关键词:

  • 清除筛选:查询中有筛选条件时出现。
  • 清除查询。
  • 调整范围 › 搜索全部版本:从单个版本扩大到全部版本。
  • 调整范围 › 仅搜索 PG N:回到正在阅读的版本和语言。

搜索未安装或已停用的版本(例如在 Core 中写 pg96:)时,Crib 会说明该版本未安装或未启用,状态栏出现“查看 PG96”,打开资料库获取或启用。

最近搜索

点搜索框左侧的放大镜,菜单中列出最近 12 条查询,选“清除最近搜索”可清空。按 ↩ 或打开某条结果时记录当前查询。

片段与个人资料

  • 匹配的片段显示在结果最上方的“片段”分组中,见片段。在“设置 › 片段”中关闭“在搜索结果中显示片段”即可隐藏。
  • 侧栏选中“个人资料”下的分类时,搜索框改为筛选笔记、更正、书签或阅读历史,按标题、正文和标签做字面匹配,不分词。

本地没找到时,结果栏底部的“网页搜索”在默认浏览器中打开外部搜索。默认启用 Google 和 Stack Overflow,DuckDuckGo 默认关闭。发送的只有查询文字,筛选条件会先去掉。

在“设置 › 网页搜索”中可以添加、停用、拖动排序或恢复默认。地址必须以 https:// 开头,用 {query} 标出查询文字的位置。阅读区“更多”菜单中的“在网页中搜索选中文字”使用同一份列表。

2.3 - 阅读与双语对照

在目录、标签页和历史之间移动,页内查找,切到另一种语言的同一章节或两栏对照,调整外观,复制链接和查看来源。
阅读 PostgreSQL 18.6 中文手册:左侧栏是资料分类,中间一栏是手册目录,右侧阅读区显示手册首页;阅读区右上角依次是目录、版本、添加书签、书签、阅读历史、English 和更多按钮
阅读手册(2026-11-06 开发构建,深色外观)

窗口布局

窗口分三栏:

  • 侧栏:资料分类。“手册”“全部资料”、六组 Wiki 集合,以及“个人资料”下的笔记、更正、书签、阅读历史、标签和待重新定位。
  • 中间一栏:有查询时是“结果”,没有查询时是当前范围的“目录”,按手册顺序列出章节。
  • 阅读区:标题下方写明正在读的版本、语言和资料类型,例如“PostgreSQL 18 · 中文 · 手册”。正文的版本和语言以这里为准,不以范围栏为准。

工具栏按钮可以隐藏侧栏或结果栏;“设置 › 通用 › 显示”中的“显示侧栏”“显示搜索结果栏”决定默认状态。

本页目录

阅读区右上角的“目录”按钮(⇧ 加 ⌘ 加 F,菜单名“筛选目录”)列出当前页面的全部章节,当前章节有标记。在“筛选章节”框中输入标题或对象名可以过滤。

按键作用
↑ ↓选择章节
↩跳转
⌘ 加 ↩在新标签页打开
Esc关闭,回到正文

双语对照时,在哪一栏打开目录,就列出哪种语言的章节。目录不改变搜索框的查询和范围。

标签页与窗口

Crib 使用 macOS 原生窗口标签页。每个标签页有自己的查询、搜索范围、正文和前进后退记录。

操作方法
新建标签页⌘ 加 T
在新标签页打开结果、目录或历史条目⌘ 加 ↩,或右键“在新标签页打开”
复制当前标签页文件 › 复制标签页
重新打开关闭的标签页⇧ 加 ⌘ 加 T
上一个 / 下一个标签页⇧ 加 ⌘ 加 [ / ⇧ 加 ⌘ 加 ]
关闭标签页或窗口⌘ 加 W

“设置 › 通用 › 启动”中的“启动时恢复窗口和标签页”默认开启,恢复时包括查询、搜索范围和阅读位置。

后退与前进

⌘ 加 [ 和 ⌘ 加 ] 在当前标签页读过的页面之间后退、前进。按住工具栏的后退或前进按钮会列出可以跳到的页面;同样的列表也在“阅读 › 后退到 / 前进到”中。

这份记录只属于当前标签页。跨标签页、跨启动保留的阅读记录是“阅读历史”(⇧ 加 ⌘ 加 Y),见笔记、书签与本地更正。

页内查找

操作按键
页内查找⌘ 加 F
查找下一个 / 上一个⌘ 加 G / ⇧ 加 ⌘ 加 G
用选中的文字查找⌘ 加 E
跳到选中的文字⌘ 加 J

查找栏右侧的“完成”关闭查找栏。双语对照时,查找作用于获得焦点的那一栏,查找栏左侧标出“中文正文”或“English 正文”。

切换语言

按 ⇧ 加 ⌘ 加 L,或点阅读区右上角的“English”/“中文”,打开另一种语言中对应的章节,并停在同一小节。

对应关系在构建资料包时确定,手册依据源码中的章节标识,不按标题或网址猜测。

  • 当前小节在另一种语言中有对应时,直接打开。
  • 没有对应时,Crib 逐级向上找,打开最近的有对应的上级章节。按钮的悬停提示写明“已定位到上级章节”。
  • 对应关系不是逐段核对过的,提示“对应章节未逐段核对”。
  • 一直找不到时,按钮不可用,提示“这一节还没有已核对的对应章节。”

双语对照

按 ⇧ 加 ⌘ 加 B,或点工具栏的“双语对照”按钮,阅读区分成两栏:左栏是当前正文,右栏是另一种语言的对应页面。

  • 滚动任一栏,另一栏跳到对应的章节。对齐只到章节一级,不逐句对齐。
  • 找不到对应章节时,右栏显示“没有对应章节”和原因。
  • 阅读设置同时作用于两栏。
  • 页内查找、“目录”和“在浏览器中打开”作用于获得焦点的那一栏;“更多”菜单中另有“在浏览器中打开 English 页面”或“中文页面”。

切换版本

阅读区右上角的“版本”按钮显示正在读的版本,并列出资料库中的其他版本。点某个版本的“阅读”,Crib 尽量停在同一位置:

  1. 先找同一章节标识;
  2. 找不到时打开上级章节或同名页面,提示“PG N 中没有这一节,已打开上级章节”之类的说明;
  3. 连页面都没有时打开该版本的目录首页。

未安装的版本显示“在资料库中显示”。打开“专家模式”后,列表也包括历史版本和开发版。安装与启用版本见资料库。

外观与缩放

浅色、深色或跟随系统在“设置 › 通用 › 显示 › 外观”中选择。正文排版在“设置 › 阅读”中调整,立即作用于所有窗口:

设置范围
页面缩放60%–300%,步长 10%
字体系统字体、衬线字体
字号12–24 pt
行距1.30–2.00
行宽适应窗口、紧凑 640 pt、标准 800 pt、宽 1040 pt

⌘ 加 + / ⌘ 加 - 每次缩放 10%,⌘ 加 0 回到 100%,“阅读 › 放大到 200%”一步放大。“设置 › 阅读”底部的“恢复默认”重置以上各项。

  • 代码:代码块右上角有“复制”按钮,复制后短暂显示“已复制”。
  • 链接:“更多 › 复制链接”复制正在阅读的章节的 crib:// 链接;在结果上右键也有“复制链接”。链接带有章节和资料包标识,格式与打开规则见链接。
  • 选中的文字:“更多”菜单中可以“搜索选中文字”,或用网页搜索查它。

在浏览器中打开

按 ⌥ 加 ⌘ 加 B,或选“更多 › 在浏览器中打开”,Crib 生成这一页的本地副本,用默认浏览器打开。副本是官方原文,不含你的笔记和更正,也不运行脚本。生成期间状态栏显示“正在准备页面…”,可以取消。

来源与许可

“更多 › 来源与许可”显示这一页的出处:

  • 版本:项目、内容版本和渠道;
  • 资料包及其修订号;
  • 页面路径、锚点和章节标识;
  • 页面和正文的校验值;
  • “来源”和“许可”两个标签页,列出该资料包的来源清单和许可证。

2.4 - 笔记、书签与本地更正

在章节上写 Markdown 笔记、加书签和标签、查阅读历史、更正译文,内容更新后重新定位,以及导出、导入、备份和恢复个人资料。

笔记、书签、标签、阅读历史和更正统称个人资料,保存在 ~/Library/Application Support/Crib/ 中,与资料包分开。卸载或更新文档版本不会删除它们;个人资料出问题时,阅读和搜索照常可用。

侧栏“个人资料”下有笔记、更正、书签、阅读历史、标签和待重新定位六个分类。选中某个分类时,搜索框改为在其中按标题、正文和标签做字面筛选。

笔记

点工具栏的“笔记”按钮打开笔记面板,按 ⇧ 加 ⌘ 加 N 新建笔记。

  • 新笔记的标题默认是当前章节的标题。新建时正文中有选中的文字,笔记就关联到这段原文,面板中显示“关联的原文”和“打开原文”。
  • 以后要改关联位置,在正文中选中新的文字,点“关联当前选区”。
  • 正文是 Markdown,“编辑”与“预览”之间切换。预览只打开 http、https 和 mailto 链接。
  • 标签写在“标签,用逗号分隔”一栏。
  • “修订”菜单列出保存过的版本,“恢复修订 N”会把它存为一个新修订,不覆盖历史。
  • 在侧栏“笔记”中右键可以“编辑笔记”“打开原文”或“删除笔记…”。删除会连同所有修订一起删除,无法撤销。

自动保存与冲突

停止输入片刻后笔记自动保存,面板底部依次显示“等待自动保存…”和“已自动保存 · 修订 N”。

  • 保存失败时显示“保存失败:”和原因,草稿留在编辑器中,不会显示为已保存。
  • 同一条笔记在两个窗口里都改过时,后保存的一份不会覆盖先保存的:它的编辑器显示保存失败,草稿保留。
  • 导出、导入和备份前,Crib 先保存所有草稿;上面那种冲突的草稿另存为标题带“(冲突副本)”的新笔记并提示,之后的修改保存到这份副本。
  • 退出时仍有无法保存的草稿,会弹出“无法保存个人资料”,可以“另存为副本并退出”“放弃修改并退出”或“继续编辑”。
说明

草稿只在保存成功后才写入磁盘。应用崩溃或磁盘不可写时,最后一次保存之后的输入可能丢失。

书签

按 ⌘ 加 D 给当前章节加书签,同时弹出编辑框,可以改名称、加标签。书签在弹出时就已添加,“取消”只放弃这次的修改。加过书签的章节,工具栏的书签图标变为实心。

⇧ 加 ⌘ 加 D 打开书签列表,可以按标题、版本或标签筛选,⌘ 加 ↩ 在新标签页打开,“在侧栏中查看全部”转到侧栏的“书签”分类。

标签

笔记和书签都可以加标签。侧栏“标签”分类顶部的标签选择器按标签列出笔记;“书签”分类顶部也有同样的选择器。

阅读历史

打开过的章节记入阅读历史。⇧ 加 ⌘ 加 Y 打开历史列表,可以按标题或版本筛选;侧栏“阅读历史”显示全部。

  • 保留最近 5,000 条、180 天以内的记录,连续重复打开同一处只记一次。超出的部分在启动时清理。
  • 右键单条记录可以“从历史中删除”。在侧栏“阅读历史”分类中,“个人资料操作”菜单里的“清除阅读历史…”删除全部历史,不影响笔记、书签和更正,无法撤销。

阅读历史与标签页的后退、前进记录是两回事,后者见后退与前进。

更正

更正用来记下你对正文(通常是译文)的修改。它只保存在你的个人资料里,不改动官方原文。

  1. 在正文中选中要改的文字。选区要在同一章节内,只含正文。
  2. 选“阅读 › 更正选中文字…”,或阅读区“更多”菜单中的同名命令。
  3. 在“更正为”中写新文字,点“保存”。

保存后,阅读区顶部显示“N 处更正”。更正过的文字带底色和下划线,悬停可以看到原文。取消勾选“显示更正”即看到官方原文;“查看全部”转到侧栏“更正”分类。

  • 更正只在保存它的版本和语言中显示,不会套用到另一种语言或其他版本。
  • 更正绑定保存时的资料包和原文。资料包更新后,即使这段文字没变,更正也不再套用,列入“待重新定位”,状态为“原文已更新”。
  • 在侧栏“更正”中右键可以“编辑更正”“恢复原文”或“删除更正…”。恢复原文会存为一个新修订;删除会移除全部修订,无法撤销。
  • “在浏览器中打开”生成的页面只含官方原文,不含更正。

内容更新后重新定位

笔记和更正记住的是一段原文和它前后的文字。安装、更新或回滚资料包,以及导入个人资料之后,Crib 会重新核对每条记录的位置。也可以在“待重新定位”分类中点“重新定位”,或在“个人资料操作”菜单中选“重新定位全部”。

Crib 只在原文和保存时的前后文完全一致、并且只出现一次时自动找回位置。它不做近似匹配,也不会跳到另一种语言或另一个版本。找不到的记录列入“待重新定位”:

状态含义
原文已更新更正所在的资料包或原文变了,更正不再显示
原文出现多处同样的文字和前后文出现了不止一次
找不到原文页面还在,那段文字没有了
找不到原页面页面不在资料库中,例如对应版本已卸载

点“打开记录”打开对应的笔记或更正:

  • 笔记:在正文中选中新位置,点“关联当前选区”。旧的关联和每次核对的结果都会保留。
  • 更正:对新原文重新选中文字,另建一条更正。

导出、导入与备份

这些命令在“个人资料操作”菜单中(侧栏个人资料分类标题右侧的“…”)。

命令结果
导出个人资料…一个文件夹,默认名 Crib-personal,含全部笔记、更正、书签、阅读历史和修订
导出更正…同样格式的文件夹,默认名 Crib-corrections,只含更正
导入个人资料…选择一个导出的文件夹并合并进来
备份个人资料…一个 SQLite 文件,默认名 Crib-user-backup.sqlite

导出的文件夹结构如下:

Crib-personal/
├── manifest.json        # 全部记录、修订、位置信息和各 Markdown 文件的校验值
├── notes/<ID>.md        # 每条笔记的正文
└── corrections/         # 每条更正的原文、新文字和一份对照说明
  • 导入时,完全相同的条目跳过;与本机条目冲突的另存为副本,完成后提示“已导入 N 条,M 条冲突另存为副本”。
  • manifest.json 记录了每个 Markdown 文件的校验值。只改动某个 .md 文件会使整个导出无法导入。导出格式用于在 Crib 之间搬运,不是通用的 Markdown 导入入口。
  • 导出和备份不能保存到 Crib 自己的数据文件夹里。

个人资料无法打开时

磁盘已满、文件损坏等原因导致个人资料无法打开时,Crib 只停用个人资料功能,阅读和搜索不受影响。侧栏个人资料分类中显示“无法打开个人资料”,有两个处理办法:

  • 从备份恢复…:选择之前用“备份个人资料…”保存的文件。Crib 先检查备份,再替换;原文件改名保留。
  • 新建个人资料…:确认后以空白的个人资料重新打开,原文件改名保留在原目录,不会删除。

启动时的提示默认按钮是“稍后处理”。如果提示的是“个人资料需要更新版本的 Crib”,说明文件完好,只是由更新版本的 Crib 写入;此时只提供“从备份恢复…”,更新 Crib 后即可正常使用。

2.5 - 片段

保存常用的 SQL 和命令文本,用参数和当前日期时间展开后复制,在多台 Mac 之间共用一个片段库,或从其他应用直接创建片段。

片段是常用的 SQL、命令或说明文字,保存在片段库中。用的时候填好参数,复制到剪贴板,再粘贴到需要的地方。Crib 不会在其他应用里自动展开片段。

片段库

片段库在“设置 › 片段”中,“文件 › 打开片段库”直接打开这一页。

  • 顶部的“启用片段”和“在搜索结果中显示片段”都勾选时,片段才出现在主搜索结果中。
  • 列表上方可以按名称、触发词或正文搜索,也可以按标签筛选。
  • “新建片段…”新建;“更多操作”菜单中有“从剪贴板新建…”“导入片段库…”“导出片段库…”。
  • 选中一个片段后可以“复制”“复制原文”“编辑…”“创建副本”或“删除”。

“文件”菜单中的“新建片段…”和“从剪贴板新建片段…”也会打开这一页并直接进入编辑。

新建与编辑

字段规则
名称必填,1–80 个字符,不能与其他片段重名(不分大小写)
触发词可选,1–32 个小写字母、数字、- 或 _,以字母开头,不能重复;搜索时也会匹配
语言默认 SQL,最多 32 个字符;决定是否按 SQL 着色
标签用逗号分隔,最多 20 个,每个不超过 40 个字符
正文最多 1,000,000 个字符

新片段的正文默认是 SELECT * FROM __TABLE__;,可以直接改。

编辑器按键

按键作用
Tab在光标处插入 4 个空格;选中多行时整体增加缩进
⇧ 加 Tab每行去掉一个行首 Tab 或最多 4 个空格
↩换行
⌘ 加 ↩保存
⌃ 加 Tab / ⌃ 加 ⇧ 加 Tab离开正文,移到下一个 / 上一个控件

正文上方也有“增加缩进”“减少缩进”按钮。编辑器不会把引号、破折号自动替换成排版符号;每个编辑器有自己的撤销记录。用中文输入法选词时,保存会等组合输入结束后再进行。

参数与展开

正文中用分隔符括起的词是参数,复制时填写:

SELECT pg_size_pretty(pg_total_relation_size('__TABLE__'));
-- 生成于 @date @time
  • 默认分隔符是两个下划线,__TABLE__ 就是名为 TABLE 的参数。同名参数出现多次,只填一次。
  • 参数名不能含空格或换行;只有开头没有结尾的分隔符按普通文字处理。
  • @date 和 @time 换成复制时的日期和时间,默认格式分别是 MM.dd.yyyy 和 HH:mm:ss。

分隔符和两种格式在“设置 › 片段”中修改。分隔符是 1–8 个字符,不能含字母或数字。日期格式点“查看写法”可以看到 yyyy、MM、dd、HH、mm、ss 等写法和示例,修改后要点“应用”才生效。

复制一个有参数的片段时,会打开“填写参数”:

  1. 逐个填写参数。确实要留空的,勾选该参数旁的“留空”。
  2. 下方“预览”实时显示结果。
  3. 全部参数填好或标为留空后,按 ⌘ 加 ↩ 或点“复制”。

没有参数的片段直接复制。“复制原文”不替换参数和日期时间,原样复制正文。

SQL 着色

语言写成 SQL、PostgreSQL、Postgres、pgsql、PLpgSQL 或 PL/pgSQL(不分大小写)时,编辑器、片段详情和参数预览按 SQL 着色:关键词、字符串、带引号的标识符、注释、数字和 $1 这类位置参数,包括 E'…' 字符串、$$ 引用和嵌套注释。

着色只是阅读辅助,不检查 SQL 是否正确。其他语言按普通文本显示。

搜索框有内容时,名称、触发词、正文、语言或标签中含查询文字的片段,显示在结果最上方的“片段”分组中。右键可以“复制正文”“展开并复制…”或“打开片段库”。

“设置 › 片段”中关闭“在搜索结果中显示片段”即可隐藏;单个搜索方案也可以关闭“在结果中显示片段”。

从其他应用创建

在其他应用中选中文字,选“服务 › 在 Crib 中创建片段”,Crib 打开新建片段,正文是选中的文字,名称是“所选文字片段”,确认后保存。菜单中没有这一项时的设置办法见系统服务。

片段库文件与共用

默认片段库是用户目录中的 snippets.json:

~/Library/Application Support/Crib/snippets.json

片段、参数分隔符和日期时间格式都保存在这个文件里。在“设置 › 片段”的“片段库”一行可以换文件:

  • 另存为…:把当前片段库另存为新文件,并改用新文件。原文件保留,已有的同名文件不会被覆盖。
  • 打开…:改用一个已有的片段库文件,不合并、不修改原来的库。要把片段合并进当前库,用“导入片段库…”,冲突的片段会自动改名。

当前用的是哪个文件只记在本机,不写进片段库本身。所以可以把片段库放进 iCloud Drive 等同步文件夹,在另一台 Mac 上“打开…”同一个文件。Crib 每两秒检查一次文件,别处的修改会自动出现。文件的传送由同步服务负责。

双机同步未经实测两个 Crib 先后编辑同一个本机文件已经测试过;通过 iCloud Drive、Dropbox 等服务在两台 Mac 之间同步还没有实测。

共用时要注意:

  • 在别处被改过的片段,保存会被拒绝,草稿保留,可以“另存为新片段”。副本使用新的标识,触发词清空。
  • 删除片段会同时从所有共用这个文件的 Mac 上删除。
  • 文件丢失、只写了一半或来自更新版本的 Crib 时,片段库变为只读:已经载入的内容继续显示,从未载入时显示“片段库未载入”。Crib 不会自动新建一个空库代替它。文件恢复或打开另一个有效的库后即可继续编辑。
  • 片段库文件上限 8 MiB,必须是普通文件,不能是符号链接。

2.6 - 快捷键

Crib 的全部默认快捷键,怎样修改、停用或恢复,以及三个默认关闭的全局快捷键。

下表是开发构建的默认值,均可在“设置 › 快捷键”中修改,见修改快捷键。菜单和工具栏的悬停提示始终显示当前生效的组合。

命令默认菜单
搜索资料库⌘ 加 L编辑
搜索资料库(备用)⌘ 加 K编辑
页内查找⌘ 加 F编辑
查找下一个⌘ 加 G编辑
查找上一个⇧ 加 ⌘ 加 G编辑
使用所选内容查找⌘ 加 E编辑
跳到所选内容⌘ 加 J编辑
筛选目录⇧ 加 ⌘ 加 F编辑

阅读

命令默认菜单
切换语言⇧ 加 ⌘ 加 L编辑
双语对照⇧ 加 ⌘ 加 B阅读
后退⌘ 加 [阅读
前进⌘ 加 ]阅读
返回主页⇧ 加 ⌘ 加 H阅读
放大⌘ 加 +阅读
缩小⌘ 加 -阅读
实际大小⌘ 加 0阅读
在浏览器中打开⌥ 加 ⌘ 加 B阅读

书签、历史与笔记

命令默认菜单
添加书签⌘ 加 D书签
显示书签⇧ 加 ⌘ 加 D书签
显示历史⇧ 加 ⌘ 加 Y书签
新建笔记⇧ 加 ⌘ 加 N文件

标签页

命令默认菜单
新建标签页⌘ 加 T文件
重新打开关闭的标签页⇧ 加 ⌘ 加 T文件
显示上一个标签页⇧ 加 ⌘ 加 [窗口
显示下一个标签页⇧ 加 ⌘ 加 ]窗口

不能修改的按键

位置按键作用
全局⌘ 加 ,设置
全局⌘ 加 W关闭标签页或窗口
搜索框与结果↑ ↓选择结果
搜索框与结果↩打开
搜索框与结果⌘ 加 ↩在新标签页打开
搜索框与结果Esc回到正文
结果列表→ / ←展开 / 收起多版本结果
目录、书签、历史弹出框↑ ↓、↩、⌘ 加 ↩、Esc选择、打开、在新标签页打开、关闭
填写片段参数⌘ 加 ↩复制

片段编辑器的按键见片段。用中文输入法选词时,↩、Esc 和方向键先交给输入法,选词结束后才执行上表中的操作。

修改快捷键

打开“设置 › 快捷键”,“命令”分组列出上面四张表中的全部命令。

  1. 点某个命令右侧的“修改”,输入框显示“按下快捷键…”。
  2. 按下新的组合:至少一个修饰键(⌘ ⌥ ⌃ ⇧)加一个按键。按 Esc 取消。
  3. 新组合立即生效。改过的命令旁出现“恢复默认”;没改过的命令旁是“停用”,停用后显示“已停用”。

两个命令不能用同一个组合,也不能与已开启的全局快捷键相同;重复时 Crib 会提示是哪两项冲突,设置保持不变。录制期间全局快捷键暂停。

全局快捷键

全局快捷键在其他应用处于前台时也能唤出 Crib。三个都默认关闭,在“设置 › 通用 › 全局快捷键”中逐个打开:

动作默认组合
显示窗口⌃ 加 ⌥ 加 ⌘ 加 Space
打开搜索⌥ 加 ⌘ 加 Space
搜索选中文字⌃ 加 ⌥ 加 ⌘ 加 D
  • 点“修改”录制新组合,规则与上面相同。组合被系统或其他应用占用时,该行显示原因和“重试”。
  • “搜索选中文字”需要辅助功能权限,用“授予权限…”打开系统设置,授权后点“重新检查”。读不到选中文字时,可以在原应用中用“服务 › 在 Crib 中查找”。
  • 组合按当前键盘布局解析,切换输入法后会重新注册。
说明

设置页的开关与录制已经验证过;在其他应用处于前台时用实体键盘唤出 Crib,还没有实测。

全局快捷键、系统服务和其他集成方式的完整说明见集成。

3 - 资料库

获取和管理文档版本,更新、回滚和恢复,以及 .crib 资料包格式。

3.1 - 管理资料库

启用、停用、卸载和导入版本,应用更改,恢复以前的资料组合,以及专家模式和“非正式发布”标记的含义。

资料库是 Crib 里已安装的全部文档。打开方式:菜单“资料库 → 管理资料库…”、工具栏的资料库按钮,或主页的“资料库”。菜单“资料库 → 获取更多版本…”和主页的“获取版本”直接打开“全部版本”。

已安装与全部版本

顶部的分段控件切换两种列表:

列表内容
已安装这台 Mac 上的资料包,包括已停用的
全部版本已安装的,加上版本目录里还没安装的;未安装的行显示下载大小和安装后大小

列表按版本状态分组(默认、常规、历史版本……),含义见版本与别名。每行还标出来源(内置或自行安装)、占用空间,以及是否在当前搜索范围内。

筛选框接受版本号或别名,例如 18、pg17、[email protected]。输入能解析成一个确切版本的别名时,列表只显示那一项。

专家模式

专家模式默认关闭,这时列表只显示“默认”和“常规”两组。打开后,列表还显示历史版本、开发版、无法下载和状态未知的版本,不加版本前缀的搜索也会包含它们。

资料库和正文上方的“版本”弹窗里各有一个“专家模式”开关,两处改的是同一个设置。

启用与停用

已安装的每一行左侧有一个勾选框。勾选或取消后,行内显示“应用后启用”或“应用后停用”,底栏显示“有未应用的更改”。点“应用更改”生效,点“放弃更改”撤回。

  • 同一个资料包只能启用一个修订。勾选某个修订时,同一资料包的其他修订会自动取消勾选。
  • 已停用的行右侧有“启用”按钮,点它立即生效,不需要再点“应用更改”。
  • 停用的版本仍在磁盘上,但不参与搜索,也不能从列表打开阅读。

应用更改时发生什么

  1. Crib 用勾选的资料包在后台建立一个新的搜索世代(generation)。进度面板依次显示“下载 → 校验 → 建立索引 → 启用”;不需要下载时从“校验”开始。
  2. 建立期间,旧的搜索世代照常提供搜索和阅读。点“继续阅读”可以关掉资料库窗口,任务在后台继续。
  3. 新世代建好后原子切换。之后的搜索使用新组合;已经打开的页面继续显示打开时的版本。

切换前点“取消”,旧组合保持不变。失败时资料库显示原因和“重试”。

卸载

只有自行安装的资料包有“卸载”按钮。App 内置的资料包不能卸载,只能停用。

卸载分两步:

  1. Crib 先切换到一个不含该资料包的组合,这一行标为“待移除”,显示“不再用于阅读和恢复后即可清理”。
  2. 文件在执行“维护 → 清理不再需要的资料”时删除,前提是没有打开的页面、当前组合或保留的旧组合还在使用它。

卸载不删除笔记、书签和更正。指向已卸载内容的个人资料会保留,内容重新安装后可以再次定位。

导入资料包

点资料库右上角的“导入资料包…”,选择一个 .crib 文件(旧扩展名 .pgdocpack 也可以),或一个已解开的资料包文件夹。导入不需要联网。

Crib 先检查磁盘空间,再解包并逐项校验:签名必须由 App 自带的可信根签发,每个文件的哈希必须与清单一致,数据库结构必须符合格式。通过后,新资料包立即启用,并替换同一资料包当前启用的修订。

以下情况会被拒绝:

  • 与已安装的资料包同名同修订、内容却不同。
  • 修订号低于当前启用的修订。要回到旧修订,用下面的“恢复资料组合…”。
  • 签名密钥不在可信根里,或是开发密钥签名而当前构建不接受开发内容。
说明

现在没有公开发布的资料包。开发构建只能导入用开发密钥签名的测试资料包。格式见资料包格式。

恢复资料组合

每次切换组合时,Crib 保留切换前启用的那一组,以便回退;更早的组合会被释放。

  1. 点底栏的“恢复资料组合…”,从菜单中选一个保留的组合。
  2. 预览窗口列出“现在启用 N 项,恢复后启用 M 项”,以及要启用、停用或替换的资料包、修订和语言。
  3. 点“恢复”。Crib 先完整校验目标组合,再切换。
  • 资料库里有未应用的更改时不能恢复,先应用或放弃它们。
  • 预览打开后如果组合被别的操作改变,点“刷新预览”后再确认。
  • 已打开的页面、笔记和书签不受影响。

维护菜单

命令作用
清理不再需要的资料删除待移除的资料包,以及不再被当前组合、保留组合或打开的页面使用的搜索世代
备份个人资料…把笔记、书签、标签、阅读历史和更正备份成一个 SQLite 文件,见备份个人资料

启动时的修复提示

Crib 启动时如果发现当前组合不能用(例如 App 换新后原来内置的资料包不在了,或搜索世代损坏),会自动换到一个可用的组合,并在资料库顶部留一条提示,直到你点“知道了”。提示带“重新启用”按钮时,可以把之前启用的资料包重新启用。

“非正式发布”标记

资料库标题旁的“非正式发布”标记表示:这些资料用开发密钥签名,只用于本地测试。构建声明接受开发内容,或 App 自带的可信根是开发可信根时,就会显示这个标记。

Crib 还没有正式签名密钥,现在所有开发构建都会显示它。

3.2 - 版本与别名

Crib 收录的 31 条 PostgreSQL 版本线、版本目录里五种状态的含义,以及 pg、pg18、pg96、[email protected] 这类别名怎样解析到一个确切版本。

收录的版本线

Crib 收录 31 条 PostgreSQL 手册版本线,每条一个中英双语资料包;Wiki 是另一个资料包。默认版本是 PostgreSQL 18(18.6),也是 pg 别名的目标;只内置一个版本的构建内置的就是它。

版本线内容版本别名
6.3 – 6.56.3.2、6.4.2、6.5.3pg63 … pg65,或 pg6.3 … pg6.5
7.0 – 7.47.0.3、7.1.3、7.2.8、7.3.21、7.4.30pg70 … pg74,或 pg7.0 … pg7.4
8.0 – 8.48.0.26、8.1.23、8.2.23、8.3.23、8.4.22pg80 … pg84,或 pg8.0 … pg8.4
9.0 – 9.69.0.23、9.1.24、9.2.24、9.3.25、9.4.26、9.5.25、9.6.24pg90 … pg96,或 pg9.0 … pg9.6
10 – 1410.23、11.22、12.22、13.23、14.24pg10 … pg14
15 – 1815.19、16.15、17.11、18.6pg15 … pg18
1919rc1(预览版)pg19
2020devel(开发快照)pg20、pgdevel
Wikir5pgwiki

内容版本来自构建时固定的来源快照,不代表上游当前的最新小版本。

版本状态

版本目录给每个版本声明一种状态。状态由发布者写进签名目录,Crib 不按版本号、发布渠道或是否已安装去推断。

目录中的值界面显示普通列表和不带版本前缀的搜索下载
default默认包含可以
active常规包含可以
historical历史版本只在专家模式下包含可以
devel开发版只在专家模式下包含可以
unavailable无法下载只在专家模式下包含不能;已安装的照常阅读和搜索
(未声明)状态未知只在专家模式下包含可以
  • 目录里只有一个默认版本,就是 pg 指向的那个。开发版不能成为默认版本。
  • “常规”只表示出现在普通列表里,不表示上游仍在维护。
  • “状态未知”出现在不带状态字段的旧格式目录里。旧目录指定的默认版本仍出现在普通列表。
  • 状态只决定版本出现在哪里、能不能新下载,不影响已安装内容的可读性。显式指定版本(版本前缀、版本菜单、书签、已打开的页面)照常可用,只要该版本已安装并启用。
  • 还没有任何版本目录时,不带版本前缀的搜索只覆盖 App 内置的资料包。
说明

本页不列出各版本的状态。状态由发布者在签名目录中决定,正式目录还没有发布。

列表里还会出现另一组状态:已启用、已停用、未安装、目录已过期、不在目录中、失败、待移除。它们描述这台 Mac 上的安装情况和最近一次操作,与上表的发布状态互相独立。

别名怎样解析

别名只存在于版本目录中,不对应额外的文件。解析规则:

  1. 输入转成 ASCII 小写,PG18 与 pg18 相同。含非 ASCII 字符的输入不是别名。
  2. 沿目录中的别名链一直走到一个确切版本,格式是 项目@内容版本,例如 [email protected]。链不能有环,目标必须存在。
  3. 在这个版本里选出包含所需语言的资料包。现在每个版本是一个中英双语包。
输入解析路径
pgpg → pg18 → [email protected]
pg18pg18 → [email protected]
pg96pg96 → [email protected]
pg9.6pg9.6 → pg96 → [email protected]
pg19pg19 → pg@19rc1
pgdevelpgdevel → pg20 → pg@20devel
pgwikipgwiki → pgwiki@r5
[email protected]本身就是确切版本
  • pg 是唯一的总别名,指向发布者选定的默认版本线。pg19、pg20 不会自动变成 pg。
  • pg18 这类版本线别名指向该线当前发布的小版本。版本号含点的旧版本线同时接受带点写法,如 pg9.6、pg7.0。
  • 解析只读本机已缓存并校验过的目录,不需要联网。

别名不会换成别的小版本

别名总是解析到一个确切版本。目标不可用时,Crib 说明原因,不会改用同一版本线上已安装的其他小版本:

目标状态搜索时的提示(以 18.7 为例)
未安装PG18(18.7)未安装,请在资料库中下载后再搜索。
已停用PG18(18.7)未启用,请在资料库中启用后再搜索。
无法下载且未安装PG18(18.7)已无法下载,请改用已安装的版本。

假设发布者把 pg18 从 18.6 移到 18.7,而你只装了 18.6:资料库在“全部版本”里显示 18.7 未安装;已安装的 18.6 仍可用 [email protected] 或版本菜单打开。

发布新的小版本时,发布者新增一个文件和一条版本记录,再移动对应的版本线别名;18.6 的文件不会被覆盖或改名。只移动别名不会重建搜索索引,也不会改变已打开的页面。

在哪里用别名

  • 搜索框的版本前缀:PG18: vacuum、pg96: vacuum、[email protected]: max_connections lang:en。pg18:vacuum 与 pg18: vacuum 相同。
  • 资料库的筛选框。
  • 本地 API 和 MCP 的搜索文本。

3.3 - 下载、更新与恢复

从版本目录下载一个版本时的每一步、断点续传、目录过期和离线时的行为,失败时保留什么,以及怎样回到以前的组合。
正式版本目录尚未上线

Crib 默认从 https://repo.pigsty.io/doc/catalog.json 获取版本目录。这个地址是规划中的正式目录,还没有上传,所以现在“刷新目录”拿不到正式目录。下文描述开发构建的行为,在本机测试目录上验证过,没有在公网 HTTPS 和 CDN 上测试。

什么时候联网

打开 Crib 或资料库都不联网。只有两个操作会联网:点“刷新目录”,以及点某个版本的“下载”。

已安装的内容不会过期,阅读和搜索始终离线完成。导入本地资料包也不需要联网。

版本目录

版本目录(catalog.json)列出可下载的版本、它们的状态、别名,以及每个归档的大小和哈希。开发构建可以内置一份签名的目录快照,所以第一次打开、没有联网时也能看到全部版本。

点“刷新目录”时,Crib 下载新目录并检查:

  • 签名必须由 App 自带的可信根签发。服务器不能自己添加可信密钥。
  • 修订号不能低于本机已有的目录;修订号相同而内容不同,只接受签发时间更晚的一份。否则视为回退或冲突,保留原来的目录。
  • 已过期的目录不接受。

刷新失败不改动本机文件。资料库顶部显示“版本目录更新于 …”;刷新中可以点“取消”。

目录过期以后

目录带有效期,由发布者签名时写入。过期后,资料库显示“版本目录已过期,刷新后才能下载。”

  • 版本列表照常显示,别名照常解析。
  • 不能下载新版本,直到刷新到一份未过期的目录。
  • 已安装的内容不受影响。

本机缓存的目录如果无法再通过校验(例如可信根换了密钥),Crib 跳过它,改用 App 内置的快照,并把旧文件移到用户目录的Distribution-rejected/,保留最近 5 份。目录中个别条目有问题时,只忽略那些条目,并在资料库提示;已安装的同一版本照常可读。

下载一个版本

在“全部版本”里点某一行的“下载”。进度面板显示“下载 → 校验 → 建立索引 → 启用”,下载阶段显示已下载和总字节数。

  1. 确认授权。 该版本必须在一份未过期的目录里,且状态不是“无法下载”。归档路径必须是目录给出的相对路径,只走同源 HTTPS,不跟随跨站重定向。
  2. 流式下载。 写入临时目录,总字节数以目录签名的大小为准。
  3. 校验。 核对长度、归档 SHA-256、ZIP 结构、清单哈希(必须等于目录记录的值)、清单签名、解包后的总大小。
  4. 解包。 解到暂存区,再逐个文件核对哈希并检查数据库结构。传输结束后再确认一次目录仍然授权这个版本。
  5. 建立索引。 在后台建立新的搜索世代,旧世代继续服务。
  6. 启用。 原子切换。新版本替换同一资料包当前启用的修订;旧修订仍已安装,状态变为“已停用”。

下载、校验或索引失败时,按钮变为“重试下载”。

断点续传

  • 网络中断时(不包括你点“取消”),已下载的部分保存在用户目录的 Distribution-partials/ 中,保留 7 天。
  • 再次下载同一个归档时,Crib 先重新计算已保存部分的哈希,再用 Range 加 If-Range(强 ETag 或 Last-Modified)请求剩余部分。
  • 服务器返回 206 时必须带完全匹配的 Content-Range;返回 200 就从头重下。最终仍以目录签名的归档哈希为准。
  • 点“取消”,或者校验、大小、路径检查失败时,已下载的部分直接丢弃。
  • 单次下载最长 48 小时;连续 60 秒收不到数据视为中断,已下载部分保留以便续传。目录请求最长 600 秒。

失败、取消与磁盘空间

  • 切换之前的任何失败、取消或磁盘空间不足,都保留原来的组合,不做切换。
  • 资料包写入资料库之前先检查磁盘空间。
  • 切换一旦完成,新组合就是当前组合,即使之后又报告了错误。重试前先看资料库里实际启用的是什么。
  • 失败只记在这一个版本上。之前启用的旧修订照常可读。

更新到新的小版本

发布者发布新的小版本时,新增一个归档并移动版本线别名,例如把 pg18 从 18.6 移到 18.7;18.6 的文件不变。

刷新目录后,“全部版本”里出现 18.7,状态为未安装。刷新本身不会自动下载,也不会重建索引。下载 18.7 后,它替换 18.6 成为启用的修订;18.6 仍已安装,可以重新启用,也可以卸载。

下载或导入同一资料包中比当前启用修订更低的修订会被拒绝。要回到以前的修订,用“恢复资料组合…”。

Crib 没有自动更新。App 本身也没有公开的更新通道。

回到以前的组合

每次切换组合,Crib 保留切换前启用的那一组。在资料库底栏点“恢复资料组合…”可以预览并恢复,步骤见管理资料库。

启动时如果当前搜索世代损坏,或 App 换新后原来内置的资料包不在了,Crib 自动换到保留的组合或 App 内置的初始组合,并在资料库顶部提示。提示里的“重新启用”可以把之前启用的资料包重新启用。

个人资料不受影响

下载、导入、启用、停用、卸载和恢复组合都不写个人资料:笔记、书签、标签、阅读历史、更正、片段和设置。卸载一个版本后,挂在上面的笔记和书签保留;内容重新安装后可以再次定位。

3.4 - 资料包格式

.crib 文件里有什么、怎样签名和校验、可信根与密钥策略,以及发布目录的布局、不可变规则和 HTTP 缓存要求。
说明

现在没有公开的资料包,也没有正式签名密钥。发布目录规划在 https://repo.pigsty.io/doc/,还没有上传。本页描述开发构建和构建工具 crib-pack 实现的格式。

文件

资料包是一个 ZIP 文件(支持 ZIP64,条目为 stored 或 DEFLATE),条目按名称排序,时间戳固定。2026-11-06 起新发布的资料包以 .crib 结尾;之前签发的目录和归档使用 .pgdocpack,这些已签名的路径继续有效。版本目录里的归档路径只接受这两种结尾,.CRIB、.crib.zip 等都会被拒绝。

App 还没有注册 .crib 文件类型,双击不能导入;请用资料库的“导入资料包…”。

一个手册资料包的内容:

pg/18.6-r4.crib

  • manifest.json清单:身份、版本、语言、文件列表与每个文件的哈希
  • manifest.sig对 manifest.json 原始字节的 Ed25519 签名
  • sources.json来源:上游修订、版次、修复记录和处理说明
  • content.sqlite文档、章节、精确名称键、双语对应、链接和搜索词元
  • documents/
    • en/英文 HTML 与资源
    • zh-Hans/简体中文 HTML 与资源
  • licenses/许可文本,按语言分目录

Wiki 资料包的页面在 documents/<语言>/wiki/<集合>/ 下,另外带有原始来源记录和许可说明 licenses/center-sources.json。

清单

format_version
资料包格式,现在是 1
schema_version
content.sqlite 的结构版本,现在是 1
analyzer_id
分词器标识 pgdash-han2-v1;旧名称属于格式身份,不随产品改名
pack_id
资料包身份,如 postgresql/manual/18、postgresql/wiki
project_id、branch、content_version、channel
项目、版本线、内容版本、发布渠道
pack_revision
修订号,同一 pack_id 跨内容版本单调递增
languages
["en", "zh-Hans"]
min_reader_version
能读取它的最低 Crib 版本
source_manifest_sha256
sources.json 的哈希
files
除清单和签名外每个文件的 path、bytes、sha256
licenses
许可文件路径
trust
签名类别;开发构建中是 development

清单之外出现未声明的文件,或任何文件与清单哈希不符,资料包都会被拒绝。Crib 用 manifest.json 原始字节的 SHA-256 标识一个已安装的资料包,链接里的 manifest 参数就是这个值。

签名与可信根

manifest.sig 是 {"key_id": "…", "signature": "<base64>"},签名对象是 manifest.json 的原始字节。目录 catalog.json 用同样的 Ed25519 签名。

公钥只来自 App 自带的 trust.json。资料包或服务器里的密钥都不会被信任。

{
  "development": false,
  "keys": { "<key_id>": "<base64 公钥>" },
  "key_policies": {
    "<key_id>": { "roles": ["pack", "catalog"], "not_after": "2027-12-31T00:00:00Z" }
  }
}
  • key_policies 可选。roles 取 pack、seed、catalog 的子集;not_after 必须是 YYYY-MM-DDTHH:MM:SSZ。没有列出的密钥可签所有用途、永不过期。
  • 未知字段、空的 roles、不规范的日期、指向不存在密钥的策略都会让整个可信根被拒绝。
  • 密钥过期只阻止获取(刷新目录、下载、导入)和发布端签名,已安装的内容照常可用。
  • 从可信根删除密钥等于吊销。要退役一把密钥,先设 not_after。

开发签名的内容只在两种情况下被接受:构建在 Info.plist 中声明 CribDevelopmentContent=true,或测试环境设置CRIB_ALLOW_DEVELOPMENT_CONTENT=1。这时资料库显示“非正式发布”。

导入与下载时的检查

解包之前,Crib 先完整检查整个 ZIP,拒绝符号链接、特殊文件、加密条目、分卷、路径穿越、大小写或 Unicode 规范化后重名的路径、多余的尾部字节。

上限值
条目数65,000
单个文件8 GiB
解包后总大小16 GiB
压缩文件20 GiB
压缩比1000:1

然后核对签名、每个文件的哈希、数据库结构和引用。同一 pack_id 同一修订号而内容不同的资料包会被拒绝。从目录下载时还要核对归档长度和 SHA-256、清单哈希和解包后大小,它们必须与目录记录一致。

发布目录

https://repo.pigsty.io/doc/(规划中)

  • catalog.json签名目录:别名、版本与状态、每个归档的路径、大小和哈希
  • pg/
    • 18.6-r4.crib
    • 17.11-r4.crib
    • 9.6.24-r4.crib
    • 20devel-r4.crib
  • pgwiki/
    • r5.crib

完整目录有 31 个手册归档和 1 个 Wiki 归档。文件名是内容版本加修订号。别名只写在 catalog.json 里,不复制文件,也不建符号链接。

catalog.json 是一个签名信封,解码后的载荷包含目录身份、修订号、签发和过期时间、默认别名、别名表和版本表:

{"format":"crib-signed-catalog-1","key_id":"…","payload":"<base64>","signature":"<base64>"}
{
  "format_version": 3,
  "catalog_id": "crib-docs",
  "revision": 2026102901,
  "default_alias": "pg",
  "aliases": {"pg": "pg18", "pg18": "[email protected]"},
  "releases": {
    "[email protected]": [{
      "pack_id": "postgresql/manual/18",
      "content_version": "18.6",
      "lifecycle": "default",
      "pack_revision": 4,
      "languages": ["en", "zh-Hans"],
      "archive_path": "pg/18.6-r4.crib",
      "manifest_sha256": "…",
      "archive_sha256": "…"
    }]
  }
}

这是节选,正式载荷还有 generated_at、expires_at、大小、结构版本等字段。版本状态 lifecycle 的含义见版本与别名。

客户端只使用目录给出的归档路径:一级目录加一个文件名,不接受绝对地址、查询串、片段、百分号转义、反斜杠和 ..,下载走与目录同源的 HTTPS。

不可变规则

  • 同一个 URL 的字节永远不变。内容有任何更正,都发新的内容版本或更高的修订号。
  • 修订号按 pack_id 单调递增,换内容版本也不重置:18.6-r4 之后发布 18.7,修订号至少是 r5。
  • 先上传并核对所有新归档,最后再替换 catalog.json。
  • 目录修订号只增不减。crib-pack distribute 的 --previous-catalog 要求新修订号更大;--validity 设定目录有效期,默认 720 小时,范围 24 小时到 400 天。

HTTP 缓存

这些是发布端的要求,还没有在真实服务器上配置和测试。

对象响应头
catalog.jsonCache-Control: no-cache
带版本和修订号的归档Cache-Control: public, max-age=31536000, immutable,Content-Length,强 ETag,支持 Range,不做内容转换

客户端续传时发送 Range 和 If-Range,规则见断点续传。

4 - 集成

本地 API、MCP、系统服务、全局快捷键和 crib:// 深链接。

4.1 - 本地 API

让本机脚本和工具通过 HTTP 搜索、读取 Crib 中已启用的文档:启用方法、发现文件、密钥与服务端验证、接口和一个 Python 示例。

本地 API 默认关闭。启用后只监听 127.0.0.1,只读,只能访问当前已启用的资料包。笔记、书签、阅读历史、片段和更正都不对外开放。Crib 自己的搜索和阅读不经过这个接口。

启用

  1. 打开“设置 → 集成”,在“本地 API”中打开“启用本地 API”。
  2. “端口”填 0 自动选择可用端口(默认),或指定 1024–65535 中的一个,再点“应用”。
  3. 启动后,设置页显示“地址”,并提供“复制 Schema 地址”“复制密钥”“更换密钥…”。

关闭开关或退出 Crib 后停止监听。资料库不可用时 API 不会启动,设置页显示原因和“重试”。

发现文件

客户端从用户目录读取地址和密钥,不要缓存自动分配的端口:

~/Library/Application Support/Crib/api/

  • status.jsonbase_url、port、pid、instance_id、access_key_file、api_version
  • access-key访问密钥
  • server.lock正在服务的实例持有这把锁
  • api/ 目录权限是 0700,两个文件是 0600。
  • status.json 在服务就绪后才出现,正常关闭时删除。Crib 异常退出可能留下旧的 status.json;下次启动时,只要没有实例持有 server.lock,就会删掉它。
  • 密钥文件是符号链接、有多个硬链接、属于其他用户或权限公开时,Crib 拒绝使用。
  • “更换密钥…”让旧密钥立即失效。随 App 附带的 MCP 程序自动使用新密钥;手动复制过密钥的工具需要重新复制。

先验证服务端,再发送密钥

Crib 崩溃后,原来的端口可能被其他本地进程占用。发送密钥之前,客户端必须确认对端持有同一把密钥:

  1. 检查 status.json 中的 pid 进程仍然存在。
  2. 不带任何凭据请求 GET /auth/challenge?nonce=<nonce>,nonce 是 32 个随机字节的 64 位小写十六进制。
  3. 服务端返回 {"algorithm":"hmac-sha256","proof":"<64 hex>","version":1}。
  4. 客户端计算 HMAC-SHA256(key = 访问密钥的 ASCII 字节, data = "crib-local-api/server-proof/v1\n127.0.0.1:<端口>\n<nonce>"),用常量时间比较与 proof 是否相等。相等才发送密钥。

端口写进了证明,占用端口的进程无法把挑战转发给别处的真实 Crib 来冒充。返回 404 的服务端应当拒绝,不能默认信任。

请求规则

  • /health、/schema、/auth/challenge 不需要密钥;其余接口需要 Authorization: Bearer <访问密钥>。密钥不要放进查询串。
  • 只支持 GET。响应是 JSON,带 Cache-Control: no-store,发送后关闭连接。
  • Host 必须是 127.0.0.1:<端口> 或 localhost:<端口>。带 Origin 头的请求返回 403,所以网页里的脚本不能调用它。
  • 查询串按表单编码解析:+ 是空格,字面加号写成 %2B。未知参数、重复参数、非法转义都返回 400。

接口

路径作用
GET /health服务状态与 API 版本
GET /schemaOpenAPI 描述
GET /auth/challenge服务端身份证明,见上文
GET /docsets/list当前搜索世代中已启用的资料包、版本、语言、摘要和修订
GET /search在已启用的资料中搜索
GET /sections/{key}读取一个章节的纯文本,必须带 generation

搜索参数

text , string
搜索文本,支持 Crib 的过滤语法和 PG96: 这类版本前缀;文本里的过滤优先于下面的参数
project , string , defaultpostgresql
项目
branch , string , default18
版本线;* 表示所有已启用版本
locale , string , defaultzh-Hans
zh-Hans 或 en;* 表示所有语言
domain , string
文档领域
collection , string
Wiki 集合
limit , integer , default20
每页条数,1–50
offset , integer , default0
偏移,0–10000
generation , string
期望的搜索世代

兼容 Dash 的参数名 query、lang、max_results 分别等同于 text、locale、limit。同时给出一对时,值相同可以接受,值不同返回 400。请求的版本或语言没有安装或启用时返回错误,不会悄悄换成默认版本。

每条结果带 section_key、document_key、path、fragment、docset、pack_digest 等字段,以及两个地址:section_url 是带 generation 的章节接口路径,load_url 是在 Crib 中打开该章节的 crib:// 链接。

响应里的 has_more 和 next_offset 用于翻页;timed_out、cancelled、candidate_truncated 为真时结果不完整,不能当作完整结果使用。

读取章节

GET /sections/{key}?generation=<id>&offset=0&limit=16000

  • offset 和 limit 按 Unicode 标量计数,不是字节,也不是 UTF-16 单元。默认 16,000,最大 50,000。
  • 跟随 next_offset 继续读,直到它为 null。
  • 启用、停用或更新资料包后搜索世代会变。用旧 generation 请求返回 409 generation_changed,重新搜索后再读。

时间限制

  • 每个请求有 3 秒执行预算。搜索本身超时返回 200 和 timed_out=true,带上已完成的部分结果;准备阶段就耗尽预算返回 504。
  • 传输层另有 7 秒处理超时、8 秒连接截止;2 秒内没发完请求头的连接被关闭。最多同时 32 个连接。

错误码

状态码含义
400参数或查询无效
401缺少密钥或密钥错误
403来源受限,例如带 Origin 头
404路径或章节不存在
409搜索世代已变,或请求的范围没有安装、启用
503资料库不可用,或请求被取消
504执行或传输超时

响应中的 error 和 message 说明具体原因。

Python 示例

示例从发现文件读取地址和密钥,先验证服务端,再搜索并读取第一条结果。密钥不出现在终端或进程参数里。

from pathlib import Path
import hashlib, hmac, json, os, secrets
import urllib.parse, urllib.request

user_root = Path.home() / "Library/Application Support/Crib"
status = json.loads((user_root / "api/status.json").read_text())
key = Path(status["access_key_file"]).read_text().strip()
client = urllib.request.build_opener(urllib.request.ProxyHandler({}))

def verify_server():
    os.kill(status["pid"], 0)  # 进程不存在时抛出异常
    nonce = secrets.token_hex(32)
    with client.open(status["base_url"] + "/auth/challenge?nonce=" + nonce, timeout=8) as r:
        reply = json.load(r)
    port = urllib.parse.urlsplit(status["base_url"]).port
    message = f"crib-local-api/server-proof/v1\n127.0.0.1:{port}\n{nonce}".encode()
    expected = hmac.new(key.encode(), message, hashlib.sha256).hexdigest()
    if reply.get("algorithm") != "hmac-sha256" or not hmac.compare_digest(reply.get("proof", ""), expected):
        raise SystemExit("not a genuine Crib listener; key not sent")

def get(path):
    request = urllib.request.Request(status["base_url"] + path,
                                     headers={"Authorization": "Bearer " + key})
    with client.open(request, timeout=8) as r:
        return json.load(r)

verify_server()
query = urllib.parse.urlencode({"text": "SELECT", "locale": "zh-Hans", "limit": 3})
result = get("/search?" + query)
for hit in result["results"]:
    print(hit["name"], hit["branch"], hit["locale"])
if result["results"]:
    section = get(result["results"][0]["section_url"] + "&limit=1000")
    print(section["body"])

与 Dash API 的差异

Crib 与 Dash 8.1.1 的本地 API 都有健康检查、Schema、资料包列表和搜索入口,并兼容 query、max_results 参数名。Crib 不支持 Dash 的 docset_identifiers、search_snippets 和 /docsets/enable_fts,默认范围、结果格式和分页上限也不同。依赖完整 Dash API 的客户端不能直接换成 Crib。

4.2 - MCP

用随 App 附带的 CribMCP 程序,让支持 MCP 的编辑器和 AI 客户端搜索、读取 Crib 中的文档:配置方法、三个工具、分页和搜索世代规则。

Crib 随 App 附带一个 stdio MCP 程序 Crib.app/Contents/MacOS/CribMCP,不需要安装 Python、uv 或 Node。它通过本地 API 只读地搜索和读取已启用的文档。

还没有在真实客户端中走通

协议已用官方 Python SDK 和一个本地 stdio 客户端验证:工具列表、搜索、读取、分页、别名和错误路径都通过。但还没有在任何真实编辑器或 AI 客户端中完成端到端验收。VS Code 已识别配置并显示 Start,工具发现、搜索和读取尚未完成验证。

前提

  • Crib 正在运行。
  • “设置 → 集成”中已启用本地 API。

MCP 程序不会自动启动 Crib,也不会替你启用 API。条件不满足时,工具调用返回 local_api_unavailable 和一句说明。

添加配置

  1. 打开“设置 → 集成”,在“MCP”中把“客户端”选为“通用”或“VS Code”。
  2. 点“复制配置”,粘贴到客户端的 MCP 设置里;VS Code 粘贴到工作区的 .vscode/mcp.json。已有配置时只合并 crib 条目,保留其他服务器。
  3. 客户端用其他配置格式时,点“复制命令”,从中取可执行文件路径和参数。

复制的内容已经带好实际路径,不含访问密钥。注意:

  • JSON 里要写绝对路径,~ 不会被展开。
  • 移动 Crib.app 或换用别的用户目录后,需要重新复制。
  • Crib 不会修改任何客户端的配置文件。
  • 设置页显示“此版本不含 MCP 程序”时,说明这个构建没有附带 CribMCP。

安装在 /Applications、使用默认用户目录时,“通用”格式如下(<用户主目录> 换成实际路径):

{
  "mcpServers": {
    "crib": {
      "command": "/Applications/Crib.app/Contents/MacOS/CribMCP",
      "args": ["--user-data", "<用户主目录>/Library/Application Support/Crib"]
    }
  }
}

“VS Code”格式用 servers,并带 "type": "stdio":

{
  "servers": {
    "crib": {
      "type": "stdio",
      "command": "/Applications/Crib.app/Contents/MacOS/CribMCP",
      "args": ["--user-data", "<用户主目录>/Library/Application Support/Crib"]
    }
  }
}

不传 --user-data 时,程序使用当前用户的 ~/Library/Application Support/Crib。

工具

工具作用
list_installed_docsets列出已启用的资料包、版本、语言和当前搜索世代;可传入期望的 generation
search_documentation在已启用的手册和 Wiki 中搜索
load_documentation_page用搜索结果中的 section_key 和 generation 读取一个章节的纯文本

search_documentation 的参数:

text , string , required
搜索文本,最多 256 个字符;支持 Crib 的过滤语法和 PG96: SELECT 这类版本前缀,文本中的过滤优先
project , string
默认 postgresql
branch , string
版本线,如 18、9.6;默认 18,* 表示所有已启用版本
locale , string
zh-Hans 或 en;默认简体中文,* 表示所有语言
domain , string
文档领域
collection , string
Wiki 集合
limit , integer
每页条数,1–50,默认 20
offset , integer
偏移,0–10000
generation , string
期望的搜索世代

load_documentation_page 的参数:

section_key , string , required
搜索结果里的 section_key
generation , string , required
同一次搜索返回的 generation
offset , integer
起始位置,按 Unicode 标量计数,默认 0
limit , integer
最多返回的 Unicode 标量数,默认 16,000,最大 50,000

每个工具同时返回 JSON structuredContent 和等价的文本内容。

分页与搜索世代

  • 搜索结果用 has_more 和 next_offset 翻页。timed_out、cancelled、candidate_truncated 为真时结果不完整。
  • 读取章节时跟随 next_offset,直到它为 null。
  • 搜索和列表都返回 generation。启用、停用或更新资料包后搜索世代会变,旧坐标的读取返回 generation_changed 错误;重新搜索,用新的 section_key 和 generation 再读。

安全与限制

  • 每次调用都重新读取 api/status.json 和 api/access-key,所以 API 换了端口也能找到。
  • 发送密钥前,程序检查记录的进程仍在运行,并完成 /auth/challenge 验证;验证失败就不发送密钥,工具返回错误。
  • 拒绝符号链接、权限不安全、所有者不对或有多个硬链接的发现文件。只连接与状态文件一致的 127.0.0.1 地址和非特权端口;不走代理,不跟随重定向,不保存 cookie。单次请求 8 秒截止,响应最大 4 MiB。
  • 工具只读文档:不包含个人资料,不能下载资料包、控制窗口或读取任意 URL。
  • 每行一条 JSON-RPC 消息,单行最多 256 KiB,最多同时处理 8 个文档请求。标准输入关闭后取消全部请求并退出。
  • 支持 MCP 2026-07-28 的 stdio 传输,以及 2025-11-25、2025-06-18、2025-03-26、2024-11-05 的 initialize 握手;后两个版本没有用真实 SDK 客户端验证过。不提供 resources、prompts 和 sampling。

工具名称参照 Dash 的官方 MCP 适配器,参数和结果遵循 Crib 自己的约定:读取用 section_key 加 generation,不接受 Dash 的 load_url。依赖 Dash 全部工具的客户端不能直接换成 Crib。

4.3 - 系统服务与全局快捷键

在其他应用中选中文字,用“服务”菜单交给 Crib 查找或存成片段;三个可选的全局快捷键;以及哪些已经实测、哪些还没有。

两个服务

在其他应用中选中文字,从应用菜单或右键菜单的“服务”中选择:

服务结果选区上限
在 Crib 中查找打开一个新的 Crib 窗口,用选中的文字(去掉首尾空白)搜索256 个字符
在 Crib 中创建片段打开“设置 → 片段”,新建一个未保存的片段草稿,正文与选区完全一致,缩进和换行都保留1,000,000 个字符

Crib 只读取系统传给服务的文字,不读取也不改写剪贴板。

启用

  1. 把 Crib.app 放进“应用程序”文件夹。
  2. 在“系统设置 › 键盘 › 键盘快捷键 › 服务”中找到“在 Crib 中查找”和“在 Crib 中创建片段”,勾选启用。也可以在那里给它们指定快捷键。

“设置 → 集成 → 系统服务”里有同样的提示。

Crib 没在运行时

选择服务时如果 Crib 没有运行,macOS 会启动它。窗口准备好之前到达的请求先排队,最多 16 个,准备好后依次处理。

实测范围

2026-10-29 在一个独立测试构建上实测通过:TextEdit 中两个服务的发现、已运行时查找、创建片段、连续两次片段请求、关闭最后一个窗口后查找,以及两个服务的冷启动。当前构建还没有重新实测。

被拒绝的请求

以下请求会被拒绝,不会排队重试:

  • 没有选中文字,或选区只有空白。
  • 选区含有制表符、换行之外的控制字符。
  • 查找文字超过 256 个字符,或片段超过 1,000,000 个字符。
  • 待处理的请求已有 16 个。
  • 片段库是只读的。

被拒绝时,Crib 把原因返回给 macOS,并在 Crib 内记录这条错误。缩小选区或处理完积压后重新选择服务。

待证实:被拒绝时能否看到错误提示

实测时在 TextEdit 中选中 257 个字符再调用“在 Crib 中查找”,没有看到任何错误提示,也无法证明这次请求到达了 Crib。单元测试证明超长输入会被拒绝,但用户能否看到提示还没有验证。

全局快捷键

全局快捷键在“设置 → 通用 → 全局快捷键”中,三项都默认关闭。打开右侧开关启用,点“修改”录制新的组合。

功能默认组合
显示窗口⌃⌥⌘Space
打开搜索⌥⌘Space
搜索选中文字⌃⌥⌘D
  • “搜索选中文字”需要辅助功能权限。设置页会显示“授予权限…”和“重新检查”。读不到选中文字时,可以改用服务菜单里的“在 Crib 中查找”。
  • 组合被系统或其他应用占用时,设置页显示“…已被系统或其他应用占用,请换一个组合。”和“重试”。
  • 快捷键按当前键盘布局解析,切换输入法后重新注册。不支持数字小键盘上的键;按下 ⌘ 后会变成其他字符的键也会被拒绝。
实测范围

设置页的开关和录制在早期测试构建上实测通过。在其他应用中实际按下快捷键呼出 Crib,还没有实测。

4.4 - 深链接

用 crib:// 链接从笔记、其他应用或脚本直接打开 Crib 中的某一章节:怎样复制链接、两种链接格式、打不开时的提示,以及旧的 pgdash:// 链接。

Crib 注册了 crib 协议。点击一个 crib:// 链接,Crib 会打开它指向的章节。界面里把这类链接叫“链接”。

复制链接

  • 在搜索结果上点右键,选“复制链接”。折叠起来的多版本结果,复制的是代表项那一条。
  • 阅读时,从正文上方的“更多”菜单(版本、书签按钮右侧)选“复制链接”,复制正在阅读的章节。
  • 本地 API 搜索结果中的 load_url 也是这种链接,见本地 API。

复制得到的链接形如:

crib://open?project=postgresql&branch=18&locale=zh-Hans&section=<章节键>&manifest=<资料包摘要>

manifest 记录结果来自哪个资料包。搜索结果和阅读器各自用自己所属的搜索世代生成链接,不会把一个版本的结果链到另一个版本。

两种格式

crib://open

project , required
项目,如 postgresql
branch , required
版本线,如 18、9.6;Wiki 为空
locale , required
zh-Hans 或 en
section
章节键,必须精确匹配
manifest
资料包摘要,64 位小写十六进制;给出时必须与已启用资料包的摘要一致
concept、semantic
没有 section 时使用,必须恰好匹配一个章节

带 section 时,该章节必须存在于当前已启用的内容中,且项目、版本线、语言都与参数一致。未知参数、重复参数、超过 4096 字节的值都会让链接被拒绝。

crib://section

crib://section/<章节键>
crib://section/<章节键>?manifest=<资料包摘要>

路径只有一段,就是精确的章节键;只允许一个可选的 manifest 参数,不能带片段、用户名、端口或其他参数。“复制链接”目前生成的是 crib://open 格式;这种短格式适合手写,或由脚本从本地 API 返回的 section_key 拼出来。

章节键和资料包摘要都来自签名资料包,详见资料包格式。

打不开时

Crib 只打开链接精确指向的章节,不会退而打开相似的页面或其他版本。打不开时,当前页面保持不变,Crib 显示:

提示原因
无法打开链接:页面地址无效链接格式不对,例如多了参数、路径不止一段、manifest 不是 64 位十六进制
无法打开链接:资料库中没有这个页面或文件链接格式正确,但当前启用的内容里找不到:版本未安装或已停用,或 manifest 指向的修订不是当前启用的那个

版本已停用时,在资料库中启用后再点链接。

说明

Crib 没有运行时点击链接、由链接启动 Crib 的情况还没有实测。Crib 打开后如果没有跳到目标章节,再点一次链接。

旧的 pgdash:// 链接

Crib 仍然注册 pgdash 协议,PGDash 时期复制的 pgdash://open?... 链接按上面相同的规则打开。PGDash 的 pgdash://search 没有实现,会被拒绝。Crib 自己只生成 crib:// 链接。

pgdoc:// 不是给用户的

阅读器内部用 pgdoc://<资料包摘要>/<路径> 加载资料包里的文件。这个协议不向系统注册,不能从其他应用打开,也不要把它当作链接保存。

5 - 参考

用户数据目录、从 PGDash 迁移、来源与许可、常见问题。

5.1 - 用户数据与迁移

Crib 在你的 Mac 上保存哪些文件、哪些属于个人资料,怎样备份和恢复,以及从 PGDash 一次性迁移的过程。

用户目录

Crib 的数据在 ~/Library/Application Support/Crib/。下面列出与你有关的部分,有些文件在用到相应功能后才出现:

~/Library/Application Support/Crib/

  • user.sqlite个人资料:笔记、书签、标签、阅读历史、更正
  • preferences.json设置
  • session.json窗口、标签页和阅读位置
  • snippets.json片段库
  • backups/个人资料库升级结构前自动做的备份
  • Library/下载或导入的资料包、搜索世代和登记表
    • packs/
    • generations/
    • registry.sqlite
  • Distribution/版本目录缓存
  • Distribution-partials/中断下载的已下载部分,保留 7 天
  • Distribution-rejected/无法再通过校验的旧目录缓存,保留最近 5 份
  • api/本地 API 的地址、密钥和锁,启用 API 后出现
  • crib-migration.json从 PGDash 迁移的记录,迁移过才有

App 内置的资料包和初始搜索索引在 Crib.app/Contents/Resources/Library 里,只读,随 App 一起替换。

个人资料与内容

类别文件丢了会怎样
个人资料user.sqlite、snippets.json、preferences.json、session.json无法从别处恢复,需要自己备份
内容Library/、Distribution*/可以重新下载或导入;内置内容随 App 恢复
运行状态api/重新启用本地 API 时重建

下载、导入、启用、停用、卸载资料包和恢复资料组合都不写个人资料。卸载一个版本不会删除挂在上面的笔记。

备份个人资料

命令位置得到什么
备份个人资料…“资料库 → 维护”,或个人资料列表的更多菜单一个 SQLite 文件,默认名 Crib-user-backup.sqlite,含笔记、书签、标签、阅读历史和更正
导出个人资料…个人资料列表的更多菜单一个可移植的文件夹,默认名 Crib-personal
导出更正…个人资料列表的更多菜单只含更正的文件夹,默认名 Crib-corrections
导出片段库…“设置 → 片段”的更多菜单片段库文件
  • 备份和导出前,Crib 先保存所有正在编辑的草稿。与其他编辑冲突的草稿另存为新笔记。
  • 备份用 SQLite 的在线备份完成,包含尚未合并进主文件的已提交数据。Crib 运行时直接复制 user.sqlite 可能漏掉这部分。
  • 备份不能保存到 Crib 的用户目录里。
  • 片段和设置不在个人资料备份里,片段要单独导出。

恢复个人资料

  • 导入个人资料…:读入一个导出的文件夹,与现有个人资料合并;冲突的条目另存为副本,不覆盖。
  • 从备份恢复…:只在个人资料打不开时出现(提示“无法打开个人资料”或“个人资料需要更新版本的 Crib”)。Crib 先打开备份的副本检查,通过后把原来的 user.sqlite 改名为 user-unreadable-<时间>.sqlite 保留,再换上备份,然后重新打开。
  • 新建个人资料…:个人资料打不开时,从空白开始;原文件同样改名保留。

个人资料打不开时,阅读和搜索照常可用,只有笔记、书签、更正和阅读历史停用。

从 PGDash 迁移

Crib 以前叫 PGDash,数据在 ~/Library/Application Support/PGDash/。Crib 启动时、打开任何数据之前,会检查是否需要迁移。

迁移过程

  1. 确认 PGDash 没有在运行。PGDash 仍在运行时迁移失败,提示退出 PGDash 后重试。
  2. 清点旧目录中每个文件的大小和 SHA-256。遇到符号链接、多个硬链接或特殊文件就停止。
  3. 把整个旧目录复制到用户资料目录旁边的暂存目录 .crib-migration-<编号>,再清点一次;复制期间旧目录有变化就停止。
  4. 用 SQLite 在线备份从副本重建 user.sqlite 和 Library/registry.sqlite,并把登记表里的路径改到新目录。
  5. 旧的 api/ 改名为 legacy-api-<编号> 存档。在 Crib 中需要重新启用本地 API。
  6. 写入迁移记录 crib-migration.json,同步到磁盘,然后一次性改名为 Crib/。

旧目录从头到尾只读:不写入、不创建 WAL 文件,也不删除。迁移完成后它原样留在原处。

状态文件

迁移状态记在 ~/Library/Application Support/.Crib-migration-state.json,在 Crib 目录之外,因此失败的尝试不会被误认为已迁移。

状态含义
pending正在迁移
failed上次迁移失败
done已完成
declined你选择了跳过,不再尝试
replaceRequested你要求用旧资料替换现有的 Crib 资料,下次启动时执行

迁移失败

迁移失败时不创建 Crib 目录,Crib 以只读方式运行:内置文档照常阅读和搜索,笔记、书签、更正、阅读历史、下载和设置都不能修改。每次启动都会重试。提示窗口有三个按钮:

  • 重试迁移:立即再试一次,成功后 Crib 重新打开。
  • 稍后处理:保持只读,下次启动再试。
  • 跳过迁移…:确认后 Crib 从空白的个人资料开始,旧资料原样留在原目录,以后不再提示。

已有 Crib 资料时

如果 Crib 目录已经存在、没有迁移记录,而 PGDash 目录也还在,Crib 提示“发现 PGDash 旧资料”:

  • 迁移旧资料:Crib 重新打开时,把现有 Crib 目录整体改名为 Crib-before-migration-<时间> 保留,再迁移旧资料。迁移失败时改回原名。
  • 稍后处理:下次启动再提示。
  • 不再提示:继续使用现有的 Crib 资料。

迁移之后

  • 旧的 pgdash:// 链接仍能打开,见深链接。
  • MCP 客户端里旧的 pgdash 配置不会被自动修改。在 Crib 中重新复制 MCP 配置。

环境变量

这些变量用于开发和测试,日常使用不需要设置。

CRIB_USER_DATA
改用另一个用户目录。设置后不会自动从 PGDash 迁移
CRIB_MIGRATE_FROM
指定迁移的来源目录
CRIB_LIBRARY
用另一个资料库代替 App 内置的内容
CRIB_CATALOG_URL
版本目录地址,默认 https://repo.pigsty.io/doc/catalog.json
CRIB_ALLOW_DEVELOPMENT_CONTENT
设为 1 时接受开发签名的内容
CRIB_ALLOW_LOOPBACK_HTTP
设为 1 且可信根是开发可信根时,允许从 127.0.0.1 的 HTTP 地址获取目录
  • CRIB_LIBRARY、CRIB_CATALOG_URL 和两个 CRIB_ALLOW_* 变量没有设置时,Crib 读取同名的旧变量 PGDASH_*;两者都设置时以 CRIB_* 为准。
  • PGDASH_USER_DATA 不再指定 Crib 的用户目录,只被当作迁移来源。
  • 设置了任何 CRIB_* 或 PGDASH_* 变量时,需要重新打开的操作(例如迁移完成后)只退出 Crib,不会自动重新打开。

5.2 - 来源与许可

Crib 收录内容的来源、各自的版权与许可状态,以及发布前仍待核对的事项。

Crib 自己的代码和它收录的内容是两回事:应用的许可证不会覆盖手册、译文、Wiki、字体和图片各自的权利。本页列出每类内容的来源和目前的许可状态。

再分发许可尚未核对完成

应用代码尚未选定许可证,源码未公开。收录内容的再分发许可正在逐项核对,在核对完成前不会公开分发。本页是来源清单,不是新的授权。

内容来源

内容来源版权与许可
英文手册PostgreSQL 全球开发组发布的官方文档,按固定版本的源码归档构建各版本手册自带法律声明(legal.sgml 或早期版本的引言),原样保留在资料包的 licenses/ 目录
中文手册pgdoc 收录的各版本简体中文译本保留各版本原有的译者署名与版权声明;译文的授权与署名单独核对,不从英文原版的授权推定
历史资源(早期版本的 CSS、GIF)同一版本的另一语言版本或核实过的同版材料逐个记录来源与哈希;6.3、6.4 的样式表是兼容样式,不冒充 1998 年的原始文件
手册插图(SVG)手册源码自带的本地 SVG转为静态图片显示,原始字节保留
Wikipg.center 2026-10-24 的冻结快照保留每条记录的原始来源、语言与证据;不推定 Center 原创文字或译文有统一授权
版本、安全与能力信息版本发布归档、CVE 记录、能力矩阵不同来源分别保留引用,不假定有共同授权
Wiki 引用的外部网页与插图原始链接不随包下载,不推定任何许可

每个资料包里的 sources.json 记录了该包每个文件的来源和哈希,licenses/ 保存原始的法律声明。在应用里打开一页手册后,从阅读区右上角的“更多”菜单选择“来源与许可”,可以查看这一页所在资料包的来源清单和许可文件。

你自己的内容

笔记、书签、本地更正和片段属于你,存放在本机用户目录,不会打包进官方资料包,也不会被收集或上传。本地更正在阅读时明确标为“本地更正”,与官方原文区分。

应用依赖

macOS 应用只使用系统框架(SwiftUI、AppKit、WebKit、CryptoKit 等)和系统自带的 SQLite,没有引入第三方 Swift 包。构建端的 Go 工具依赖:

依赖用途许可
github.com/mattn/go-sqlite3SQLite 绑定MIT;内含的 SQLite 源码另有声明
github.com/yuin/goldmark渲染 Wiki 的 MarkdownMIT
golang.org/x/net解析 HTMLBSD 风格
golang.org/x/textUnicode 规范化BSD 风格

应用目前随包附带一份 Font Awesome Free 字体子集及其完整许可文本;2026-11-06 重设计后界面已改用系统的SF Symbols,这份字体会在后续打包改动中移除。

本站

本站文字采用 CC BY 4.0 许可,站点源码在 pgsty/crib.pgsty.com。站内截图来自 Crib 的开发构建,其中显示的手册内容版权归原作者与译者。

5.3 - 常见问题

关于下载、联网、系统要求、内容来源、隐私和与其他工具关系的简短回答。

现在能下载吗?

还不能。Crib 只有本地开发构建,Developer ID 签名、Apple 公证、内容再分发许可和生产资料包目录都还没完成。见发布状态和下载。

收费吗?开源吗?

都还没有定。应用代码尚未选定许可证,源码暂未公开。确定后会在下载页和开发日志写明。

需要联网吗?

日常使用不需要。手册和搜索索引随应用安装,首次启动断网就能阅读和搜索。以下操作会联网:

  • 刷新版本目录、下载其他版本或 Wiki(Core 版);
  • 点击搜索结果下方的网页搜索入口(在浏览器中打开);
  • 打开手册或 Wiki 中的外部链接。

没有账号,没有云同步,也不收集使用数据。

支持哪些 Mac?

应用按 macOS 14 部署目标构建,目前只在 Apple Silicon、macOS 27 的开发机上实测。macOS 14 实机和 Intel Mac尚未测试,正式发布前不作支持承诺。

界面有英文吗?

没有。应用界面目前只有中文。文档内容是中英双语的,可以只读英文手册,搜索时用 lang:en 限定英文。

某一节只有英文、没有中文怎么办?

62 套手册都是完整的,但两种语言的章节不一定一一对应。切换语言时,如果当前小节没有已验证的对应,Crib 会回到最近的已对应父节并提示。Wiki 中某种语言没有正文时显示缺失,不用另一种语言填充。

能自己修改译文吗?

可以写本地更正:选中一段文字,写下修改后的内容。更正存在你的个人资料库里,阅读时与原文并列显示,不会改动资料包,也不会自动应用到其他版本或语言。更正可以导出,方便提交给译者。见笔记、书签与本地更正。

卸载一个版本,笔记会丢吗?

不会。笔记和更正存在独立的 user.sqlite 里。卸载后,挂在该版本上的笔记显示为目标不可用;重新安装后恢复定位。

和 Dash 有什么关系?

Crib 借鉴了 Dash 的片段库、系统服务和本地 API 等用法,但内容格式是自己的:.crib 资料包带双语章节对应、版本信息和签名,不兼容 Dash docset,也不使用 Kapeli 的文档源。

能用来查 Patroni、PgBouncer 等其他项目的文档吗?

目前不能。资料包格式本身不绑定 PostgreSQL,以后可以用同样的格式加入其他项目,但这些都还没有立项。

以前用过 PGDash,数据怎么办?

PGDash 是 Crib 开发期间的旧名。Crib 首次启动时把旧目录的个人资料复制到新目录,旧目录保持不动。见用户数据与迁移。

在哪里反馈问题?

Crib 的源码仓库暂未公开。对本站内容的意见可以在 pgsty/crib.pgsty.com 提 issue。