Obsidian Canvas Export
AgriciDaniel/claude-canvas
Exports Obsidian Canvas files to PNG, SVG or PDF, using the Advanced Canvas plugin when Obsidian is open and falling back to a Playwright screenshot.
Renders a single source document as a narrative slide-deck PDF through NotebookLM, saved beside the original file for sharing.
$ npx skills add thedotmack/claude-mem --skill wowerpoint -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install thedotmack/claude-mem wowerpoint --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/thedotmack/claude-mem.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugin/skills/wowerpoint .claude/skills/wowerpoint && 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 "wowerpoint" agent skill from https://github.com/thedotmack/claude-mem/tree/main/plugin/skills/wowerpoint into .claude/skills/wowerpoint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "wowerpoint", 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/thedotmack/claude-mem/tree/main/plugin/skills/wowerpointType 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 thedotmack/claude-mem --skill wowerpoint -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install thedotmack/claude-mem wowerpoint --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/thedotmack/claude-mem.git skills-src && mkdir -p .agents/skills && cp -r skills-src/plugin/skills/wowerpoint .agents/skills/wowerpoint && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "wowerpoint" agent skill from https://github.com/thedotmack/claude-mem/tree/main/plugin/skills/wowerpoint into .agents/skills/wowerpoint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "wowerpoint", 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 thedotmack/claude-mem --skill wowerpoint -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install thedotmack/claude-mem wowerpoint --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/thedotmack/claude-mem.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/plugin/skills/wowerpoint .cursor/skills/wowerpoint && 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 "wowerpoint" agent skill from https://github.com/thedotmack/claude-mem/tree/main/plugin/skills/wowerpoint into .cursor/skills/wowerpoint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "wowerpoint", 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/thedotmack/claude-mem.git --path plugin/skills/wowerpoint--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 thedotmack/claude-mem --skill wowerpoint -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install thedotmack/claude-mem wowerpoint --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/thedotmack/claude-mem.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/plugin/skills/wowerpoint .gemini/skills/wowerpoint && 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 "wowerpoint" agent skill from https://github.com/thedotmack/claude-mem/tree/main/plugin/skills/wowerpoint into .gemini/skills/wowerpoint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "wowerpoint", 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 thedotmack/claude-mem wowerpointInstalls 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 thedotmack/claude-mem --skill wowerpoint -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/thedotmack/claude-mem.git skills-src && mkdir -p .github/skills && cp -r skills-src/plugin/skills/wowerpoint .github/skills/wowerpoint && 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 "wowerpoint" agent skill from https://github.com/thedotmack/claude-mem/tree/main/plugin/skills/wowerpoint into .github/skills/wowerpoint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "wowerpoint", 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 thedotmack/claude-mem --skill wowerpoint -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install thedotmack/claude-mem wowerpoint --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/thedotmack/claude-mem.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/plugin/skills/wowerpoint .opencode/skills/wowerpoint && 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 "wowerpoint" agent skill from https://github.com/thedotmack/claude-mem/tree/main/plugin/skills/wowerpoint into .opencode/skills/wowerpoint/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "wowerpoint", 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.
wowerpointRenders a single source document as a narrative slide-deck PDF through NotebookLM, saved beside the original file for sharing.
You hand the agent one document and get one PDF back. The agent creates a NotebookLM notebook with the `notebooklm` command-line tool, adds the document as the only source, and passes the slow generation step to a background subagent, because rendering takes roughly 10 minutes. It ends its turn by printing the notebook address so you can watch progress.
If the source document is missing or too short to carry a deck, the agent is told to write a long, narrative version first rather than pad the notebook with extra sources. The PDF is named after the source with a -slides suffix and placed in the same folder, falling back to a reports folder. Only slide decks are covered; videos and podcasts are left to the CLI itself. Setup needs `notebooklm-py`, Playwright Chromium and `jq`, plus a login you complete yourself in your own terminal.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit fa8ab09. 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:
jquvcurlbrewFrom 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:
notebooklm.google.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
WOWERPOINT_UPLOAD_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Wowerpoint Slide Decks loads about 2.2k tokens when it runs. Until then it costs about 58 tokens; SKILL.md has 573 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 thedotmack/claude-mem at commit fa8ab09, republished under its Apache-2.0 licence (© thedotmack). 573 words, ~2,207 tokens.
.claude/skills/wowerpoint/SKILL.md (or your agent's skills folder).One doc in, one PDF out. Slide-deck only — videos and podcasts from the same engine are noticeably worse and out of scope; refer the user to the notebooklm CLI directly if they want those.
<file>"<file>"If notebooklm auth check returns 0 and command -v jq resolves, skip.
uv tool install --with playwright --force notebooklm-py
$(uv tool dir)/notebooklm-py/bin/playwright install chromiumjq is required by the workflow's JSON parsing; install if missing (brew install jq on macOS, or your distro's package manager).
Then the user authenticates interactively — do not script. Tell them to type ! notebooklm login so the OAuth ENTER lands in their terminal.
You need exactly one source doc. If it doesn't exist or is too thin to carry a deck, write it first — use mem-search and sequential thinking to make it comprehensive (long-form, narrative, several thousand words is normal). Do not paper over a weak source by adding more sources.
notebooklm auth check 2>&1 | tail -5Exit 1 with Run 'notebooklm login' to authenticate. = halt and tell the user.
NOTEBOOK_ID=$(notebooklm create "<title>" --json | jq -r .notebook.id)
SOURCE_ID=$(notebooklm source add "<doc-path>" --notebook "$NOTEBOOK_ID" --json | jq -r .source.id)Title: H1 of the source doc, or its filename stem; append a date for dated work.
JSON envelope keys differ — create → .notebook.id, source add → .source.id, generate → .task_id. Wrong key = empty string = silent downstream failure.
Generation takes ~10 minutes; never block on it. Use the template below with run_in_background: true.
Print the notebook URL so the user can watch live:
https://notebooklm.google.com/notebook/<NOTEBOOK_ID>The subagent's completion notification fires when the file is on disk.
Adjacent to the source, parallel filename:
<source-dir>/<source-stem>-slides.pdfIf the source isn't somewhere that makes sense as an output location, default to reports/<stem>-slides.pdf.
After the PDF lands on disk, the subagent also POSTs it to the WOWerpoint Server, which converts the 16:9 deck into a 9:16 mobile twin and returns a share URL. The share URL is the primary deliverable to the user; the PDF on disk is the backup.
Required env (exported in the user's shell — the subagent inherits the parent's environment, so plain export is enough; no dotenv loader runs):
WOWERPOINT_API_BASE=https://wowerpoint-api.<subdomain>.workers.dev
WOWERPOINT_VIEWER_BASE=https://wowerpoint-viewer.<subdomain>.workers.dev
WOWERPOINT_UPLOAD_TOKEN=<token>If any var is missing, skip the share-link step and just hand the PDF over.
Upload pattern (run AFTER the subagent confirms the PDF exists on disk). Capture the full response so empty id and error payloads are handled — jq -r '.id' returns the literal string null on a missing key, so always pipe through .id // empty:
if [ -n "$WOWERPOINT_API_BASE" ] && [ -n "$WOWERPOINT_UPLOAD_TOKEN" ] && [ -n "$WOWERPOINT_VIEWER_BASE" ]; then
UPLOAD_JSON=$(curl -sS --connect-timeout 10 --max-time 30 -X POST "$WOWERPOINT_API_BASE/api/decks" \
-H "Authorization: Bearer $WOWERPOINT_UPLOAD_TOKEN" \
-F "file=@<OUTPUT_PATH>" \
-F "title=<TITLE>")
DECK_ID=$(printf '%s' "$UPLOAD_JSON" | jq -r '.id // empty')
API_ERROR=$(printf '%s' "$UPLOAD_JSON" | jq -r '.error // empty')
if [ -n "$API_ERROR" ] || [ -z "$DECK_ID" ]; then
echo "WOWerpoint upload warning: ${API_ERROR:-missing id}"
else
echo "Share URL: $WOWERPOINT_VIEWER_BASE/$DECK_ID"
fi
fiThe returned id is a kebab-case slug derived from the title with a random creature suffix (e.g. tokenrouter-quest-hawk, or velvet-comet-tiger if the title is empty or non-ASCII). The share URL is:
$WOWERPOINT_VIEWER_BASE/<id>It works immediately (shows a "still converting…" page that auto-reloads when ready). Conversion takes ~1–2 min per slide. Print the share URL in your final response.
One sentence. Default:
Use kawaii characters to tell the story of <subject>. Keep it warm and clear.Replace <subject> with a one-phrase description from the source doc's H1 or the user's framing. If the user supplies their own prompt, pass it through verbatim — don't expand it.
You're handling NotebookLM slide-deck generation. Work in `<repo-absolute-path>`.
Context:
- The `notebooklm` CLI is installed and authenticated (parent verified with `notebooklm auth check`).
- A notebook and source already exist.
Inputs:
- Notebook ID: `<NOTEBOOK_ID>`
- Source ID: `<SOURCE_ID>`
- Generation prompt: `<PROMPT>`
- Output path: `<OUTPUT_PATH>`
- Deck title: `<TITLE>` (the notebook title, used by the share-link step)
Steps:
1. Wait for source: `notebooklm source wait <SOURCE_ID> -n <NOTEBOOK_ID> --timeout 600`
Exit 0 = ready, 1 = error, 2 = timeout. On timeout, run `notebooklm source list -n <NOTEBOOK_ID> --json` and report status.
2. Generate: `notebooklm generate slide-deck "<PROMPT>" --format detailed --length default --notebook <NOTEBOOK_ID> --json --retry 2`
Parse `task_id` from the JSON (key is `task_id` at top level).
On `GENERATION_FAILED` or "No result found for RPC ID": sleep 300, retry once, then give up.
3. Wait for artifact: `notebooklm artifact wait <task_id> -n <NOTEBOOK_ID> --timeout 1800`
4. Download: `notebooklm download slide-deck <OUTPUT_PATH> -a <task_id> -n <NOTEBOOK_ID>`
5. Verify: `ls -la <OUTPUT_PATH>` confirms the file exists.
6. Upload to WOWerpoint Server for a mobile share link. Skip silently if any of `WOWERPOINT_API_BASE`, `WOWERPOINT_UPLOAD_TOKEN`, or `WOWERPOINT_VIEWER_BASE` is unset. Otherwise:
```bash
if [ -n "$WOWERPOINT_API_BASE" ] && [ -n "$WOWERPOINT_UPLOAD_TOKEN" ] && [ -n "$WOWERPOINT_VIEWER_BASE" ]; then
UPLOAD_JSON=$(curl -sS --connect-timeout 10 --max-time 30 -X POST "$WOWERPOINT_API_BASE/api/decks" \
-H "Authorization: Bearer $WOWERPOINT_UPLOAD_TOKEN" \
-F "file=@<OUTPUT_PATH>" \
-F "title=<TITLE>")
DECK_ID=$(printf '%s' "$UPLOAD_JSON" | jq -r '.id // empty')
API_ERROR=$(printf '%s' "$UPLOAD_JSON" | jq -r '.error // empty')
if [ -n "$API_ERROR" ] || [ -z "$DECK_ID" ]; then
echo "WOWerpoint upload warning: ${API_ERROR:-missing id}"
else
echo "Share URL: $WOWERPOINT_VIEWER_BASE/$DECK_ID"
fi
fiOn warning, the PDF on disk is still a valid deliverable — do not retry the upload.
Report briefly (under 200 words):
Do NOT poll status manually. The wait commands handle backoff.
## Failure modes
- **`pip: command not found`** — modern macOS doesn't ship pip on PATH. Use `uv tool install`.
- **`Playwright not installed`** — install `notebooklm-py` with `--with playwright`, then `playwright install chromium`.
- **`Run 'notebooklm login' to authenticate`** — only the user can complete OAuth.
- **`task_id` parsed as empty string** — wrong JSON envelope key. `generate` returns `{"task_id": "..."}` at top level.
- **Rate-limit (`GENERATION_FAILED` or "No result found for RPC ID")** — `--retry 2` handles transients; persistent failure means wait 5–10 minutes or fall back to the web UI.
- **Source upload denied for sensitive docs** — confirm before adding sources containing credentials, customer data, or unreleased product info. NotebookLM is a Google service.
- **`--length long` does not exist** — only `default|short`. If the user asks for "long slides," use `default` and explain.
- **No `--style` flag** — kawaii lives in the prompt text.
## Operational tips
- **Rerun cheaply** — once the notebook + source exist, regenerating with a different prompt only repeats generation + download. Reuse `NOTEBOOK_ID` and `SOURCE_ID`.
- **Web UI fallback** — if generation is rate-limited >30 minutes, open the notebook URL, trigger generation in the UI, then `notebooklm artifact list -n <NOTEBOOK_ID>` and `download`.© thedotmack, Apache-2.0. 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 plugin/skills/wowerpoint of thedotmack/claude-mem.
Open the folder on GitHubat commit fa8ab09
Wowerpoint Slide Decks 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 |
|---|---|---|---|---|---|---|
| Wowerpoint Slide Decks this skillthedotmack/claude-mem | 99k | — | ~2.2k | Automated safety check: Pass | Apache-2.0 | |
| Obsidian Canvas ExportAgriciDaniel/claude-canvas | 300 | — | ~1.2k | Automated safety check: Pass | MIT | |
| Huashu Markdown Publishing Pipelinealchaincyf/huashu-md-html | 907 | — | ~4.8k | Automated safety check: Pass | MIT | |
| Paper Deckzsyggg/paper-craft-skills | 1.3k | — | ~1.4k | Automated safety check: Pass | None | |
| Paper2slidesQuZhan51496/paper2anything | 469 | — | ~3.8k | Automated safety check: Notes | Apache-2.0 | |
| Li CarouselJakeschincariol/linkedin-agent-skill | 1.6k | — | ~715 | Automated safety check: Pass | MIT |
AgriciDaniel/claude-canvas
Exports Obsidian Canvas files to PNG, SVG or PDF, using the Advanced Canvas plugin when Obsidian is open and falling back to a Playwright screenshot.
alchaincyf/huashu-md-html
Converts files and web pages into clean Markdown, then turns Markdown into polished HTML, Word, PDF and EPUB using four templates.
zsyggg/paper-craft-skills
将论文、技术文章或知识内容制作成高真实感的 AIGC 幻灯片。先做叙事结构和逐页视觉导演,再调用生图模型生成每一页 16:9 slide image,最后合成为 PPTX/PDF。适合论文汇报、组会、公开课、技术分享、商业化研究展示;当用户提到“论文PPT”“AI生成PPT”“不像AI的PPT”“高质感幻灯片”“逐页生图PPT”时使用。
QuZhan51496/paper2anything
Turn an academic paper PDF into a presentation deck (.pptx) end-to-end.
Jakeschincariol/linkedin-agent-skill
Build a LinkedIn document post (carousel) - slide-by-slide copy, the cover that earns the swipe, and the PDF to upload.
lxsssssss/pdf-translate
A skill your agent uses when translating PDF documents between languages while strictly preserving original layout, formatting, typography, tables, and signatures.
thedotmack/claude-mem
Walks you through creating, installing and verifying a custom claude-mem mode, including note types, tags and optional Telegram alerts for chosen memories.
thedotmack/claude-mem
Keeps watching a pull request, fixing real review and CI problems and resolving stale threads, until it is clean and ready to merge.
thedotmack/claude-mem
Use this when setting up claude-mem on Grok Bot: local worker plus CMEM Pro observer (default), optional host-login observer, or remote cmem.ai. No Cursor…
thedotmack/claude-mem
Checks claude-mem cloud sync status and guides you through connecting a cmem.ai Pro account without the sync token ever passing through the chat.
thedotmack/claude-mem
Audits a design against Dieter Rams' ten principles of good design, scores each with evidence, and hands off a make-plan prompt for a new, refined or redesigned outcome.
thedotmack/claude-mem
Writes a HANDOFF.md capturing goal, state, files, failed attempts and next steps so a fresh agent session can continue exactly where this one stopped.
Works with
Categories
Renders a single source document as a narrative slide-deck PDF through NotebookLM, saved beside the original file for sharing. You hand the agent one document and get one PDF back. The agent creates a NotebookLM notebook with the `notebooklm` command-line tool, adds the document as the only source, and passes the slow generation step to a background subagent, because rendering takes roughly 10 minutes.
Wowerpoint Slide Decks fits situations like: turning a finished report into a shareable slide-deck PDF; presenting one long markdown document as a narrative deck without building slides by hand; producing a visual summary of a design doc or research write-up for people who will not read it in full.
Run `npx skills add thedotmack/claude-mem --skill wowerpoint -a claude-code`. Or copy the skill folder (plugin/skills/wowerpoint in thedotmack/claude-mem) into .claude/skills/wowerpoint in your project. Claude Code loads it when a task matches its description.
Run `npx skills add thedotmack/claude-mem --skill wowerpoint -a codex`. Or copy the skill folder (plugin/skills/wowerpoint in thedotmack/claude-mem) into .agents/skills/wowerpoint 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 thedotmack/claude-mem --skill wowerpoint -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/wowerpoint, .gemini/skills/wowerpoint, .github/skills/wowerpoint and .opencode/skills/wowerpoint in your project.
Going by SKILL.md and its folder, Wowerpoint Slide Decks needs the command-line tools its instructions call (jq, uv, curl and brew) and credentials named WOWERPOINT_UPLOAD_TOKEN. Our summary lists: The `notebooklm` CLI (`notebooklm-py`), installed with `uv`; Playwright with Chromium; `jq`; An interactive `notebooklm login` that you run yourself.
SKILL.md names 1 domain. In commands or code: notebooklm.google.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.
Wowerpoint Slide Decks is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.2k tokens (SKILL.md is roughly 8.8k 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 Wowerpoint Slide Decks: Obsidian Canvas Export (AgriciDaniel/claude-canvas, 300 stars), Huashu Markdown Publishing Pipeline (alchaincyf/huashu-md-html, 907 stars), Paper Deck (zsyggg/paper-craft-skills, 1.3k stars) and Paper2slides (QuZhan51496/paper2anything, 469 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
thedotmack (a GitHub user) maintains it in thedotmack/claude-mem, which has 98,732 GitHub stars. The repository holds 26 skills in this directory. The repository was last updated on October 9, 2026.
Source: thedotmack/claude-mem on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.