Kill AI Slop
yetone/kill-ai-slop
Find and remove AI slop — the generic, machine-default visual and copy tics of vibe-coded products — from a web project.
Builds or updates a Tabler component preview page under preview/pages, covering the page skeleton, header, and card grid conventions.
$ npx skills add tabler/tabler --skill demo-pages -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install tabler/tabler demo-pages --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/tabler/tabler.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/demo-pages .claude/skills/demo-pages && 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 "demo-pages" agent skill from https://github.com/tabler/tabler/tree/dev/.agents/skills/demo-pages into .claude/skills/demo-pages/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "demo-pages", 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/tabler/tabler/tree/dev/.agents/skills/demo-pagesType 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 tabler/tabler --skill demo-pages -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install tabler/tabler demo-pages --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tabler/tabler.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/demo-pages .agents/skills/demo-pages && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "demo-pages" agent skill from https://github.com/tabler/tabler/tree/dev/.agents/skills/demo-pages into .agents/skills/demo-pages/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "demo-pages", 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 tabler/tabler --skill demo-pages -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install tabler/tabler demo-pages --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tabler/tabler.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/demo-pages .cursor/skills/demo-pages && 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 "demo-pages" agent skill from https://github.com/tabler/tabler/tree/dev/.agents/skills/demo-pages into .cursor/skills/demo-pages/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "demo-pages", 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/tabler/tabler.git --path .agents/skills/demo-pages--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 tabler/tabler --skill demo-pages -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install tabler/tabler demo-pages --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tabler/tabler.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/demo-pages .gemini/skills/demo-pages && 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 "demo-pages" agent skill from https://github.com/tabler/tabler/tree/dev/.agents/skills/demo-pages into .gemini/skills/demo-pages/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "demo-pages", 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 tabler/tabler demo-pagesInstalls 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 tabler/tabler --skill demo-pages -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/tabler/tabler.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/demo-pages .github/skills/demo-pages && 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 "demo-pages" agent skill from https://github.com/tabler/tabler/tree/dev/.agents/skills/demo-pages into .github/skills/demo-pages/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "demo-pages", 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 tabler/tabler --skill demo-pages -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install tabler/tabler demo-pages --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tabler/tabler.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/demo-pages .opencode/skills/demo-pages && 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 "demo-pages" agent skill from https://github.com/tabler/tabler/tree/dev/.agents/skills/demo-pages into .opencode/skills/demo-pages/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "demo-pages", 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.
demo-pagesBuilds or updates a Tabler component preview page under preview/pages, covering the page skeleton, header, and card grid conventions.
This skill explains that a demo page exists to show a component's variants side by side, not to document it, so prose stays to one line per card while real depth lives in separate docs content. The title prop both sets the browser title and becomes the page header, so a pageHeader prop is only for text that differs from the title, or false to remove the header entirely.
Anything to the right of the title, such as a docs link or a prebuilt action-button group, goes in the page-header-actions slot as a direct child of the layout component, and a docs link's path is checked against the actual docs content tree by a lint command so a typo fails before anyone opens a browser. The card grid itself uses one card per variant in a row of consistent column widths.
11 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit c2a7cbf. 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:
pnpmcurlFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use pnpm and curl, 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.
Tabler Demo Page Builder loads about 2.2k tokens when it runs. Until then it costs about 113 tokens; SKILL.md has 1,080 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 tabler/tabler at commit c2a7cbf, republished under its MIT licence (© tabler). 1,080 words, ~2,213 tokens.
.claude/skills/demo-pages/SKILL.md (or your agent's skills folder).Demo pages live in preview/pages/*.astro and are served at /<name> in dev, /<name>.html in the build. Each one shows the variants of a single component so a reader can compare them at a glance. They are not documentation — the prose is one line per card; the depth lives in docs/content/** (see the write-docs skill).
---
import DefaultLayout from '@shared/layouts/DefaultLayout.astro'
import Card from '@ui/Card.astro'
import CardBody from '@ui/CardBody.astro'
import CardTitle from '@ui/CardTitle.astro'
import CardSubtitle from '@ui/CardSubtitle.astro'
import DocsLink from '@ui/DocsLink.astro'
---
<DefaultLayout title="Badges" pageMenu="base.badges" description="Badges highlight a count, status, or short label attached to text, buttons, or menu items.">
<DocsLink slot="page-header-actions" path="/ui/components/badge" />
<div class="row row-cards">
<div class="col-md-6 col-lg-4">
<Card>
<CardBody>
<CardTitle>Basic</CardTitle>
<CardSubtitle>One sentence on what this variant is for.</CardSubtitle>
…
</CardBody>
</Card>
</div>
</div>
</DefaultLayout>title — browser title. It also becomes the page header, so do not repeat it in a pageHeader prop; pageHeader exists only for a header that differs from the browser title (title="Dashboard" pageHeader="Boxed layout"), or as pageHeader={false} for a page with no header at all.description — renders under the page title and fills <meta name="description">. One sentence, present tense, says what the component is for.pageMenu — the menu entry to highlight, e.g. base.badges. Match an existing key in shared/data/menu.json.Anything to the right of the title goes in the page-header-actions slot, as a direct child of <DefaultLayout>:
<DocsLink slot="page-header-actions" path="/ui/components/badge" />path is the page's path under docs/content/** without the extension — docs/content/ui/components/badge.mdx → /ui/components/badge. Add one whenever a matching docs page exists.pnpm run check:docs-links. It resolves every <DocsLink path="…"> against docs/content/** and fails on a typo, so you do not need a browser for this.docs-dev.tabler.io, which serves dev. docs.tabler.io serves the last release and still has the pre-content-collection urls, so a valid page can 404 there. A 404 on production alone is never a reason to change a path.HeaderActionsButtons, HeaderActionsPrint, HeaderActionsPhotos, …) live in shared/components/layout/ and go in the same slot: <HeaderActionsButtons slot="page-header-actions" />. There is no actions="buttons" prop any more.<div class="row row-cards"> with col-* wrappers. Keep column widths consistent down the page.CardTitle names the variant in 1-3 words. CardSubtitle explains it in one sentence, naming the prop or class it demonstrates: "Add showClose to let users close the alert."<code> inside the subtitle. Readers scan for the token.<h3 class="card-title"> or <div class="card-subtitle"> by hand — use the components, which also keep the heading level right.CardTitle and CardHeader render h2, directly under the page h1. Pass as="h3" only for a card nested under its own h2 section heading. Do not introduce raw <h3>/<h4> headings for card titles; that is what made pages mix levels before.
Use the list wrappers instead of margin utilities on each child:
| Wrapper | For |
|---|---|
<ButtonList> | rows of buttons |
<BadgeList> | rows of badges |
<TagList> | rows of tags |
<AvatarList> | rows or stacks of avatars |
The pluralised class names (.badges-list, .tags-list) are deprecated aliases of .badge-list / .tag-list. Do not add me-2/mb-2 to individual items.
Icon action buttons: btn-action is always combined with btn (btn btn-action, plus btn-sm when small) — never use btn-action on its own.
Never add a <style> block to a preview page or a shared component, and never import CSS from the frontmatter. The built HTML is the product: a plain <style> makes Astro stamp data-astro-cid-* on every element of the page, so a copied page carries dozens of attributes nobody wants. The block also bypasses build-css.ts, so a custom property written bare (var(--table-color)) stays unprefixed and never matches Tabler's --tblr-* names. is:global or is:inline avoids the stamping but not the prefix problem, and still hides styling where nobody looks for it.
If a demo needs a look the framework does not have, either use existing utilities in the markup or add the class to core/scss/ (core-scss skill). If neither fits, keep the plain markup; a demo page never justifies a one-off rule.
Demo markup is copied as-is, so a shortcut here becomes a shortcut in every user's app. The four that keep coming back:
<button type="button" class="btn">, never <a class="btn"> without href. An anchor without href is not focusable, so keyboard users cannot reach it. An anchor that really links keeps href, and href="#" is fine for a demo link.<select>, a switch in a card footer: give it a <label for> or an aria-label. placeholder is not a name.<label> wraps exactly one control or points at one with for. A label wrapping a radio and an unrelated dropdown toggle selects the radio when the toggle is clicked.aria-label. <Icon> renders aria-hidden, so without the label the control has no name at all.Dropdown toggles are <button type="button" data-bs-toggle="dropdown">, or <a href="#" role="button" …> inside a nav; never a <label>. One .dropdown-menu per toggle — Bootstrap shows only the first sibling.
shared/data/*.json (site.json colors, people.json, flags.json) instead of pasting 20 near-identical blocks.astro check is part of the quality gates.shared/data/menu.json so it is reachable, and use the same key in pageMenu.shared/ui component usually needs both a demo page and a docs page. After finishing here, check docs/content/** and consult the write-docs skill if it is missing.Never hand the page to the user unchecked.
preview_start with the preview config from .claude/launch.json, then open /<page-name>.curl -s http://localhost:3000/badges | grep -o '<h[1-6]' | sort | uniq -cA demo page should show exactly one h1 and then h2s — no h3 in the card grid.
title and description set; no pageHeader repeating the titleDocsLink present when a docs page exists; pnpm run check:docs-links passesCardTitle + CardSubtitle on eachcard-title / card-subtitle / page-title markup<style> block and no CSS import; new looks go to core/scss/<button type="button">, controls and icon-only links have a name, every <label> matches one control<Icon name> exists in shared/data/icons.json (play does not; player-play does)pnpm run format:prettier and pnpm run type-check clean (repo root, not a tail-filtered subset)generate-changeset skill© tabler, 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/demo-pages of tabler/tabler.
Open the folder on GitHubat commit c2a7cbf
Tabler Demo Page Builder 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 |
|---|---|---|---|---|---|---|
| Tabler Demo Page Builder this skilltabler/tabler | 42k | — | ~2.2k | Automated safety check: Pass | MIT | |
| Kill AI Slopyetone/kill-ai-slop | 1.3k | — | ~1.4k | Automated safety check: Pass | Apache-2.0 | |
| Motion Dev Animations199-biotechnologies/motion-dev-animations-skill | 114 | 1 repos | ~2.8k | Automated safety check: Notes | MIT | |
| Astrodevantler-tech/ksail | 165 | 3 repos | ~1.1k | Automated safety check: Pass | MIT | |
| UI Upstream Syncfulldotdev/ui | 610 | — | ~1.3k | Automated safety check: Pass | MIT | |
| Check Docs Stylenrwl/nx | 29k | — | ~1.3k | Automated safety check: Pass | MIT |
yetone/kill-ai-slop
Find and remove AI slop — the generic, machine-default visual and copy tics of vibe-coded products — from a web project.
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.
devantler-tech/ksail
Skill for building with the Astro web framework. An agent skill from devantler-tech/ksail.
fulldotdev/ui
Audit and update the existing Fulldev Astro UI registry against current data-slot and shadcn/ui Base UI Vega.
nrwl/nx
Check modified Nx documentation pages against the astro-docs style guide.
manycoretech/aholo-viewer
Owns the Aholo Viewer Astro website shell and Playground integration, covering routes, layouts, i18n copy and scoped CSS, while leaving the renderer and example content to other skills.
tabler/tabler
Starts the right Tabler dev server, keeps it from clashing with builds and verifies changes in the browser before a page or component is handed back.
tabler/tabler
Rules for adding or fixing client-side scripts in Tabler's Astro components so the copied preview HTML stays readable, self-contained and runs in the right order.
tabler/tabler
Sets the file structure, typing and Data API pattern for writing a new Bootstrap-style JavaScript component class in Tabler's vendored port of Bootstrap's JS.
tabler/tabler
Writes or updates the classnames front matter that renders the class table at the end of a Tabler component docs page.
tabler/tabler
Guidance for changing the Tabler framework's own JavaScript in core/js: the tabler.js and tabler-theme.js bundles, the Bootstrap port and their tests.
tabler/tabler
Rules for adding or changing styles in Tabler's core/scss framework: file placement, custom properties, dark mode, RTL, tests and build gates.
Works with
Categories
Builds or updates a Tabler component preview page under preview/pages, covering the page skeleton, header, and card grid conventions. This skill explains that a demo page exists to show a component's variants side by side, not to document it, so prose stays to one line per card while real depth lives in separate docs content. The title prop both sets the browser title and becomes the page header, so a pageHeader prop is only for text that differs from the title, or false to remove the header entirely.
Tabler Demo Page Builder fits situations like: adding a demo page for a new shared UI component; extending an existing component preview page with a new variant; fixing a broken docs link on a Tabler preview page.
Run `npx skills add tabler/tabler --skill demo-pages -a claude-code`. Or copy the skill folder (.agents/skills/demo-pages in tabler/tabler) into .claude/skills/demo-pages in your project. Claude Code loads it when a task matches its description.
Run `npx skills add tabler/tabler --skill demo-pages -a codex`. Or copy the skill folder (.agents/skills/demo-pages in tabler/tabler) into .agents/skills/demo-pages 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 tabler/tabler --skill demo-pages -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/demo-pages, .gemini/skills/demo-pages, .github/skills/demo-pages and .opencode/skills/demo-pages in your project.
Going by SKILL.md and its folder, Tabler Demo Page Builder needs the command-line tools its instructions call (pnpm and curl).
SKILL.md contains no URLs. Its commands use curl, 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.
Tabler Demo Page Builder is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.2k tokens (SKILL.md is roughly 8.9k 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 Tabler Demo Page Builder: Kill AI Slop (yetone/kill-ai-slop, 1.3k stars), Motion Dev Animations (199-biotechnologies/motion-dev-animations-skill, 114 stars), Astro (devantler-tech/ksail, 165 stars) and UI Upstream Sync (fulldotdev/ui, 610 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
tabler (a GitHub organization) maintains it in tabler/tabler, which has 41,833 GitHub stars. The repository holds 21 skills in this directory. The repository was last updated on October 8, 2026.
Source: tabler/tabler on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.