Web Interface Guidelines Reviewer
vercel-labs/openreview
Review UI code for Web Interface Guidelines compliance. Use when asked to "review my UI", "check accessibility", "audit design", "review UX", or "check my…
Counterpoint and voice writing (对位与声部写作) - writing a second line that is genuinely independent rather than a harmony part.
$ npx skills add jtydhr88/music-composition-skills --skill mc-counterpoint -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install jtydhr88/music-composition-skills mc-counterpoint --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/jtydhr88/music-composition-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/music-composition/skills/mc-counterpoint .claude/skills/mc-counterpoint && 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 "mc-counterpoint" agent skill from https://github.com/jtydhr88/music-composition-skills/tree/main/plugins/music-composition/skills/mc-counterpoint into .claude/skills/mc-counterpoint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mc-counterpoint", 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/jtydhr88/music-composition-skills/tree/main/plugins/music-composition/skills/mc-counterpointType 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 jtydhr88/music-composition-skills --skill mc-counterpoint -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install jtydhr88/music-composition-skills mc-counterpoint --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jtydhr88/music-composition-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/plugins/music-composition/skills/mc-counterpoint .agents/skills/mc-counterpoint && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "mc-counterpoint" agent skill from https://github.com/jtydhr88/music-composition-skills/tree/main/plugins/music-composition/skills/mc-counterpoint into .agents/skills/mc-counterpoint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mc-counterpoint", 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 jtydhr88/music-composition-skills --skill mc-counterpoint -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install jtydhr88/music-composition-skills mc-counterpoint --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jtydhr88/music-composition-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/plugins/music-composition/skills/mc-counterpoint .cursor/skills/mc-counterpoint && 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 "mc-counterpoint" agent skill from https://github.com/jtydhr88/music-composition-skills/tree/main/plugins/music-composition/skills/mc-counterpoint into .cursor/skills/mc-counterpoint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mc-counterpoint", 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/jtydhr88/music-composition-skills.git --path plugins/music-composition/skills/mc-counterpoint--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 jtydhr88/music-composition-skills --skill mc-counterpoint -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install jtydhr88/music-composition-skills mc-counterpoint --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jtydhr88/music-composition-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/plugins/music-composition/skills/mc-counterpoint .gemini/skills/mc-counterpoint && 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 "mc-counterpoint" agent skill from https://github.com/jtydhr88/music-composition-skills/tree/main/plugins/music-composition/skills/mc-counterpoint into .gemini/skills/mc-counterpoint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mc-counterpoint", 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 jtydhr88/music-composition-skills mc-counterpointInstalls 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 jtydhr88/music-composition-skills --skill mc-counterpoint -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/jtydhr88/music-composition-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/plugins/music-composition/skills/mc-counterpoint .github/skills/mc-counterpoint && 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 "mc-counterpoint" agent skill from https://github.com/jtydhr88/music-composition-skills/tree/main/plugins/music-composition/skills/mc-counterpoint into .github/skills/mc-counterpoint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mc-counterpoint", 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 jtydhr88/music-composition-skills --skill mc-counterpoint -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install jtydhr88/music-composition-skills mc-counterpoint --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jtydhr88/music-composition-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/plugins/music-composition/skills/mc-counterpoint .opencode/skills/mc-counterpoint && 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 "mc-counterpoint" agent skill from https://github.com/jtydhr88/music-composition-skills/tree/main/plugins/music-composition/skills/mc-counterpoint into .opencode/skills/mc-counterpoint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mc-counterpoint", 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.
mc-counterpointCounterpoint and voice writing (对位与声部写作) - writing a second line that is genuinely independent rather than a harmony part.
Mc Counterpoint is an agent skill from jtydhr88/music-composition-skills. Counterpoint and voice writing (对位与声部写作) - writing a second line that is genuinely independent rather than a harmony part. The four complementarity axes that make two lines combine (rhythmic density, interval colour, contrary/oblique/similar motion, staggered peaks), contrast between unlike versus like characters, the melodic constraints a contrapuntal line must obey, the five species, and invertible counterpoint for varying a repeat. Use when writing a counter-melody or obbligato, when checking voice leading in…
Its SKILL.md is about 1.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `reference.md`).
It sits in Frontend & Design, covering Accessibility. The repository describes itself as: Professional agent skills for composing and arranging popular music. The licence is MIT.
9 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 7adca0c. 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.
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.
Mc Counterpoint loads about 1.7k tokens when it runs. Until then it costs about 228 tokens; SKILL.md has 338 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); files beside SKILL.md are not scanned.
The full file from jtydhr88/music-composition-skills at commit 7adca0c, republished under its MIT licence (© jtydhr88). 338 words, ~1,685 tokens.
.claude/skills/mc-counterpoint/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.对位是专业级编曲的分水岭。 理由很简单:和声让声部同时响,对位让声部各自活着。 只会和声的编曲,所有非主旋律声部都是"伴奏";会对位的编曲,它们是角色。
本 skill 不教你写练习,教你写第二条线。
| 任务 | 读 |
|---|---|
| 要写一条副旋律/obbligato | §3 四条互补轴(最常用的一节) |
| 两条线黏在一起、听成一条 | §3 + §4 |
| 两条线打架、乱 | §5 旋律约束 |
| 贝司线没有自己的生命 | §3 + §5 |
| 同一段要重复一遍,想变 | ★ §6 二重对位 |
| 和声都对但就是平 | §2 |
| 想系统练 | §7 五类对位 |
| 不归这里 | 归哪 |
|---|---|
| 和弦选什么、功能进行 | mc-harmony |
| 主旋律本身怎么写 | mc-melody |
| 这条线用什么乐器奏 | mc-orchestration |
| 这条线占哪个频段、会不会抢 | mc-texture-layering |
| 这条线什么时候进场退场 | mc-arrangement-arch |
| 赋格、卡农的完整曲式 | reference.md(本 skill 只取能用在编曲里的部分) |
| 三声部及以上的严格写作 | reference.md |
★ 与
mc-harmony的分界:和声管纵向(这一刻响的是什么和弦), 对位管横向(每条线自己走得通不通)。 平行五八度这类声部进行规则归本 skill,不归和声。
| 必填 | 问法 |
|---|---|
| ① 这条线是谁 | 它是一个角色还是一层铺垫?角色才需要对位 |
| ② 与主旋律是哪种对比 | 不同特性 还是 相同特性(§4) |
| ③ 四条互补轴各怎么错开 | §3。说不出四条里的至少两条,这条线就还是伴奏 |
| ④ 主次关系 | ★ 即使两条线都独立,也必须有主有次 |
对比复调:两个或两个以上具有独立性的旋律,以对位原则结合成的复调结构 (p0050)。
艺术表现上特有的功能:
能够同时陈述两个或两个以上具有不同特性的旋律所表现的内容, 并以对位原则谐调地结合为统一体 (p0050)。
用处:戏剧性或交响性音乐里,把两个不同的形象结合起来表现矛盾与冲突, 或描绘宏伟的戏剧场面。
★ 这正是"电影级"的落点之一—— 单一旋律 + 和声只能表达一个东西;对位能同时表达两个,并让它们发生关系。
谱例(丁善德《长征交响曲》II,例 61): 低声部是缓慢悠长、低沉压抑的固定低音,不变地反复三次,表现人民的苦难; 上方单簧管与英国管交替奏出悠扬辽阔的旋律,描绘山区风光。 → 压抑低沉 与 明朗辽阔 两种表情特性的对比结构。
两条线要"既结合又各自独立",靠的是在这四条轴上互补:
| 轴 | 怎么互补 |
|---|---|
| 1. 节奏的疏密 | 一条密时另一条疏。★ 这是四条里最强的一条——两条线节奏同步就一定会被听成一条 |
| 2. 音程结合的色彩 | 变换协和/不协和、三度/六度/四度五度的比例,不要全程平行三度 |
| 3. 声部进行的方向 | 同向、反向、斜向交替分布。★ 全程同向 = 和声声部,不是对位 |
| 4. 旋律线的高峰与低点 | 交错,不要同时到达顶点 |
★ 自检动作:把两条线在这四条轴上逐条打勾。 少于两条互补,你写的就是和声声部,不是对位。
这四条也是"相同特性的对比"的全部技术手段——见 §4.2。
两条线的形象本身就不同(见 §2 的例 61)。 适合:戏剧冲突、双线叙事、影视配乐里"两个角色同时在场"。
谱例(普罗科菲耶夫《第七交响曲》I,例 62): 高声部是抒情委婉的主部主题,低声部的对比旋律富有内在激情与崇高的气质。
构成对比的两个旋律没有鲜明的特性对比, 而是运用对位技术使两个具有共性的旋律产生对比的效果 (p0052)。
手段就是 §3 的四条轴。
★ 这种纯对位性的对比二声部,虽没有形象特征的对比,但却有主要次要之分。
在不同体裁的音乐中经常遇到这种情况: 给已经陈述过的主题旋律配上一条对比旋律,使主题内涵得以丰富、升华。 (p0052)
这句话就是"第二遍副歌怎么变"的答案之一——
不改主旋律,给它加一条对比旋律。
(另外几种办法见 mc-arrangement-arch §6。)
谱例:
不是任何旋律都能拿来对位。 能对位的线有四条特性:
复调合唱旋律要求旋律线平稳流畅、节奏律动宽广悠缓,以适宜于多声部的复调结合 (p0054)。
★ 它不同于器乐音乐中的音型化旋律。 这是最常被违反的一条:拿一条器乐 riff 去和主旋律对位,结果只会打架。
于苏贤原文这条只给了这一句整体判断,没有像 §5.3 那样拆成音程表。 "平稳流畅""宽广悠缓"是一个先于细节的方向判据: 先问这条线像不像合唱队能唱出来的,通过了才去查 §5.3 的音程约束和 §5.4 的节奏约束。
勋伯格《作曲基本原理》里与申克一致的观点: "就大体上来说,一首乐曲就像一个终止式,每一个短句等于终止式中的一个部分, 不过或多或少比较复杂而已。" (p0054)
| 规则 | 说明 |
|---|---|
| 不超过人声音域 | 不要超过合唱队中任何一个声部的音域极限 |
| 避免增减音程 | 以及七度、九度的大跳 |
| 大跳之后反向级进平衡 | 其他自然音程的大跳之后要这样处理 |
| ★ 四度、五度自然音程是好东西 | 可以形成旋律的特性音调,还能起建立调性的结构功能作用——是旋律发展中不可缺少的因素 |
| 但避免连续的四五度大跳 |
总之:以级进为主,再结合上述良好音程的跳进。
★ 与 mc-melody §3 的关系:那边讲单条旋律好不好唱,这边讲两条线能不能配合。
约束更严——因为要同时满足两条线各自成立且合起来成立。
节奏律动要求宽广悠缓,是为了让两条旋律结合时彼此之间可以交替运用不协和音。
具体到两条线怎么摆节奏(p0055–0056):
这是对位技术在编曲里最直接的用处。
二重对位 = 两个声部可以上下交换位置而仍然成立。 写好一次,就得到两个版本——第二遍重复时把上下声部互换, 听起来是新的,但材料完全一样。
| 类型 | 转位方法 | 特点 |
|---|---|---|
| 八度(及十五度)二重对位 | 一个声部移八度 | 最常用,限制最少 |
| 十度二重对位 | 有独特的写作原则 | |
| 十二度二重对位 | 有独特的特征与写作原则 |
★ 贝多芬在《第九》第二乐章里就是这么干的(§4.2 的例 64): 每次重复用声部转位或附加平行三度取得变化。
其他可动对位(详见 reference.md):
本库的用法:ARR-SPEC 里"第二遍副歌怎么变"(lint #16)的一个高级答案, 就是同一条对比旋律做一次八度二重对位的转位。 这比"加一层和声"高级,而且不增加新材料。
以固定调(cantus firmus)为基础,逐级放开节奏:
| 类 | 对法 |
|---|---|
| 第一类 | 一音对一音 |
| 第二类 | 二音对一音 |
| 第三类 | 四音对一音 |
| 第四类 | 切分音对全音符 |
| 第五类 | 混合节奏对全音符(华丽对位) |
为什么要经过严格法则: "通过严格法则的制约,学习、掌握丰富多样的复调技术, 不但不影响在写作自由风格的复调音乐时对个性与才能的发挥, 相反,只有打好坚实的严格对位基础,才能获得敏锐的洞察力, 才能理解大师们在创作实践中是如何灵活运用这些严格对位技术的。" (p0054)
★ 本库的立场:agent 不需要做练习,但需要知道这五级的存在, 因为它们对应"这条对位线有多活跃"的五个刻度—— 第一类 = 一个纯粹的和声声部,第五类 = 一条完全独立的旋律。 每一类的规则本体(音程三档、声部进行六条、弱拍音四种身份、延留音的可用与禁用音程)在 reference.md §2,副旋律出问题时按类查。 写副旋律时,先选一个刻度。
各类的具体规则(和声音程、调性结构、声部进行、终止式)在 reference.md。
| 字段 | 本 skill |
|---|---|
arrangement.roster[].role 为 旋律 的第二件 | §3、§4 |
hooks.arrangement_hook | ★ 一条好的对比旋律就是非人声记忆点(lint #8) |
vocal.chorus_variation / 段落变化 | §6 二重对位(lint #16 的高级解法) |
form[].note | 记"此段为二声部对比复调" |
© jtydhr88, 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 1 other file in plugins/music-composition/skills/mc-counterpoint of jtydhr88/music-composition-skills.
Open the folder on GitHubat commit 7adca0c
Mc Counterpoint 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 |
|---|---|---|---|---|---|---|
| Mc Counterpoint this skilljtydhr88/music-composition-skills | 151 | — | ~1.7k | Automated safety check: Pass | MIT | |
| Web Interface Guidelines Reviewervercel-labs/openreview | 1.7k | 97 repos | ~308 | Automated safety check: Pass | None | |
| Accessibility Reviewmarkmead/hyperui | 12k | 1 repos | ~1.1k | Automated safety check: Pass | MIT | |
| Web Animation DesignbaptisteArno/typebot.io | 11k | 2 repos | ~2.7k | Automated safety check: Pass | Custom licence | |
| Accessibility Fixeribelick/ui-skills | 9.5k | 4 repos | ~1.2k | Automated safety check: Pass | MIT | |
| Wcag Audit PatternsvmDeshpande/ai-agent-automation | 178 | 11 repos | ~610 | Automated safety check: Pass | Apache-2.0 |
vercel-labs/openreview
Review UI code for Web Interface Guidelines compliance. Use when asked to "review my UI", "check accessibility", "audit design", "review UX", or "check my…
markmead/hyperui
Run a WCAG 2.1 AA accessibility audit on a design or page. An agent skill from markmead/hyperui.
baptisteArno/typebot.io
Guides easing, timing and animation choices for UI motion, based on a web animation course, and reviews existing animations in a before-and-after table.
ibelick/ui-skills
Audits and fixes HTML accessibility problems such as ARIA labels, keyboard navigation, focus management, contrast and form errors with minimal changes.
vmDeshpande/ai-agent-automation
Conduct WCAG 2.2 accessibility audits with automated testing, manual verification, and remediation guidance.
ibelick/ui-skills
Applies a fixed set of UI rules for stack, components, interaction, animation, typography and layout, or reviews a file against them with concrete fixes.
jtydhr88/music-composition-skills
The post-generation AI-tell audit (AI 味诊断). An agent skill from jtydhr88/music-composition-skills.
jtydhr88/music-composition-skills
Arrangement architecture (编曲结构学) - the shape of a track over time rather than its notes.
jtydhr88/music-composition-skills
The corpus layer (语料层) - how real recordings are made to testify for or against the textbook rules.
jtydhr88/music-composition-skills
Thematic development (乐思发展层) - what the theme is and what each section does with it.
jtydhr88/music-composition-skills
Song form and section design (曲式与段落) - the terminology, the standard templates, and how to build a setsu backwards from the chorus.
jtydhr88/music-composition-skills
Melody writing (旋律法) - what a melodic line expresses and how to make it singable.
Categories
Counterpoint and voice writing (对位与声部写作) - writing a second line that is genuinely independent rather than a harmony part. Mc Counterpoint is an agent skill from jtydhr88/music-composition-skills. Counterpoint and voice writing (对位与声部写作) - writing a second line that is genuinely independent rather than a harmony part.
Mc Counterpoint fits situations like: writing a counter-melody; checking voice leading in a multi-part passage (parallel fifths and octaves; voice crossing and overlap); two simultaneous lines sound glued together.
Run `npx skills add jtydhr88/music-composition-skills --skill mc-counterpoint -a claude-code`. Or copy the skill folder (plugins/music-composition/skills/mc-counterpoint in jtydhr88/music-composition-skills) into .claude/skills/mc-counterpoint in your project. Claude Code loads it when a task matches its description.
Run `npx skills add jtydhr88/music-composition-skills --skill mc-counterpoint -a codex`. Or copy the skill folder (plugins/music-composition/skills/mc-counterpoint in jtydhr88/music-composition-skills) into .agents/skills/mc-counterpoint 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 jtydhr88/music-composition-skills --skill mc-counterpoint -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/mc-counterpoint, .gemini/skills/mc-counterpoint, .github/skills/mc-counterpoint and .opencode/skills/mc-counterpoint in your project.
SKILL.md names no scripts, command-line tools or credentials: Mc Counterpoint 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 found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Mc Counterpoint is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 1.7k tokens (SKILL.md is roughly 6.7k 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 Mc Counterpoint: Web Interface Guidelines Reviewer (vercel-labs/openreview, 1.7k stars), Accessibility Review (markmead/hyperui, 12k stars), Web Animation Design (baptisteArno/typebot.io, 11k stars) and Accessibility Fixer (ibelick/ui-skills, 9.5k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
jtydhr88 (a GitHub user) maintains it in jtydhr88/music-composition-skills, which has 151 GitHub stars. The repository holds 29 skills in this directory. The repository was last updated on September 22, 2026.
Source: jtydhr88/music-composition-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.