Environment Setup Assistant
ArabelaTso/Skills-4-SE
Generate setup scripts and instructions for development environments across platforms.
Fully automated new Mac setup for fullstack web developers and AI engineers.
$ npx skills add swyxio/skills --skill new-mac-setup -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install swyxio/skills new-mac-setup --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/swyxio/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/new-mac-setup .claude/skills/new-mac-setup && 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 "new-mac-setup" agent skill from https://github.com/swyxio/skills/tree/main/new-mac-setup into .claude/skills/new-mac-setup/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "new-mac-setup", 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/swyxio/skills/tree/main/new-mac-setupType 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 swyxio/skills --skill new-mac-setup -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install swyxio/skills new-mac-setup --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/swyxio/skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/new-mac-setup .agents/skills/new-mac-setup && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "new-mac-setup" agent skill from https://github.com/swyxio/skills/tree/main/new-mac-setup into .agents/skills/new-mac-setup/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "new-mac-setup", 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 swyxio/skills --skill new-mac-setup -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install swyxio/skills new-mac-setup --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/swyxio/skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/new-mac-setup .cursor/skills/new-mac-setup && 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 "new-mac-setup" agent skill from https://github.com/swyxio/skills/tree/main/new-mac-setup into .cursor/skills/new-mac-setup/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "new-mac-setup", 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/swyxio/skills.git --path new-mac-setup--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 swyxio/skills --skill new-mac-setup -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install swyxio/skills new-mac-setup --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/swyxio/skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/new-mac-setup .gemini/skills/new-mac-setup && 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 "new-mac-setup" agent skill from https://github.com/swyxio/skills/tree/main/new-mac-setup into .gemini/skills/new-mac-setup/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "new-mac-setup", 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 swyxio/skills new-mac-setupInstalls 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 swyxio/skills --skill new-mac-setup -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/swyxio/skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/new-mac-setup .github/skills/new-mac-setup && 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 "new-mac-setup" agent skill from https://github.com/swyxio/skills/tree/main/new-mac-setup into .github/skills/new-mac-setup/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "new-mac-setup", 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 swyxio/skills --skill new-mac-setup -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install swyxio/skills new-mac-setup --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/swyxio/skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/new-mac-setup .opencode/skills/new-mac-setup && 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 "new-mac-setup" agent skill from https://github.com/swyxio/skills/tree/main/new-mac-setup into .opencode/skills/new-mac-setup/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "new-mac-setup", 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.
new-mac-setupFully automated new Mac setup for fullstack web developers and AI engineers.
New Mac Setup is an agent skill from swyxio/skills. Fully automated new Mac setup for fullstack web developers and AI engineers. Generates and executes idempotent shell scripts to install dev tools, CLI utilities, GUI apps, AI/ML tooling, shell config, and macOS preferences — all via Homebrew, fnm, uv, and defaults commands. Use this skill whenever someone says "set up my Mac", "new Mac setup", "configure my dev machine", "install my dev tools", "fresh Mac install", "developer environment setup", or anything about bootstrapping a macOS machine for development…
Its SKILL.md is about 4.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 11 other files, including scripts (for example `README.md`, `scripts/00-run-all.sh` and `scripts/01-xcode-and-homebrew.sh`). Compatibility notes: Requires macOS on Apple Silicon (M1/M2/M3/M4). Scripts use Homebrew, which handles all dependencies. Bash 3.2+ (ships with macOS). Internet connection…
It sits in DevOps & Cloud, covering Shell scripting and Containers. It works with Homebrew, Python, macOS and Bash. The repository describes itself as: Agent skills for Claude Code and other AI agents. The licence is MIT.
3 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 038ef34. 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 8 files in scripts/ (Shell), which the agent can run.
Shell commands in SKILL.md call:
brewuvbashgitFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
github.comwispr.comsuperwhisper.comtelestream.nettella.tvappquitter.comclipbook.appFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
HF_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Requires macOS on Apple Silicon (M1/M2/M3/M4). Scripts use Homebrew, which handles all dependencies. Bash 3.2+ (ships with macOS). Internet connection required for package downloads.
From compatibility in the SKILL.md frontmatter.
New Mac Setup loads about 4.3k tokens when it runs. Until then it costs about 208 tokens; SKILL.md has 1,708 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 swyxio/skills at commit 038ef34, republished under its MIT licence (© swyxio). 1,708 words, ~4,317 tokens.
.claude/skills/new-mac-setup/SKILL.md (or your agent's skills folder). This skill also uses 10 other files; get the full folder from GitHub.This skill generates and runs a complete, idempotent Mac setup for fullstack web development and AI engineering. It produces 8 shell scripts that can be run individually or via a master runner, plus dotfiles and macOS preference automation.
The scripts are designed to be re-runnable — they check whether each tool is already installed before attempting installation, so you can safely run them again if something fails partway through.
The setup is opinionated. The core opinions:
agy via the antigravity Homebrew cask), Railway CLI, Ollama for local modelsHF_TOKEN is configured. Diarization should default to GPU/cloud paths; do not burn local CPU on long diarization unless explicitly requested.Before generating scripts, ask the user a few questions to customize the setup. Key things to learn:
git configFor RAM-based Ollama model recommendations:
Generate 8 scripts into the user's chosen directory. Each script is standalone and idempotent. Use the templates in scripts/ as the base, customizing per the user's answers.
The scripts should run in this order:
01-xcode-and-homebrew.sh # Xcode CLI tools + Homebrew (15-25 min)
02-shell-setup.sh # Oh-My-ZSH + plugins + fonts
03-brew-packages.sh # All brew formulae + cask apps
04-dev-environment.sh # Node (fnm), Python (uv), Git, Docker
05-ai-tools.sh # Claude Code, Codex CLI, Antigravity CLI, Ollama models, llama.cpp
06-dotfiles.sh # .zshrc + Ghostty config
07-macos-settings.sh # System preferences via defaults commands
00-run-all.sh # Master runner (runs 01-07 in order)If possible, execute the scripts directly. If running in a VM/sandbox that can't reach the user's Mac, write the scripts to the workspace folder and put a one-liner in the clipboard:
cd /path/to/scripts && chmod +x ./*.sh && bash ./00-run-all.shThese are real issues encountered during testing. The scripts in scripts/ already incorporate these fixes, but if you're generating fresh scripts, keep these in mind:
fnm needs sourcing before npm works. After installing Node via fnm, the current shell doesn't have npm in PATH until you run eval "$(fnm env --use-on-cd)". Every script that uses npm/node must source fnm first.
Don't use set -e in the master runner. If one script fails (e.g., a brew cask 404s), set -e kills the entire pipeline. Individual scripts can use set -e if they handle errors gracefully, but the master runner should not.
Source brew and fnm in the master runner. Add these lines near the top of 00-run-all.sh so all child scripts inherit them:
eval "$(/opt/homebrew/bin/brew shellenv)" 2>/dev/null || true
eval "$(fnm env --use-on-cd)" 2>/dev/null || trueSmart quotes break shell commands. If writing commands to the clipboard, avoid curly/smart quotes. Use simple ASCII quotes only, or avoid quotes entirely where possible. The safest clipboard commands are single simple statements like bash ./07-macos-settings.sh.
Zoom and some casks require sudo. The Zoom installer triggers a Password: prompt. The user needs to be warned that some cask installs will pause for their password.
brew install yarn --ignore-dependencies is needed if Node is managed by fnm (not brew). Otherwise brew tries to install its own Node as a yarn dependency.
Ghostty config location: ~/.config/ghostty/config. cmux reads this same file.
# Core dev tools
gh, git, fnm, pnpm, bun, z, diff-so-fancy
# Languages & runtimes
elixir, erlang, python@3.13
# Docker (no Docker Desktop)
colima, docker, docker-completion
# Media & processing
ffmpeg, yt-dlp, tesseract, libsndfile
# Build dependencies
openssl@3, readline, sqlite, xz, zstd
# Databases
postgresql@14, rabbitmq
# Misc CLI
honcho, pipx, flyctl, entr, tig, mas, terminal-notifier, googleworkspace-cli
# Google Workspace
googleworkspace-cli installs the `gws` binary; auth still requires `gws auth setup` and `gws auth login`.
# Libraries
cairo, glib, harfbuzz, libvmaf, webp# Terminal
ghostty
# Editors
cursor, visual-studio-code
# Browser
thebrowsercompany-dia
# Communication
slack, discord, zoom
# Productivity
raycast, rectangle, obsidian, notion, notion-calendar
# AI & ML
ollama, antigravity
# Media
vlc, audacity, tella, descript
# Utilities
shottr, notunes, caffeine, stretchly, quickshade, pure-paste, 1password
# Dev tools
beeper, superhuman, gcloud-cliPlus cmux via: brew tap manaflow-ai/cmux && brew install --cask cmux
gcloud-cli installs Google Cloud CLI (gcloud). Keep /opt/homebrew/share/google-cloud-sdk/bin on PATH so additional SDK components are available after install.
These tools were suggested by Claude during the initial setup session and accepted by the user. They are now part of the default install in 03-brew-packages.sh:
brew install fzfrg) — Blazingly fast grep replacement. Respects .gitignore, searches recursively by default. Essential for any developer. brew install ripgrepcat with syntax highlighting, line numbers, and git integration. Makes reading code files in terminal beautiful. brew install batz replacement with a smarter frecency algorithm and fuzzy matching. Same muscle memory, better results. brew install zoxidebrew install --cask orbstackundollar, npm-check-updates, trash-cli,
@anthropic-ai/claude-code, @openai/codex, @railway/cliInstall Google Antigravity through Homebrew:
brew install --cask antigravityThe cask installs the desktop app and exposes agy as the Antigravity CLI. Prefer this over Gemini CLI for new setups: Google announced on May 19, 2026 that consumer Gemini CLI access for free, Google AI Pro, and Ultra users stops serving requests on June 18, 2026. Enterprise and paid API-key Gemini CLI access can remain available, but this new-Mac path should default to Antigravity CLI.
Install the local transcription stack on new AI/dev Macs because it is useful for meetings, podcasts, YouTube/video workflows, and searchable archives.
Add this to 03-brew-packages.sh / 04-dev-environment.sh generation:
brew install ffmpeg yt-dlp libsndfile
uv tool install mlx-whisper || true
mkdir -p "$HOME/.local/share/transcribe-anything"
uv venv --python 3.11 "$HOME/.local/share/transcribe-anything/.venv-pyannote"
uv pip install --python "$HOME/.local/share/transcribe-anything/.venv-pyannote/bin/python" \
"pyannote.audio" soundfileGuidance for generated docs:
mlx_whisper is the preferred local ASR path on Apple Silicon when available.pyannote.audio direct is the preferred diarization path when HF_TOKEN is configured and the user has accepted Hugging Face model terms, but run it on CUDA/cloud GPU for long files.pyannote/speaker-diarization-community-1 and pyannote/segmentation-3.0, then set HF_TOKEN in their shell or secret manager. Never bake tokens into generated setup scripts.When setting up AI tools on a new Mac, also install and configure peon-ping with these defaults:
~/.claude/hooks/peon-ping/ so Claude Code, Codex, and Cursor can all use the same install.~/.codex/config.toml:notify = ["bash", "/Users/$USER/.claude/hooks/peon-ping/adapters/codex.sh"]~/.cursor/ exists.default_pack: "peon" as the fallback pack.glados, jarvis, r2d2, peasant, sc_kerrigan, sc_scv, sc_marine, sc_raynor, sc_ghost, sc_terran, protoss, sc2_alarak, sc2_abathur, ra2_eva_commander, ra2_kirov, ra2_yuri, ra_soviet, ccg_gla_worker, ccg_us_dozer, ccg_china_dozerpack_rotation_mode to round-robin.volume to 0.2.desktop_notifications enabled, but use notification_style: "standard" rather than large overlays.terminal-notifier via Homebrew so standard macOS notifications work reliably and support click-to-focus behavior.suppress_sound_when_tab_focused: true.silent_window_seconds: 30 so task.complete only fires for longer-running work.session.start: falsetask.acknowledge: falsetask.complete: truetask.error: trueinput.required: trueresource.limit: trueuser.spam: falseqwen3.5:27b # General purpose (256K context, multimodal)
qwen2.5-coder:14b # Code-focused
deepseek-r1:8b # Reasoning# Finder: show extensions, show dotfiles, show path bar, list view
# Dock: auto-hide, no recents, no delay, minimize to app icon
# Keyboard: no autocorrect, no smart quotes, fast repeat, no press-and-hold
# Trackpad: no natural scrolling, tap to click
# Screenshots: PNG, Desktop, no shadow
# Menu bar: auto-hideThese can't be automated via defaults write:
These aren't in Homebrew or need manual install:
After all scripts finish, open these apps to sign in and configure them. The skill should auto-open them for the user:
# Apps that need login/activation after install
open -a "Slack"
open -a "Discord"
open -a "Raycast"
open -a "Shottr"
open -a "1Password"
open -a "Spotify"
open -a "Zoom"
open -a "Dia"
open -a "GitHub Desktop" 2>/dev/null
open -a "Claude" 2>/dev/null
echo "🔑 Sign into each app above, then continue setup."Essential:
Nice to have:
Things worth considering that aren't in the original blog posts but complement this setup well:
z alternative with fuzzy matchingcat replacement with syntax highlightingls replacementfind alternativegrep (rg)The .zshrc should include:
The Ghostty config should include:
© swyxio, MIT. 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 10 other files (scripts) in new-mac-setup of swyxio/skills.
Open the folder on GitHubat commit 038ef34
New Mac Setup 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 |
|---|---|---|---|---|---|---|
| New Mac Setup this skillswyxio/skills | 175 | — | ~4.3k | Automated safety check: Pass | MIT | |
| Environment Setup AssistantArabelaTso/Skills-4-SE | 253 | — | ~3k | Automated safety check: Notes | Apache-2.0 | |
| Headless Codex CLI AutomationXiaomiMiMo/MiMo-Code | 14k | — | ~2.7k | Automated safety check: Pass | MIT | |
| Deploy To Tempsgotempsh/temps | 828 | — | ~1.3k | Automated safety check: Notes | Apache-2.0 | |
| Writing Dockerfilesancoleman/ai-design-components | 526 | — | ~3.2k | Automated safety check: Notes | MIT | |
| Env Troubleshoot312362115/claude | 107 | — | ~900 | Automated safety check: Warn | MIT |
ArabelaTso/Skills-4-SE
Generate setup scripts and instructions for development environments across platforms.
XiaomiMiMo/MiMo-Code
Runs OpenAI Codex CLI as a non-interactive worker for CI, Docker, Kubernetes or remote servers, with sandbox modes and JSONL-friendly output.
gotempsh/temps
Deploy applications to the Temps platform with automatic framework detection, Dockerfile generation, and container orchestration.
ancoleman/ai-design-components
Writing optimized, secure, multi-stage Dockerfiles with language-specific patterns (Python, Node.js, Go, Rust), BuildKit features, and distroless images.
312362115/claude
环境排障技能:结构化排查开发环境问题. An agent skill from 312362115/claude.
ArabelaTso/Skills-4-SE
Generate Dockerfiles, Docker Compose configurations, and Kubernetes manifests for containerizing applications.
swyxio/skills
Run a selected coding-agent CLI programmatically, with latency, error, usage, cost, and trace logging.
swyxio/skills
Design, implement, audit, or refresh protected username and handle namespaces for public products.
swyxio/skills
Manage YouTube videos programmatically via the YouTube Data API v3 — upload video files, upload custom thumbnails, update video metadata (titles, descriptions, tags), and query video/channel info…
swyxio/skills
Batch YouTube Studio upload workflow for videos sourced from Airtable, Google Drive, Loom, YouTube, or local files.
swyxio/skills
Reconstruct and visually analyze paired agent, game, or policy trajectories to determine whether changed actions produced their intended effects.
swyxio/skills
Operate or diagnose SmolForge repositories and Forge Deploy/Sites when the task requires Forge-specific CLI, authentication, manifest, or release behavior on forge.smol.ai or .sites.smol.ai.
Categories
Fully automated new Mac setup for fullstack web developers and AI engineers. New Mac Setup is an agent skill from swyxio/skills. Fully automated new Mac setup for fullstack web developers and AI engineers.
New Mac Setup fits situations like: someone says set up my Mac; configure my dev machine; install my dev tools; fresh Mac install.
Run `npx skills add swyxio/skills --skill new-mac-setup -a claude-code`. Or copy the skill folder (new-mac-setup in swyxio/skills) into .claude/skills/new-mac-setup in your project. Claude Code loads it when a task matches its description.
Run `npx skills add swyxio/skills --skill new-mac-setup -a codex`. Or copy the skill folder (new-mac-setup in swyxio/skills) into .agents/skills/new-mac-setup 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 swyxio/skills --skill new-mac-setup -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/new-mac-setup, .gemini/skills/new-mac-setup, .github/skills/new-mac-setup and .opencode/skills/new-mac-setup in your project.
Going by SKILL.md and its folder, New Mac Setup needs a shell for the scripts in its folder, the command-line tools its instructions call (brew, uv, bash and git) and credentials named HF_TOKEN. Our summary lists: Python 3; Node.js; A Bash shell; Docker. Compatibility (from SKILL.md): Requires macOS on Apple Silicon (M1/M2/M3/M4). Scripts use Homebrew, which handles all dependencies. Bash 3.2+ (ships with macOS). Internet connection required for package downloads. .
SKILL.md names 7 domains. As links in the text: github.com, wispr.com, superwhisper.com, telestream.net, tella.tv, appquitter.com and clipbook.app. 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.
New Mac Setup is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.3k tokens (SKILL.md is roughly 17k 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 New Mac Setup: Environment Setup Assistant (ArabelaTso/Skills-4-SE, 253 stars), Headless Codex CLI Automation (XiaomiMiMo/MiMo-Code, 14k stars), Deploy To Temps (gotempsh/temps, 828 stars) and Writing Dockerfiles (ancoleman/ai-design-components, 526 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
swyxio (a GitHub user) maintains it in swyxio/skills, which has 175 GitHub stars. The repository holds 89 skills in this directory. The repository was last updated on October 5, 2026.
Source: swyxio/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.