Obsidian Paper Notes Search
juliye2025/evil-read-arxiv
Searches already-saved paper notes in a local Obsidian vault by title, author, keyword, tag, field or arXiv ID, and ranks the matches by relevance.
Generate a high-quality deep-reading note for a single paper and write it into an Obsidian-style vault.
$ npx skills add 917Dhj/DeepPaperNote --skill deeppapernote -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install 917Dhj/DeepPaperNote deeppapernote --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/917Dhj/DeepPaperNote.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/deeppapernote .claude/skills/deeppapernote && 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 "deeppapernote" agent skill from https://github.com/917Dhj/DeepPaperNote/tree/main/skills/deeppapernote into .claude/skills/deeppapernote/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "deeppapernote", 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/917Dhj/DeepPaperNote/tree/main/skills/deeppapernoteType 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 917Dhj/DeepPaperNote --skill deeppapernote -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install 917Dhj/DeepPaperNote deeppapernote --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/917Dhj/DeepPaperNote.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/deeppapernote .agents/skills/deeppapernote && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "deeppapernote" agent skill from https://github.com/917Dhj/DeepPaperNote/tree/main/skills/deeppapernote into .agents/skills/deeppapernote/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "deeppapernote", 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 917Dhj/DeepPaperNote --skill deeppapernote -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install 917Dhj/DeepPaperNote deeppapernote --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/917Dhj/DeepPaperNote.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/deeppapernote .cursor/skills/deeppapernote && 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 "deeppapernote" agent skill from https://github.com/917Dhj/DeepPaperNote/tree/main/skills/deeppapernote into .cursor/skills/deeppapernote/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "deeppapernote", 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/917Dhj/DeepPaperNote.git --path skills/deeppapernote--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 917Dhj/DeepPaperNote --skill deeppapernote -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install 917Dhj/DeepPaperNote deeppapernote --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/917Dhj/DeepPaperNote.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/deeppapernote .gemini/skills/deeppapernote && 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 "deeppapernote" agent skill from https://github.com/917Dhj/DeepPaperNote/tree/main/skills/deeppapernote into .gemini/skills/deeppapernote/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "deeppapernote", 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 917Dhj/DeepPaperNote deeppapernoteInstalls 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 917Dhj/DeepPaperNote --skill deeppapernote -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/917Dhj/DeepPaperNote.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/deeppapernote .github/skills/deeppapernote && 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 "deeppapernote" agent skill from https://github.com/917Dhj/DeepPaperNote/tree/main/skills/deeppapernote into .github/skills/deeppapernote/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "deeppapernote", 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 917Dhj/DeepPaperNote --skill deeppapernote -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install 917Dhj/DeepPaperNote deeppapernote --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/917Dhj/DeepPaperNote.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/deeppapernote .opencode/skills/deeppapernote && 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 "deeppapernote" agent skill from https://github.com/917Dhj/DeepPaperNote/tree/main/skills/deeppapernote into .opencode/skills/deeppapernote/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "deeppapernote", 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.
deeppapernoteGenerate a high-quality deep-reading note for a single paper and write it into an Obsidian-style vault.
Deeppapernote is an agent skill from 917Dhj/DeepPaperNote. Generate a high-quality deep-reading note for a single paper and write it into an Obsidian-style vault. Use when the user gives a paper title, DOI, URL, arXiv ID, Zotero item, or local PDF and wants a polished Markdown note with strong structure, evidence-based analysis, and figure placeholders.
Its SKILL.md is about 5.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 44 other files, including scripts and reference files (for example `agents/openai.yaml`, `references/architecture.md` and `references/deep-analysis.md`).
It sits in Research & Science, covering Citation management, Note-taking and Academic paper search. It works with Obsidian, Zotero and arXiv. The repository describes itself as: DeepPaperNote is an agent skill for deep-reading a single paper and generating high-quality Obsidian-style research notes. Works with Claude Code, Codex, Cursor, Copilot, Gemini… The licence is MIT.
12 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 1cedf36. 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.
Ships 3 files in scripts/ (Python, from the files we listed), which the agent can run.
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.
Deeppapernote loads about 5.9k tokens when it runs, and up to ~25k if it reads all its reference files. Until then it costs about 78 tokens; SKILL.md has 3,124 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 no risky patterns in SKILL.md.
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); the scripts in this folder are not scanned.
The full file from 917Dhj/DeepPaperNote at commit 1cedf36, republished under its MIT licence (© 917Dhj). 3,124 words, ~5,851 tokens.
.claude/skills/deeppapernote/SKILL.md (or your agent's skills folder). This skill also uses 41 other files; get the full folder from GitHub.Use this skill when the user wants one outcome:
Chinese trigger examples:
给这篇论文生成深度笔记写一篇高质量论文精读笔记把这篇文章整理成 obsidian 笔记读这篇论文并生成 md 笔记English trigger examples:
Generate a deep-reading note for this paperTurn this paper into an Obsidian research noteBefore a normal paper run, read references/user-configuration.md for configuration admission, migration, repair, Run Overrides, and Preference Changes.
Resolve Run Overrides from the explicit request, CLI, and current process environment first. When they form a complete valid configuration for the selected Save Mode, Configuration Readiness is complete without reading User Configuration. Only inspect User Configuration when those Run Overrides need fallback values.
After Configuration Readiness, resolve one output_language (zh-CN or en) for the run. source_manifest.language_hint describes source text only and never selects the note profile.
Bind that exact value through Save Target Admission → Figure Plan → Figure/Table Decisions → Synthesis Bundle → Note Plan → Grounding Lint → Final Note Lint → Final Quality Review → Final Readability Review → Formal Save:
output_language; the Synthesis Bundle also carries the same value at writing_contract.language.note_sha256. Any review edit invalidates the prior lint, so rerun Final Note Lint under the same language. Formal Save requires the lint language and note_sha256 to match the final note, and validates Figure/Table Decisions language before any save side effect.This contract is complete only when every named stage is bound to the resolved value and Formal Save validates the final bytes. Read references/output-language.md for profile content while drafting or debugging either language.
This skill is intentionally narrow:
The finished note must be more than a summary. It should reconstruct the paper's argument:
Default writer persona:
The note must adapt to the paper type. Use the same base structure, but shift emphasis for AI methods, benchmarks, clinical studies, and humanities or social-science papers.
Follow this order:
fetch_pdf.py --reference); in Obsidian mode, verify and reuse a matching local archive before downloading, following references/paper-archive.md for version/source selection*_raw_sections.jsonl, *_source_manifest.json, and optional derived *_full_text.mdscripts/write_obsidian_note.py --preflight with the resolved title, exact output_language, Vault, and *_source_manifest.json; this program result is authoritative, so do not replace it with prompt-only duplicate checkingasset_subdir from preflight and use it for source-bound figure embedssame_language_note_exists, stop before drafting and ask whether to overwrite the reported note. If the user approves, rerun preflight with --overwrite-existing-note --expected-existing-note-sha256 <reported_sha256> and carry that exact confirmation into Formal Save; if the user declines, stop without writingreferences/paper-archive.md: ask for the current selection and carry it through preflight and Formal Savenote_plan that satisfies the generated bundle contract, including its exact output_languagenote_plan — this stage completes only when the lint artifact exists and every reported passes_* gate is true; otherwise revise and rerun lint. If the lint output contains passes_style_gate: false, apply the Style Gate Enforcement rule before advancing to step 15, 16, or 17final_quality_review after lint passesfinal_readability_review after the quality review passesscripts/write_obsidian_note.py, the same Source Manifest, and any user-approved overwrite hash; the script repeats admission before the first save side effectThis is the required workflow for a normal single-paper note request, not a loose suggestion. Unless this skill explicitly marks a stage as optional, required stages must not be silently skipped, reordered into a shortcut, or treated as complete just because a partial artifact already exists.
Global no-short-circuit rule:
Completion-language rule:
笔记已完成 only when the required workflow is actually complete已生成草稿 when drafting is done but lint, final readability review, or save is still pending已通过校验 only when lint has actually been run and passed已保存到 Obsidian only when the write step has actually succeededlint 已通过 as equivalent to 整篇笔记已经润色完成Final user report:
note_sha256SKILL.md plus the generated synthesis_bundle.json must be enough to complete a normal note-generation run.
Files under references/ are optional stage-specific deep dives, not a default reading checklist.
Non-negotiable rules:
source_manifest, raw sections, coverage metadata, explicit note_plan, and inspected paper evidence; never finish from title/abstract/headings alone*_raw_sections.jsonl and *_source_manifest.json are the canonical reading material; old top-N evidence buckets, truncated section_texts, and candidate_chunks are not model-facing writing inputswriting_contract.must_include_sectionszh-CN mode and render it faithfully in English in en modeReference usage policy:
references/evidence-first.md, references/deep-analysis.md, or references/final-writing.md only when the paper is complex or the draft is too shallowreferences/figure-placement.md only for ambiguous figure/table placement or image replacement decisionsreferences/paper-archive.md for existing Obsidian directories, local PDF version selection, or Connector handoffreferences/obsidian-format.md only for Markdown, vault, frontmatter, or reference-link formatting detailsreferences/note-quality.md or references/paper-types.md only for final review or domain adaptationreferences/metadata-sources.md only when metadata is incomplete, and references/architecture.md only for repository maintenance decisionsPrefer the strongest available source in this order:
Before web resolution, use the bundled scripts/resolve_paper.py Zotero Local API path to check the desktop library. Its default --zotero-mode auto prefers a unique local match and falls back to the existing providers when Zotero is unavailable or has no match. An explicit Zotero key has no safe web fallback and must be verified locally. Use off to make no Local API request, or required when the reference must resolve through Zotero. A trusted JSON artifact or explicit local PDF remains authoritative and bypasses this lookup. A compatible session-scoped Zotero/MCP integration may still provide a trusted input artifact when available, but it is not required for the built-in path.
Local-library-first rule:
scripts/locate_zotero_attachment.py to find the PDF under the user's Zotero storage.Formal Save states:
| Save Target state | Required action |
|---|---|
save_mode=obsidian and the configured Vault is usable | Perform the Formal Save to that Vault. |
save_mode=obsidian and Formal Save fails | Keep the current Save Target and attempt an in-scope recovery. If it still cannot complete, report blocked; do not switch to workspace. |
save_mode=workspace | Perform the Formal Save inside the current workspace output root. |
#, ##, and ###.# title heading. Include at least a tags field with a papers/<domain> value and useful aliases; include date, doi, or arxiv_id when known, and omit unavailable fields rather than inventing placeholders.writing_contract.core_info_fields; omit unavailable fields and move commentary to a later analysis section.### subheadings in the technical sections when the paper is non-trivial.writing_contract.figure_table_contract before drafting or saving.note_plan; no review_pending item may cross that boundary.insert decision is complete only after Formal Save materializes the selected image into the paper-local images/ directory and the write succeeds.zh-CN rejects mixed Chinese-English prose artifacts, while en rejects Chinese prose outside citation metadata.KV缓存 of, 批量ing, In相关 Researcher, or Single 序列 generation; rewrite the sentence naturally instead of preserving a partially translated phrase.lint_note.py output contains passes_style_gate: false, fix the reported issues and re-run lint. Keep fixing and re-running until lint passes — multiple rounds are normal and expected. Do not decide that any failure is an acceptable exception — proper nouns, math formulas, and citation metadata are not automatic exemptions. Only escalate to the user if the same failures appear unchanged across multiple rounds with no reduction, indicating the model is unable to make further progress independently.Model-first rule:
<thinking> block$...$ or $$...$$, not as inline code or fenced code blocksfinal_quality_review, check the full note against seven questions: whether the central evidence chain is complete, whether key settings and numbers are present, whether mechanisms or protocols are mapped to the result pattern they explain, whether the paper is positioned against strong baselines or alternative routes, whether Discussion/Limitations conclusions are explained mechanistically, whether proven claims are separated from unproven claims, and whether the research, engineering, replication, or validity takeaways are specific enough to reusefinal_quality_review passes, reread the full note once more for readability; do not stop at formal compliance onlyfinal_readability_review, rewrite language leftovers into natural prose in the configured language while preserving stable proper nounsfinal_readability_review to invent new facts, empty filler text, or shallower but safer wording just to satisfy lintThe topic references above can improve difficult runs, but the normal execution path should not depend on reading all of them.
Use these bundled scripts rather than rebuilding the workflow from scratch:
scripts/check_environment.pyscripts/user_configuration.pyscripts/create_input_record.pyscripts/locate_zotero_attachment.pyscripts/resolve_paper.pyscripts/run_pipeline.pyscripts/collect_metadata.pyscripts/fetch_pdf.pyscripts/extract_source_text.pyscripts/extract_evidence.pyscripts/extract_pdf_assets.pyscripts/plan_figures.pyscripts/plan_figure_table_decisions.pyscripts/build_synthesis_bundle.pyscripts/lint_grounding.pyscripts/lint_note.pyscripts/materialize_figure_asset.pyscripts/write_obsidian_note.pyPython interpreter rule:
>=3.10.python3 is below 3.10, automatically look for another available interpreter that satisfies the requirement, such as python3.12, python3.11, python3.10, /opt/anaconda3/bin/python3, /opt/homebrew/bin/python3, or /usr/local/bin/python3.>=3.10.Troubleshooting rule:
scripts/check_environment.py only when a concrete dependency or integration question is blocking executionCurrent status:
scripts/run_pipeline.py now defaults to building a model-facing synthesis bundlescripts/write_obsidian_note.py can write the final note into a target vaultpdf_url, direct PDF URL, arXiv/open-access sources, publisher PDF if accessible, DOI enrichment, and any other current fetch path implemented by the workflow.© 917Dhj, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 41 other files (scripts, references) in skills/deeppapernote of 917Dhj/DeepPaperNote.
Open the folder on GitHubat commit 1cedf36
We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in 917Dhj/DeepPaperNote, which our catalogue first saw on October 7, 2026.
Deeppapernote 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 |
|---|---|---|---|---|---|---|
| Deeppapernote this skill917Dhj/DeepPaperNote | 1.2k | 1 repos | ~5.9k | Automated safety check: Pass | MIT | |
| Obsidian Paper Notes Searchjuliye2025/evil-read-arxiv | 1.7k | — | ~481 | Automated safety check: Pass | None | |
| Ref Downloaderltczding-gif/ref-downloader | 139 | — | ~5.9k | Automated safety check: Pass | MIT | |
| Obsidian Paper VaultAperivue/medsci-skills | 331 | — | ~1.6k | Automated safety check: Pass | MIT | |
| Zotero Obsidian BridgeGalaxy-Dawn/claude-scholar | 5.7k | — | ~514 | Automated safety check: Pass | MIT | |
| Literature Review Toolsbrycewang-stanford/Auto-Empirical-Research-Skills | 4.5k | — | ~2.5k | Automated safety check: Notes | Custom licence |
juliye2025/evil-read-arxiv
Searches already-saved paper notes in a local Obsidian vault by title, author, keyword, tag, field or arXiv ID, and ranks the matches by relevance.
ltczding-gif/ref-downloader
A skill your agent uses when the user asks to batch-download academic PDFs with ref-downloader — either ALL references of one paper (Mode A: DOI or PDF input), OR a custom batch of papers (Mode B…
Aperivue/medsci-skills
A skill your agent uses when turning a folder of research PDFs into Obsidian notes, even if Obsidian is not named.
Galaxy-Dawn/claude-scholar
Moves papers from Zotero into an Obsidian project knowledge base as source notes, literature synthesis and writing outputs, with evidence records behind every promoted claim.
brycewang-stanford/Auto-Empirical-Research-Skills
Recommend AND run open-source AI tools, agents, Claude Code / Codex skills, and MCP servers for any stage of a literature review — searching, reading, extracting, synthesizing, screening…
GRIND-Lab-Core/night_owl_research_agent
Retrieves papers from local folder or ArXiv and Semantic Scholar using domain-aware keyword expansion, builds synthesis matrix, identifies gaps.
917Dhj/DeepPaperNote
A skill your agent uses when building reusable Obsidian glossary notes from an existing paper source manifest, optionally with a raw-sections override, especially when a reader needs a reviewed…
Categories
Generate a high-quality deep-reading note for a single paper and write it into an Obsidian-style vault. Deeppapernote is an agent skill from 917Dhj/DeepPaperNote. Generate a high-quality deep-reading note for a single paper and write it into an Obsidian-style vault.
Deeppapernote fits situations like: the user gives a paper title; local PDF and wants a polished Markdown note with strong structure; evidence-based analysis; figure placeholders.
Run `npx skills add 917Dhj/DeepPaperNote --skill deeppapernote -a claude-code`. Or copy the skill folder (skills/deeppapernote in 917Dhj/DeepPaperNote) into .claude/skills/deeppapernote in your project. Claude Code loads it when a task matches its description.
Run `npx skills add 917Dhj/DeepPaperNote --skill deeppapernote -a codex`. Or copy the skill folder (skills/deeppapernote in 917Dhj/DeepPaperNote) into .agents/skills/deeppapernote 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 917Dhj/DeepPaperNote --skill deeppapernote -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/deeppapernote, .gemini/skills/deeppapernote, .github/skills/deeppapernote and .opencode/skills/deeppapernote in your project.
Going by SKILL.md and its folder, Deeppapernote needs Python for the scripts in its folder. Our summary lists: Python 3.
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 found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Deeppapernote is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.9k tokens (SKILL.md is roughly 23k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 19k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Deeppapernote: Obsidian Paper Notes Search (juliye2025/evil-read-arxiv, 1.7k stars), Ref Downloader (ltczding-gif/ref-downloader, 139 stars), Obsidian Paper Vault (Aperivue/medsci-skills, 331 stars) and Zotero Obsidian Bridge (Galaxy-Dawn/claude-scholar, 5.7k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
917Dhj (a GitHub user) maintains it in 917Dhj/DeepPaperNote, which has 1,164 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on October 7, 2026.
Source: 917Dhj/DeepPaperNote on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.