GSAP for React
greensock/gsap-skills
Shows how to run GSAP animations in React and Next.js with the useGSAP hook, refs, scoped selectors and automatic cleanup on unmount.
Framer Motion (Motion) patterns for React: spring presets, staggers, layout animations, micro-interactions, scroll effects and page transitions, with performance rules.
$ npx skills add dylanfeltus/skills --skill motion-design-patterns -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install dylanfeltus/skills motion-design-patterns --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/dylanfeltus/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/motion-design-patterns .claude/skills/motion-design-patterns && 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 "motion-design-patterns" agent skill from https://github.com/dylanfeltus/skills/tree/main/motion-design-patterns into .claude/skills/motion-design-patterns/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "motion-design-patterns", 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/dylanfeltus/skills/tree/main/motion-design-patternsType 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 dylanfeltus/skills --skill motion-design-patterns -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install dylanfeltus/skills motion-design-patterns --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dylanfeltus/skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/motion-design-patterns .agents/skills/motion-design-patterns && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "motion-design-patterns" agent skill from https://github.com/dylanfeltus/skills/tree/main/motion-design-patterns into .agents/skills/motion-design-patterns/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "motion-design-patterns", 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 dylanfeltus/skills --skill motion-design-patterns -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install dylanfeltus/skills motion-design-patterns --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dylanfeltus/skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/motion-design-patterns .cursor/skills/motion-design-patterns && 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 "motion-design-patterns" agent skill from https://github.com/dylanfeltus/skills/tree/main/motion-design-patterns into .cursor/skills/motion-design-patterns/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "motion-design-patterns", 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/dylanfeltus/skills.git --path motion-design-patterns--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 dylanfeltus/skills --skill motion-design-patterns -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install dylanfeltus/skills motion-design-patterns --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dylanfeltus/skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/motion-design-patterns .gemini/skills/motion-design-patterns && 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 "motion-design-patterns" agent skill from https://github.com/dylanfeltus/skills/tree/main/motion-design-patterns into .gemini/skills/motion-design-patterns/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "motion-design-patterns", 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 dylanfeltus/skills motion-design-patternsInstalls 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 dylanfeltus/skills --skill motion-design-patterns -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/dylanfeltus/skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/motion-design-patterns .github/skills/motion-design-patterns && 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 "motion-design-patterns" agent skill from https://github.com/dylanfeltus/skills/tree/main/motion-design-patterns into .github/skills/motion-design-patterns/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "motion-design-patterns", 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 dylanfeltus/skills --skill motion-design-patterns -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install dylanfeltus/skills motion-design-patterns --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dylanfeltus/skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/motion-design-patterns .opencode/skills/motion-design-patterns && 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 "motion-design-patterns" agent skill from https://github.com/dylanfeltus/skills/tree/main/motion-design-patterns into .opencode/skills/motion-design-patterns/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "motion-design-patterns", 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.
motion-design-patternsFramer Motion (Motion) patterns for React: spring presets, staggers, layout animations, micro-interactions, scroll effects and page transitions, with performance rules.
This skill collects animation patterns for React with the Motion library, the package formerly named framer-motion, installed with `npm install motion` and imported from `motion/react`. It argues that motion should be purposeful, that one well-tuned spring beats several competing animations, and that only `transform` and `opacity` should be animated, never width, height, top, left or margin.
It supplies spring presets with stiffness and damping values for snappy, smooth, gentle and bouncy feels (500 and 30 for buttons and toggles, for example), rules of thumb for tuning bounce, and numbered patterns that begin with a fade-and-rise entrance kept subtle at about 12 to 24px. Further sections cover staggers, layout animations, micro-interactions, scroll-triggered effects, exit animations and page transitions.
Read from SKILL.md and the folder at commit b97a48f. 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.
Shell commands in SKILL.md call:
npmFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
magicui.designmotion-primitives.comui.aceternity.comFrom 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.
Motion Design Patterns for React loads about 3k tokens when it runs. Until then it costs about 67 tokens; SKILL.md has 801 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 dylanfeltus/skills at commit b97a48f, republished under its MIT licence (© dylanfeltus). 801 words, ~2,962 tokens.
.claude/skills/motion-design-patterns/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Framer Motion (Motion) patterns for React — springs, staggers, layout animations, micro-interactions, scroll-triggered effects, and exit animations. The #1 differentiator between generic and polished UI.
transform and opacity only. Never animate width, height, top, left, or margin.npm install motionImport: import { motion, AnimatePresence, stagger, useScroll, useTransform } from "motion/react"
Note: The package was renamed from framer-motion to motion in late 2024. Both work, but motion is the current package.
Springs feel more natural than easing curves. Use these as your defaults:
// Snappy — buttons, toggles, small elements
const snappy = { type: "spring", stiffness: 500, damping: 30 }
// Smooth — cards, panels, modals
const smooth = { type: "spring", stiffness: 300, damping: 25 }
// Gentle — page transitions, large elements
const gentle = { type: "spring", stiffness: 200, damping: 20 }
// Bouncy — playful UI, notifications, badges
const bouncy = { type: "spring", stiffness: 400, damping: 15 }| Feel | stiffness | damping | Use for |
|---|---|---|---|
| Snappy | 500 | 30 | Buttons, toggles, chips |
| Smooth | 300 | 25 | Cards, panels, modals |
| Gentle | 200 | 20 | Page transitions, heroes |
| Bouncy | 400 | 15 | Notifications, badges, fun UI |
The bread-and-butter entrance animation. Element fades in while sliding up slightly.
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ type: "spring", stiffness: 300, damping: 25 }}
>
Content here
</motion.div>When to use: Cards, sections, any content appearing on the page.
Anti-pattern: Don't use y: 100 or large values — subtle (12–24px) feels premium, large feels janky.
Children animate in one after another. The cascade effect that makes lists feel alive.
const container = {
hidden: { opacity: 0 },
visible: {
opacity: 1,
transition: {
staggerChildren: 0.08,
delayChildren: 0.1,
},
},
}
const item = {
hidden: { opacity: 0, y: 16 },
visible: {
opacity: 1,
y: 0,
transition: { type: "spring", stiffness: 300, damping: 25 },
},
}
<motion.ul variants={container} initial="hidden" animate="visible">
{items.map((i) => (
<motion.li key={i.id} variants={item}>
{i.content}
</motion.li>
))}
</motion.ul>Timing guide:
staggerChildren: 0.1staggerChildren: 0.06staggerChildren: 0.03 (or animate as a group)Anti-pattern: Don't stagger more than ~15 items individually — it feels slow. Group them or use a wave effect.
Automatically animate between layout states. Motion's killer feature.
<motion.div layout transition={{ type: "spring", stiffness: 300, damping: 25 }}>
{isExpanded ? <ExpandedContent /> : <CollapsedContent />}
</motion.div>{tabs.map((tab) => (
<button key={tab.id} onClick={() => setActive(tab.id)}>
{tab.label}
{active === tab.id && (
<motion.div
layoutId="activeTab"
className="absolute inset-0 bg-primary rounded-md"
transition={{ type: "spring", stiffness: 400, damping: 30 }}
/>
)}
</button>
))}When to use: Tab indicators, expanding cards, reordering lists, filtering grids.
Performance tip: Add layout="position" if you only need to animate position (not size). It's cheaper.
Elements animate out before being removed from the DOM.
<AnimatePresence mode="wait">
{isVisible && (
<motion.div
key="modal"
initial={{ opacity: 0, scale: 0.95 }}
animate={{ opacity: 1, scale: 1 }}
exit={{ opacity: 0, scale: 0.95 }}
transition={{ type: "spring", stiffness: 300, damping: 25 }}
>
Modal content
</motion.div>
)}
</AnimatePresence>| Mode | Behavior | Use for |
|---|---|---|
"sync" (default) | Enter and exit at the same time | Crossfade effects |
"wait" | Wait for exit to finish before entering | Page transitions, modals |
"popLayout" | Exiting element pops out of layout flow | Lists where items are removed |
<motion.button
whileHover={{ scale: 1.02 }}
whileTap={{ scale: 0.98 }}
transition={{ type: "spring", stiffness: 500, damping: 30 }}
>
Click me
</motion.button>| Element | whileHover | whileTap |
|---|---|---|
| Button (primary) | { scale: 1.02 } | { scale: 0.98 } |
| Card | { y: -4, boxShadow: "0 8px 30px rgba(0,0,0,0.12)" } | — |
| Icon button | { scale: 1.1 } | { scale: 0.9 } |
| Link | { x: 2 } | — |
| Avatar | { scale: 1.05 } | — |
Anti-pattern: Don't scale buttons more than 1.05 — it looks cartoonish. Subtle (1.01–1.03) feels premium.
<motion.div
initial={{ opacity: 0, y: 40 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: "-100px" }}
transition={{ type: "spring", stiffness: 200, damping: 20 }}
>
Appears when scrolled into view
</motion.div>viewport.once: true — Only animate the first time (most common for landing pages).
viewport.margin — Negative margin triggers earlier (before element is fully visible).
const { scrollYProgress } = useScroll()
const opacity = useTransform(scrollYProgress, [0, 0.3], [1, 0])
const y = useTransform(scrollYProgress, [0, 0.3], [0, -50])
<motion.div style={{ opacity, y }}>
Parallax hero content
</motion.div>// In your layout or page wrapper
<AnimatePresence mode="wait">
<motion.main
key={pathname}
initial={{ opacity: 0, y: 8 }}
animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: -8 }}
transition={{ type: "spring", stiffness: 300, damping: 30 }}
>
{children}
</motion.main>
</AnimatePresence>Keep it subtle. Page transitions should be fast (200–300ms feel) and small (8–12px movement). Flashy page transitions feel like 2015.
// Animate a counter
<motion.span
key={count}
initial={{ opacity: 0, y: -10 }}
animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: 10 }}
>
{count}
</motion.span>Wrap in AnimatePresence for the exit animation. Great for dashboards, pricing, live data.
| ❌ Don't | ✅ Do Instead |
|---|---|
Animate width/height directly | Use scale or layout animations |
Large movement values (y: 200) | Subtle values (y: 16–24) |
| Bounce on everything | Reserve bounce for playful/celebratory moments |
| Animate on every scroll event | Use whileInView with once: true |
| Different timing for every element | Use consistent spring configs project-wide |
| Animation on page load for everything | Prioritize above-the-fold; stagger the rest |
| Custom easing curves | Use springs — they respond to interruption better |
When building animated components, reference these for patterns and inspiration:
When a user wants a specific animated component (text reveal, animated border, gradient animation, etc.), check these libraries first — there's likely a battle-tested implementation.
| Scenario | Pattern | Spring Config |
|---|---|---|
| Card appearing | Fade + Rise | smooth |
| List loading | Staggered List | smooth, 0.08s stagger |
| Tab switching | Shared Layout (layoutId) | snappy |
| Modal open/close | AnimatePresence + scale | smooth |
| Button press | whileHover + whileTap | snappy |
| Landing page sections | Scroll-triggered | gentle |
| Page navigation | Page Transition | smooth |
| Dashboard counter | Number Transition | snappy |
| Notification popup | Fade + Rise + bounce | bouncy |
| Accordion expand | Layout animation | smooth |
Apply staggered fade+rise entrance to the grid, hover lift effect on each card:
<motion.div
variants={container}
initial="hidden"
animate="visible"
className="grid grid-cols-3 gap-4"
>
{cards.map((card) => (
<motion.div
key={card.id}
variants={item}
whileHover={{ y: -4, boxShadow: "0 8px 30px rgba(0,0,0,0.12)" }}
transition={{ type: "spring", stiffness: 300, damping: 25 }}
>
<Card {...card} />
</motion.div>
))}
</motion.div>Wrap in AnimatePresence, add scale + opacity entrance/exit, overlay fade:
<AnimatePresence>
{isOpen && (
<>
<motion.div
className="fixed inset-0 bg-black/50"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
/>
<motion.div
className="fixed inset-0 flex items-center justify-center"
initial={{ opacity: 0, scale: 0.95 }}
animate={{ opacity: 1, scale: 1 }}
exit={{ opacity: 0, scale: 0.95 }}
transition={{ type: "spring", stiffness: 300, damping: 25 }}
>
<ModalContent onClose={onClose} />
</motion.div>
</>
)}
</AnimatePresence>Apply whileInView with staggered children to each section:
<motion.section
initial={{ opacity: 0, y: 40 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: "-100px" }}
transition={{ type: "spring", stiffness: 200, damping: 20 }}
>
<h2>Feature Section</h2>
<motion.div
variants={container}
initial="hidden"
whileInView="visible"
viewport={{ once: true }}
>
{features.map((f) => (
<motion.div key={f.id} variants={item}>
<FeatureCard {...f} />
</motion.div>
))}
</motion.div>
</motion.section>© dylanfeltus, 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 1 other file in motion-design-patterns of dylanfeltus/skills.
Open the folder on GitHubat commit b97a48f
Motion Design Patterns for React 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 |
|---|---|---|---|---|---|---|
| Motion Design Patterns for React this skilldylanfeltus/skills | 179 | — | ~3k | Automated safety check: Pass | MIT | |
| GSAP for Reactgreensock/gsap-skills | 16k | 4 repos | ~1.6k | Automated safety check: Pass | MIT | |
| Animated React Component LibrariesHainrixz/editor-pro-max | 260 | 1 repos | ~5.7k | Automated safety check: Pass | Custom licence | |
| Animatedelphi-ai/animate-skill | 107 | — | ~1.3k | Automated safety check: Pass | None | |
| Awwwards-Level React AnimationsHainrixz/editor-pro-max | 260 | — | ~4.4k | Automated safety check: Pass | Custom licence | |
| Framer MotionAThevon/genjutsu | 416 | 1 repos | ~1.9k | Automated safety check: Pass | Custom licence |
greensock/gsap-skills
Shows how to run GSAP animations in React and Next.js with the useGSAP hook, refs, scoped selectors and automatic cleanup on unmount.
Hainrixz/editor-pro-max
Helps choose and drop in animated React components from Magic UI and React Bits for landing pages, marketing sites and dashboards, instead of hand-coding animations.
delphi-ai/animate-skill
Animation patterns and best practices for Next.js/React applications.
Hainrixz/editor-pro-max
Guides React animation work with GSAP, Motion, Anime.js and Lenis for scroll effects, page transitions, text effects and generative visuals, with a library decision table.
AThevon/genjutsu
Framer Motion / Motion sub-skill - AnimatePresence, layout animations, gestures, motion values.
199-biotechnologies/motion-dev-animations-skill
Creates 120fps GPU-accelerated animations with Motion.dev (Framer Motion successor) for React, Next.js, Svelte, and Astro projects.
dylanfeltus/skills
Looks up app details, ratings and reviews and searches the iOS and Mac App Stores through Apple's free iTunes APIs, with a web-search fallback for Google Play.
dylanfeltus/skills
Gives prompt templates, a model-selection guide and anti-generic rules for AI-generated visuals: hero images, feature illustrations, OG cards, icons and backgrounds.
dylanfeltus/skills
Generates type scales, color palettes, spacing systems, WCAG contrast checks and dark mode palettes from formulas, as CSS custom properties, a Tailwind config or JSON tokens.
dylanfeltus/skills
Searches and monitors Hacker News stories, comments and users through the free Algolia HN Search API, with tag, points and date filters.
dylanfeltus/skills
Creates, updates, and monitors Privacy.com virtual payment cards with spending limits for an agent making controlled purchases.
dylanfeltus/skills
Looks up Product Hunt launches, products and makers through its GraphQL API: daily top posts, topic browsing and per-post details, using a free developer token.
Categories
Framer Motion (Motion) patterns for React: spring presets, staggers, layout animations, micro-interactions, scroll effects and page transitions, with performance rules. This skill collects animation patterns for React with the Motion library, the package formerly named framer-motion, installed with `npm install motion` and imported from `motion/react`. It argues that motion should be purposeful, that one well-tuned spring beats several competing animations, and that only `transform` and `opacity` should be animated, never width, height, top, left or margin.
Motion Design Patterns for React fits situations like: adding entrance, exit or hover animations to a React project; making lists, cards, modals or navigation feel more polished; choosing consistent spring settings across an app; building scroll-triggered effects or page transitions.
Run `npx skills add dylanfeltus/skills --skill motion-design-patterns -a claude-code`. Or copy the skill folder (motion-design-patterns in dylanfeltus/skills) into .claude/skills/motion-design-patterns in your project. Claude Code loads it when a task matches its description.
Run `npx skills add dylanfeltus/skills --skill motion-design-patterns -a codex`. Or copy the skill folder (motion-design-patterns in dylanfeltus/skills) into .agents/skills/motion-design-patterns 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 dylanfeltus/skills --skill motion-design-patterns -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/motion-design-patterns, .gemini/skills/motion-design-patterns, .github/skills/motion-design-patterns and .opencode/skills/motion-design-patterns in your project.
Going by SKILL.md and its folder, Motion Design Patterns for React needs the command-line tools its instructions call (npm). Our summary lists: A React project; The motion package (npm install motion).
SKILL.md names 3 domains. As links in the text: magicui.design, motion-primitives.com and ui.aceternity.com. 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.
Motion Design Patterns for React is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3k tokens (SKILL.md is roughly 12k 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 Motion Design Patterns for React: GSAP for React (greensock/gsap-skills, 16k stars), Animated React Component Libraries (Hainrixz/editor-pro-max, 260 stars), Animate (delphi-ai/animate-skill, 107 stars) and Awwwards-Level React Animations (Hainrixz/editor-pro-max, 260 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
dylanfeltus (a GitHub user) maintains it in dylanfeltus/skills, which has 179 GitHub stars. The repository holds 10 skills in this directory. The repository was last updated on September 17, 2026.
Source: dylanfeltus/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.