Setup Matt Pocock Skills
bestofjs/bestofjs
Configure this repo for the engineering skills — set up its issue tracker, triage label vocabulary, and domain doc layout.
Triage an Adaptive Cover Pro GitHub issue end-to-end — fetch the attached diagnostics file (or take a local path), run a Sonnet-powered diagnosis, and draft a reply ready to post on the issue.
$ npx skills add jrhubott/adaptive-cover-pro --skill acp-issue-diagnose -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install jrhubott/adaptive-cover-pro acp-issue-diagnose --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/jrhubott/adaptive-cover-pro.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/acp-issue-diagnose .claude/skills/acp-issue-diagnose && 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 "acp-issue-diagnose" agent skill from https://github.com/jrhubott/adaptive-cover-pro/tree/main/.claude/skills/acp-issue-diagnose into .claude/skills/acp-issue-diagnose/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "acp-issue-diagnose", 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/jrhubott/adaptive-cover-pro/tree/main/.claude/skills/acp-issue-diagnoseType 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 jrhubott/adaptive-cover-pro --skill acp-issue-diagnose -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install jrhubott/adaptive-cover-pro acp-issue-diagnose --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jrhubott/adaptive-cover-pro.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/acp-issue-diagnose .agents/skills/acp-issue-diagnose && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "acp-issue-diagnose" agent skill from https://github.com/jrhubott/adaptive-cover-pro/tree/main/.claude/skills/acp-issue-diagnose into .agents/skills/acp-issue-diagnose/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "acp-issue-diagnose", 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 jrhubott/adaptive-cover-pro --skill acp-issue-diagnose -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install jrhubott/adaptive-cover-pro acp-issue-diagnose --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jrhubott/adaptive-cover-pro.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/acp-issue-diagnose .cursor/skills/acp-issue-diagnose && 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 "acp-issue-diagnose" agent skill from https://github.com/jrhubott/adaptive-cover-pro/tree/main/.claude/skills/acp-issue-diagnose into .cursor/skills/acp-issue-diagnose/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "acp-issue-diagnose", 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/jrhubott/adaptive-cover-pro.git --path .claude/skills/acp-issue-diagnose--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 jrhubott/adaptive-cover-pro --skill acp-issue-diagnose -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install jrhubott/adaptive-cover-pro acp-issue-diagnose --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jrhubott/adaptive-cover-pro.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/acp-issue-diagnose .gemini/skills/acp-issue-diagnose && 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 "acp-issue-diagnose" agent skill from https://github.com/jrhubott/adaptive-cover-pro/tree/main/.claude/skills/acp-issue-diagnose into .gemini/skills/acp-issue-diagnose/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "acp-issue-diagnose", 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 jrhubott/adaptive-cover-pro acp-issue-diagnoseInstalls 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 jrhubott/adaptive-cover-pro --skill acp-issue-diagnose -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/jrhubott/adaptive-cover-pro.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/acp-issue-diagnose .github/skills/acp-issue-diagnose && 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 "acp-issue-diagnose" agent skill from https://github.com/jrhubott/adaptive-cover-pro/tree/main/.claude/skills/acp-issue-diagnose into .github/skills/acp-issue-diagnose/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "acp-issue-diagnose", 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 jrhubott/adaptive-cover-pro --skill acp-issue-diagnose -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install jrhubott/adaptive-cover-pro acp-issue-diagnose --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jrhubott/adaptive-cover-pro.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/acp-issue-diagnose .opencode/skills/acp-issue-diagnose && 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 "acp-issue-diagnose" agent skill from https://github.com/jrhubott/adaptive-cover-pro/tree/main/.claude/skills/acp-issue-diagnose into .opencode/skills/acp-issue-diagnose/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "acp-issue-diagnose", 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.
acp-issue-diagnoseTriage an Adaptive Cover Pro GitHub issue end-to-end — fetch the attached diagnostics file (or take a local path), run a Sonnet-powered diagnosis, and draft a reply ready to post on the issue.
Acp Issue Diagnose is an agent skill from jrhubott/adaptive-cover-pro. Triage an Adaptive Cover Pro GitHub issue end-to-end — fetch the attached diagnostics file (or take a local path), run a Sonnet-powered diagnosis, and draft a reply ready to post on the issue. Use when the user says "triage issue NNN", "look at issue NNN", "diagnose issue NNN", "draft a response to issue NNN", or hands over a local diagnostics file with "draft an issue reply".
Its SKILL.md is about 2.8k 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 Development, covering Issue triage. It works with GitHub and Home Assistant. The repository describes itself as: Adaptive sun-tracking cover control for Home Assistant: blinds, awnings, and venetian tilts with climate-aware positioning and a priority override pipeline. The licence is MIT.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit c03d682. 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.
Shell commands in SKILL.md call:
ghcurlpython3pythonFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
github.comFrom 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.
Acp Issue Diagnose loads about 2.8k tokens when it runs. Until then it costs about 100 tokens; SKILL.md has 713 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 jrhubott/adaptive-cover-pro at commit c03d682, republished under its MIT licence (© jrhubott). 713 words, ~2,762 tokens.
.claude/skills/acp-issue-diagnose/SKILL.md (or your agent's skills folder).End-to-end triage workflow for adaptive-cover-pro GitHub issues that include a diagnostics dump. This skill fetches, diagnoses (Sonnet), and drafts a reply. Posting the reply is gated behind explicit user confirmation.
For one-off analysis of a JSON file with no GitHub-issue context, use the simpler acp-diagnose skill instead.
| User says… | Mode |
|---|---|
| "issue 285", "#285", a GitHub issue URL | issue mode — fetch from GitHub |
A path like /tmp/foo.json, "this file", or a paste of JSON | local mode — skip the fetch step |
If the user says only "diagnose this" with no number, file, or attachment, ask: "Issue number (e.g. 285) or path to a diagnostics file?"
gh issue view <N> --json number,title,body,author,state,labels,createdAt,commentsParse the body for attachment URLs. Home Assistant's diagnostics download is a JSON file; users sometimes rename it to .log. Match this regex on the body:
https://github\.com/user-attachments/files/\d+/[^\s\)]+\.(?:json|log|txt)Download to /tmp/:
URL="<attachment-url>"
OUT="/tmp/acp-issue-<N>-$(basename "$URL")"
gh api "$URL" > "$OUT" # gh handles auth; works for private repos tooIf gh api fails (occasionally happens for the user-attachments host), fall back to:
curl -sSL -H "Authorization: Bearer $(gh auth token)" "$URL" -o "$OUT"Verify it parsed:
python3 -c "import json; json.load(open('$OUT'))" && echo OKIf parse fails, the file is likely an HTML error page (auth/redirect). Show the first 200 bytes to the user and stop.
Take the path verbatim. If it's a paste, write it to /tmp/acp-diag-paste.json first, then validate parse.
Dispatch one subagent with the Sonnet model. Do not run the analysis in the main thread — the diagnostics file is large and the structured walkthrough is exactly what a delegated subagent is for.
Agent(
description: "Sonnet diagnosis of ACP diagnostics",
subagent_type: "general-purpose",
model: "sonnet",
prompt: <see template below>
)You are diagnosing an Adaptive Cover Pro diagnostics dump for a GitHub issue.
Diagnostics file: <ABSOLUTE_PATH>
Issue context (may be empty for local-mode runs):
Number: <N or "n/a">
Title: <title or "n/a">
Reporter: <login or "n/a">
ACP version reported in body: <version or "n/a">
HA version reported in body: <version or "n/a">
Cover type reported in body: <type or "n/a">
Reporter's description (verbatim, may be truncated):
---
<first ~1500 chars of issue body, describe + reproduction sections preferred>
---
Your job:
1. Run the triage engine over the diagnostics file (from the repo root, with the
dev virtualenv — the package import pulls Home Assistant):
venv/bin/python scripts/triage_json.py <ABSOLUTE_PATH> [--latest-version <X.Y.Z>]
That runs the SAME declarative rule table as the in-product Troubleshoot step and
prints one line per finding plus a wiki deep link. Do NOT re-implement the checks
by hand — the engine owns them. Pass --latest-version when the issue names the
newest release so the STALE_VERSION check can fire.
2. Read the diagnostics file (Read tool, or Bash+Python `json.load` for large files)
to investigate anything the engine did NOT flag. Remember the offline seam: the
download lacks per-entity capabilities and axis requirements, so rules 8a
(COVER_NOT_READY) and 13 (COVER_FEATURE_MISMATCH) cannot fire offline — check a
suspected capability mismatch by hand. An unexplained symptom is a missing rule
row: note it so the maintainer can add one (see the Developer-Triage-Rules wiki).
3. Cross-reference the reporter's described symptom against the diagnostics:
- Does the diagnostics state corroborate the symptom? (e.g. "covers don't move" + `gave_up=true`)
- Or contradict it? (e.g. "manual override stuck" + `manual_override_state.entries == []`)
- Or is the symptom outside what diagnostics can show? (e.g. a UI rendering bug)
4. Identify the most likely root cause(s), ranked.
5. Note any missing information you'd need to confirm — specific entity states, HA logs around a timestamp, repro steps, etc.
Output a single JSON object with this shape — no commentary, no markdown fences:
{
"header": {
"integration_version": "...",
"cover_type": "...",
"last_update_success": true,
"last_update_time": "..."
},
"critical": ["..."], // empty array if none
"warnings": ["..."],
"findings": ["..."], // bullet-form, plain English
"decision_trace_summary": "Winning handler: X (position: Y%, reason: ...)",
"symptom_vs_diagnostics": "corroborated" | "contradicted" | "orthogonal" | "insufficient",
"symptom_analysis": "1-3 sentences: how the diagnostics relate to what the reporter described",
"root_cause_ranked": [
{"hypothesis": "...", "confidence": "high|medium|low", "evidence": "..."}
],
"info_needed": ["..."], // empty array if you have enough
"config_suggestions": ["..."], // concrete option changes if applicable
"summary": "1-2 sentences for the issue reply"
}
Keep total output under ~3KB. Be specific — cite handler names, option names, entity IDs.When the subagent returns, parse its JSON. If parsing fails, show the user what came back and ask whether to retry; do not silently fix.
Use the structured output from Step 2 to assemble a markdown comment. Voice: first-person ("I"), matching the maintainer's tone in the existing repo. Tone: direct, technical, friendly. No filler ("Thanks for reporting!"), no emoji unless flagging a critical issue with a single 🔴.
Looked at the diagnostics — running ACP {version}, cover type `{cover_type}`, last update {ok/FAILED} at {time}.
**What I see:**
{2–4 bullets of the most relevant findings — pull from `findings` and `decision_trace_summary`. Lead with anything in `critical`.}
**Most likely cause:**
{`root_cause_ranked[0].hypothesis` with one-sentence evidence. If confidence is low, hedge ("might be"). If multiple hypotheses are roughly tied, list the top two.}
**Suggested next step:**
{Pull from `config_suggestions` if any. Otherwise: what to try, or what info you need.}
{If `info_needed` is non-empty, add:}
**To confirm, could you share:**
- {bullet per item}If critical is non-empty, lead with a single line:
🔴 The diagnostics show {first critical item}.…then the rest of the template.
I don't see a diagnostics dump on this issue yet — could you attach one?
In Home Assistant: Settings → Devices & Services → Adaptive Cover Pro → ⋮ (the row's overflow menu) → Download diagnostics. Drop the resulting `.json` file into a comment here.
If you can also include:
- A rough timestamp of when the misbehavior happened (so I can correlate against the diagnostics)
- The relevant `cover.*` entity ID
…that'd let me get to a root cause faster.Always show the drafted reply to the user first. Then ask one question:
Post this comment on issue #N, edit it first, or leave it as-is for me to post manually?
Only if the user explicitly says "post it" / "yes, post" do you run:
gh issue comment <N> --body "$(cat <<'EOF'
<reply markdown>
EOF
)"⚠️ Posting to GitHub is shared state. Never post without explicit confirmation in the current turn. A prior approval for a different issue does not carry over.
Do not add labels, close the issue, or assign. Those are maintainer judgments outside this skill's scope.
After Step 3 (drafted but not posted), report:
ACP issue triage — #<N> "<title>" by @<author>
Diagnostics: <path or attachment URL>
ACP <version> · <cover_type> · last update <ok|FAILED>
Verdict: <one-sentence summary from Sonnet>
Confidence: <high|medium|low — from root_cause_ranked[0]>
--- DRAFT REPLY ---
<full markdown reply>
--- END DRAFT ---
Post this on #<N>, edit, or leave for manual posting?For local-mode runs (no issue number), drop the #N lines and end with:
No issue number provided — copy the draft above into your reply manually, or give me an issue number to post it to.symptom_vs_diagnostics == "contradicted"), say so plainly in the reply rather than papering over it. The contradiction is itself a useful finding.scripts/triage_json.py — the SAME rule engine as the in-product Troubleshoot step. New checks are added as rule rows in diagnostics/triage.py (see the Developer-Triage-Rules wiki), never as prose in a skill file, so both this skill and the offline acp-diagnose skill pick them up automatically.https://github.com/user-attachments/files/<id>/<filename>.config_entry-adaptive_cover_pro-<ULID>.json. Some reporters rename to .log — that's why the regex accepts .json|.log|.txt.© jrhubott, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/acp-issue-diagnose of jrhubott/adaptive-cover-pro.
Open the folder on GitHubat commit c03d682
Acp Issue Diagnose 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 |
|---|---|---|---|---|---|---|
| Acp Issue Diagnose this skilljrhubott/adaptive-cover-pro | 176 | — | ~2.8k | Automated safety check: Pass | MIT | |
| Setup Matt Pocock Skillsbestofjs/bestofjs | 3.1k | 20 repos | ~1.7k | Automated safety check: Pass | MIT | |
| Windows App SDK Issue Triage Reportmicrosoft/WindowsAppSDK | 4.7k | — | ~3.4k | Automated safety check: Pass | Apache-2.0 | |
| Exposed Bug Fix WorkflowJetBrains/Exposed | 9.3k | — | ~3.8k | Automated safety check: Pass | Apache-2.0 | |
| Pre-Release PR Triagejamiepine/voicebox | 57k | — | ~3.1k | Automated safety check: Pass | MIT | |
| WinAppSDK Triage Meeting Prepmicrosoft/WindowsAppSDK | 4.7k | — | ~2.8k | Automated safety check: Pass | Apache-2.0 |
bestofjs/bestofjs
Configure this repo for the engineering skills — set up its issue tracker, triage label vocabulary, and domain doc layout.
microsoft/WindowsAppSDK
Generates GitHub Feature Area Status reports for the Windows App SDK repository, scoring issues so teams can see what needs attention in each area.
JetBrains/Exposed
Takes a GitHub or YouTrack issue for the Exposed project through reproduction, a failing test, a fix, validation and a pull request.
jamiepine/voicebox
Sorts a backlog of open pull requests into must-merge, candidate, superseded and deferred, writes a triage doc and works the merge loop before a release.
microsoft/WindowsAppSDK
Prepares the triage meeting summary for WinAppSDK Needs-Triage issues, with research-backed area suggestions, draft replies and a diff since the last triage.
a2ui-project/a2ui
Automates the triage of GitHub issues in the A2UI repository.
jrhubott/adaptive-cover-pro
Analyze an Adaptive Cover Pro diagnostics JSON file and produce a triage report.
jrhubott/adaptive-cover-pro
Root-cause a misbehaving Adaptive Cover Pro cover on a RUNNING Home Assistant install by pulling live diagnostics over the HA MCP, correlating against the recorder, proving the mechanism with a…
jrhubott/adaptive-cover-pro
Sync DE/FR translations with en.json, add a new language, drop a language, or check translation status for the Adaptive Cover Pro integration.
Works with
Categories
Triage an Adaptive Cover Pro GitHub issue end-to-end — fetch the attached diagnostics file (or take a local path), run a Sonnet-powered diagnosis, and draft a reply ready to post on the issue. Acp Issue Diagnose is an agent skill from jrhubott/adaptive-cover-pro. Triage an Adaptive Cover Pro GitHub issue end-to-end — fetch the attached diagnostics file (or take a local path), run a Sonnet-powered diagnosis, and draft a reply ready to post on the issue.
Acp Issue Diagnose fits situations like: the user says triage issue NNN; look at issue NNN; diagnose issue NNN; draft a response to issue NNN.
Run `npx skills add jrhubott/adaptive-cover-pro --skill acp-issue-diagnose -a claude-code`. Or copy the skill folder (.claude/skills/acp-issue-diagnose in jrhubott/adaptive-cover-pro) into .claude/skills/acp-issue-diagnose in your project. Claude Code loads it when a task matches its description.
Run `npx skills add jrhubott/adaptive-cover-pro --skill acp-issue-diagnose -a codex`. Or copy the skill folder (.claude/skills/acp-issue-diagnose in jrhubott/adaptive-cover-pro) into .agents/skills/acp-issue-diagnose 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 jrhubott/adaptive-cover-pro --skill acp-issue-diagnose -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/acp-issue-diagnose, .gemini/skills/acp-issue-diagnose, .github/skills/acp-issue-diagnose and .opencode/skills/acp-issue-diagnose in your project.
Going by SKILL.md and its folder, Acp Issue Diagnose needs the command-line tools its instructions call (gh, curl, python3 and python). Our summary lists: Python 3.
SKILL.md names 1 domain. In commands or code: github.com; the agent is likely to contact it when it follows the instructions. 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.
Acp Issue Diagnose is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.8k tokens (SKILL.md is roughly 11k 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 Acp Issue Diagnose: Setup Matt Pocock Skills (bestofjs/bestofjs, 3.1k stars), Windows App SDK Issue Triage Report (microsoft/WindowsAppSDK, 4.7k stars), Exposed Bug Fix Workflow (JetBrains/Exposed, 9.3k stars) and Pre-Release PR Triage (jamiepine/voicebox, 57k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
jrhubott (a GitHub user) maintains it in jrhubott/adaptive-cover-pro, which has 176 GitHub stars. The repository holds 4 skills in this directory. The repository was last updated on October 9, 2026.
Source: jrhubott/adaptive-cover-pro on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.