Blog Locale Audit
AgriciDaniel/claude-blog
Audit a directory of multilingual blog content for completeness, consistency, hreflang correctness, meta-tag parity, and freshness.
One-command multilingual blog creation. An agent skill from Infrasity-Labs/dev-gtm-claude-skills.
$ npx skills add Infrasity-Labs/dev-gtm-claude-skills --skill blog-multilingual -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Infrasity-Labs/dev-gtm-claude-skills blog-multilingual --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/Infrasity-Labs/dev-gtm-claude-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/blog-multilingual .claude/skills/blog-multilingual && 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 "blog-multilingual" agent skill from https://github.com/Infrasity-Labs/dev-gtm-claude-skills/tree/main/.claude/skills/blog-multilingual into .claude/skills/blog-multilingual/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "blog-multilingual", 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/Infrasity-Labs/dev-gtm-claude-skills/tree/main/.claude/skills/blog-multilingualType 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 Infrasity-Labs/dev-gtm-claude-skills --skill blog-multilingual -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Infrasity-Labs/dev-gtm-claude-skills blog-multilingual --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Infrasity-Labs/dev-gtm-claude-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/blog-multilingual .agents/skills/blog-multilingual && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "blog-multilingual" agent skill from https://github.com/Infrasity-Labs/dev-gtm-claude-skills/tree/main/.claude/skills/blog-multilingual into .agents/skills/blog-multilingual/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "blog-multilingual", 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 Infrasity-Labs/dev-gtm-claude-skills --skill blog-multilingual -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Infrasity-Labs/dev-gtm-claude-skills blog-multilingual --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Infrasity-Labs/dev-gtm-claude-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/blog-multilingual .cursor/skills/blog-multilingual && 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 "blog-multilingual" agent skill from https://github.com/Infrasity-Labs/dev-gtm-claude-skills/tree/main/.claude/skills/blog-multilingual into .cursor/skills/blog-multilingual/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "blog-multilingual", 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/Infrasity-Labs/dev-gtm-claude-skills.git --path .claude/skills/blog-multilingual--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 Infrasity-Labs/dev-gtm-claude-skills --skill blog-multilingual -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Infrasity-Labs/dev-gtm-claude-skills blog-multilingual --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Infrasity-Labs/dev-gtm-claude-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/blog-multilingual .gemini/skills/blog-multilingual && 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 "blog-multilingual" agent skill from https://github.com/Infrasity-Labs/dev-gtm-claude-skills/tree/main/.claude/skills/blog-multilingual into .gemini/skills/blog-multilingual/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "blog-multilingual", 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 Infrasity-Labs/dev-gtm-claude-skills blog-multilingualInstalls 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 Infrasity-Labs/dev-gtm-claude-skills --skill blog-multilingual -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Infrasity-Labs/dev-gtm-claude-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/blog-multilingual .github/skills/blog-multilingual && 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 "blog-multilingual" agent skill from https://github.com/Infrasity-Labs/dev-gtm-claude-skills/tree/main/.claude/skills/blog-multilingual into .github/skills/blog-multilingual/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "blog-multilingual", 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 Infrasity-Labs/dev-gtm-claude-skills --skill blog-multilingual -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Infrasity-Labs/dev-gtm-claude-skills blog-multilingual --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Infrasity-Labs/dev-gtm-claude-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/blog-multilingual .opencode/skills/blog-multilingual && 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 "blog-multilingual" agent skill from https://github.com/Infrasity-Labs/dev-gtm-claude-skills/tree/main/.claude/skills/blog-multilingual into .opencode/skills/blog-multilingual/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "blog-multilingual", 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.
blog-multilingualOne-command multilingual blog creation. An agent skill from Infrasity-Labs/dev-gtm-claude-skills.
Blog Multilingual is an agent skill from Infrasity-Labs/dev-gtm-claude-skills. One-command multilingual blog creation. Writes a blog post, translates it into user-specified languages, applies cultural adaptation, and emits hreflang tags, sitemap entries, and a CMS-ready language map. The complete write-to-publish pipeline for international content. Orchestrates blog-write, blog-translate, blog-localize, and (optionally) seo-hreflang. Use when user says "multilingual blog", "blog multilingual", "write in multiple languages", "international blog", "mehrsprachiger Blog", "blog multilingue"…
Its SKILL.md is about 2.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts. Compatibility notes: Requires claude-blog (blog-write). Optional integration with claude-seo (seo-hreflang) for richer hreflang validation.
It sits in Writing & Content, covering Technical SEO, Translation and Blog and article writing. The repository describes itself as: Open-source Claude skills for GEO, AI discoverability, and developer GTM workflows. Built for developer-focused companies that want their documentation to be found, parsed, and… The licence is MIT.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 02cfefb. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are json, html and xml).
From 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:
sitemaps.orgw3.orgschema.orgFrom 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.
Requires claude-blog (blog-write). Optional integration with claude-seo (seo-hreflang) for richer hreflang validation.
From compatibility in the SKILL.md frontmatter.
Blog Multilingual loads about 2.6k tokens when it runs. Until then it costs about 147 tokens; SKILL.md has 784 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 Infrasity-Labs/dev-gtm-claude-skills at commit 02cfefb, republished under its MIT licence (© Infrasity-Labs). 784 words, ~2,577 tokens.
.claude/skills/blog-multilingual/SKILL.md (or your agent's skills folder).The flagship multilingual orchestrator. Combines blog writing, translation, cultural adaptation, and full international SEO into a single command. Produces publication-ready blog posts in every target language with hreflang tags, localized JSON-LD schema, and CMS-integration metadata.
Invoked internally by this orchestrator:
| Component | Source | Required |
|---|---|---|
blog-write | claude-blog (this plugin) | Yes |
blog-translate | claude-blog (this plugin) | Yes |
blog-localize | claude-blog (this plugin) | Yes (when --localize is on, default) |
seo-hreflang | claude-seo (sibling plugin) | No, falls back to a self-contained generator |
If seo-hreflang is not installed, the orchestrator emits hreflang tags using
its own minimal generator (Phase 5 below) and notes the limitation in the
delivery summary. Hreflang validation in that case is structural only, not the
deeper validation seo-hreflang provides.
/blog multilingual <topic> --languages <lang1,lang2,...> [--source <lang>] [--no-localize] [--format <md|mdx|html>]| Argument | Required | Default | Description |
|---|---|---|---|
<topic> | Yes | , | Blog topic or working title |
--languages | Yes | , | Comma-separated ISO 639-1 codes (e.g. de,fr,es,ja,pt-BR) |
--source | No | en | Source language to write the original in |
--no-localize | No | off | Skip cultural adaptation (translation only) |
--format | No | auto | Output format: md, mdx, or html |
If --languages is missing, ask the user once before running anything:
"Which languages should the blog be published in? Provide ISO 639-1 codes
separated by commas (e.g., de,fr,es,ja,pt-BR). The post will be written in
<source> first, then translated."
pt-BR, es-MX, zh-TW are also accepted).--format.--source, drop it
from the translation list with a notice.multilingual/
{source-lang}/
{lang-1}/
{lang-2}/
...Progress: Phase 1: Configuration complete, [N] languages selected ([codes])
Invoke the blog-write sub-skill (route through /blog write so all
existing rules apply: template auto-selection, sourced statistics, citation
capsules, FAQ schema, internal-link zones, charts, image embedding). Pass the
topic and any blog-write parameters surfaced by the user.
Save the original to multilingual/{source-lang}/{slug}.{ext}.
Progress: Phase 2: Original written, multilingual/{source-lang}/{slug}.{ext}
For each target language, invoke blog-translate:
Save translations to multilingual/{lang}/{localized-slug}.{ext}.
Progress: Phase 3: Translating to [lang] ([X]/[N]) per language, then
Phase 3: All translations complete.
If --no-localize is NOT set, invoke blog-localize for every translated
post:
Update files in place. The localizer swaps brand examples, adapts CTAs,
substitutes legal references, and adjusts formality. See
../blog-localize/SKILL.md for the full adaptation pass.
Progress: Phase 4: Cultural adaptation complete for [N] languages.
Generate three artifacts plus localized schema. If the seo-hreflang skill
from claude-seo is installed, delegate validation to it. Otherwise use the
self-contained generator below.
Copy-paste ready tags for <head>:
<!-- Hreflang tags. Paste into <head> of each language version. -->
<link rel="alternate" hreflang="{source}" href="{source-url}" />
<link rel="alternate" hreflang="{lang-1}" href="{lang-1-url}" />
<link rel="alternate" hreflang="{lang-2}" href="{lang-2-url}" />
<link rel="alternate" hreflang="x-default" href="{source-url}" />Rules (mirrored from seo-hreflang):
x-default points to the source-language version.Save to multilingual/hreflang-tags.html.
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>{source-url}</loc>
<xhtml:link rel="alternate" hreflang="{source}" href="{source-url}" />
<xhtml:link rel="alternate" hreflang="{lang-1}" href="{lang-1-url}" />
<xhtml:link rel="alternate" hreflang="x-default" href="{source-url}" />
</url>
<!-- Repeat one <url> block per language version -->
</urlset>Save to multilingual/hreflang-sitemap.xml.
Machine-readable mapping for CMS integration:
{
"sourceSlug": "how-to-avoid-ai-slop",
"sourceLanguage": "en",
"generatedDate": "YYYY-MM-DD",
"versions": [
{
"lang": "en",
"slug": "how-to-avoid-ai-slop",
"file": "en/how-to-avoid-ai-slop.md",
"title": "How to Avoid AI Slop in 2026",
"description": "..."
},
{
"lang": "de",
"slug": "wie-man-ki-slop-vermeidet",
"file": "de/wie-man-ki-slop-vermeidet.md",
"title": "KI-Slop vermeiden in 2026",
"description": "..."
}
],
"hreflang": {
"method": "html",
"x-default": "en"
}
}Save to multilingual/hreflang-map.json.
If the user asks, or if a frontmatter schema: true flag is present, attach
or update JSON-LD on every language version with inLanguage and
translationOfWork fields:
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "[Localized title]",
"description": "[Localized description]",
"inLanguage": "[lang-code]",
"isPartOf": { "@type": "Blog", "inLanguage": "[lang-code]" },
"translationOfWork": {
"@type": "BlogPosting",
"inLanguage": "[source-lang]",
"url": "[source-url]"
}
}Use the existing /blog schema sub-skill if richer schema (FAQ, Person,
Breadcrumb) is wanted on each version.
## Multilingual blog complete: [Title]
### Original
- Language: [source]
- File: multilingual/{source}/{slug}.{ext}
### Translations
| Language | File | Localized | Keywords adapted |
|----------|------|-----------|------------------|
| de | multilingual/de/{slug}.md | yes | [N] |
| fr | multilingual/fr/{slug}.md | yes | [N] |
| es | multilingual/es/{slug}.md | yes | [N] |
### International SEO assets
- multilingual/hreflang-tags.html
- multilingual/hreflang-sitemap.xml
- multilingual/hreflang-map.json
- Localized schema embedded per version (if requested)
### Total
- [N] posts in [N] languages
- [N] SEO assets generated
### Next steps
- Replace `{url}` placeholders in hreflang tags with your real URLs.
- Merge `hreflang-sitemap.xml` into your existing sitemap.
- Run `/blog locale-audit multilingual/` to verify completeness.
- Resolve `[INTERNAL-LINK]` placeholders with locale-specific URLs.
- If claude-seo is installed, run `/seo hreflang multilingual/` for
deeper validation.| When | Run |
|---|---|
| To regenerate or reword the source | /blog write <topic> |
| To translate one existing file only | /blog translate <file> --to <codes> |
| To deepen cultural fit on one file | /blog localize <file> --locale <code> |
| To audit a multilingual directory | /blog locale-audit <directory> |
| For deeper hreflang validation | /seo hreflang <directory> (claude-seo, optional) |
| Scenario | Action |
|---|---|
blog-write missing | Error: "This skill requires blog-write. Reinstall claude-blog." |
| One translation fails | Complete the rest, report partial results, suggest a retry command |
| Source language equals a target | Skip that target, log a notice |
| More than 10 target languages | Warn about wall-clock time, proceed if confirmed |
seo-hreflang not installed | Use the self-contained generator, note it in the summary |
| Command | Purpose |
|---|---|
/blog multilingual <topic> --languages de,fr,es | Write source, translate, localize, emit hreflang assets |
/blog translate <file> --to de,fr,es | Translate one file into target languages |
/blog localize <file> --locale de-DE | Cultural deep-adaptation of one translated file |
/blog locale-audit <directory> | Multilingual QA across a directory |
© Infrasity-Labs, 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/blog-multilingual of Infrasity-Labs/dev-gtm-claude-skills.
Open the folder on GitHubat commit 02cfefb
We found 4 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in Infrasity-Labs/dev-gtm-claude-skills, which our catalogue first saw on October 7, 2026.
Blog Multilingual 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 |
|---|---|---|---|---|---|---|
| Blog Multilingual this skillInfrasity-Labs/dev-gtm-claude-skills | 136 | 1 repos | ~2.6k | Automated safety check: Pass | MIT | |
| Blog Locale AuditAgriciDaniel/claude-blog | 2.3k | 1 repos | ~2.1k | Automated safety check: Pass | MIT | |
| SEOgridaco/grida | 2.7k | — | ~2.1k | Automated safety check: Pass | Apache-2.0 | |
| Create Release Blogweb-infra-dev/rstest | 505 | — | ~4.7k | Automated safety check: Pass | MIT | |
| Blog Post ProcessorJustin3go/justin3go.com | 172 | — | ~1.5k | Automated safety check: Pass | Custom licence | |
| Humanizer Zhai-zixun/humanizer-zh | 179 | — | ~1.2k | Automated safety check: Pass | MIT |
AgriciDaniel/claude-blog
Audit a directory of multilingual blog content for completeness, consistency, hreflang correctness, meta-tag parity, and freshness.
gridaco/grida
SEO best practices for the Grida project across Next.js pages, blog posts, and documentation.
web-infra-dev/rstest
Generate a narrative version release blog post from commits within a tag range.
Justin3go/justin3go.com
Process Chinese blog posts for the justin3go.com VitePress blog: rename to English slug, add frontmatter and AI summary, and translate to English.
ai-zixun/humanizer-zh
Remove signs of AI-generated, translated, or overly mechanical Chinese prose.
Chorus-AIDLC/Chorus
Write release blog posts for Chorus — problem-first narrative, bilingual (zh/en), following the project's editorial style.
Infrasity-Labs/dev-gtm-claude-skills
Generates a fully structured SEO content outline (not a finished brief) and exports it as a formatted .docx Word document.
Infrasity-Labs/dev-gtm-claude-skills
Generates a fully structured SEO content brief for a target keyword and optionally pushes it to a Notion database.
Infrasity-Labs/dev-gtm-claude-skills
Audits any API documentation site by crawling every endpoint page and scoring each one across 5 checks: description quality, OpenAPI spec presence, body param descriptions, response codes, and…
Infrasity-Labs/dev-gtm-claude-skills
Audits any developer documentation site across 33 checks in 7 categories and produces a scored report (out of 100) with Pass / Warn / Fail status per check.
Infrasity-Labs/dev-gtm-claude-skills
Generates a 3-month SEO performance HTML report for any domain using DataForSEO data.
Infrasity-Labs/dev-gtm-claude-skills
Email triage system that handles both one-time setup and recurring triage in a single skill.
Categories
One-command multilingual blog creation. An agent skill from Infrasity-Labs/dev-gtm-claude-skills. Blog Multilingual is an agent skill from Infrasity-Labs/dev-gtm-claude-skills. One-command multilingual blog creation.
Blog Multilingual fits situations like: user says multilingual blog; blog multilingual; write in multiple languages; international blog.
Run `npx skills add Infrasity-Labs/dev-gtm-claude-skills --skill blog-multilingual -a claude-code`. Or copy the skill folder (.claude/skills/blog-multilingual in Infrasity-Labs/dev-gtm-claude-skills) into .claude/skills/blog-multilingual in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Infrasity-Labs/dev-gtm-claude-skills --skill blog-multilingual -a codex`. Or copy the skill folder (.claude/skills/blog-multilingual in Infrasity-Labs/dev-gtm-claude-skills) into .agents/skills/blog-multilingual 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 Infrasity-Labs/dev-gtm-claude-skills --skill blog-multilingual -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/blog-multilingual, .gemini/skills/blog-multilingual, .github/skills/blog-multilingual and .opencode/skills/blog-multilingual in your project.
SKILL.md names no scripts, command-line tools or credentials: Blog Multilingual is instructions for the agent only. Compatibility (from SKILL.md): Requires claude-blog (blog-write). Optional integration with claude-seo (seo-hreflang) for richer hreflang validation..
SKILL.md names 3 domains. In commands or code: sitemaps.org, w3.org and schema.org; the agent is likely to contact these 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.
Blog Multilingual 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.6k tokens (SKILL.md is roughly 10k 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 Blog Multilingual: Blog Locale Audit (AgriciDaniel/claude-blog, 2.3k stars), SEO (gridaco/grida, 2.7k stars), Create Release Blog (web-infra-dev/rstest, 505 stars) and Blog Post Processor (Justin3go/justin3go.com, 172 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Infrasity-Labs (a GitHub user) maintains it in Infrasity-Labs/dev-gtm-claude-skills, which has 136 GitHub stars. The repository holds 26 skills in this directory. The repository was last updated on June 28, 2026.
Source: Infrasity-Labs/dev-gtm-claude-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.