Defuddle
kepano/obsidian-skills
Uses the Defuddle CLI to pull clean, readable Markdown, JSON or metadata from web pages, stripping navigation, ads and clutter to save tokens.
Add a "Learn" tab + tier-S design-engineer article to a GodUI component docs page.
$ npx skills add LucasBassetti/godui --skill godui-learn-article -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install LucasBassetti/godui godui-learn-article --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/LucasBassetti/godui.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/godui-learn-article .claude/skills/godui-learn-article && 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 "godui-learn-article" agent skill from https://github.com/LucasBassetti/godui/tree/main/.agents/skills/godui-learn-article into .claude/skills/godui-learn-article/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "godui-learn-article", 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/LucasBassetti/godui/tree/main/.agents/skills/godui-learn-articleType 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 LucasBassetti/godui --skill godui-learn-article -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install LucasBassetti/godui godui-learn-article --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LucasBassetti/godui.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/godui-learn-article .agents/skills/godui-learn-article && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "godui-learn-article" agent skill from https://github.com/LucasBassetti/godui/tree/main/.agents/skills/godui-learn-article into .agents/skills/godui-learn-article/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "godui-learn-article", 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 LucasBassetti/godui --skill godui-learn-article -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install LucasBassetti/godui godui-learn-article --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LucasBassetti/godui.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/godui-learn-article .cursor/skills/godui-learn-article && 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 "godui-learn-article" agent skill from https://github.com/LucasBassetti/godui/tree/main/.agents/skills/godui-learn-article into .cursor/skills/godui-learn-article/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "godui-learn-article", 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/LucasBassetti/godui.git --path .agents/skills/godui-learn-article--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 LucasBassetti/godui --skill godui-learn-article -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install LucasBassetti/godui godui-learn-article --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LucasBassetti/godui.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/godui-learn-article .gemini/skills/godui-learn-article && 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 "godui-learn-article" agent skill from https://github.com/LucasBassetti/godui/tree/main/.agents/skills/godui-learn-article into .gemini/skills/godui-learn-article/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "godui-learn-article", 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 LucasBassetti/godui godui-learn-articleInstalls 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 LucasBassetti/godui --skill godui-learn-article -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/LucasBassetti/godui.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/godui-learn-article .github/skills/godui-learn-article && 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 "godui-learn-article" agent skill from https://github.com/LucasBassetti/godui/tree/main/.agents/skills/godui-learn-article into .github/skills/godui-learn-article/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "godui-learn-article", 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 LucasBassetti/godui --skill godui-learn-article -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install LucasBassetti/godui godui-learn-article --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LucasBassetti/godui.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/godui-learn-article .opencode/skills/godui-learn-article && 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 "godui-learn-article" agent skill from https://github.com/LucasBassetti/godui/tree/main/.agents/skills/godui-learn-article into .opencode/skills/godui-learn-article/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "godui-learn-article", 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.
godui-learn-articleAdd a "Learn" tab + tier-S design-engineer article to a GodUI component docs page.
Godui Learn Article is an agent skill from LucasBassetti/godui. Add a "Learn" tab + tier-S design-engineer article to a GodUI component docs page. Use when writing a Learn deep-dive for a component (motion breakdown, scroll-triggered animated scenes with replay, annotated code, live result). Covers routing, sidebar hiding, the ScrollScene primitive, scene patterns, and every gotcha.
Its SKILL.md is about 5.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
The repository describes itself as: 🙏 UI Collection for Modern Interfaces. The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 1f632a7. 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:
pnpmgitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use pnpm and git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Godui Learn Article loads about 5.9k tokens when it runs. Until then it costs about 85 tokens; SKILL.md has 2,621 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 LucasBassetti/godui at commit 1f632a7, republished under its MIT licence (© LucasBassetti). 2,621 words, ~5,885 tokens.
.claude/skills/godui-learn-article/SKILL.md (or your agent's skills folder).A Learn tab sits at the right of a component page's breadcrumb row (Docs | Learn
segmented control). Docs is the normal component page; Learn is a blog-style,
scroll-animated deconstruction of how the component's motion is built — layered
scenes that auto-play on scroll-in with a replay button, annotated code, and a live
result. Same layout as the rest of docs (sidenav + right TOC).
The tab system, routing, sidebar hiding, and the reusable ScrollScene primitive are
already built and generic. Adding a Learn article to a new component is mostly:
create the folder, write learn.mdx, and build a few component-specific scene
components. This skill documents the whole system so you can extend it correctly.
Reference implementation: Magic Button —
apps/docs/content/docs/components/buttons/magic-button/learn.mdx and
apps/docs/src/components/learn/*.
| Piece | File | Per-component? |
|---|---|---|
| Docs page (moved into folder) | apps/docs/content/docs/components/{cat}/{name}/index.mdx | ✅ create |
| Learn article | apps/docs/content/docs/components/{cat}/{name}/learn.mdx | ✅ create |
| Component-specific scenes | apps/docs/src/components/learn/{scene}.tsx | ✅ create |
| Register scenes for MDX | apps/docs/src/components/mdx.tsx | ✅ add |
| Reusable scene shell | apps/docs/src/components/learn/scroll-scene.tsx | ♻️ reuse |
| Motion Score panel | apps/docs/src/components/learn/motion-score-panel.tsx + registry entry | ✅ add registry row (see §6.5) |
| Result preview (live component) | apps/docs/src/components/learn/result-preview.tsx | ♻️ generalize or copy |
| Tabs control | apps/docs/src/app/docs/_components/component-tabs.tsx | ♻️ generic |
| Page routing + tab wiring | apps/docs/src/app/docs/[[...slug]]/page.tsx | ♻️ generic |
| Keep sidebar link active on learn | apps/docs/src/app/docs/_components/sidebar-active-link.tsx | ♻️ generic |
| Sidebar prune plugin | apps/docs/src/lib/source.ts → hideLearnPagesPlugin | ♻️ generic |
| Sidebar nav order | apps/docs/content/docs/meta.json | ⚠️ do not add the learn page |
To get /docs/components/{cat}/{name} and /docs/components/{cat}/{name}/learn,
the component must be a folder with index.mdx, not a flat {name}.mdx file:
components/buttons/magic-button/
index.mdx ← the Docs page (was magic-button.mdx)
learn.mdx ← the Learn articleWhy not a flat sibling (magic-button.mdx + magic-button/learn.mdx): fumadocs
then treats the docs page as a child of the folder, so pruning learn still leaves
a child and the sidebar renders an expandable "Magic button" group. With index.mdx,
folder.index is set, pruning learn empties children, and the prune plugin
collapses the folder back to a plain leaf. Always use the folder+index layout.
The catch-all page ([[...slug]]/page.tsx) needs no change per component. It:
base = slug.slice(0,3) for slug[0]==="components" && length>=3;isLearnPage = length 4 and last segment learn;source.getPage([...base,"learn"]) exists;source.getPage(base)), not the article's frontmatter title;length===3).hideLearnPagesPluginsource.ts runs a transformPageTree.root plugin that recursively drops any page
node whose url ends in /learn, and collapses a folder emptied by that removal to
its index leaf. Routing is unaffected (source.getPage still resolves the learn
page). Do not list the learn page in meta.json — the explicit pages allowlist
plus this plugin keep it out of the sidebar. This plugin is generic; new components
need nothing here.
Because the learn route has no sidebar node, fumadocs marks the component's sidebar
link data-active="false" there. SidebarActiveLink (client) flips it back to
"true" (with a MutationObserver to survive re-renders) only while
pathname is still that component's /learn. On leave it clears the forced
flag (immediately if another sidebar item is already active) so client
navigation never leaves two data-active="true" pills. page.tsx renders it
when isLearnPage. Generic — no per-component work.
git mv apps/docs/content/docs/components/{cat}/{name}.mdx \
apps/docs/content/docs/components/{cat}/{name}/index.mdxRoute and content are unchanged. meta.json still references
components/{cat}/{name} and resolves to the folder index — leave it as-is.
The article must be grounded in the actual implementation, not invented. Read
packages/components/src/ui/{name}.tsx (core) or packages/lab/src/{name}/{name}.tsx (Lab) and note the true mechanisms: transforms,
transition timings/beziers, keyframes, observers, a11y (keyboard/focus-visible/
motion-reduce). Every claim and code excerpt in the article comes from here.
Each interactive block wraps the shared ScrollScene. Its render-prop hands you
{ cycle, reduced }:
cycle — 0 before scroll-in, 1 on scroll-in, +1 per replay. Use it as a React
key on the animated subtree so CSS keyframes restart on replay.reduced — prefers-reduced-motion; render the resolved (final) state with no
animation.Reliable replay = keyframes + key={cycle} remount. Do NOT drive scenes with a
transition toggled by a boolean — that replay is unreliable. Use CSS @keyframes (in
an inline <style>) applied to elements that remount when cycle changes.
Skeleton:
"use client";
import { ScrollScene } from "./scroll-scene";
const CSS = `
@keyframes myscene-in {
from { opacity: 0; transform: translateY(8px); }
to { opacity: 1; transform: translateY(0); }
}
.myscene-el { animation: myscene-in 700ms cubic-bezier(0.3,0.7,0.4,1.2) both; }
.myscene-static .myscene-el { animation: none; opacity: 1; transform: none; }
`;
export function MyScene() {
return (
<ScrollScene label="Section" note="what this shows">
{({ cycle, reduced }) => (
<div
key={cycle}
className={`flex flex-col items-center gap-8 ${reduced ? "myscene-static" : ""}`}
>
{/* biome-ignore lint/security/noDangerouslySetInnerHtml: static keyframes, no user input */}
<style dangerouslySetInnerHTML={{ __html: CSS }} />
<div className="myscene-el ...">…</div>
</div>
)}
</ScrollScene>
);
}Scene design rules:
Match the final component. Anatomy / structure scenes must use the same geometry the reader will see in the Result (open state, direction, piece count). If the component is an open FAB with satellites, draw that silhouette — do not invent a generic plate stack that doesn't map to the live UI.
Don't clone Magic Button visuals. Reference scenes teach techniques
(keyed keyframes, legends, looping cycles) — not a layout to copy. A new
component gets scenes invented from its source, not a reskin of
layer-reveal / push-physics / rainbow-sweep.
Prose count = diagram count. If the article says "two layers," the scene and legend show two items. Don't add a third plate "for the trigger" when the mechanism under discussion is blob vs control.
Compositor-only motion: animate transform / opacity / filter only. No
top/width/box-shadow/clip-path. (The CI motion-lint gate only scans
packages/components, so docs scenes aren't enforced — hold the rule anyway; it's
the whole point of the article.)
Grayscale by default, and theme-safe. Illustrative plates/shapes use the
theme tokens bg-[var(--card)], bg-[var(--muted)], bg-[var(--foreground)],
bg-[var(--background)]. Reserve real color for a scene whose subject is color
(e.g. a gradient), and for the live component in the result panel.
Black/white pattern — every scene MUST work in BOTH light and dark theme. This is the #1 source of bugs: a shape that's fine in dark mode goes invisible in light (or vice-versa). Rules:
bg-black/*, bg-white/*, border-white/*, border-black/*, text-white,
text-black, hex like #000/#fff. Each only contrasts in ONE theme.
(e.g. a black button bg-[var(--foreground)] on light theme is black; a
bg-black/25 fill over it is black-on-black → invisible.)bg-[var(--foreground)] inverts per theme (black on light, white on dark); an
overlay/fill/icon on top of it must use --background (bg-[var(--background)]/30,
text-[var(--background)]) so it inverts the same way and always contrasts.
Same in reverse for a --card/--background surface: tint with --foreground.border-fd-border is often too faint. Use border-[var(--foreground)]/20 — a
foreground-tinted border reads in both themes.No copy on the diagram shapes. Never put button text ("Hold to delete",
"Slide to confirm", "Get started") on the animated pieces — it reads as instructional
UI and distracts from the motion. Where a shape needs to stand in for a label/content,
use a neutral gray token bar (h-2 w-12 rounded-full bg-[var(--foreground)]/30, light
on dark surfaces). Leave faces blank when the shape alone carries the point. Explanation
lives in the legend, the mono captions, and the prose — not on the shape. Real component
labels are fine (and expected) only in the Result panel, since that's the live product.
Legend swatches MUST match the diagram (color + shape). This is the #1 legend bug. Every bottom-legend entry names a concrete piece the reader can see in the scene — not an abstract CSS concept with no visual counterpart.
| Rule | Pass | Fail |
|---|---|---|
| Color | Swatch fill/border/opacity appears on that diagram piece | Opacity-only ramps (/30 vs /60 vs solid) that never appear as distinct pieces; primary / white / black that aren't on the diagram |
| Shape | Swatch silhouette matches the piece | Same h-1.5 w-8 rounded-full pill for a card, a pointer, a dashed frame, and a hairline |
| Meaning | Name = visible piece (Viewport, Tile, Active plate, Pointer) | Temporal labels (Pan / Settle / Flick) or CSS props (Perspective / Tilt) with no matching cue |
Shape vocabulary (pick the one that matches the piece):
rounded-md / rounded-xl / card border) — cards, panels, tilesrotateX/rotateZ (draw the swatch with the same transform + fill)Prefer a local LegendSwatch({ kind }) helper (or full shape classes on swatch) over always wrapping item.swatch in h-1.5 w-8 rounded-full. If two legend items would get identical swatches, either differentiate shapes or merge the items.
If a concept isn't visible, make it visible first — then swatch it. Example: a
perspective / overflow clip that has no border → add a dashed viewport outline on
the diagram, then use a matching dashed-frame swatch. Do not invent a circle or
dotted pill that doesn't exist in the scene (classic 3D Marquee failure).
Temporal / motion phases (drag → settle → fling) need a visible cue for each phase (pointer dot, active plate, ghost outline at overshoot) — or rename the legend to the pieces that are actually drawn.
Label with a grounded legend, not floating tags. Put a bottom legend row (swatch
3D exploded views (only when they help): center a
[transform-style:preserve-3d] stage in a fixed-size box ([perspective:1000px]),
separate plates along translateZ. Works for stacked rectangular layers (Magic
Button). Avoid for concentric circles — they occlude and look broken; prefer a
front-facing split (layer A | layer B | together) instead. Don't put readable
text on rotated plates (it distorts) — name them in the legend.
Looping demos (e.g. a push cycle) are good — use animation: … infinite, gated
behind cycle > 0 via the keyed remount so it only runs after scroll-in.
Reference scenes (technique patterns, not templates to clone):
layer-reveal.tsx — isometric explode + legend (rectangular layers). Text-free plates.gooey-layers.tsx — same open silhouette, split by layer (blob | control | both). Uses a + glyph, no words.mask-twin-labels.tsx / slide-anatomy.tsx — canonical token-bar stand-ins for a label (h-2 w-12 rounded-full bg-[var(--foreground)]/30, light on dark).orbit-carousel-orbit.tsx — motion legend with shape-matched pieces (pointer · active plate · flick ghost), not opacity pills.three-d-marquee-anatomy.tsx — viewport dashed frame + isometric tile swatch matching the clipped diamond grid.rainbow-sweep.tsx — the one colored scene (gradient), reuses animate-magic-rainbow.push-physics.tsx — looping rest→hover→press cycle. NOTE: its face still reads "Push me" — that predates the no-copy rule; do not copy that, blank the face or use a token bar instead.End with the real, interactive component so the reader feels every mechanism. Copy /
generalize result-preview.tsx — same ComponentPreview-style chrome, importing the
component from @godui/components (core) or @godui/lab (Lab):
"use client";
import { TheComponent } from "@godui/components";
// …chrome (border/rounded-2xl/bg-fd-card + bar label "Result")…
// <TheComponent /> instances in a centered flex canvasIn apps/docs/src/components/mdx.tsx, import each scene + ResultPreview and add them
to the object returned by getMDXComponents (after PreviewCard). Keep imports
alphabetically ordered by path (biome organizeImports enforces it —
@/components/lang-badge sorts before @/components/learn/*).
learn.mdxFrontmatter title is the article title (breadcrumb still shows the component name
via page.tsx). Voice: senior design engineer + technical writer — specific,
mechanism-first, no filler. Each section pairs a scene (or code block) with prose.
Suggested spine (scale to the component):
focus-visible, motion-reduce.<MotionScorePanel name="{name}" />, the static render-cost grade (see §6.5).<ResultPreview />.Headings become the right-hand TOC automatically. Use fenced ```tsx blocks with real excerpts from the component source.
Every Learn article carries a Motion Score section — a small table that grades the
component's animation by render cost (the official MotionScore S→F tiers: S composited
off the main thread … F layout thrashing) and rolls its animated properties up to a
final grade (worst tier wins). It sits directly before ## The result, and the whole
section is just the heading + the panel, no prose:
## Motion Score
<MotionScorePanel name="{name}" />Static components get NO Motion Score. The *-background effects in
STATIC_COMPONENTS render with plain CSS and never animate — there's nothing to grade, so
they get no Motion Score section here and no Motion badge on the docs page (they
keep only the green "Static" badge). Skip §6.5 entirely for them.
Prerequisite — the machine grade. For an animated component, the final grade comes from
motionScore("{name}") (apps/docs/src/lib/motion-score.ts), which reads the component's
curated MOTION_NOTES[{name}] entry (apps/docs/src/lib/motion-notes.ts) + its
MOTION_ALLOWLIST props. If the component isn't in MOTION_NOTES, it grades S
(compositor-only). Make sure that entry exists and is honest first — it's the same signal
that drives the docs-page Motion badge.
Shared panel + registry. The UI is one reusable component —
apps/docs/src/components/learn/motion-score-panel.tsx (already registered in mdx.tsx).
Per-component work is only an entry in apps/docs/src/lib/motion-score-panels.ts:
"{name}": {
title: "Display Name", // same as the docs page title
properties: [
// AUDIT THE REAL SOURCE — one row per property the component actually animates.
// `prop` is the normalised name propTier() grades (lowercase, no hyphens); `label`
// is how it reads; `note` is one line on what that property drives.
// Optional `tier` overrides propTier() when the real cost isn't a single CSS
// property (SVG goo, canvas/WebGL loops) so the worst row matches the header grade.
{ prop: "translate", label: "translate", note: "…what it drives…" },
{ prop: "backgroundposition", label: "background-position", note: "…" },
],
},Rules:
propTier grades each:
transform/opacity/filter/clip-path → S; background-position/box-shadow/
border-radius/color/SVG attrs → C; width/height/margin/top/font-size → D.
The header grade (motionScore(name)) and the worst row must agree.*-score.tsx — extend the registry and drop
<MotionScorePanel name="{name}" /> into the Learn MDX.ScrollScene — it's a static reference table, so no replay/keyed-remount.pnpm --filter docs exec tsc --noEmit # types
pnpm exec biome check apps/docs/src/components/learn # lint
pnpm --filter docs build # SSG both routesScan for stray copy on the diagram shapes — every human-readable string inside a
scene (outside the legend/caption/prose) should be a token bar or blank, not button
text. Eyeball the hits; the only quoted words left should be legend/caption strings and
Result-panel component labels:
grep -nE '>[A-Za-z][A-Za-z ]{2,}<' apps/docs/src/components/learn/{scene}.tsxThen run the dev server and check in a browser (a docs dev server may already be running on a non-3000 port — grep the log). Confirm:
Docs | Learn tabs on the docs page; Learn active on the learn page.## The result as
<MotionScorePanel name="{name}" />, its registry entry exists, its header grade
matches the worst property row and the docs-page Motion badge, and it reads in
both themes. Static (*-background) components have no panel and no
Motion badge.Headless screenshot without installing Playwright (chromium is cached):
BIN="$HOME/Library/Caches/ms-playwright/chromium_headless_shell-1228/chrome-headless-shell-mac-arm64/chrome-headless-shell"
"$BIN" --headless --disable-gpu --hide-scrollbars --virtual-time-budget=3000 \
--window-size=1300,2000 --screenshot=/tmp/learn.png "$URL"To verify replay programmatically, launch with --remote-debugging-port=9333, then
drive CDP over the built-in global WebSocket (Node ≥20): click
button[aria-label="Replay animation"] and assert an animated element's computed
opacity drops then returns to 1.
folder/index.mdx + folder/learn.mdx
so the prune plugin can collapse the folder to a leaf.bg-fd-muted renders wrong — the GodUI theme aliases --color-fd-muted to
muted-foreground. Use raw bg-[var(--muted)] / bg-[var(--card)] (matches
Segmented in docs-tabs.tsx).style need a cast: style={{ "--tz": "78px" } as CSSProperties}
(import type { CSSProperties } from "react").<style> needs dangerouslySetInnerHTML + a biome-ignore lint/security/noDangerouslySetInnerHtml comment. Keep the CSS a static constant (no
interpolation of user input).aria-hidden="true" (biome noSvgWithoutTitle). The replay
icon in ScrollScene is the canonical circular-arrow SVG.organizeImports sorts by path; fix or run
pnpm exec biome check --write <file>.pnpm check && pnpm test repo-wide; both must pass before any
commit. Pre-existing <img> warnings in demos are warnings (non-blocking); an
unsorted import is an error (blocking).@godui/components); the docs index.mdx
already imports components the same way.h-1.5 w-8 rounded-full with only --foreground opacity changes. Shape-match the
piece (plate / dot / dashed frame / hairline / isometric tile). If the concept isn't
on the diagram, draw the cue first (e.g. dashed viewport), then swatch it.© LucasBassetti, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/godui-learn-article of LucasBassetti/godui.
Open the folder on GitHubat commit 1f632a7
Godui Learn Article 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 |
|---|---|---|---|---|---|---|
| Godui Learn Article this skillLucasBassetti/godui | 130 | — | ~5.9k | Automated safety check: Pass | MIT | |
| Defuddlekepano/obsidian-skills | 49k | 11 repos | ~208 | Automated safety check: Pass | MIT | |
| Markdown Article FormatterJimLiu/baoyu-skills | 27k | 6 repos | ~3.5k | Automated safety check: Pass | MIT | |
| Knap Markdown Templateskepano/obsidian-skills | 49k | 2 repos | ~986 | Automated safety check: Pass | MIT | |
| MarkitdownImCa0/just-laws | 781 | 14 repos | ~3.2k | Automated safety check: Notes | MIT | |
| Obsidian MarkdownAtmosphere/atmosphere | 3.8k | 20 repos | ~1.3k | Automated safety check: Pass | Apache-2.0 |
kepano/obsidian-skills
Uses the Defuddle CLI to pull clean, readable Markdown, JSON or metadata from web pages, stripping navigation, ads and clutter to save tokens.
JimLiu/baoyu-skills
Reformats plain text or Markdown articles with frontmatter, a title, a summary, headings, bold, lists and code blocks, and saves a separate formatted copy.
kepano/obsidian-skills
Renders Markdown notes from Knap templates and JSON data on the command line, including notes built from Defuddle web page output.
ImCa0/just-laws
Convert files and office documents to Markdown. An agent skill from ImCa0/just-laws.
Atmosphere/atmosphere
Create and edit Obsidian Flavored Markdown with wikilinks, embeds, callouts, properties, and other Obsidian-specific syntax.
sdyckjq-lab/llm-wiki-skill
Fetch any URL and convert to markdown using Chrome CDP. An agent skill from sdyckjq-lab/llm-wiki-skill.
LucasBassetti/godui
A skill your agent uses when creating a new component for the design system.
LucasBassetti/godui
Create new core components for GodUI (@godui/components) — animated, drop-in replacements for shadcn/ui with strict GPU-only motion.
Add a "Learn" tab + tier-S design-engineer article to a GodUI component docs page. Godui Learn Article is an agent skill from LucasBassetti/godui. Add a "Learn" tab + tier-S design-engineer article to a GodUI component docs page.
Godui Learn Article fits situations like: writing a Learn deep-dive for a component (motion breakdown; scroll-triggered animated scenes with replay.
Run `npx skills add LucasBassetti/godui --skill godui-learn-article -a claude-code`. Or copy the skill folder (.agents/skills/godui-learn-article in LucasBassetti/godui) into .claude/skills/godui-learn-article in your project. Claude Code loads it when a task matches its description.
Run `npx skills add LucasBassetti/godui --skill godui-learn-article -a codex`. Or copy the skill folder (.agents/skills/godui-learn-article in LucasBassetti/godui) into .agents/skills/godui-learn-article 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 LucasBassetti/godui --skill godui-learn-article -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/godui-learn-article, .gemini/skills/godui-learn-article, .github/skills/godui-learn-article and .opencode/skills/godui-learn-article in your project.
Going by SKILL.md and its folder, Godui Learn Article needs the command-line tools its instructions call (pnpm and git).
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. 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.
Godui Learn Article is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.9k tokens (SKILL.md is roughly 24k 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 Godui Learn Article: Defuddle (kepano/obsidian-skills, 49k stars), Markdown Article Formatter (JimLiu/baoyu-skills, 27k stars), Knap Markdown Templates (kepano/obsidian-skills, 49k stars) and Markitdown (ImCa0/just-laws, 781 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
LucasBassetti (a GitHub user) maintains it in LucasBassetti/godui, which has 130 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on October 9, 2026.
Source: LucasBassetti/godui on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.