Makepad Platform
sickn33/agentic-awesome-skills
CRITICAL: Use for Makepad cross-platform support. An agent skill from sickn33/agentic-awesome-skills.
ALWAYS use when creating, resizing, or presenting through an agfxSwapChain in AGFX — window/layer handle setup, HDR toggling, vsync, resize handling, or back buffer acquire/present.
$ npx skills add AmelieHeinrich/agfx --skill agfx-presentation-and-swapchain -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install AmelieHeinrich/agfx agfx-presentation-and-swapchain --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/AmelieHeinrich/agfx.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/agfx-presentation-and-swapchain .claude/skills/agfx-presentation-and-swapchain && 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 "agfx-presentation-and-swapchain" agent skill from https://github.com/AmelieHeinrich/agfx/tree/main/.claude/skills/agfx-presentation-and-swapchain into .claude/skills/agfx-presentation-and-swapchain/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agfx-presentation-and-swapchain", 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/AmelieHeinrich/agfx/tree/main/.claude/skills/agfx-presentation-and-swapchainType 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 AmelieHeinrich/agfx --skill agfx-presentation-and-swapchain -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install AmelieHeinrich/agfx agfx-presentation-and-swapchain --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/AmelieHeinrich/agfx.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/agfx-presentation-and-swapchain .agents/skills/agfx-presentation-and-swapchain && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "agfx-presentation-and-swapchain" agent skill from https://github.com/AmelieHeinrich/agfx/tree/main/.claude/skills/agfx-presentation-and-swapchain into .agents/skills/agfx-presentation-and-swapchain/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agfx-presentation-and-swapchain", 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 AmelieHeinrich/agfx --skill agfx-presentation-and-swapchain -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install AmelieHeinrich/agfx agfx-presentation-and-swapchain --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/AmelieHeinrich/agfx.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/agfx-presentation-and-swapchain .cursor/skills/agfx-presentation-and-swapchain && 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 "agfx-presentation-and-swapchain" agent skill from https://github.com/AmelieHeinrich/agfx/tree/main/.claude/skills/agfx-presentation-and-swapchain into .cursor/skills/agfx-presentation-and-swapchain/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agfx-presentation-and-swapchain", 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/AmelieHeinrich/agfx.git --path .claude/skills/agfx-presentation-and-swapchain--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 AmelieHeinrich/agfx --skill agfx-presentation-and-swapchain -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install AmelieHeinrich/agfx agfx-presentation-and-swapchain --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/AmelieHeinrich/agfx.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/agfx-presentation-and-swapchain .gemini/skills/agfx-presentation-and-swapchain && 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 "agfx-presentation-and-swapchain" agent skill from https://github.com/AmelieHeinrich/agfx/tree/main/.claude/skills/agfx-presentation-and-swapchain into .gemini/skills/agfx-presentation-and-swapchain/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agfx-presentation-and-swapchain", 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 AmelieHeinrich/agfx agfx-presentation-and-swapchainInstalls 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 AmelieHeinrich/agfx --skill agfx-presentation-and-swapchain -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/AmelieHeinrich/agfx.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/agfx-presentation-and-swapchain .github/skills/agfx-presentation-and-swapchain && 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 "agfx-presentation-and-swapchain" agent skill from https://github.com/AmelieHeinrich/agfx/tree/main/.claude/skills/agfx-presentation-and-swapchain into .github/skills/agfx-presentation-and-swapchain/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agfx-presentation-and-swapchain", 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 AmelieHeinrich/agfx --skill agfx-presentation-and-swapchain -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install AmelieHeinrich/agfx agfx-presentation-and-swapchain --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/AmelieHeinrich/agfx.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/agfx-presentation-and-swapchain .opencode/skills/agfx-presentation-and-swapchain && 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 "agfx-presentation-and-swapchain" agent skill from https://github.com/AmelieHeinrich/agfx/tree/main/.claude/skills/agfx-presentation-and-swapchain into .opencode/skills/agfx-presentation-and-swapchain/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agfx-presentation-and-swapchain", 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.
agfx-presentation-and-swapchainALWAYS use when creating, resizing, or presenting through an agfxSwapChain in AGFX — window/layer handle setup, HDR toggling, vsync, resize handling, or back buffer acquire/present.
Agfx Presentation And Swapchain is an agent skill from AmelieHeinrich/agfx. ALWAYS use when creating, resizing, or presenting through an agfxSwapChain in AGFX — window/layer handle setup, HDR toggling, vsync, resize handling, or back buffer acquire/present. Trigger for agfxSwapChainCreate/Destroy/Resize/Present, agfxSwapChainAcquireNextTexture, agfxSwapChainGetFormat, AGFXRESOURCESTATEPRESENT, CAMetalLayer/HWND handle, agfxLinuxWindowHandle, agfxDisplayServerProtocol, X11/XCB/Wayland surface setup, "blank window", "swap chain out of date", HDR toggle, resize crash. Do NOT trigger for…
Its SKILL.md is about 2k 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 Game Development. It works with macOS and Linux. The licence is MIT.
Read from SKILL.md and the folder at commit d8ad38b. 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 cpp).
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.
Agfx Presentation And Swapchain loads about 2k tokens when it runs. Until then it costs about 189 tokens; SKILL.md has 612 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 AmelieHeinrich/agfx at commit d8ad38b, republished under its MIT licence (© AmelieHeinrich). 612 words, ~1,999 tokens.
.claude/skills/agfx-presentation-and-swapchain/SKILL.md (or your agent's skills folder).agfxSwapChain is AGFX's cross-platform presentation object: on macOS it wraps a CAMetalLayer*, on Windows an HWND, on Linux a pointer to an agfxLinuxWindowHandle (a {display, window} pair whose interpretation — Xlib, XCB, or Wayland — is fixed by the agfxDeviceCreateInfo::displayServerProtocol the device was created with). The contract is deliberately simple — acquire a back buffer texture, render into it via a render pass, barrier it back to AGFX_RESOURCE_STATE_PRESENT, submit, then present. AGFX hides the per-backend present sequences (waitForDrawable/signalDrawable on Metal 4, IDXGISwapChain::Present on D3D12, the binary acquire/present semaphore bookkeeping on Vulkan) behind agfxSwapChainAcquireNextTexture/agfxSwapChainPresent.
Anything that changes the swap chain's underlying resources — resize, or an HDR toggle — requires the GPU to be fully idle first (see agfx-synchronization for drainGPU). AGFX does not do this drain internally; the caller must drain before resizing or recreating.
Owns:
agfxSwapChainCreateInfo / agfxSwapChainCreate / agfxSwapChainDestroyagfxSwapChainResizeagfxSwapChainGetFormatagfxSwapChainAcquireNextTexture / agfxSwapChainPresentisHDR) and vsync (vsync) swap chain configurationCAMetalLayer* on macOS, HWND on Windows, agfxLinuxWindowHandle* on Linux) and the Linux-only agfxDeviceCreateInfo::displayServerProtocol field it depends onAGFX_RESOURCE_STATE_PRESENT as the required pre/post state for the acquired textureDoesn't own:
agfx-render-targets-and-passesagfx-synchronizationRead agfx/agfx.h's // Swap chain section for authoritative struct/enum definitions. agfx_demo/agfx_demo_main.cpp is the full reference implementation: swap chain creation from an SDL window, per-frame acquire/present, resize handling, and HDR toggle.
agfxSwapChainCreateInfo swapChainCreateInfo = {};
swapChainCreateInfo.queue = graphicsQueue; // must be a graphics queue
swapChainCreateInfo.imageCount = 2; // double buffering; 3 for triple buffering
swapChainCreateInfo.width = drawableWidth;
swapChainCreateInfo.height = drawableHeight;
swapChainCreateInfo.isHDR = false;
swapChainCreateInfo.vsync = true;
#if GAME_MAC
swapChainCreateInfo.handle = metalLayer; // CAMetalLayer* from SDL_Metal_GetLayer or similar
#elif GAME_LINUX
agfxLinuxWindowHandle linuxHandle = {}; // interpreted per the device's displayServerProtocol
linuxHandle.display = x11DisplayOrWlDisplay; // Display* / xcb_connection_t* / wl_display*
linuxHandle.window = x11WindowOrWlSurface; // Window / xcb_window_t / wl_surface* as uint64_t
swapChainCreateInfo.handle = &linuxHandle; // read during the create call
#else
swapChainCreateInfo.handle = hwnd;
#endif
agfxSwapChain* swapChain = agfxSwapChainCreate(device, &swapChainCreateInfo);On Linux the device must have been created with the matching agfxDeviceCreateInfo::displayServerProtocol (AGFX_DISPLAY_SERVER_PROTOCOL_X11/XCB/WAYLAND) — the Vulkan backend enables the corresponding surface extension at instance creation, so this is decided before the swap chain exists; a mismatch fails at agfxSwapChainCreate with a "was the device created with the right displayServerProtocol?" log. With SDL, pick it from SDL_GetCurrentVideoDriver() — see agfx_demo_main.cpp. Note agfx::ez differs here: raw agfxSwapChainCreate consumes the handle struct during the call, but agfx::ez::Context stores the pointer (to recreate the swap chain on an HDR toggle), so there it must outlive the Context.
Query the back buffer's actual pixel format with agfxSwapChainGetFormat(swapChain) rather than assuming a fixed format — it changes when isHDR changes, and any render target/pipeline built against the back buffer must use this queried format (AGFX_TEXTURE_FORMAT_UNKNOWN in the render target's format field lets it inherit automatically; see agfx-render-targets-and-passes).
agfxTexture* backBuffer = agfxSwapChainAcquireNextTexture(swapChain);
// backBuffer starts in AGFX_RESOURCE_STATE_PRESENT
agfxCommandBufferTextureBarrier(cmd, backBuffer, AGFX_RESOURCE_STATE_PRESENT, AGFX_RESOURCE_STATE_RENDER_TARGET, 0, 0, /*agglomerate=*/false);
// ... wrap backBuffer in an agfxRenderTarget, run a render pass, draw ...
agfxCommandBufferTextureBarrier(cmd, backBuffer, AGFX_RESOURCE_STATE_RENDER_TARGET, AGFX_RESOURCE_STATE_PRESENT, 0, 0, /*agglomerate=*/false);
agfxCommandBufferEnd(cmd);
agfxCommandQueueSubmit(queue, &cmd, 1);
agfxSwapChainPresent(swapChain);Pass agglomerate = false specifically for these PRESENT↔RENDER_TARGET transitions around acquire/present (see agfx-synchronization for why: presentable drawables need no explicit hazard tracking on Metal, but D3D12 and Vulkan still need the transition emitted unconditionally — on Vulkan it is a real image layout transition to/from PRESENT_SRC_KHR, and the backend internally treats PRESENT-as-old-state as UNDEFINED since a freshly acquired image's contents are discardable). On Vulkan, agfxSwapChainAcquireNextTexture can also return nullptr when the surface is out of date (e.g. mid-resize, logged as a warning) — skip the frame and resize rather than dereferencing the result. agfxSwapChainPresent must be called only after the command buffer that renders to and barriers the back buffer has already been submitted via agfxCommandQueueSubmit — calling it before submit is a synchronization bug.
Resizing is destructive to in-flight GPU work referencing swap chain resources, so always drain first:
// On a window resize event:
drainGPU(); // see agfx-synchronization — signal + wait until the frame fence catches up
agfxSwapChainResize(device, swapChain, newWidth, newHeight);
renderer.Resize(device, newWidth, newHeight); // resize any render targets sized to match the windowAGFX has no in-place HDR reconfiguration API — toggling HDR means destroying and recreating the swap chain, then recreating anything downstream whose pipeline format depended on the old back buffer format:
drainGPU();
agfxSwapChainDestroy(device, swapChain);
swapChainCreateInfo.isHDR = wantHDR;
swapChain = agfxSwapChainCreate(device, &swapChainCreateInfo);
renderer.RecreateTonemapPipeline(device, agfxSwapChainGetFormat(swapChain));
imguiBackend.RecreatePipeline(device, agfxSwapChainGetFormat(swapChain));Skipping the pipeline recreation step is the most common HDR-toggle bug: the render pass will still bind fine, but color-attachment format mismatch between the pipeline and the actual back buffer produces validation errors on D3D12 and garbage/black output on Metal.
© AmelieHeinrich, 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/agfx-presentation-and-swapchain of AmelieHeinrich/agfx.
Open the folder on GitHubat commit d8ad38b
Agfx Presentation And Swapchain 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 |
|---|---|---|---|---|---|---|
| Agfx Presentation And Swapchain this skillAmelieHeinrich/agfx | 146 | — | ~2k | Automated safety check: Pass | MIT | |
| Makepad Platformsickn33/agentic-awesome-skills | 47k | 2 repos | ~1.2k | Automated safety check: Pass | MIT | |
| Godot Platform Desktopthedivergentai/GD-Agentic-Skills | 821 | — | ~2.8k | Automated safety check: Pass | LGPL-3.0 | |
| Godot Exportgamedev-skills/awesome-gamedev-agent-skills | 1.4k | — | ~1.4k | Automated safety check: Pass | Apache-2.0 | |
| Defold Project Buildselimanac/defold-astar | 111 | — | ~727 | Automated safety check: Pass | None | |
| Godot Export Buildsthedivergentai/GD-Agentic-Skills | 821 | — | ~3k | Automated safety check: Pass | LGPL-3.0 |
sickn33/agentic-awesome-skills
CRITICAL: Use for Makepad cross-platform support. An agent skill from sickn33/agentic-awesome-skills.
thedivergentai/GD-Agentic-Skills
Expert blueprint for desktop platforms (Windows/Linux/macOS) covering keyboard/mouse controls, settings menus, window management (fullscreen, resolution), keybind remapping, and Steam integration.
gamedev-skills/awesome-gamedev-agent-skills
Export and build a Godot 4.7 project for distribution: install export templates, define export presets (Windows/macOS/Linux/Web/Android), run headless command-line exports for CI, and handle web…
selimanac/defold-astar
Builds the project using the running Defold editor, returns build errors, and launches the game if build succeeds.
thedivergentai/GD-Agentic-Skills
Expert patterns for multi-platform exports including export templates (Windows/Linux/macOS/Android/iOS/Web), command-line exports (headless mode), platform-specific settings (codesign, notarization…
gamedev-skills/awesome-gamedev-agent-skills
Publish and update a game on itch.io: create the project page and upload builds with the butler CLI (butler push) to named channels.
AmelieHeinrich/agfx
ALWAYS use when porting an existing D3D11 engine or renderer to AGFX — translating ID3D11Device/DeviceContext/InputLayout/state-object code to agfxDevice/agfxCommandBuffer/agfxRenderPipeline calls…
AmelieHeinrich/agfx
ALWAYS use when porting an existing D3D12 engine or renderer to AGFX — translating ID3D12Device/CommandList/PipelineState/RootSignature/DescriptorHeap code to…
AmelieHeinrich/agfx
ALWAYS use when porting an existing OpenGL (or OpenGL ES) engine or renderer to AGFX — translating glGenTextures/glBindTexture/glBufferData/glUseProgram/FBO code to…
AmelieHeinrich/agfx
ALWAYS use when porting an existing Vulkan engine or renderer to AGFX — translating VkDevice/VkCommandBuffer/VkPipeline/VkDescriptorSet/VkRenderPass code to…
AmelieHeinrich/agfx
ALWAYS use when creating agfxRenderTarget or agfxRenderPass objects in AGFX, or wiring up color/depth attachments, load/store ops, viewport/scissor, or draw calls within a render pass.
AmelieHeinrich/agfx
ALWAYS use when working with AGFX fences, frames-in-flight pacing, queue signal/wait, resource-state barriers, or the barrier "agglomerate" flag.
Categories
ALWAYS use when creating, resizing, or presenting through an agfxSwapChain in AGFX — window/layer handle setup, HDR toggling, vsync, resize handling, or back buffer acquire/present. Agfx Presentation And Swapchain is an agent skill from AmelieHeinrich/agfx. ALWAYS use when creating, resizing, or presenting through an agfxSwapChain in AGFX — window/layer handle setup, HDR toggling, vsync, resize handling, or back buffer acquire/present.
Agfx Presentation And Swapchain fits situations like: presenting through an agfxSwapChain in AGFX — window/layer handle setup; resize handling; back buffer acquire/present; agfxSwapChainCreate/Destroy/Resize/Present.
Run `npx skills add AmelieHeinrich/agfx --skill agfx-presentation-and-swapchain -a claude-code`. Or copy the skill folder (.claude/skills/agfx-presentation-and-swapchain in AmelieHeinrich/agfx) into .claude/skills/agfx-presentation-and-swapchain in your project. Claude Code loads it when a task matches its description.
Run `npx skills add AmelieHeinrich/agfx --skill agfx-presentation-and-swapchain -a codex`. Or copy the skill folder (.claude/skills/agfx-presentation-and-swapchain in AmelieHeinrich/agfx) into .agents/skills/agfx-presentation-and-swapchain 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 AmelieHeinrich/agfx --skill agfx-presentation-and-swapchain -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/agfx-presentation-and-swapchain, .gemini/skills/agfx-presentation-and-swapchain, .github/skills/agfx-presentation-and-swapchain and .opencode/skills/agfx-presentation-and-swapchain in your project.
SKILL.md names no scripts, command-line tools or credentials: Agfx Presentation And Swapchain 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.
Agfx Presentation And Swapchain is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2k tokens (SKILL.md is roughly 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 Agfx Presentation And Swapchain: Makepad Platform (sickn33/agentic-awesome-skills, 47k stars), Godot Platform Desktop (thedivergentai/GD-Agentic-Skills, 821 stars), Godot Export (gamedev-skills/awesome-gamedev-agent-skills, 1.4k stars) and Defold Project Build (selimanac/defold-astar, 111 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
AmelieHeinrich (a GitHub user) maintains it in AmelieHeinrich/agfx, which has 146 GitHub stars. The repository holds 8 skills in this directory. The repository was last updated on September 27, 2026.
Source: AmelieHeinrich/agfx on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.