Import Export
AHS12/thoth-blueprint
Change SQL, SQLite worker, DBML, JSON, Mermaid, SVG, or database export/import flows while preserving diagram semantics and round trips.
编写"数据库筑基课"文章的专用 Skill,面向数据库架构师、DBA 和业务开发者。输入一个筑基课文章标题及相关参考资料(技术文档、产品手册、开源项目地址、deepwiki、论文等),输出图文并茂、结构完整的 Markdown 筑基课文章,保存至项目 markdown/…
The automated check flagged lines worth reading first. See the safety section below.
$ npx skills add digoal/blog --skill db-foundation-course -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install digoal/blog db-foundation-course --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/digoal/blog.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/skills_for_claude_web/db-foundation-course .claude/skills/db-foundation-course && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "db-foundation-course" agent skill from https://github.com/digoal/blog/tree/master/skills/skills_for_claude_web/db-foundation-course into .claude/skills/db-foundation-course/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "db-foundation-course", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/digoal/blog/tree/master/skills/skills_for_claude_web/db-foundation-courseType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add digoal/blog --skill db-foundation-course -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install digoal/blog db-foundation-course --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/digoal/blog.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/skills_for_claude_web/db-foundation-course .agents/skills/db-foundation-course && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "db-foundation-course" agent skill from https://github.com/digoal/blog/tree/master/skills/skills_for_claude_web/db-foundation-course into .agents/skills/db-foundation-course/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "db-foundation-course", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add digoal/blog --skill db-foundation-course -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install digoal/blog db-foundation-course --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/digoal/blog.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/skills_for_claude_web/db-foundation-course .cursor/skills/db-foundation-course && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "db-foundation-course" agent skill from https://github.com/digoal/blog/tree/master/skills/skills_for_claude_web/db-foundation-course into .cursor/skills/db-foundation-course/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "db-foundation-course", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/digoal/blog.git --path skills/skills_for_claude_web/db-foundation-course--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add digoal/blog --skill db-foundation-course -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install digoal/blog db-foundation-course --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/digoal/blog.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/skills_for_claude_web/db-foundation-course .gemini/skills/db-foundation-course && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "db-foundation-course" agent skill from https://github.com/digoal/blog/tree/master/skills/skills_for_claude_web/db-foundation-course into .gemini/skills/db-foundation-course/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "db-foundation-course", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install digoal/blog db-foundation-courseInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add digoal/blog --skill db-foundation-course -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/digoal/blog.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/skills_for_claude_web/db-foundation-course .github/skills/db-foundation-course && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "db-foundation-course" agent skill from https://github.com/digoal/blog/tree/master/skills/skills_for_claude_web/db-foundation-course into .github/skills/db-foundation-course/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "db-foundation-course", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add digoal/blog --skill db-foundation-course -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install digoal/blog db-foundation-course --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/digoal/blog.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/skills_for_claude_web/db-foundation-course .opencode/skills/db-foundation-course && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "db-foundation-course" agent skill from https://github.com/digoal/blog/tree/master/skills/skills_for_claude_web/db-foundation-course into .opencode/skills/db-foundation-course/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "db-foundation-course", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
db-foundation-course编写"数据库筑基课"文章的专用 Skill,面向数据库架构师、DBA 和业务开发者。输入一个筑基课文章标题及相关参考资料(技术文档、产品手册、开源项目地址、deepwiki、论文等),输出图文并茂、结构完整的 Markdown 筑基课文章,保存至项目 markdown/…
DB Foundation Course is an agent skill from digoal/blog. 编写"数据库筑基课"文章的专用 Skill,面向数据库架构师、DBA 和业务开发者。输入一个筑基课文章标题及相关参考资料(技术文档、产品手册、开源项目地址、deepwiki、论文等),输出图文并茂、结构完整的 Markdown 筑基课文章,保存至项目 markdown/ 目录。适用主题覆盖:表存储结构(heap/parquet/arrow/zedstore/LSM-Tree/HStore等)、索引结构(btree/gin/brin/hnsw/ivfflat/bloom等)、数据类型与操作符(vector/jsonb/tsvector/range/array等)、优化器扫描算法(seq scan/index scan/bitmap scan/join/agg/并行等)、场景化实践(时序/GIS/RAG/全文检索/图数据/数据湖等)以及事务/锁/并发/安全等周边主题。只要用户提及"筑基课"、"数据库原理"、"数据库内核"写作,或给出了数据库存储/索引/扫描相关的技术文档让你写成教程,都应使用此 Skill。
Its SKILL.md is about 1.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Databases, covering Vector databases, DataFrames and Markdown. It works with Mermaid and SQL. The repository describes itself as: AI,Opensource,Database,Business,Finance,Minds. git clone --depth 1 https://github.com/digoal/blog. The licence is GPL-2.0.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit ad6fcb7. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are mermaid, sql, bash and markdown).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
DB Foundation Course loads about 1.9k tokens when it runs. Until then it costs about 120 tokens; SKILL.md has 362 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found patterns that need a careful read before installing.
⟨U+200B⟩```⟨U+200B⟩```⟨U+200B⟩```⟨U+200B⟩```Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from digoal/blog at commit ad6fcb7, republished under its GPL-2.0 licence (© digoal). 362 words, ~1,871 tokens.
.claude/skills/db-foundation-course/SKILL.md (or your agent's skills folder).核心目标:让数据库架构师、DBA、业务开发者学完每篇筑基课后,能将知识直接用于工作实践,打下坚实基础。
输入: 文章标题 + 参考资料(URL / 文档 / 论文 / 代码仓库)
│
├─ Step 1: 读取参考资料
├─ Step 2: 按"标准文章结构"起草提纲
├─ Step 3: 逐节撰写内容(含图表、代码、示例)
├─ Step 4: 自检(逻辑 / 代码 / 事实)
└─ Step 5: 输出 Markdown 文件 → markdown/<slug>.md每篇筑基课文章必须包含以下 12 个章节,可根据主题适当增减子节:
# 数据库筑基课 - <标题>
> 所属系列: [数据库筑基课大纲](链接)
> 难度: ★☆☆ / ★★☆ / ★★★
> 适合角色: 架构师 / DBA / 业务开发者
---
## 0. 导读(Why Read This)
## 1. 背景与痛点(Background & Pain Points)
## 2. 核心原理(Core Principles)
## 3. 数据结构 / 存储格式 / 算法详解(Deep Dive)
## 4. 优势与适合场景(Strengths & Use Cases)
## 5. 劣势与不适合场景(Weaknesses & Anti-Patterns)
## 6. 竞品 / 横向技术对比(Comparison)
## 7. 实操与最佳实践(Hands-on & Best Practices)
## 8. 性能调优(Performance Tuning)
## 9. 思考与边界(Thinking & Boundaries)
## 10. 常见问题(FAQ)
## 11. 扩展阅读(Further Reading)根据主题选择合适的子节,参考如下分类:
存储结构类(heap/parquet/arrow/zedstore/LSM等)
索引结构类(btree/gin/brin/hnsw/bloom等)
扫描与计算类(seq scan/index scan/join/agg/并行等)
数据类型类(vector/jsonb/tsvector等)
graph TD
A[Client] --> B[Buffer Pool]
B --> C{命中?}
C -- Yes --> D[直接返回]
C -- No --> E[从磁盘读取 Block]File Layout:
┌─────────────────────────────────┐
│ Block 0 │ Block 1 │ ... │
│ (8KB) │ (8KB) │ │
└─────────────────────────────────┘
Block Layout:
┌──────────────┬────────────────────────┐
│ Page Header │ Line Pointers (lp[]) │
├──────────────┴────────────────────────┤
│ Free Space │
├───────────────────────────────────────┤
│ Tuple N │ ... │ Tuple 2 │ Tuple 1 │
└───────────────────────────────────────┘| 特性 | heap(行存) | parquet(列存) | zedstore(行列混存) |
|---|---|---|---|
| OLTP 写入 | ★★★★★ | ★★☆☆☆ | ★★★★☆ |
| OLAP 扫描 | ★★☆☆☆ | ★★★★★ | ★★★★☆ |
| ... | ... | ... | ... |
在确实需要 SVG 时,使用简洁的 <svg> 内联图,宽度限制在 700px 以内。
-- 【示例】创建 heap 表并观察存储结构
CREATE TABLE tbl_demo (
id BIGSERIAL PRIMARY KEY,
name TEXT,
score FLOAT
) WITH (fillfactor = 80);
-- 插入测试数据
INSERT INTO tbl_demo (name, score)
SELECT 'user_' || g, random() * 100
FROM generate_series(1, 100000) g;
-- 查看物理文件路径
SELECT pg_relation_filepath('tbl_demo');
-- 查看 block 内容(需要 pageinspect 插件)
SELECT * FROM heap_page_items(get_raw_page('tbl_demo', 0)) LIMIT 5;sql / bash / python / json)在生成最终文件前,逐项检查:
□ 文章结构是否覆盖了 12 个标准章节(允许合并,不允许缺失关键章节)
□ 每个技术概念是否有对应的图示(layout/流程图/对比表)
□ 所有 SQL / 代码示例是否语法正确(逐行检查关键字、括号、引号)
□ 核心原理是否有"类比"帮助理解
□ 对比章节是否客观(不只夸自己,要说出竞品优势)
□ 边界/不适合场景是否明确
□ 扩展阅读的链接格式是否正确
□ 文件名格式是否符合 <YYYYMMDD>_<slug>.md
□ 文章开头是否有"所属系列"链接 和 "难度/角色"标注# 目录: markdown/
# 命名: YYYYMMDD_<topic-slug>.md
# 示例:
markdown/20240919_heap-storage.md
markdown/20241015_parquet-columnar.md
markdown/20250624_hnsw-vector-index.md保存完毕后,输出:
| 主题类别 | 典型技术点 | 关联大纲章节 |
|---|---|---|
| 行存 | heap, HOT-update, vacuum, FSM, VM | 一、表组织结构 |
| 列存(磁盘) | parquet, orc, lance, vortex | 一、表组织结构 |
| 列存(内存) | arrow, monetdb in-memory, DuckDB | 一、表组织结构 |
| 行列混存 | zedstore, vops | 一、表组织结构 |
| 追加写优化 | LSM-Tree, HStore/HBase | 一、表组织结构 |
| 有序存储 | cluster table, 索引组织表 | 一、表组织结构 |
| 冷热分层 | Iceberg, Delta Lake, Hudi | 一、表组织结构 |
| 传统索引 | btree, hash, bitmap, brin, bloom, gin | 二、索引组织结构 |
| 全文索引 | gin+tsvector, BM25, zombodb | 二、索引组织结构 |
| 向量索引 | hnsw, ivfflat, pgvectorscale, vectorchord | 二、索引组织结构 |
| 特殊索引 | partial/expression/include/global index | 二、索引组织结构 |
| 数据类型 | vector, jsonb, tsvector, range, array | 三、数据类型和操作符 |
| 扫描算法 | seq/index/bitmap/index-only scan | 四、扫描&计算 |
| Join 算法 | nested loop, hash join, merge join | 四、扫描&计算 |
| 并行计算 | parallel scan, EPQ, JIT, 向量化 | 四、扫描&计算 |
| 场景实践 | 时序/GIS/RAG/全文/图/数据湖 | 五、应用实践 |
| 周边能力 | 事务/锁/连接池/安全/存储过程 | 六、其他 |
当用户提供的参考资料为 URL 时:
web_fetch 获取完整内容## 1. 背景与痛点
数据库最基础的问题:**一条记录写到哪里?怎么找回来?**
在 heap 之前,如果要自己实现存储,可能会想到顺序存文件——但这样读一条记录需要扫全表。
heap 的设计解决了三个核心问题:
| 问题 | heap 的解法 |
|--------------|----------------------|
| 写到哪里? | FSM 快速找空闲 block |
| 怎么定位一行? | ctid = (blockNum, lp) |
| 怎么回收空间? | vacuum + autovacuum |
## 2. 核心原理
### 整体架构
Table Files: main: tbl.1, tbl.2, ... ← 数据文件(每个最大 1GB) fsm: tbl_fsm ← 空闲空间图(Free Space Map) vm: tbl_vm ← 可见性图(Visibility Map)
### Block 内部结构
┌─────────────────────────────────────────┐ ← Block(默认 8KB) │ PageHeaderData (24B) │ │ lp[1] lp[2] lp[3] ... lp[N] │ ← Line Pointers(4B each) │ │ │ ← Free Space → │ │ │ │ Tuple 3 Tuple 2 Tuple 1 │ ← 从尾部向前增长 └─────────────────────────────────────────┘
ctid = (BlockNum, lp_index) 例:ctid=(0,1) 表示第0块,第1条记录
以上即为"数据库筑基课"Skill 的完整指南。 每次生成文章后,务必运行自检清单,确认内容逻辑正确、代码可运行,再保存文件。
© digoal, GPL-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. 4 hidden characters (zero-width or bidirectional) removed. Raw file
Just SKILL.md in skills/skills_for_claude_web/db-foundation-course of digoal/blog.
Open the folder on GitHubat commit ad6fcb7
DB Foundation Course next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| DB Foundation Course this skilldigoal/blog | 8.6k | — | ~1.9k | Automated safety check: Warn | GPL-2.0 | |
| Import ExportAHS12/thoth-blueprint | 625 | — | ~499 | Automated safety check: Pass | GPL-3.0 | |
| Database Scoutzebbern/claude-code-guide | 4.7k | — | ~1.1k | Automated safety check: Pass | MIT | |
| Data Model CreationTencentCloudBase/CloudBase-AI-Toolkit | 1.1k | 1 repos | ~1.8k | Automated safety check: Pass | MIT | |
| Database Inspectorrongxinzy/RongxinAI | 154 | — | ~835 | Automated safety check: Pass | MIT | |
| Data Model ExtractorEmeaAppGbb/spec2cloud | 100 | — | ~2.5k | Automated safety check: Pass | MIT |
AHS12/thoth-blueprint
Change SQL, SQLite worker, DBML, JSON, Mermaid, SVG, or database export/import flows while preserving diagram semantics and round trips.
zebbern/claude-code-guide
Explore SQLite and PostgreSQL databases: list tables, inspect schemas (columns/types/constraints), preview data, generate Mermaid ER diagrams, and run safe read-only queries.
TencentCloudBase/CloudBase-AI-Toolkit
[Deprecated] Optional advanced tool for complex data modeling.
rongxinzy/RongxinAI
探索 SQLite 或 PostgreSQL 数据库,执行安全只读查询,提供表列表、详细表结构(列/类型/约束/索引)、数据预览,并生成 Mermaid ER 图。当用户需要查看数据库架构、探索表关系、预览数据、执行只读查询,或提及 schema、ER 图、SQL 查询、数据预览、describe table、数据库探索等关键词时触发。
EmeaAppGbb/spec2cloud
Extract database schemas, data models, and entity relationships from code.
astronomer/agents
Queries the data warehouse with SQL and answers business questions about data.
digoal/blog
三层审查模型,逐段逐句验证文章真伪、证据链与逻辑结构。Use when the user asks to fact-check, verify, audit, or evaluate the credibility of an article, essay, report, opinion piece, social-media post, or any written claim —…
digoal/blog
Find latent bugs in a local PostgreSQL source tree (RELxxSTABLE branch or HEAD) the way a core hacker does: build a heavily-poisoned debug instance (cassert + cache-discard + -O0/-ggdb3 + core…
digoal/blog
Portable digital employee distilled from digoal's personal blog for PostgreSQL, PolarDB, DuckDB, AI+database, vector/RAG, database operations, source-code reading, technical content creation…
digoal/blog
从论文 PDF 文件或论文 PDF URL 生成通俗易懂、图文并茂、带批判性评估的中文 Markdown 解读,并保存到当前项目的 markdown 目录。Use when the user asks to interpret,精读,解读,summarize,explain,analyze, or write an article from an academic paper PDF…
digoal/blog
Analyze a product from documentation, websites, PDFs, articles, release notes, pricing pages, app listings, reviews, filings, or related links; save separate intermediate analyses from seven roles…
digoal/blog
Turn a blog post, article, notes, or any source material into a set of vertical poster images — one cover plus several coherent content slides that explain the core points.
编写"数据库筑基课"文章的专用 Skill,面向数据库架构师、DBA 和业务开发者。输入一个筑基课文章标题及相关参考资料(技术文档、产品手册、开源项目地址、deepwiki、论文等),输出图文并茂、结构完整的 Markdown 筑基课文章,保存至项目 markdown/…. DB Foundation Course is an agent skill from digoal/blog.
DB Foundation Course fits situations like: tasks that involve Vector databases; tasks that involve DataFrames; tasks that involve Markdown.
Run `npx skills add digoal/blog --skill db-foundation-course -a claude-code`. Or copy the skill folder (skills/skills_for_claude_web/db-foundation-course in digoal/blog) into .claude/skills/db-foundation-course in your project. Claude Code loads it when a task matches its description.
Run `npx skills add digoal/blog --skill db-foundation-course -a codex`. Or copy the skill folder (skills/skills_for_claude_web/db-foundation-course in digoal/blog) into .agents/skills/db-foundation-course in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add digoal/blog --skill db-foundation-course -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/db-foundation-course, .gemini/skills/db-foundation-course, .github/skills/db-foundation-course and .opencode/skills/db-foundation-course in your project.
SKILL.md names no scripts, command-line tools or credentials: DB Foundation Course is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md flagged 4 warning(s): contains zero-width characters. Read the flagged lines before installing; the check is not a guarantee either way.
DB Foundation Course is published under the GPL-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 1.9k tokens (SKILL.md is roughly 7.5k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with DB Foundation Course: Import Export (AHS12/thoth-blueprint, 625 stars), Database Scout (zebbern/claude-code-guide, 4.7k stars), Data Model Creation (TencentCloudBase/CloudBase-AI-Toolkit, 1.1k stars) and Database Inspector (rongxinzy/RongxinAI, 154 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
digoal (a GitHub user) maintains it in digoal/blog, which has 8,586 GitHub stars. The repository holds 98 skills in this directory. The repository was last updated on October 9, 2026.
Source: digoal/blog on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.