design-tokens
Skill2 starsChanged 3 months agoMITView on GitHub
Design token system for sales websites - color scales with contrast roles, spacing grid, type scale, radii, shadows, durations. Use before building anything and whenever a raw value tempts you.
33 other projects use a version of this.
Adopted by
Most recently taken up by
- ainurdev/mystical-assistanttheir own version, first seen Nov 8, 2026
- gitbutlerapp/gitbutlertheir own version, first seen Nov 8, 2026
- dmlguq456/heartingtheir own version, first seen Nov 8, 2026
- Aboudjem/ui-ux-suitetheir own version, first seen Nov 8, 2026
- drinkspiller/skillstheir own version, first seen Nov 6, 2026
- TomSzenessy/AI_TEMPLATEtheir own version, first seen Nov 6, 2026
Used with
Projects with it also use brief-to-tasks, design-flow and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
julianoczkowskiSkillbrief-to-tasks
Break a design brief into an ordered checklist of independently buildable tasks using vertical slices. Saves as a markdown checklist. Use when user wants to break down work, create tasks from a brief, plan implementation order, or mentions "tasks" or "breakdown".
Also in 7 projects that use this
julianoczkowskiSkilldesign-flow
Run the full design-to-build workflow as a guided sequence. Orchestrates all designer skills in order, from grilling through review. Use when user wants to go through the complete design process, start a project from scratch, run the full flow, or mentions "design flow" or "full workflow".
Also in 6 projects that use this
45ckSkillinformation-architecture
Define the information architecture for a prototype -- sitemap, navigation model, grouping logic, labeling, and action placement.
Also in 10 projects that use this
nandanosqlSkilldesign-brief
Create a design brief that clearly communicates the product context, user needs, constraints, and success criteria to the design team — bridging PM requirements and design execution.
Also in 8 projects that use this
solinkzSkillmicro-interactions
Expert micro-interaction architect for mobile apps, web applications, and responsive websites. Use this skill when the user asks to add, build, fix, audit, or consult on micro-interactions, animations, transitions, motion design, gesture feedback, haptics, loading states, skeleton screens, pull-to-refresh, swipe actions, scroll animations, button states, form validation feedback, toast notifications, modals, dropdowns, toggles, progress indicators, shared element transitions, spring physics, easing curves, motion tokens, or any interaction that provides visual/haptic/auditory feedback to user actions. Triggers on: "micro-interaction", "animation", "transition", "motion", "easing", "spring", "gesture", "haptic", "feedback", "loading state", "skeleton", "shimmer", "pull to refresh", "swipe", "drag", "hover effect", "press state", "focus ring", "scroll animation", "parallax", "stagger", "orchestration", "reduced motion", "View Transitions", "layout animation", "shared element", "hero animation", "morphing", "Framer Motion", "GSAP", "Lottie", "Rive", "React Spring", "anime.js", or any request to make an interface "feel better", "feel alive", "feel snappy", "feel responsive", or "feel polished".
Also in 3 projects that use this
jpoindexterSkilldesign-system-audit
Audit code for design system violations - grid spacing, tokens, existing components
Also in 3 projects that use this
Other versions33 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 33
- gitbutlerapp/gitbutler★ 22ksame name
- plugin87/ux-ui-agent-skills★ 3.1ksame name
- rommapp/argosy-launcher★ 710same name
- julianoczkowski/designer-skills★ 536same name
- glebis/claude-skills★ 410same name
- dylanfeltus/skills★ 179same name
- marcusgoll/Spec-Flow★ 94same name
- mshadmanrahman/claude-for-designers★ 32same name
- ilikescience/design-tokens-skill★ 15same name
- icons8/agent-skills★ 12same name
23 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository18 other files it gives its agents.
- art-director-reviewSkill
- b2b-landingSkill
- brand-voiceSkill
- checkout-trustSkill
- composition-gridsSkill
- copy-chiefSkill
- demo-assetsSkill
- experimentation-measurementSkill
- layout-compositionSkill
- marketing-strategySkill
- motion-performanceSkill
- navigation-searchSkill
- pixel-qaSkill
- post-purchase-lifecycleSkill
- product-page-croSkill
- promotions-eventsSkill
- typography-craftSkill
- visual-identitySkill
The file
We split this skill into the rules it gives an agent
4 rules. 0 are common, 3 are distinctive, and 1 is very specific to this project.
0
Common
Most of the 30 edited versions we read keep these.
3
Distinctive
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 12
Before building any component, page, or template — the token set must exist before the first pixel ships, not get retrofitted after.
- Distinctive: line 14
When establishing or auditing a brand's OKLCH color ramp, spacing scale, type scale, radius/shadow set, or dark-mode variant.
- Very specific: line 15
Before wiring tools/spacing-lint.mjs / tools/contrast-check.mjs into review or CI — both tools assume the conventions below, not arbitrary …
- Distinctive: line 16
When reviewing a PR that touches CSS — a lint/contrast failure here blocks merge, it isn't a style nit.
“Common” is measured: kept by at least 6 in 10 of the 30 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Design Tokens
The token layer every other skill builds on. Nothing in a build references a raw hex, px, rem, or ms value — it references a token, and the token traces back to a rule below.
When to use
- Before building any component, page, or template — the token set must exist before the first pixel ships, not get retrofitted after.
- Whenever a raw hex, px, rem, or ms value tempts you inside component CSS — that's the signal to add or reuse a token instead of hand-writing the literal.
- When establishing or auditing a brand's OKLCH color ramp, spacing scale, type scale, radius/shadow set, or dark-mode variant.
- Before wiring
tools/spacing-lint.mjs/tools/contrast-check.mjsinto review or CI — both tools assume the conventions below, not arbitrary CSS. - When reviewing a PR that touches CSS — a lint/contrast failure here blocks merge, it isn't a style nit.
Rules
tokens.css structure & tooling
- [FRAMEWORK] Ship exactly one
tokens.cssfile per project as the sole source of custom-property declarations; every other stylesheet only consumesvar(--…).tools/spacing-lint.mjsenforces this at the property level — a guarded property outside:rootwritten as a raw literal is a lint error. — tools/spacing-lint.mjs - [LAW] Structure tokens in three layers: primitive (
--blue-9: #3b82f6) → semantic (--color-action-primary: var(--blue-9)) → component (--button-primary-bg: var(--color-action-primary)); product/page CSS references semantic or component tokens only, never a primitive directly. — color-systems.md R12 - [LAW] Name semantic and component tokens by function, not appearance (
--color-danger, not--color-red) so the name still makes sense after a rebrand or a dark-mode remap changes the underlying hex. — color-systems.md R13 - [FRAMEWORK]
tools/contrast-check.mjsresolves hex literals andvar()alias chains (its own doc comment specs one-hop aliasing — keep chains shallow) but never parsesoklch()/color-mix(). Generate ramps in OKLCH, but commit the computed hex as the primitive value, or any@contrastassertion built on it reports "token missing" instead of a real pass/fail. — tools/contrast-check.mjs - [LAW] Inside
:root, every token named*space*/*spacing*/*gap*must be a multiple of 4px —spacing-lint.mjsflags any non-multiple (--space-sm: 6pxfails,8pxpasses). — tools/spacing-lint.mjs; layout-spacing.md R1 - [FRAMEWORK]
/* lint-allow */is a one-line escape hatch, not a default; every use needs a written justification in review — leaning on more than a couple means the scale has a gap to fix, not a rule to suppress. — tools/spacing-lint.mjs
Color scale (OKLCH ramps, 11–12 steps)
- [LAW] Build every brand color and neutral as an ordered 11–12 step ramp, never a single hex value. Choosing WHICH hue to ramp (category audit, ownable color, accent relationships) happens first and belongs to the
visual-identityskill — this skill starts once the hue is chosen. — color-systems.md R9; visual-identity - [LAW] Generate the ramp in OKLCH, not RGB/HSL interpolation — equal lightness deltas must look like equal visual steps across every hue in the palette; this is why Tailwind v4 rebuilt its default palette in OKLCH. — color-systems.md R10
- [LAW] Fix semantic roles to specific steps and hold them across every color in the system: steps 1–2 page/canvas background, 3–5 interactive component background (rest/hover/active), 6–8 borders (subtle → interactive → focus ring), 9–10 solid/saturated fills (primary button default/hover), 11–12 text (secondary, primary). — color-systems.md R9 (Radix Colors)
- [LAW] Reserve the solid/saturated step (~9) for large filled UI elements and the darkest steps (11–12) for running text — a mid-saturation ~500-level swatch routinely fails 4.5:1 against white and must never be body-text color. — color-systems.md R11
- [LAW] Adopt P3 wide-gamut values for the most saturated ramp steps where the rendering stack supports it — sRGB clips the brightest reds/yellows on modern wide-gamut displays; treat as baseline tooling, not a stylistic choice. — color-systems.md R14
- [LAW] The primary CTA's fill token must be the single most saturated color in the viewport and clear ≥3:1 non-text contrast against its 1–2 nearest surrounding fills (page background, adjacent card) — the checkable form of "make the CTA pop." — color-systems.md R17
- [LAW] Only one button per screen resolves to the primary (filled, most-saturated) component token; every other action uses an outline/ghost/lower-step token — co-equal saturated buttons destroy the isolation that makes a CTA read as the one thing to click. — color-systems.md R18
Contrast assertions
- [FRAMEWORK] Declare every foreground/background pair actually used on the page as a
/* @contrast --fg on --bg >= N */comment beside the tokens involved, e.g./* @contrast --color-text on --color-bg >= 4.5 */. — tools/contrast-check.mjs - [LAW] Thresholds by role: normal text (below 24px regular / 18.66px bold) ≥4.5:1; large text (≥24px regular or ≥18.66px/14pt bold) ≥3:1; non-text UI — icon outlines, input borders, an outline/ghost button's visible boundary — ≥3:1 against its adjacent fill, not the 4.5:1 text threshold. — color-systems.md R1-2, R5
- [LAW] Reserve AAA thresholds (7:1 normal / 4.5:1 large) for regulated verticals (health, finance, legal) or an explicit internal stretch goal; AA is the shipped baseline everywhere else. — color-systems.md R3
- [FRAMEWORK] A tokens.css with zero
@contrastassertions is itself a FAIL —contrast-check.mjstreats "no assertions declared" as a failure, not a silent pass. Write the assertion the moment a pairing ships, not retroactively at QA. — tools/contrast-check.mjs
Spacing scale (4px / 8px grid)
- [LAW] Use 8px as the base spacing unit; every section margin, padding, and gutter is a multiple of 8 (8/16/24/32/40/48/64/80/96). Declared fluid exception: a
--flow-*token (Rules 40-41) whose two written bounds land on this grid may interpolate between them at intermediate viewports. — layout-spacing.md R1 - [LAW] Reserve the 4px sub-grid for internal component spacing only (icon-to-label gap, button internal padding, inline badge spacing) — never for section-level layout. — layout-spacing.md R2
- [LAW] Fix the spacing scale as a token set, not arbitrary values:
--space-1: 4px,--space-2: 8px, then 12/16/24/32/48/64/96/128px — 7–10 steps total, every layout value pulled from this list or expressed as a--flow-*clamp between two of these steps (Rules 40-41). — layout-spacing.md R3 - [LAW] Set
--leading-*(line-height) tokens to multiples of 4px so text baselines stay locked to the spacing grid. — layout-spacing.md R4 - [LAW] Ship
--target-min: 44pxas the touch/click-target design floor (Apple HIG 44×44pt; Material 48×48dp) with ≥8px clearance between adjacent targets. WCAG 2.2 SC 2.5.8's legal AA minimum is 24×24px — state both in review, ship 44. — layout-spacing.md R6-7; WCAG 2.2 SC 2.5.8
Type scale (modular ratio)
- [FRAMEWORK] Declare one modular-scale ratio per project as its own token (
--type-ratio: 1.333), chosen by context: 1.2 dense dashboards, 1.25–1.333 marketing/landing pages, 1.5–1.618 hero-driven/editorial pages with few hierarchy levels. Craft convention, not a measured usability finding — a strong default, not an evidence-backed optimum. — typography-craft.md R1 - [FRAMEWORK] Generate 7–12 size steps from that ratio (
--text-xs…--text-6xl); don't hand-pick sizes outside the generated set. — typography-craft.md R1-2 - [LAW] Body text floor is 16px (
1rem) at every breakpoint; declare everyfont-sizetoken inrem/em, never fixed px, so the scale honors 200% browser zoom and OS text-size settings. — typography-craft.md R10-13 - [LAW] Pair each scale step with its own
--leading-*token, inverse to size: ~1.1–1.2 for display steps ≥48px, 140–150% for body-range steps (16–19px). — typography-craft.md R7-8 - [LAW] Build one
clamp()per scale step, not one clamp for the whole scale:font-size: clamp(MIN_REM, PREFERRED, MAX_REM), bounds always inrem— a bare-vwpreferred value with no rem floor/ceiling breaks WCAG 1.4.4's 200%-zoom requirement. — typography-craft.md R15-19 - [LAW] Derive PREFERRED from two anchor points (min size y1 at viewport x1, max size y2 at viewport x2): vw-coefficient
v = 100×(y2−y1)/(x2−x1), rem-offsetr = (x1·y2 − x2·y1)/(x1−x2). — typography-craft.md R16
Radius, shadow & duration tokens
- [FRAMEWORK] Define radius as a fixed scale, not a per-component pick:
--radius-sm4px (inputs/chips),--radius-md8px (cards/buttons),--radius-lg16px (modals/panels),--radius-full9999px (pills/avatars);spacing-lint.mjsguardsborder-radiusoutside:root. — practitioner scale-token convention (Radix/Tailwind/Material); tools/spacing-lint.mjs - [FRAMEWORK] Define shadow as elevation tiers, not ad hoc
box-shadowvalues:--shadow-1resting card,--shadow-2hover/raised,--shadow-3dropdown/popover,--shadow-4modal — each generated once and reused, never authored per component. - [FRAMEWORK] Define duration tokens on Material Design 3's scale:
--duration-short50–200ms (micro-interactions: toggles, hover/press feedback),--duration-medium250–400ms (cards, sheets, dropdowns),--duration-long450–500ms (large-surface/full-screen transitions) — never exceed ~500ms for a single-step transition on a sales page. — motion-performance.md R3 (m3.material.io) - [FRAMEWORK] Pair duration tokens with named easing tokens:
--ease-standardfor on-screen morphs,--ease-decelerate(cubic-bezier(0,0,0,1)) for elements entering,--ease-accelerate(cubic-bezier(0.3,0,1,1)) for elements exiting. — motion-performance.md R4 - [FRAMEWORK]
transition-duration,animation-duration,transition, andanimationare guarded properties underspacing-lint.mjs— every declaration outside:rootresolves through a duration/easing token, never a rawms/sliteral. — tools/spacing-lint.mjs
Dark mode (rebuilt, not inverted)
- [LAW] Never generate dark mode by inverting the light palette; rebuild each semantic token (background, surface, border, text, accent) independently on the dark theme's own scale. — color-systems.md R30
- [LAW] Re-run every
@contrastassertion against the dark-mode token values — a pair safe at 4.5:1 in light mode is not guaranteed safe after the rebuild; naive inversion routinely breaks contrast on mid-saturation brand colors. — color-systems.md R30 - [TREND-2026] Default cart, checkout, and payment screens to light mode (or exact system match) even on sites offering dark mode elsewhere — lighter UI reads as more trustworthy at the payment-trust moment. Direction is corroborated across sources; specific abandonment percentages are not — don't cite a number. — color-systems.md R28
- [TREND-2026] If dark mode is supported, make it a persistent saved user toggle, not OS-detection-only — the cited driver of dissatisfaction is a mismatch between expectation and rendered theme, which a persistent toggle resolves directly. — color-systems.md R29
- [TREND-2026] If shipping partial-dark, segment by module type: imagery-heavy modules (hero, product gallery, lifestyle photography) read fine or better on dark surfaces; data-dense modules (pricing tables, spec comparisons, forms) read better on light. — color-systems.md R31
- [TREND-2026] Implement the dark-mode rebuild (Rule 34) through
light-dark()paired unconditionally withcolor-scheme: light dark(or an explicitlight/darkvalue) declared on:root/html—light-dark()is Baseline newly available since 2024-05-13 (not yet widely available, ~2026-11-13 projected) and resolves light-only if the pairedcolor-schemedeclaration is missing. This is a mechanism choice layered on top of Rule 34, not a substitute for it: eachlight-dark(#lightHex, #darkHex)pair is still two independently rebuilt values, never a light value with the dark half derived by inversion.contrast-check.mjscannot resolve alight-dark()call any more than it resolvesoklch()(Rule 4) — commit both arguments as literal hex, and Rule 35's dark-mode@contrastre-verification runs against the resolved dark-branch hex specifically. — modern-baseline-css.md R23-24; web-featureslight-dark,color-scheme
Fluid-space tokens (clamp within the grid)
- [TREND-2026]
--flow-*tokens are a fluid-space option layered on top of the fixed 8px scale (Rule 20), for section-level rhythm that must not visibly "jump" at a breakpoint: declare each asclamp()between two bounds that are themselves grid-step values from Rule 20's scale, e.g.--flow-md: clamp(1rem, 0.9rem + 0.5vi, 2rem)where the 1rem (16px) floor and 2rem (32px) ceiling both land on the fixed scale. Component-internal spacing stays on the 4px sub-grid (Rule 19) and is never expressed as a--flow-*token. — modern-baseline-css.md R27-29 (Utopia methodology) - [FRAMEWORK]
spacing-lint.mjsenforces the--flow-*contract mechanically: each such token must be aclamp()whose written min/max bounds are plain px/rem literals landing exactly on the 8px section grid (Rule 18), and whose preferred value carries aremterm — a pure-vw/vimiddle ignores browser zoom (for text clamps that is a WCAG 1.4.4 failure per modern-baseline-css R28; for space it breaks zoom coherence, same discipline, no legal ratio constraint applies). The clamp's interpolated output at intermediate viewports is off-grid by design (Rule 40's declared tradeoff) — flagging those values in review is noise, not rigor. — tools/spacing-lint.mjs; modern-baseline-css.md R28-29
Checklist
Structure & tooling
- Exactly one
tokens.css; all other CSS consumesvar(--…)only (R1) - Primitive → semantic → component layering held; no component references a primitive directly (R2)
- Token names are function-based, not appearance-based (R3)
- Every primitive feeding a
@contrastassertion resolves to a committed hex, even if authored in OKLCH (R4) :rootspacing/gap tokens are all multiples of 4px (R5)- Any
/* lint-allow */has a written justification attached (R6)
Color
- Every brand/neutral color is an 11–12 step ramp, not a single hex (R7)
- Ramp generated in OKLCH (R8)
- Step-to-role mapping matches R9 exactly (bg / component-bg / border / solid / text)
- No mid-saturation solid-step color used as body-text color (R10)
- P3 values used for saturated steps where the stack supports it (R11)
- Primary CTA fill is the most saturated element on screen, ≥3:1 vs. neighbors (R12)
- Only one primary-treatment button per screen (R13)
Contrast
- Every used fg/bg pair has a
@contrastassertion in tokens.css (R14) - Correct threshold applied per role: 4.5 / 3 / 3 (text / large text / non-text UI) (R15)
- AAA (7:1/4.5:1) applied only where the vertical requires it (R16)
node tools/contrast-check.mjs tokens.cssexits 0 (R17)
Spacing & type
- All layout spacing is a multiple of 8; 4px reserved for component internals (R18-19)
- Spacing token set matches the fixed 7–10 step scale (R20)
- Line-height tokens are multiples of 4px (R21)
- Touch targets ≥44×44px with ≥8px clearance (24×24px legal floor noted, not shipped) (R22)
--type-ratiodeclared and every size step derived from it (R23-24)- Body text never drops below 16px/1rem; all sizes in rem/em (R25)
- Line-height inverse to size (~1.1–1.2 display, 140–150% body) (R26)
- Each scale step has its own
clamp()with rem floor/ceiling (R27-28) - Any
--flow-*fluid-space token's twoclamp()bounds both land on the fixed 4/8px-grid scale; the interpolated mid-range value is not lint-chased (R40-41)
Radius, shadow, duration
border-radiusvalues resolve through the 4-step radius scale (R29)- Shadows are elevation tiers, not per-component values (R30)
- Duration tokens match the short/medium/long M3 bands (R31)
- Easing tokens paired with duration tokens by entrance/exit/morph context (R32)
transition/animationdeclarations use tokens, never raw ms/s (R33)
Dark mode
- Dark theme tokens rebuilt per-role, not inverted from light (R34)
- Dark-mode fg/bg pairs re-verified through
@contrast(R35) - Any
light-dark()token is paired with acolor-schemedeclaration on:root/html, and both hex arguments are committed literals, notvar()/oklch()(R39) - Checkout/cart/payment default light or system-match (R36)
- Dark mode is a persistent toggle, not OS-detection-only (R37)
- Partial-dark (if used) segmented by module type (R38)
Tooling gate
node tools/spacing-lint.mjs <css files>exits 0node tools/contrast-check.mjs tokens.cssexits 0
Anti-patterns
- A single hex value standing in for a color (
--brand-blue: #2563eband nothing else). Breaks the moment a hover state, border, or disabled variant is needed — you'll invent ad hoc darken/lighten values instead of using the ramp. Instead: generate the full 11–12 step OKLCH ramp up front and assign every UI state to a fixed step. - Authoring primitives in raw
oklch()with no hex output.contrast-check.mjscan't resolve it, so every@contrastassertion built on that token silently reports "token missing" instead of a real pass/fail — a false sense of coverage. Instead: commit the computed hex as the primitive value; keep OKLCH generation in tooling, not in tokens.css. - Component CSS with raw px/rem/em/ms values outside
:root. Defeats the point of a token system and is exactly whatspacing-lint.mjscatches — don'tlint-allowit away as noise. Instead: add the missing token to the scale if one doesn't exist yet. - Shipping tokens.css with zero
@contrastassertions "because the colors look fine."contrast-check.mjsfails this by design — an unverified pairing is not a passing pairing. Instead: write the assertion for every fg/bg pair the moment it's added. - Using a mid-saturation solid-step swatch as running body text. Reads fine on a bright monitor, fails 4.5:1 in a contrast checker, and is a common real-world AA failure. Instead: pull text color from the dedicated text steps (11–12); reserve solid steps for large filled elements only.
- Generating dark mode with a CSS filter or hue-rotate/invert on the light palette. Produces fg/bg pairs never checked against 4.5:1/3:1 in the new combination. Instead: define an independently-tuned dark-theme value per semantic role and re-run every
@contrastassertion against it. - One-off
border-radius/box-shadowvalues per component ("this card gets 10px, that modal gets 14px"). Produces a system that looks hand-tuned-inconsistent rather than designed. Instead: pick from the fixed radius/shadow scale; if nothing fits, add a scale step deliberately. vw-only fluid type with no rem floor/ceiling on theclamp(). Breaks WCAG 1.4.4 because text never stops scaling in lockstep with viewport width, regardless of browser zoom. Instead: always wrap the preferredvwvalue in rem-based min/max bounds.- Forcing dark-mode-only on checkout/payment regardless of saved preference. Repeatedly flagged as a trust/abandonment risk at the exact moment trust matters most. Instead: default transactional screens to light or system-match; let dark mode elsewhere be an explicit, persistent user choice.
- Shipping
light-dark()with nocolor-schemedeclaration on:root/html. The function silently resolves to its light branch only — a dark-mode toggle appears to do nothing. Instead: always declarecolor-schemeandlight-dark()together, never one without the other. - Chasing a
--flow-*clamp()'s intermediate viewport-width value to force it onto the 4px grid. The interpolated value between the two bounds is off-grid by design; only the clamp's own min/max literals need to land on 4px multiples. Instead: grid-check the two bounds, accept the fluid interpolation between them. - Multiple co-equal saturated "primary" buttons on one screen. Re-creates the no-isolation condition that makes a CTA fail to stand out, independent of hue. Instead: exactly one component token (
--button-primary-*) per screen gets the solid/saturated treatment.
Plugin context
Installed as the conversion-craft plugin, the lint tools live at ${CLAUDE_PLUGIN_ROOT}/tools/spacing-lint.mjs and ${CLAUDE_PLUGIN_ROOT}/tools/contrast-check.mjs; inside this repo they are at tools/. Both must exit 0 either way.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

