Threejs 3D Generator
corosolto/client
Generate, texture, rig, animate, stylize, convert, and download 3D assets for Three.js games using the Tripo API.
Generate, texture, rig, animate, stylize, convert, and download 3D assets for Three.js games via the Tripo API.
$ npx skills add valkor-ai/loom --skill threejs-3d-generator -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install valkor-ai/loom threejs-3d-generator --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/valkor-ai/loom.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/shared/loom/skills/threejs/threejs-3d-generator .claude/skills/threejs-3d-generator && 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 "threejs-3d-generator" agent skill from https://github.com/valkor-ai/loom/tree/main/plugins/shared/loom/skills/threejs/threejs-3d-generator into .claude/skills/threejs-3d-generator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "threejs-3d-generator", 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/valkor-ai/loom/tree/main/plugins/shared/loom/skills/threejs/threejs-3d-generatorType 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 valkor-ai/loom --skill threejs-3d-generator -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install valkor-ai/loom threejs-3d-generator --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/valkor-ai/loom.git skills-src && mkdir -p .agents/skills && cp -r skills-src/plugins/shared/loom/skills/threejs/threejs-3d-generator .agents/skills/threejs-3d-generator && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "threejs-3d-generator" agent skill from https://github.com/valkor-ai/loom/tree/main/plugins/shared/loom/skills/threejs/threejs-3d-generator into .agents/skills/threejs-3d-generator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "threejs-3d-generator", 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 valkor-ai/loom --skill threejs-3d-generator -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install valkor-ai/loom threejs-3d-generator --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/valkor-ai/loom.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/plugins/shared/loom/skills/threejs/threejs-3d-generator .cursor/skills/threejs-3d-generator && 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 "threejs-3d-generator" agent skill from https://github.com/valkor-ai/loom/tree/main/plugins/shared/loom/skills/threejs/threejs-3d-generator into .cursor/skills/threejs-3d-generator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "threejs-3d-generator", 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/valkor-ai/loom.git --path plugins/shared/loom/skills/threejs/threejs-3d-generator--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 valkor-ai/loom --skill threejs-3d-generator -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install valkor-ai/loom threejs-3d-generator --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/valkor-ai/loom.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/plugins/shared/loom/skills/threejs/threejs-3d-generator .gemini/skills/threejs-3d-generator && 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 "threejs-3d-generator" agent skill from https://github.com/valkor-ai/loom/tree/main/plugins/shared/loom/skills/threejs/threejs-3d-generator into .gemini/skills/threejs-3d-generator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "threejs-3d-generator", 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 valkor-ai/loom threejs-3d-generatorInstalls 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 valkor-ai/loom --skill threejs-3d-generator -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/valkor-ai/loom.git skills-src && mkdir -p .github/skills && cp -r skills-src/plugins/shared/loom/skills/threejs/threejs-3d-generator .github/skills/threejs-3d-generator && 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 "threejs-3d-generator" agent skill from https://github.com/valkor-ai/loom/tree/main/plugins/shared/loom/skills/threejs/threejs-3d-generator into .github/skills/threejs-3d-generator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "threejs-3d-generator", 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 valkor-ai/loom --skill threejs-3d-generator -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install valkor-ai/loom threejs-3d-generator --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/valkor-ai/loom.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/plugins/shared/loom/skills/threejs/threejs-3d-generator .opencode/skills/threejs-3d-generator && 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 "threejs-3d-generator" agent skill from https://github.com/valkor-ai/loom/tree/main/plugins/shared/loom/skills/threejs/threejs-3d-generator into .opencode/skills/threejs-3d-generator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "threejs-3d-generator", 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.
threejs-3d-generatorGenerate, texture, rig, animate, stylize, convert, and download 3D assets for Three.js games via the Tripo API.
Threejs 3D Generator is an agent skill from valkor-ai/loom. Generate, texture, rig, animate, stylize, convert, and download 3D assets for Three.js games via the Tripo API. Use for text-to-3D, image-to-3D, game-ready GLB/FBX, characters, creatures, buildings, props, weapons, terrain, auto-rigging, animation retargeting, model texturing, voxel/LEGO stylization, and low-poly conversion. Pair with threejs-image-generator for concept and texture references first.
Its SKILL.md is about 2.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 8 other files, including scripts and reference files (for example `agents/openai.yaml`, `references/api-notes.md` and `references/image-generator-workflows.md`).
It sits in Game Development, covering 3D graphics and WebGL and Game assets and audio. It works with Three.js. The repository describes itself as: Loop engineering for agentic software delivery. The licence is Apache-2.0.
Read from SKILL.md and the folder at commit a30a7e6. 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.
Ships 1 file in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
python3From 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 these keys or tokens, usually read from environment variables:
TRIPO_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Threejs 3D Generator loads about 2.6k tokens when it runs, and up to ~8.7k if it reads all its reference files. Until then it costs about 106 tokens; SKILL.md has 1,022 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); the scripts in this folder are not scanned.
The full file from valkor-ai/loom at commit a30a7e6, republished under its Apache-2.0 licence (© valkor-ai). 1,022 words, ~2,589 tokens.
.claude/skills/threejs-3d-generator/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.Production 3D assets for browser games, prepared for Three.js. Provider: Tripo.
Resolve <this-skill-dir> from the actual loaded skill file. Resolve sibling skills beside it first, then use the runner's discovered paths. Do not mix installed versions or assume a particular home directory.
| File | Read it when |
|---|---|
references/api-notes.md | endpoint and task decisions, model versions, polling, postprocess, conversion, rigging, animation, downloads |
references/threejs-integration.md | importing outputs into a browser game, GLB/FBX loading, root motion, animation wiring |
references/image-generator-workflows.md | pairing threejs-image-generator for concepts, textures, UI art, or image-to-3D inputs |
The script reads --api-key or TRIPO_API_KEY. Keys never go in skill files, game code, or reports.
python3 <this-skill-dir>/scripts/threejs_3d_asset.py probe # TRIPO_API_KEY=SET|MISSINGKeys defined only in a shell profile can be absent from the process env. If the plain probe unexpectedly prints MISSING, use threejs-game-director/scripts/probe_asset_credentials.sh, which sources the profile and probes all three providers at once.
Download URLs expire quickly — download immediately after a task succeeds.
python3 <this-skill-dir>/scripts/threejs_3d_asset.py --helpText to 3D, the default for a premium hero model:
python3 <this-skill-dir>/scripts/threejs_3d_asset.py text \
--prompt "game-ready sci-fi hover bike, sleek armored panels, strong readable silhouette, layered hard-surface detail, PBR materials, clean topology, centered pivot, front facing, no text" \
--model-version v3.1-20260211 --texture-quality detailed --geometry-quality detailed \
--checkpoint artifacts/hover-bike-job.json \
--wait --download --out-dir assets/models/hover-bikeImage to 3D from a generated concept:
python3 <this-skill-dir>/scripts/threejs_3d_asset.py image \
--image assets/concepts/hover-bike-front.png --model-version v3.1-20260211 \
--enable-image-autofix --texture-alignment original_image --texture-quality detailed \
--wait --download --out-dir assets/models/hover-bikeStatus, download, and postprocess (texture_model, animate_prerigcheck, animate_rig, animate_retarget, conversion, stylize_model):
python3 <this-skill-dir>/scripts/threejs_3d_asset.py status TASK_ID
python3 <this-skill-dir>/scripts/threejs_3d_asset.py download TASK_ID --out-dir assets/models
python3 <this-skill-dir>/scripts/threejs_3d_asset.py postprocess --type conversion \
--original-task-id TASK_ID --format GLTF --face-limit 20000 --wait --download --out-dir assets/models/gltfAnimated character pipeline: generation, prerigcheck, validated rig with bounded retries, retargets, and downloads, routed by body plan. Use checkpoints and stop between stages to inspect before spending on dependent work:
python3 <this-skill-dir>/scripts/threejs_3d_asset.py character-pipeline \
--prompt "stylized cyber runner character, T-pose, full body, game-ready outfit, readable silhouette" \
--animations preset:idle,preset:walk,preset:run,preset:jump \
--checkpoint artifacts/cyber-runner-job.json --stop-after model \
--out-dir assets/models/cyber-runner
# After inspecting the downloaded model/preview:
python3 <this-skill-dir>/scripts/threejs_3d_asset.py resume artifacts/cyber-runner-job.json --stop-after rig
# After inspecting the validated rig:
python3 <this-skill-dir>/scripts/threejs_3d_asset.py resume artifacts/cyber-runner-job.json --stop-after animations
python3 <this-skill-dir>/scripts/threejs_3d_asset.py character-pipeline \
--prompt "stylized wolf, quadrupedal stance, all four legs planted and separated, full body" \
--rig-type quadruped --animations preset:quadruped:walk \
--checkpoint artifacts/wolf-job.json --stop-after model --out-dir assets/models/wolf--checkpoint PATH is optional on text, image, postprocess, and character-pipeline. It records accepted task IDs immediately, stage status, and downloaded file fingerprints; no API keys or signed output URLs go in the checkpoint. Use a separate checkpoint per job. Existing checkpoints must be resumed, not overwritten, and concurrent use is locked.
For background single-task generation omit --wait, retain the printed task ID/checkpoint, and run resume CHECKPOINT later. Single-task resume waits/downloads that task only; it does not add rigging. Character resume reuses completed stages and continues through animations unless --stop-after model|rig|animations limits this invocation. Credentials still come from the current environment. The checkpoint records absolute local paths, so keep its referenced files in place.
The helper retries safe status/download reads with bounded backoff, never paid task submissions. Missing credentials, exhausted credits, invalid input, transient errors, and uncertain submissions are reported distinctly. On interruption, resume the existing job rather than starting over. If a POST may have succeeded but no task ID was received, find it in provider history and use resume CHECKPOINT --task-id RECOVERED_ID; do not invent an ID or submit a replacement blindly. Without a recoverable ID, report the uncertainty before any potentially duplicate charge.
For coordinated games follow the director's references/asset-recovery.md; continue independent implementation while generation runs. Explicitly procedural or no-external-service requests override generated-asset defaults. Record pending jobs and user corrections in the project note, preserving completed assets instead of repeating generation.
These rules prevent nearly every expensive failure. Full parameter tables and the measurements behind them are in references/api-notes.md.
--quad and --generate-parts off (generate_parts disables texturing, quad forces FBX output).animate_prerigcheck first (it takes no model version, costs nothing) and use the detected rig_type. riggable=false means regenerate with a clearer pose, not force a rig.v1.0-20240301 — the anatomical skeleton with twist bones and the large preset:biped:* library. The v2.x limb-chain rigger went 0/16 on humanoid meshes, armored or not, always producing asymmetric chains. Creatures use v2.5-20260210. character-pipeline routes this automatically.riggable=true does not guarantee a usable rig. Validate the skeleton before retargeting — validate-rig rig-model.glb --rig-type biped — checking both bone presence and chain depth, since a 1-bone leg warps every clip. A missing or malformed rig GLB is a failure, including with --force-rig. Auto-rigging is nondeterministic: on failure retry the rig task (~25 credits) within the chosen budget before regenerating the model. Armored hard-surface characters need the most retries.animate_retarget takes the rig task ID, not the generation task ID. Non-biped rigs batch up to 5 presets per task; batched clips come back as NlaTrack, NlaTrack.001, … in request order, so map by index and rename after import.--model-version default — the enum rejects an explicit v1.0-20240301 with HTTP 400 code 2017, but the server default handles them.--out-format fbx (the script enforces it): Tripo's GLB bake on this path writes twist-bone transforms in the wrong space and limbs collapse into the torso. v2.5 creature retargets are fine as GLB.--animate-in-place. It corrupts the bake — mirrored and crossed limbs on v1.0, exploded skinning on v2.5. Keep root motion baked and strip it at import instead; the engine snippet is in references/threejs-integration.md.preset:attack (use preset:slash or preset:shoot). A creature's mesh stance drives how a preset reads — a quadruped walk on an upright dragon looks like a person walking, so generate creatures in the stance the animation expects.avian for wing chains.--spec tripo (default) when Tripo presets will be retargeted; --spec mixamo rigs cannot be retargeted by Tripo and are for external pipelines only.validate-animation clip.glb (flags scale tracks, limb-stretching translation, extreme rotations, per-clip duration and channel coverage), then check gltf.animations names and counts before wiring the AnimationMixer.Improve the user's prompt with material, silhouette, camera readability, scale, and game-use constraints. Request GLB/PBR with face limits and texture quality matched to the performance budget; for mobile, favor smart_low_poly, face_limit, or a later low-poly postprocess. Use generated 3D as hero content and build the surrounding prop kit procedurally.
Inspect unpaused in-game motion after integration: clip transitions, deformation, root motion, foot sliding, and attack/contact timing. Use the QA motion pass for animated work; a successful download or skeleton check is not proof of good animation.
Report task IDs, checkpoint/output paths, model version, texture and geometry settings, animations, conversion settings, Three.js import notes, observed motion, and anything that failed. Put detailed evidence in the project artifact for the lead's consolidated report.
© valkor-ai, 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
SKILL.md and 5 other files (scripts, references) in plugins/shared/loom/skills/threejs/threejs-3d-generator of valkor-ai/loom.
Open the folder on GitHubat commit a30a7e6
We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in valkor-ai/loom, which our catalogue first saw on October 7, 2026.
Threejs 3D Generator 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 |
|---|---|---|---|---|---|---|
| Threejs 3D Generator this skillvalkor-ai/loom | 1.2k | 1 repos | ~2.6k | Automated safety check: Pass | Apache-2.0 | |
| Threejs 3D Generatorcorosolto/client | 257 | — | ~3.4k | Automated safety check: Pass | AGPL-3.0 | |
| Living BackdropTheOrcDev/skills | 106 | — | ~2.3k | Automated safety check: Pass | None | |
| Blender Web Export Pipelinefreshtechbro/claudedesignskills | 1k | — | ~4.2k | Automated safety check: Pass | MIT | |
| Pneuma Lucidpandazki/pneuma-skills | 161 | — | ~4.6k | Automated safety check: Warn | MIT | |
| Vtj Resource ManagementhexianWeb/Third-Person-MC | 195 | — | ~1.6k | Automated safety check: Pass | MIT |
corosolto/client
Generate, texture, rig, animate, stylize, convert, and download 3D assets for Three.js games using the Tripo API.
TheOrcDev/skills
Turn one still image into a living web backdrop - depth parallax that follows the pointer, a subject that breathes, and ambient wind, cloud drift, light and dust, in a single WebGL shader with a…
freshtechbro/claudedesignskills
Exports and optimizes Blender 3D models and animations for the web as glTF, covering batch Python scripting, texture baking, decimation and LOD generation for Three.js and Babylon.js.
pandazki/pneuma-skills
Pneuma Lucid Mode workspace guidelines. An agent skill from pandazki/pneuma-skills.
hexianWeb/Third-Person-MC
Loads and manages 3D assets via the Resources system. An agent skill from hexianWeb/Third-Person-MC.
corosolto/client
3D asset engineer that finds, downloads, and integrates GLB/GLTF models into Three.js browser games.
valkor-ai/loom
Build and iterate playable Three.js game systems: starter scaffold, architecture, design briefs, core loops, level and encounter design, entities, input, camera, collision and physics, scoring…
valkor-ai/loom
Generate and edit 2D image assets for Three.js games with Google's Gemini image API: concept sheets, image-to-3D inputs, texture and material references, sky and background plates, decals, logos…
valkor-ai/loom
Entrypoint for building, upgrading, and finishing Three.js browser games.
valkor-ai/loom
Generate, convert, clean, and integrate audio for Three.js browser games with ElevenLabs: sound effects, looping ambience, UI sounds, impact/weapon/vehicle audio, creature and boss stingers…
valkor-ai/loom
Verify and release Three.js browser games: playtest QA, automated bot playtests, mobile and responsive checks, production builds, static-hosting base paths, debug gating, bundle review, screenshots…
valkor-ai/loom
Upgrade Three.js games from prototype visuals to premium browser graphics: art-direction critique, procedural model building, material and texture libraries, world prop kits, shaders, VFX, lighting…
Works with
Categories
Generate, texture, rig, animate, stylize, convert, and download 3D assets for Three.js games via the Tripo API. Threejs 3D Generator is an agent skill from valkor-ai/loom.js games via the Tripo API.
Threejs 3D Generator fits situations like: game-ready GLB/FBX; animation retargeting; model texturing; voxel/LEGO stylization.
Run `npx skills add valkor-ai/loom --skill threejs-3d-generator -a claude-code`. Or copy the skill folder (plugins/shared/loom/skills/threejs/threejs-3d-generator in valkor-ai/loom) into .claude/skills/threejs-3d-generator in your project. Claude Code loads it when a task matches its description.
Run `npx skills add valkor-ai/loom --skill threejs-3d-generator -a codex`. Or copy the skill folder (plugins/shared/loom/skills/threejs/threejs-3d-generator in valkor-ai/loom) into .agents/skills/threejs-3d-generator 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 valkor-ai/loom --skill threejs-3d-generator -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/threejs-3d-generator, .gemini/skills/threejs-3d-generator, .github/skills/threejs-3d-generator and .opencode/skills/threejs-3d-generator in your project.
Going by SKILL.md and its folder, Threejs 3D Generator needs Python for the scripts in its folder, the command-line tools its instructions call (python3) and credentials named TRIPO_API_KEY. Our summary lists: Python 3; A credential in TRIPO_API_KEY.
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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Threejs 3D Generator 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.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. Its references folder adds about 6.1k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Threejs 3D Generator: Threejs 3D Generator (corosolto/client, 257 stars), Living Backdrop (TheOrcDev/skills, 106 stars), Blender Web Export Pipeline (freshtechbro/claudedesignskills, 1k stars) and Pneuma Lucid (pandazki/pneuma-skills, 161 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
valkor-ai (a GitHub organization) maintains it in valkor-ai/loom, which has 1,211 GitHub stars. The repository holds 17 skills in this directory. The repository was last updated on October 6, 2026.
Source: valkor-ai/loom on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.