Generates 3D molecular conformers from SMILES strings or files with RDKit, keeps the lowest-energy one per molecule, and falls back to 2D coordinates when embedding fails.

LGPL-3.0Auto-check passedResearch & Science

Install RDKit Conformer Generator

skills CLI
$ npx skills add jinzhezenggroup/computational-chemistry-agent-skills --skill rdkit-conf -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install jinzhezenggroup/computational-chemistry-agent-skills rdkit-conf --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/jinzhezenggroup/computational-chemistry-agent-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/molecular-conformer/rdkit-conf .claude/skills/rdkit-conf && rm -rf skills-src

Use ~/.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/

Facts

Skill name
rdkit-conf
GitHub stars
148
Token cost
~2.4k tokens
SKILL.md length
739 words
Files
2 (incl. scripts)
Skills in repo
62
Repo updated
First seen
Licence
LGPL-3.0

At a glance

Generates 3D molecular conformers from SMILES strings or files with RDKit, keeps the lowest-energy one per molecule, and falls back to 2D coordinates when embedding fails.

  • Works in 7 steps: Generate 3D conformers (SDF output,… → Control conformer sampling count → Choose force-field minimization → …
  • Preparing 3D geometries from a SMILES dataset before docking
  • SKILL.md covers Quick Start, Core Tasks, 3D Embedding Pipeline Details and Output Format Notes, plus 2 more sections
  • Runs Python scripts from its folder; calls uv

What it does

A helper script, scripts/rdkit_conf_helper.py, samples several conformers per molecule with ETKDGv3 (10 by default, set by the num-confs option), optimizes each with MMFF94s or UFF, and keeps the lowest-energy result. SMILES can come from a single string, a CSV with a configurable column and optional name column, or an SMI file where the second token is the name. Output goes to SDF by default, or to XYZ.

If every 3D attempt fails, the molecule gets a 2D layout and a warning line is printed. Invalid SMILES are skipped and logged to a skipped CSV, and 2D fallbacks go to a separate fallback CSV. Each run prints the detected Python, RDKit and pandas environment, a summary count of 3D, 2D and skipped molecules, and the absolute paths of the files it wrote. The results suit docking, visualization or 3D descriptor calculations.

When your agent uses it

  • Preparing 3D geometries from a SMILES dataset before docking
  • Producing SDF or XYZ files for visualization
  • Computing 3D descriptors that need optimized conformers

Example prompts

  • “Generate 3D conformers for molecules.csv using the smiles column and write an SDF.”
  • “Make a 3D structure for ethanol from the SMILES CCO and save it as XYZ.”
  • “Run conformer generation on candidates.smi with more conformers per molecule than the default.”

Requirements

  • uv installed, with the script run through uv run and not uv run python
  • RDKit and pandas, installed automatically from the script's inline metadata
  • Compatibility (from SKILL.md): Requires uv. Dependencies (rdkit, pandas) are declared as PEP 723 inline script metadata and are installed automatically when the script is invoked with `uv run <script_path>` (do NOT use `uv run python <script_path>` -- that bypasses the inline metadata and will not install dependencies automatically).

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Generate 3D conformers (SDF output, default)
  2. Control conformer sampling count
  3. Choose force-field minimization
  4. XYZ output
  5. Tuning embedding for difficult molecules
  6. Suppress hydrogen addition
  7. Custom log file paths

What it can do on your machine

Read from SKILL.md and the folder at commit 5c19e75. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Ships 1 file in scripts/ (Python), which the agent can run.

    Shell commands in SKILL.md call:

    • uv

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • rdkit.org

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

  • Compatibility

    Requires uv. Dependencies (rdkit, pandas) are declared as PEP 723 inline script metadata and are installed automatically when the script is invoked with `uv run <script_path>` (do NOT use `uv run python <script_path>` -- that bypasses the inline metadata and will not install dependencies automatically).

    From compatibility in the SKILL.md frontmatter.

Context cost

RDKit Conformer Generator loads about 2.4k tokens when it runs. Until then it costs about 136 tokens; SKILL.md has 739 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~136
When it runs · the whole SKILL.md, loaded when a task matches
~2.4k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from jinzhezenggroup/computational-chemistry-agent-skills at commit 5c19e75, republished under its LGPL-3.0 licence (© jinzhezenggroup). 739 words, ~2,380 tokens.

Download SKILL.mdSave it as .claude/skills/rdkit-conf/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
rdkit-conf
description
A standardized CLI wrapper for RDKit 3D/2D conformer generation that samples multiple conformers per molecule (ETKDGv3, default 10), optimizes each with a force field (MMFF94s/UFF), keeps the lowest-energy conformer, automatically falls back to 2D layout on total embedding failure with a printed warning, and writes results to SDF or XYZ format. USE WHEN you need to generate 3D (or 2D fallback) molecular geometries from SMILES datasets (.csv/.smi) for downstream tasks such as docking, visualization, or 3D-descriptor computation.
compatibility
Requires uv. Dependencies (rdkit, pandas) are declared as PEP 723 inline script metadata and are installed automatically when the script is invoked with `uv run <script_path>` (do NOT use `uv run python <script_path>` -- that bypasses the inline metadata and will not install dependencies automatically).
metadata.author
luzitian
metadata.version
1.0
metadata.repository
https://github.com/rdkit/rdkit

RDKit Conformer Generation

This skill provides practical command patterns for RDKit 3D/2D conformer generation using the standardized CLI wrapper: <skill_path>/scripts/rdkit_conf_helper.py.

Key behaviors (important for Agents):

  • The script prints environment detection (Python/RDKit/Pandas) by default.
  • Multi-conformer sampling: embeds --num-confs conformers (default 10) per molecule via EmbedMultipleConfs, optimizes each with the chosen force field, and keeps the lowest-energy one. Set --num-confs 1 to revert to single-conformer behavior.
  • 2D fallback: if all 3D embedding attempts fail, Compute2DCoords is used instead and a [WARN] line is printed to stderr for that molecule.
  • Bad/illegal SMILES are skipped entirely and logged to *.skipped.csv (no crash).
  • Molecules that fell back to 2D are additionally logged to *.fallback.csv.
  • Each run ends with a summary line and absolute output paths:
    • [INFO] Done: <N_3d> 3D, <N_2d> 2D-fallback, <N_skip> skipped (total input: <N>)
    • [RESULT] conf_sdf=/abs/path.sdf
    • [RESULT] conf_xyz=/abs/path.xyz
    • [RESULT] fallback_csv=/abs/path.fallback.csv (only if any 2D fallbacks occurred)
    • [RESULT] skipped_csv=/abs/path.skipped.csv (only if any SMILES were skipped)

Quick Start

Check CLI help:

bash
uv run <skill_path>/scripts/rdkit_conf_helper.py --help
uv run <skill_path>/scripts/rdkit_conf_helper.py conf --help

Disable environment printing (optional):

bash
uv run <skill_path>/scripts/rdkit_conf_helper.py --no-env conf --smiles "CCO" --output out.sdf

Core Tasks

1) Generate 3D conformers (SDF output, default)

Single SMILES:

bash
uv run <skill_path>/scripts/rdkit_conf_helper.py conf \
    --smiles "CCO" \
    --output /tmp/CCO.sdf

Single SMILES with a custom molecule name:

bash
uv run <skill_path>/scripts/rdkit_conf_helper.py conf \
    --smiles "c1ccccc1" \
    --name benzene \
    --output /tmp/benzene.sdf

From CSV (default SMILES column: smiles):

bash
uv run <skill_path>/scripts/rdkit_conf_helper.py conf \
    --file data.csv \
    --smiles-col smiles \
    --output data.sdf

From CSV with a name column:

bash
uv run <skill_path>/scripts/rdkit_conf_helper.py conf \
    --file data.csv \
    --smiles-col smiles \
    --name-col compound_id \
    --output data.sdf

From SMI (second token per line is used as name automatically):

bash
uv run <skill_path>/scripts/rdkit_conf_helper.py conf \
    --file molecules.smi \
    --output molecules.sdf
2) Control conformer sampling count

Default (10 conformers sampled, lowest-energy kept):

bash
uv run <skill_path>/scripts/rdkit_conf_helper.py conf \
    --file data.csv --output data.sdf

Single conformer (fastest, least thorough):

bash
uv run <skill_path>/scripts/rdkit_conf_helper.py conf \
    --file data.csv --num-confs 1 --output data.sdf

Increase sampling for flexible or macrocyclic molecules:

bash
uv run <skill_path>/scripts/rdkit_conf_helper.py conf \
    --file data.csv --num-confs 50 --output data.sdf
3) Choose force-field minimization

MMFF94s (default, falls back to UFF if unavailable):

bash
uv run <skill_path>/scripts/rdkit_conf_helper.py conf \
    --file data.csv --ff mmff94s --output data.mmff.sdf

UFF (universal force field):

bash
uv run <skill_path>/scripts/rdkit_conf_helper.py conf \
    --file data.csv --ff uff --output data.uff.sdf

Skip force-field optimization (raw ETKDG geometry only):

bash
uv run <skill_path>/scripts/rdkit_conf_helper.py conf \
    --file data.csv --ff none --output data.etkdg_raw.sdf
4) XYZ output
bash
uv run <skill_path>/scripts/rdkit_conf_helper.py conf \
    --file data.csv \
    --format xyz \
    --output data.xyz
5) Tuning embedding for difficult molecules

Large or macrocyclic molecules sometimes fail standard ETKDG; try random initial coordinates:

bash
uv run <skill_path>/scripts/rdkit_conf_helper.py conf \
    --file macrocycles.csv \
    --use-random-coords \
    --max-attempts 500 \
    --output macrocycles.sdf

Use a different random seed (reproducibility):

bash
uv run <skill_path>/scripts/rdkit_conf_helper.py conf \
    --file data.csv --seed 123 --output data.seed123.sdf

Non-deterministic embedding (seed = -1):

bash
uv run <skill_path>/scripts/rdkit_conf_helper.py conf \
    --file data.csv --seed -1 --output data.sdf
6) Suppress hydrogen addition

By default explicit H atoms are added before embedding for more accurate 3D geometry. Use --no-hs to keep the molecule as-is (heavy atoms only):

bash
uv run <skill_path>/scripts/rdkit_conf_helper.py conf \
    --file data.csv --no-hs --output data.noh.sdf
7) Custom log file paths
bash
uv run <skill_path>/scripts/rdkit_conf_helper.py conf \
    --file data.csv \
    --output data.sdf \
    --error-log logs/skipped.csv \
    --fallback-log logs/used_2d.csv

3D Embedding Pipeline Details

For each molecule, the script runs the following steps in order:

  1. Parse SMILES via Chem.MolFromSmiles.
  2. Add hydrogens (Chem.AddHs) -- skipped with --no-hs.
  3. Multi-conformer 3D embedding (EmbedMultipleConfs, --num-confs candidates, default 10): tries ETKDGv3, then ETKDGv2, then ETDG, then ETDG+useRandomCoords as a fallback chain until at least one conformer is embedded.
  4. Force-field minimization (if --ff is not none): each successfully embedded conformer is individually optimized. MMFF94s transparently falls back to UFF if parameters are unavailable for that molecule.
  5. Lowest-energy selection: the conformer with the minimum post-optimization energy is retained; all others are discarded. If --ff none, the first embedded conformer is kept without energy ranking.
  6. 2D fallback (if all 3D attempts yield zero conformers): generates a flat 2D layout via Compute2DCoords (Z=0 for all atoms), prints a [WARN] to stderr, and records the molecule in the fallback log.

Show full SKILL.md (283 more words)Show less

Output Format Notes

SDF output (--format sdf, default):

  • Standard V2000 multi-molecule SDF, one conformer per molecule.
  • Molecule name (from --name, --name-col, or auto-generated mol_<i>) is written to the SDF header line.
  • Compatible with most cheminformatics tools (RDKit, OpenBabel, Schrodinger, etc.).

XYZ output (--format xyz):

  • Concatenated XYZ blocks (element, x, y, z per atom).
  • Molecule name is written as the comment line (second line of each block).
  • Coordinates are in Angstroms.
  • Note: if --no-hs is used, hydrogen atoms are absent from the XYZ.

Fallback log (*.fallback.csv):

  • Written only when at least one molecule fell back to 2D.
  • Columns: idx, smiles, name, dim (always 2), ff (always 2d_fallback), note.

Skipped log (*.skipped.csv):

  • Written only when at least one SMILES was skipped.
  • Columns: idx, smiles, error.

Agent Checklist

When using this skill for users:

  1. Confirm input format:
    • .csv requires a SMILES column (default smiles)
    • .smi uses the first token per line as SMILES, second token (if present) as name
  2. Quote SMILES containing special shell characters (brackets/parentheses):
    • Example: --smiles "[C@@H](O)(F)Cl"
  3. For CSV workflows, verify column names:
    • --smiles-col for the SMILES column
    • --name-col (optional) for molecule identifiers to embed in SDF/XYZ headers
  4. Check the [INFO] Done: summary line for the 3D/2D/skip breakdown.
  5. If 2D fallbacks occurred, inspect *.fallback.csv:
    • Consider --use-random-coords or --max-attempts tuning for the affected SMILES.
    • 2D conformers have Z=0 and are not suitable for 3D-based applications (docking, 3D QSAR).
  6. Always capture absolute output paths:
    • Look for [RESULT] ...=/abs/path in stdout.
  7. If debugging is needed, enable full traceback:
    • RDKIT_CONF_HELPER_TRACE=1 uv run <skill_path>/scripts/rdkit_conf_helper.py ...

References

© jinzhezenggroup, LGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file (scripts) in molecular-conformer/rdkit-conf of jinzhezenggroup/computational-chemistry-agent-skills.

  • SKILL.md
  • scripts/rdkit_conf_helper.py

Open the folder on GitHubat commit 5c19e75

Compare with similar skills

RDKit Conformer 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.

RDKit Conformer Generator compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
RDKit Conformer Generator this skilljinzhezenggroup/computational-chemistry-agent-skills148—~2.4kAutomated safety check: PassLGPL-3.0
ADMET Prediction for Drug CandidatesGPTomics/bioSkills1.2k1 repos~5kAutomated safety check: PassMIT
DiffDock Molecular DockingK-Dense-AI/scientific-agent-skills48k1 repos~3kAutomated safety check: NotesMIT
Edu Chem Reactionwy51ai/edulab1.4k—~1.2kAutomated safety check: PassApache-2.0
Rowanlamm-mit/scienceclaw2464 repos~3.1kAutomated safety check: WarnProprietary
Coot Rdkitpemsley/coot168—~981Automated safety check: PassGPL-3.0

Similar skills

  • Predicts absorption, distribution, metabolism, excretion and toxicity for drug candidates with ADMETlab 3.0, ADMET-AI, DeepChem and chemprop, plus druglikeness filters.

    1.2k GitHub starsUsed in 1 repo~5k tokens
    Research & ScienceAuto-check passed
  • DiffDock Molecular Docking

    K-Dense-AI/scientific-agent-skills

    Predicts how small molecules bind to a protein with DiffDock, covering batch docking, pose ranking by confidence and checks on the results; not for binding affinity.

    48k GitHub starsUsed in 1 repo~3k tokens
    Research & ScienceAuto-check: notes
  • Edu Chem Reaction

    wy51ai/edulab

    把一个化学反应做成自包含的微观 3D 交互演示网页:左/上为 Three.js 可交互分子动画 (拖滑块看断键·成键·原子重组,分步高亮),右为 KaTeX 反应方程 + 分步讲解 + 原子守恒计数 + 可选能量-反应进程曲线。支持三入口——给定文字反应/方程、随机出题、上传图片识别后演示。

    1.4k GitHub stars~1.2k tokensUpdated yesterday
    Research & ScienceAuto-check passed
  • Rowan

    lamm-mit/scienceclaw

    Cloud-based quantum chemistry platform with Python API. An agent skill from lamm-mit/scienceclaw.

    246 GitHub starsUsed in 4 repos~3.1k tokens
    Research & ScienceAuto-check: warnings
  • Coot Rdkit

    pemsley/coot

    RDKit molecular manipulation and visualization within Coot's Python environment.

    168 GitHub stars~981 tokensUpdated 3 days ago
    Research & ScienceAuto-check passed
  • RDKit Cheminformatics

    davila7/claude-code-templates

    Guides molecular work with RDKit in Python: reading SMILES and SDF, sanitization, descriptors, fingerprints, substructure and similarity search, reactions and coordinates.

    33k GitHub starsUsed in 14 repos~5k tokens
    Research & ScienceAuto-check passed

More from jinzhezenggroup/computational-chemistry-agent-skills

All 62 skills in this repo
  • Quantum ESPRESSO DFT Task Builder

    jinzhezenggroup/computational-chemistry-agent-skills

    Turns a user-supplied atomic structure and DFT settings into a runnable Quantum ESPRESSO input file, stopping short of submitting the job.

    148 GitHub stars~1.8k tokensUpdated 2 days ago
    Auto-check passed
  • DP-GEN Simplify Workflow

    jinzhezenggroup/computational-chemistry-agent-skills

    Prepares, validates and runs DP-GEN simplify jobs that thin out repeated or redundant DeepMD datasets, generating param.json and machine.json for local or scheduler runs.

    148 GitHub stars~2.7k tokensUpdated 2 days ago
    Auto-check passed
  • LAMMPS with DeePMD-kit

    jinzhezenggroup/computational-chemistry-agent-skills

    Prepares and runs molecular dynamics simulations in LAMMPS with a DeePMD machine-learning potential, writing the input script and choosing NVE, NVT or NPT.

    148 GitHub stars~2.8k tokensUpdated 2 days ago
    Auto-check passed
  • LAMMPS ReaxFF Setup

    jinzhezenggroup/computational-chemistry-agent-skills

    Prepares and explains LAMMPS input scripts for reactive molecular dynamics with the ReaxFF potential, including charge equilibration and ensemble choice.

    148 GitHub stars~1.8k tokensUpdated 2 days ago
    Auto-check passed
  • RDKit Descriptors and Fingerprints

    jinzhezenggroup/computational-chemistry-agent-skills

    Computes RDKit physicochemical descriptors and molecular fingerprints from SMILES through a uv-run CLI script that skips and logs invalid molecules.

    148 GitHub stars~2.3k tokensUpdated 2 days ago
    Auto-check passed
  • Unimol

    jinzhezenggroup/computational-chemistry-agent-skills

    A standardized CLI wrapper for Uni-Mol molecular ML workflows that handles representation extraction (embeddings), model training (regression/classification), and property prediction with built-in…

    148 GitHub stars~1.5k tokensUpdated 2 days ago
    Auto-check passed

Questions about RDKit Conformer Generator

What does RDKit Conformer Generator do?

Generates 3D molecular conformers from SMILES strings or files with RDKit, keeps the lowest-energy one per molecule, and falls back to 2D coordinates when embedding fails. py, samples several conformers per molecule with ETKDGv3 (10 by default, set by the num-confs option), optimizes each with MMFF94s or UFF, and keeps the lowest-energy result. SMILES can come from a single string, a CSV with a configurable column and optional name column, or an SMI file where the second token is the name.

When should I use RDKit Conformer Generator?

RDKit Conformer Generator fits situations like: preparing 3D geometries from a SMILES dataset before docking; producing SDF or XYZ files for visualization; computing 3D descriptors that need optimized conformers.

How do I install RDKit Conformer Generator in Claude Code?

Run `npx skills add jinzhezenggroup/computational-chemistry-agent-skills --skill rdkit-conf -a claude-code`. Or copy the skill folder (molecular-conformer/rdkit-conf in jinzhezenggroup/computational-chemistry-agent-skills) into .claude/skills/rdkit-conf in your project. Claude Code loads it when a task matches its description.

How do I install RDKit Conformer Generator in Codex?

Run `npx skills add jinzhezenggroup/computational-chemistry-agent-skills --skill rdkit-conf -a codex`. Or copy the skill folder (molecular-conformer/rdkit-conf in jinzhezenggroup/computational-chemistry-agent-skills) into .agents/skills/rdkit-conf in your project. Codex loads it when a task matches its description.

Can I use RDKit Conformer Generator in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add jinzhezenggroup/computational-chemistry-agent-skills --skill rdkit-conf -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/rdkit-conf, .gemini/skills/rdkit-conf, .github/skills/rdkit-conf and .opencode/skills/rdkit-conf in your project.

What does RDKit Conformer Generator need to run?

Going by SKILL.md and its folder, RDKit Conformer Generator needs Python for the scripts in its folder and the command-line tools its instructions call (uv). Our summary lists: uv installed, with the script run through uv run and not uv run python; RDKit and pandas, installed automatically from the script's inline metadata. Compatibility (from SKILL.md): Requires uv. Dependencies (rdkit, pandas) are declared as PEP 723 inline script metadata and are installed automatically when the script is invoked with `uv run <script_path>` (do NOT use `uv run python <script_path>` -- that bypasses the inline metadata and will not install dependencies automatically)..

Does RDKit Conformer Generator access the network?

SKILL.md names 1 domain. As links in the text: rdkit.org. This is read from the text; nothing was executed.

Is RDKit Conformer Generator safe to install?

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.

What licence does RDKit Conformer Generator use?

RDKit Conformer Generator is published under the LGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does RDKit Conformer Generator use?

About 2.4k tokens (SKILL.md is roughly 9.5k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to RDKit Conformer Generator?

Skills that share tags, products or a category with RDKit Conformer Generator: ADMET Prediction for Drug Candidates (GPTomics/bioSkills, 1.2k stars), DiffDock Molecular Docking (K-Dense-AI/scientific-agent-skills, 48k stars), Edu Chem Reaction (wy51ai/edulab, 1.4k stars) and Rowan (lamm-mit/scienceclaw, 246 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains RDKit Conformer Generator?

jinzhezenggroup (a GitHub organization) maintains it in jinzhezenggroup/computational-chemistry-agent-skills, which has 148 GitHub stars. The repository holds 62 skills in this directory. The repository was last updated on October 9, 2026.

Source: jinzhezenggroup/computational-chemistry-agent-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.