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.
Style Obsidian plugin UI with Tailwind + native components. An agent skill from aidenlx/zotlit.
$ npx skills add aidenlx/zotlit --skill obsidian-css -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install aidenlx/zotlit obsidian-css --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/aidenlx/zotlit.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/obsidian-css .claude/skills/obsidian-css && 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 "obsidian-css" agent skill from https://github.com/aidenlx/zotlit/tree/main/.agents/skills/obsidian-css into .claude/skills/obsidian-css/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "obsidian-css", 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/aidenlx/zotlit/tree/main/.agents/skills/obsidian-cssType 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 aidenlx/zotlit --skill obsidian-css -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install aidenlx/zotlit obsidian-css --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/aidenlx/zotlit.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/obsidian-css .agents/skills/obsidian-css && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "obsidian-css" agent skill from https://github.com/aidenlx/zotlit/tree/main/.agents/skills/obsidian-css into .agents/skills/obsidian-css/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "obsidian-css", 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 aidenlx/zotlit --skill obsidian-css -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install aidenlx/zotlit obsidian-css --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/aidenlx/zotlit.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/obsidian-css .cursor/skills/obsidian-css && 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 "obsidian-css" agent skill from https://github.com/aidenlx/zotlit/tree/main/.agents/skills/obsidian-css into .cursor/skills/obsidian-css/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "obsidian-css", 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/aidenlx/zotlit.git --path .agents/skills/obsidian-css--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 aidenlx/zotlit --skill obsidian-css -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install aidenlx/zotlit obsidian-css --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/aidenlx/zotlit.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/obsidian-css .gemini/skills/obsidian-css && 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 "obsidian-css" agent skill from https://github.com/aidenlx/zotlit/tree/main/.agents/skills/obsidian-css into .gemini/skills/obsidian-css/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "obsidian-css", 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 aidenlx/zotlit obsidian-cssInstalls 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 aidenlx/zotlit --skill obsidian-css -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/aidenlx/zotlit.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/obsidian-css .github/skills/obsidian-css && 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 "obsidian-css" agent skill from https://github.com/aidenlx/zotlit/tree/main/.agents/skills/obsidian-css into .github/skills/obsidian-css/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "obsidian-css", 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 aidenlx/zotlit --skill obsidian-css -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install aidenlx/zotlit obsidian-css --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/aidenlx/zotlit.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/obsidian-css .opencode/skills/obsidian-css && 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 "obsidian-css" agent skill from https://github.com/aidenlx/zotlit/tree/main/.agents/skills/obsidian-css into .opencode/skills/obsidian-css/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "obsidian-css", 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.
obsidian-cssStyle Obsidian plugin UI with Tailwind + native components. An agent skill from aidenlx/zotlit.
Obsidian CSS is an agent skill from aidenlx/zotlit. Style Obsidian plugin UI with Tailwind + native components. Use when writing or reviewing any styled React/JSX in apps/obsidian/ — picking colors, spacing, typography, borders, radius, shadows, dark-mode tokens, or choosing between Tailwind utilities, Obsidian native components, and custom CSS. Also use for .zt-root preflight setup, zt: prefix usage, theme compatibility, component wrapper selection, or any CSS/styling decision in the plugin.
Its SKILL.md is about 4.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 8 other files, including reference files (for example `references/components.md`, `references/editor.md` and `references/foundations.md`).
It sits in Frontend & Design, covering CSS and styling. It works with Obsidian, Tailwind CSS and React. The repository describes itself as: Bring your Zotero library into Obsidian. Create literature notes, insert citations, and annotate PDFs without leaving your vault. The licence is AGPL-3.0.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 27f5752. 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.
No scripts in the folder and no shell commands in SKILL.md (its code samples are typescript and css).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
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.
Obsidian CSS loads about 4.8k tokens when it runs, and up to ~15k if it reads all its reference files. Until then it costs about 115 tokens; SKILL.md has 1,934 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 aidenlx/zotlit at commit 27f5752, republished under its AGPL-3.0 licence (© aidenlx). 1,934 words, ~4,753 tokens.
.claude/skills/obsidian-css/SKILL.md (or your agent's skills folder). This skill also uses 7 other files; get the full folder from GitHub.Plugin UI should feel like part of Obsidian — same colors, same spacing, same dark/light handling — without the plugin needing to know which theme the user has installed. Theme authors do this by overriding Obsidian's built-in CSS variables; plugin authors do it by consuming them through Tailwind utility classes.
The biggest mistake is hardcoding values (#1e1e1e, 12px, 1px solid #ccc). Hardcoded values look fine in the default theme and break in every other theme. Always use Tailwind tokens, which are backed by Obsidian CSS variables.
Tailwind-first with zt: prefix. Default to Tailwind utility classes for all styling. Avoid writing raw CSS stylesheets. The Tailwind theme in src/zt-main.css maps Obsidian CSS variables to Tailwind tokens.
Every utility class uses the zt: prefix — zt:flex, zt:gap-2, zt:bg-background, zt:text-muted-foreground, zt:rounded-md. Variants chain after the prefix: zt:hover:opacity-100, zt:@md:columns-2. This is Tailwind v4's prefix() feature applied to both theme.css and utilities.css imports — it scopes compiled selectors so they never collide with other plugins' Tailwind output. Custom @theme variables defined in zt-main.css (colors, radii, shadows mapped to Obsidian tokens) keep their authored names (no prefix).
When no Tailwind token exists for an Obsidian variable, either extend zt-main.css (follow the existing pattern) or use Tailwind's arbitrary CSS variable syntax: zt:bg-(--obsidian-var), zt:text-(--some-color), zt:p-(--size-4-3), etc. These compile to var(--…) at build time with full utility support.
Use cn() from @/lib/utils to merge Tailwind classes with conflict resolution — never raw string concatenation. cn() is prefix-aware via twMerge from @/lib/tw.
For React components with Obsidian modifier classes (mod-cta, is-enabled, clickable-icon), use tv from @/lib/tw (not directly from tailwind-variants) for variant composition — it's pre-configured with the zt prefix for correct class merging. See the existing wrappers in src/components/obsidian/ for the pattern.
#hex, rgb(…), and 8px values look correct in the default theme and break in every other theme. Use mapped tokens (zt:bg-background, zt:text-muted, zt:rounded-md). For spacing, Tailwind's default scale (zt:gap-2, zt:p-3) is fine — Obsidian's --size-4-N variables are just fixed 4px multiples that no theme overrides. See references/foundations.md for available variables.<button>, <input>, <select>, <textarea>, and toggle — rebuilding these from Tailwind primitives fights Obsidian's styles and breaks across themes. Use bare elements or the React wrappers from src/components/obsidian/.!important, scope custom CSS. !important blocks user CSS snippets — they can never override your styles. Scope custom CSS under zt--prefixed classes and keep specificity low.Picking a style goes:
src/components/obsidian/ (or the imperative obsidian API class). Don't restyle it with Tailwind — Obsidian's preflight handles appearance.zt:text-muted, zt:bg-background, zt:text-accent-foreground), not a raw palette one. Semantic tokens already track light/dark and the user's accent color. See references/foundations.md.zt:gap-2, zt:p-3, zt:mt-4). Obsidian's --size-4-N variables are just fixed multiples of 4px (never overridden by themes) and map 1:1 to Tailwind's scale, so there's no reason to use them directly.zt:rounded-sm/md/lg/xl (mapped to --radius-s/m/l/xl).zt:text-xs/sm/base/lg (mapped to Obsidian UI font sizes). See references/foundations.md#typography.--modal-background, --button-radius, --tab-text-color) → use the arbitrary variable syntax (zt:bg-(--modal-background)) or extend zt-main.css. See references/components.md, references/editor.md, references/window.md, references/plugins.md.zt:bg-(--obsidian-var)) to reference the Obsidian variable directly. If you want to expose it for user snippets, add a local custom property at your component root (.zt-foo { --zt-foo-bg: var(--background-secondary); }) and consume it via zt:bg-(--zt-foo-bg).Obsidian fully styles <button>, <input> (all types), <textarea>, and <select> via its global stylesheet — see references/preflights.md for the full table. Lean into this — don't fight it with Tailwind resets.
zt:flex, zt:gap-2, zt:w-full, zt:mt-2 etc. don't conflict because Obsidian's preflight doesn't set layout on these elements.<input type="checkbox">, <input type="radio">, and other preflighted elements need no wrapper. See next section for which elements have React wrappers and which don't.blockquote, p, headings, lists, hr, …) that Obsidian doesn't reset get cleaned up by a scoped preflight applied to plugin roots. See Scoped preflight (.zt-root) below..zt-root)src/zt-main.css applies Tailwind's preflight scoped to plugin UI roots, never globally:
@layer theme, base, components, utilities; /* explicit order: utilities > base */
@import "tailwindcss/theme.css" layer(theme) prefix(zt);
/* …@theme tokens… */
@import "tailwindcss/utilities.css" layer(utilities) prefix(zt);
@layer base {
.zt-root { @import "tailwindcss/preflight.css"; } /* Tailwind inlines + scopes this at build */
}Add zt-root to the container the view owns — ItemView.contentEl, a modal's contentEl, a settings pane — not inside the React tree. Then write normal semantic HTML — <blockquote>, <p>, <ul>/<li>, <h2>, <hr> — plus Tailwind border utilities; they render clean because preflight zeroes the UA margins/padding and sets border-style: solid. No div role workaround, no border-solid.
// Set the scope on the container the view owns — not in the React tree:
class AnnotationView extends ItemView {
async onOpen() {
this.contentEl.classList.add("zt-root");
createRoot(this.contentEl).render(<AnnotView />);
}
}
// Inside, semantic HTML + border utilities just work — no div+role, no border-solid:
<blockquote className="zt:border-l-2 zt:pl-2" style={{ borderLeftColor: color }}>{text}</blockquote>
<p className="zt:select-text">{text}</p>Preflight sits in @layer base — your zt: utilities (@layer utilities) outrank it, and Obsidian's unlayered stylesheet outranks all layers. So preflight only overrides browser UA defaults (the leaks you want gone: <blockquote> margin:1em 40px, <p> margin:1em 0, <ul>/<ol> 40px indent, etc.), while your spacing/border utilities and Obsidian's native control styles both work normally inside .zt-root.
@layer base), and the bare-rule set is bigger than it looks. Structural: <hr> (border-top: var(--hr-thickness) + margin: 2rem 0 — note .markdown-rendered hr only re-declares the border, so the 2rem margin survives even there); <h1>–<h6> (per-level themed typography — size/weight/color/font/line-height — + var(--p-spacing) margin-block); <ol> (list-style-type: var(--list-numbered-style) → numbering survives); nested ul selectors like ul ul, ol ul (list-style-type: disc) — but a top-level bare <ul> has no rule at all, so preflight strips its markers; ul > li, ol > li (text-align: start) and their ::marker color. Inline elements: a/a:hover (accent color, underline, link weight/cursor — this beats preflight's a { color: inherit }, so links stay Obsidian-styled inside .zt-root), b/strong (bold weight + color), i/em (italic + color), kbd (fully styled: mono font, background, padding, radius). Other globals: button (full Obsidian button box, distinct from the <button> preflight discussion above), iframe, audio, * (box-sizing: border-box), and :focus (outline: none). Everything else (<p>, <blockquote>, <code>, <pre>, <table>/<th>/<td>, <img>, <video>, <mark>, <sub>/<sup>, <fieldset>, a top-level <ul>, …) has no bare Obsidian rule — pure Chrome UA, so preflight fully governs them. Neutralize the ones you don't want with a utility/inline style or a plain <div>..zt-root is for your own custom DOM. Markdown rendered via MarkdownRenderer inside it still looks right (Obsidian's .markdown-rendered rules are unlayered → they win), but don't lean on preflight to style markdown.Inside .zt-root a width utility is all you need: zt:border / zt:border-l-2 render solid (preflight supplies the style) and zt:divide-y zt:divide-border gives clean section rules — no zt:border-solid / zt:divide-solid. For a data-driven color (e.g. an annotation highlight) keep the width in the utility and set style={{ borderLeftColor: color }}.
.zt-root? (fallback)Outside a scoped root there is no preflight, so a width utility sets only width — border-style stays none (so zt:border alone is invisible) and unset sides fall back to UA medium, making zt:border-l-2 zt:border-solid a full box. There, add zt:border-solid / set the border inline, or render a <div> with the matching ARIA role (role="blockquote", role="paragraph", role="list" + child role="listitem", role="heading" + aria-level, role="separator"). Prefer adding zt-root — simpler, and keeps real semantics.
Prefer Obsidian's native components over building custom equivalents from Tailwind primitives. They get automatic theme compatibility, accessibility, and consistent behavior across Obsidian versions.
In React, use the wrappers in src/components/obsidian/ for components that need modifier-class logic or non-trivial behavior:
Button, IconButton, Toggle, Dropdown (+ DropdownItem, DropdownGroup), Slider, Color, Icon, SearchInput<input type="text/search/email/password/number/date/datetime-local">, <input type="checkbox">, <input type="radio"> and <textarea> need no wrapper. Obsidian's preflight fully styles these elements — use them directly in JSX. Don't create thin React wrappers around them; the native elements already look correct.
AutosizeTextarea from react-textarea-autosize when the textarea should expand with content (e.g. template editors, note fields).// Correct — bare elements, Obsidian styles them
<input type="text" value={text} onChange={(e) => setText(e.currentTarget.value)} />
<textarea value={body} onChange={(e) => setBody(e.currentTarget.value)} rows={4} />
<input type="checkbox" checked={checked} onChange={(e) => setChecked(e.currentTarget.checked)} />
<input type="radio" name="group" value="a" checked={val === "a"} onChange={() => setVal("a")} />
// For auto-growing textareas, use the wrapper
<AutosizeTextarea value={body} onChange={setBody} minRows={2} maxRows={8} />In imperative DOM (settings tabs, modals built with the Obsidian API), use the obsidian module classes directly:
ButtonComponent, ToggleComponent, TextComponent, TextAreaComponent, DropdownComponent, ColorComponent, SliderComponentRead the wrapper source files for the full API. Each wrapper's JSDoc links to tooltipAttrs for tooltip usage.
Obsidian renders aria-label as a hover tooltip via global pointerover delegation. No extra library needed.
React — use tooltipAttrs() from @/lib/utils and spread onto the element:
import { tooltipAttrs } from "@/lib/utils";
<Button variant="cta" {...tooltipAttrs("Saves the current file")}>
Save
</Button>
<IconButton icon="settings" {...tooltipAttrs("Settings", { placement: "top" })} />Imperative DOM — use setTooltip from the obsidian module:
import { setTooltip } from "obsidian";
setTooltip(buttonEl, "Saves the current file");
setTooltip(iconEl, "Settings", { placement: "top" });Obsidian sets .theme-light or .theme-dark on <body>. Almost always you do not need to write theme-specific rules — Tailwind tokens resolve to semantic Obsidian variables that already swap. Only branch on theme when:
For accent-aware colors, use text-accent-foreground / bg-primary rather than text-blue-500. The accent is user-configurable in Settings → Appearance and Obsidian rebuilds it from --accent-h/s/l.
For RGB-with-opacity overlays, pair the -rgb variant: background: rgba(var(--color-red-rgb), 0.2).
Tailwind utilities are inherently element-scoped — they don't leak. You rarely need a BEM-style root class.
Use a scoped root class only when:
@layer rule that needs a specificity anchor.When you do scope, prefix with zt-:
.zt-zotero-pane {
--zt-pane-padding-x: var(--size-4-4);
--zt-pane-row-gap: var(--size-4-2);
padding-inline: var(--zt-pane-padding-x);
}
.zt-zotero-pane__row { gap: var(--zt-pane-row-gap); }Prefix custom properties with --zt-… to avoid colliding with Obsidian's. Default them to an Obsidian variable so the value flows through theme changes.
Hardcoded values — break in non-default themes because themes override Obsidian's base variables, not your literals.
// bad — color/spacing literals
<div className="zt:bg-[#2a2a2a] zt:text-[#ddd] zt:p-[8px_12px]" />
// good — semantic tokens + Tailwind scale
<div className="zt:bg-background zt:text-foreground zt:px-3 zt:py-2" />
// bad — manual dark mode (semantic tokens already swap)
<div className="zt:bg-white dark:zt:bg-[#1e1e1e]" />
// good
<div className="zt:bg-background" />Restyling a native element — Obsidian's preflight already handles appearance; adding Tailwind bg/border/padding fights it and drifts across Obsidian versions.
// bad
<button className="zt:bg-primary zt:text-primary-foreground zt:rounded-md zt:px-3 zt:py-1">Save</button>
// good — bare button is already styled; use mod-cta for primary variant
<Button variant="cta">Save</Button>Targeting Obsidian internals — undocumented class names change between Obsidian releases.
/* bad */
.workspace-leaf-content[data-type="zt-view"] .markdown-preview-view div.callout-title { … }
/* good — scope to your own root */
.zt-view .zt-callout-title { … }!important to win specificity → restructure the selector instead. !important blocks user CSS snippets from ever overriding the value.
Use the obsidian-debug skill for the build → reload → eval → screenshot loop. CSS-specific
probes worth running during that loop:
getComputedStyle(el).backgroundColor.<blockquote> outside .zt-root reporting marginLeft: "40px"
(see Scoped preflight above).getBoundingClientRect().Then confirm it holds up across themes:
obsidian eval code='document.body.className' (expect theme-light / theme-dark).These are catalogs — read on demand, not all at once. Each file lists the Obsidian variables grouped by topic with one-line descriptions.
references/preflights.md — which bare HTML elements Obsidian fully styles (button, input, textarea, select, checkbox, radio, toggle).references/foundations.md — colors (semantic + accent palette), spacing, typography, radiuses, borders, layers, icons, cursors. Read this first when you don't know which variable to use.references/components.md — buttons, inputs, dropdowns, checkboxes, toggles, sliders, modals/dialogs, popovers, prompts, tabs, navigation, pills (multi-select), color inputs, indentation guides, dragging.references/editor.md — markdown content: headings, links, tables, callouts, code, blockquotes, lists, tags, embeds, footnotes, properties, bases, inline title.references/window.md — workspace chrome: ribbon, sidebar, status bar, dividers, scrollbars, window frame, vault profile, workspace.references/plugins.md — built-in plugin views: file explorer, search, graph, canvas, sync.references/app.css — the full Obsidian v1.12.7 stylesheet. Consult when you need to understand exactly what Obsidian applies to a bare element or class.To find a variable when you only have a CSS property in mind:
zt:bg-background / zt:bg-card (see references/foundations.md).zt:text-muted-foreground.zt:bg-primary (bg) or zt:text-accent-foreground (text).zt:border-border.zt:bg-muted.zt:bg-popover (see references/components.md).© aidenlx, AGPL-3.0. 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 7 other files (references) in .agents/skills/obsidian-css of aidenlx/zotlit.
Open the folder on GitHubat commit 27f5752
Obsidian CSS 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 |
|---|---|---|---|---|---|---|
| Obsidian CSS this skillaidenlx/zotlit | 1k | — | ~4.8k | Automated safety check: Pass | AGPL-3.0 | |
| Kill AI Slopyetone/kill-ai-slop | 1.3k | — | ~1.4k | Automated safety check: Pass | Apache-2.0 | |
| Cosscrafter-station/petdex | 4.2k | — | ~1.4k | Automated safety check: Pass | MIT | |
| Design StyleCastor6/tactus | 376 | 1 repos | ~2.1k | Automated safety check: Pass | Apache-2.0 | |
| Opensource UIbidyut10/opensourceui | 717 | — | ~1.1k | Automated safety check: Pass | MIT | |
| Extract DesignManavarya09/design-extract | 4.2k | — | ~786 | Automated safety check: Notes | 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.
crafter-station/petdex
Helps implement coss UI components correctly. An agent skill from crafter-station/petdex.
Castor6/tactus
A skill your agent uses whenever the user asks to build, create, design, develop, improve, or style any frontend interface or visual element.
bidyut10/opensourceui
Use Opensource UI patterns and copy-paste React/Next.js components from opensourceui.in.
Manavarya09/design-extract
Extract the full design language from any website URL. An agent skill from Manavarya09/design-extract.
leepokai/Codync
Guide to Sonner, the React toast library — install and wire up the Toaster, pick the right toast() call, promise and loading toasts, updating, dismissing and persisting toasts, styling, theming and…
aidenlx/zotlit
Obsidian house style for the wording of user-facing UI strings — command names, setting labels, button text, notices, modal copy.
aidenlx/zotlit
Typed regex authoring with arkregex in this repo. An agent skill from aidenlx/zotlit.
aidenlx/zotlit
Write a user-facing changelog entry under apps/docs/content/changelog/.
aidenlx/zotlit
Draft a Discord announcement from a changelog entry. An agent skill from aidenlx/zotlit.
aidenlx/zotlit
Define ZotLit UI messages in the Inlang Message Format and consume them through the generated JSON Language Pack facade.
aidenlx/zotlit
Patterns for registering commands (action modules) and building context menus (menu segments) in the Obsidian plugin.
Works with
Categories
Style Obsidian plugin UI with Tailwind + native components. An agent skill from aidenlx/zotlit. Obsidian CSS is an agent skill from aidenlx/zotlit. Style Obsidian plugin UI with Tailwind + native components.
Obsidian CSS fits situations like: reviewing any styled React/JSX in apps/obsidian/ — picking colors; dark-mode tokens; choosing between Tailwind utilities; obsidian native components.
Run `npx skills add aidenlx/zotlit --skill obsidian-css -a claude-code`. Or copy the skill folder (.agents/skills/obsidian-css in aidenlx/zotlit) into .claude/skills/obsidian-css in your project. Claude Code loads it when a task matches its description.
Run `npx skills add aidenlx/zotlit --skill obsidian-css -a codex`. Or copy the skill folder (.agents/skills/obsidian-css in aidenlx/zotlit) into .agents/skills/obsidian-css 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 aidenlx/zotlit --skill obsidian-css -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/obsidian-css, .gemini/skills/obsidian-css, .github/skills/obsidian-css and .opencode/skills/obsidian-css in your project.
SKILL.md names no scripts, command-line tools or credentials: Obsidian CSS is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. 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.
Obsidian CSS is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.8k tokens (SKILL.md is roughly 19k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 10k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Obsidian CSS: Kill AI Slop (yetone/kill-ai-slop, 1.3k stars), Coss (crafter-station/petdex, 4.2k stars), Design Style (Castor6/tactus, 376 stars) and Opensource UI (bidyut10/opensourceui, 717 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
aidenlx (a GitHub user) maintains it in aidenlx/zotlit, which has 1,028 GitHub stars. The repository holds 16 skills in this directory. The repository was last updated on October 8, 2026.
Source: aidenlx/zotlit on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.