UI Styling
Ohh-889/skyroc
Create beautiful, accessible user interfaces with shadcn/ui components (built on Radix UI + Tailwind), Tailwind CSS utility-first styling, and canvas-based visual designs.
Frontend conventions and component usage rules. An agent skill from letehaha/moneymatter.
$ npx skills add letehaha/moneymatter --skill frontend-rules -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install letehaha/moneymatter frontend-rules --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/letehaha/moneymatter.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/frontend-rules .claude/skills/frontend-rules && 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 "frontend-rules" agent skill from https://github.com/letehaha/moneymatter/tree/dev/.claude/skills/frontend-rules into .claude/skills/frontend-rules/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "frontend-rules", 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/letehaha/moneymatter/tree/dev/.claude/skills/frontend-rulesType 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 letehaha/moneymatter --skill frontend-rules -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install letehaha/moneymatter frontend-rules --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/letehaha/moneymatter.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/frontend-rules .agents/skills/frontend-rules && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "frontend-rules" agent skill from https://github.com/letehaha/moneymatter/tree/dev/.claude/skills/frontend-rules into .agents/skills/frontend-rules/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "frontend-rules", 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 letehaha/moneymatter --skill frontend-rules -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install letehaha/moneymatter frontend-rules --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/letehaha/moneymatter.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/frontend-rules .cursor/skills/frontend-rules && 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 "frontend-rules" agent skill from https://github.com/letehaha/moneymatter/tree/dev/.claude/skills/frontend-rules into .cursor/skills/frontend-rules/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "frontend-rules", 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/letehaha/moneymatter.git --path .claude/skills/frontend-rules--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 letehaha/moneymatter --skill frontend-rules -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install letehaha/moneymatter frontend-rules --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/letehaha/moneymatter.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/frontend-rules .gemini/skills/frontend-rules && 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 "frontend-rules" agent skill from https://github.com/letehaha/moneymatter/tree/dev/.claude/skills/frontend-rules into .gemini/skills/frontend-rules/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "frontend-rules", 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 letehaha/moneymatter frontend-rulesInstalls 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 letehaha/moneymatter --skill frontend-rules -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/letehaha/moneymatter.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/frontend-rules .github/skills/frontend-rules && 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 "frontend-rules" agent skill from https://github.com/letehaha/moneymatter/tree/dev/.claude/skills/frontend-rules into .github/skills/frontend-rules/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "frontend-rules", 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 letehaha/moneymatter --skill frontend-rules -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install letehaha/moneymatter frontend-rules --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/letehaha/moneymatter.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/frontend-rules .opencode/skills/frontend-rules && 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 "frontend-rules" agent skill from https://github.com/letehaha/moneymatter/tree/dev/.claude/skills/frontend-rules into .opencode/skills/frontend-rules/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "frontend-rules", 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.
frontend-rulesFrontend conventions and component usage rules. An agent skill from letehaha/moneymatter.
Frontend Rules is an agent skill from letehaha/moneymatter. Frontend conventions and component usage rules. Read before writing any frontend code. Covers styling, component library, data flow, and UI patterns. Trigger on "/frontend-rules" or when starting frontend work.
Its SKILL.md is about 3.8k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Frontend & Design, covering Design systems and Responsive design. The repository describes itself as: A personal budget tracking application. Track your balances and transactions with bank connections or manual entry, categorize and analyze expenses and income, and many more. 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 de5319f. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadGrepGlobFrom allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are vue, typescript and json).
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.
Frontend Rules loads about 3.8k tokens when it runs. Until then it costs about 56 tokens; SKILL.md has 1,438 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 letehaha/moneymatter at commit de5319f, republished under its AGPL-3.0 licence (© letehaha). 1,438 words, ~3,842 tokens.
.claude/skills/frontend-rules/SKILL.md (or your agent's skills folder).Reference guide for all frontend code in packages/frontend/. Read this before writing or modifying frontend components.
reminder-form-dialog.vue, use-submit-transaction.ts)<script setup lang="ts">any unless absolutely unavoidabledate-fns for all date formatting and manipulation. Never use raw Date methods or other date librariesconst MAX_VISIBLE_TAGS = 5). Simple, self-evident values (array indices, 0/1 checks, common multipliers, etc.) are fine inline — use your judgementAll API call functions live in src/api/. Components and composables must import from there — never inline fetch or axios calls directly in components.
components/common/ or components/lib/pages/<feature>/components/Route paths are defined as constants in routes/constants.ts. Always use those constants for router.push() and <RouterLink :to="...">. Never hardcode path strings.
The project defines CUSTOM_BREAKPOINTS and provides the useWindowBreakpoints composable. Use those for JS-based responsive logic — never use custom media queries or magic pixel values.
The app has a ~300px sidebar visible on screens wider than 768px, so the content area is significantly narrower than the viewport (e.g., 900px screen = ~600px content). Viewport breakpoints (md:, lg:) don't account for this and can produce wrong results for content layout.
Prefer CSS container queries (@container) when the layout depends on the available content width — multi-column grids, card arrangements, etc. Use Tailwind's named container syntax:
<!-- Parent: define the container -->
<Card class="@container/my-section max-w-4xl">
<!-- Child: query the container width, NOT the viewport -->
<div class="grid grid-cols-1 @sm/my-section:grid-cols-2">
...
</div>
</Card>Container queries aren't needed everywhere — use judgement:
@container): multi-column grids, card layouts, anything where the sidebar makes viewport breakpoints inaccuratemd:, lg:): showing/hiding the sidebar, header layout, simple show/hide toggles that genuinely depend on screen sizeuseWindowBreakpoints: JS-based responsive logic — toggling components, conditional rendering based on device classAll computation functions, services, utils, and helpers must have unit tests to verify their logic. If you create or modify a pure function (formatting, calculation, transformation, validation), write or update a corresponding unit test.
text-red-500, bg-blue-200). Always use the project's color variables defined in packages/frontend/src/styles/global.cssglobal.css rather than using raw color valuescn() utility from @/lib/utils for conditional class composition. Never use manual string concatenation for dynamic classes| Purpose | Class |
|---|---|
| Income / positive | text-app-income-color |
| Expense / negative | text-app-expense-color |
| Transfer | text-app-transfer-color |
Semantic colors come in pairs: the base token is a fill (button/badge backgrounds, with *-foreground for the label on top), and the *-text token is the tint tuned for text and icons sitting directly on the page/card background. Icons count as text here — lucide icons inherit currentColor.
| Color | Text / icons | Fill / background |
|---|---|---|
| Primary (brand) | text-primary-text | bg-primary + text-primary-foreground |
| Destructive | text-destructive-text | bg-destructive |
| Success | text-success-text | bg-success |
| Warning | text-warning-text | — |
text-primary or text-destructive to color text or icons. Fill tokens are tuned so a white label passes contrast on top of them, which makes them too low-contrast as text on the dark theme (this is why --primary-text exists as a separate, brighter tint in dark mode)bg-primary/10 still count as a dark background — text/icons inside them use text-primary-textAlways use the project's Button component (@/components/lib/ui/button). Never use raw <button> elements.
Available variants: default, destructive, outline, secondary, ghost, ghost-destructive, soft-destructive, ghost-primary, soft-primary, success, outline-success, ghost-success, soft-success, link
Available sizes: default, sm, lg, icon, icon-sm
Button is inline-flex with gap-2, so spacing between its children (icon + label, multiple icons, etc.) is handled by the button itself. Do not add mr-* / ml-* / space-x-* to icons or text inside a Button — it doubles the gap and looks off.
<!-- WRONG — gap-2 already spaces the icon from the label -->
<Button><PlusIcon class="mr-2 size-4" /> Add item</Button>
<!-- CORRECT -->
<Button><PlusIcon class="size-4" /> Add item</Button>Always use the project's field components from @/components/fields/. Never use raw <input>, <select>, or <textarea> elements.
| Need | Component |
|---|---|
| Text / number | input-field.vue |
| Select | select-field.vue |
| Date | date-field.vue |
| Textarea | textarea-field.vue |
| Category | category-select-field.vue |
| Tags | tag-select-field.vue |
| Color | color-select-field.vue |
Every form field must have a :placeholder set. An empty input or an empty select with only a label leaves the user guessing what to enter or pick (especially in dialogs that open with no prefilled value). The placeholder should be a concrete prompt — "Enter payee name", "Select a category", "DD/MM/YYYY" — not a restatement of the label.
Always wire placeholders through i18n (:placeholder="$t('...')"); never inline raw English strings.
Always use @lucide/vue icons. Never use raw SVGs or other icon libraries. Do not use lucide-vue-next — that's the old package and has been replaced.
Always import icons with the Icon suffix — e.g., CircleCheckIcon, Trash2Icon, ChevronDownIcon. Never use the short form without the suffix.
<!-- WRONG -->
import { CircleCheck, Trash2 } from '@lucide/vue'
<CircleCheck />
<!-- WRONG — old package -->
import { CircleCheckIcon, Trash2Icon } from 'lucide-vue-next'
<!-- CORRECT -->
import { CircleCheckIcon, Trash2Icon } from '@lucide/vue'
<CircleCheckIcon />Always use the ScrollArea component (@/components/lib/ui/scroll-area) for scrollable containers. Never use raw overflow-auto / overflow-y-scroll divs. Adding the ScrollArea's id to a global variable is not needed unless there's a concrete use case for it.
The project's Checkbox component (@/components/lib/ui/checkbox) uses modelValue / update:modelValue, not checked / update:checked. Always bind with :model-value and @update:model-value (or v-model).
<!-- Correct -->
<Checkbox :model-value="form.notifyEmail" @update:model-value="(val) => (form.notifyEmail = !!val)" />
<!-- Also correct -->
<Checkbox v-model="form.notifyEmail" />
<!-- WRONG — will silently do nothing -->
<Checkbox :checked="form.notifyEmail" @update:checked="..." />When a button uses size="icon" or size="icon-sm" (no visible label) and performs an action (edit, delete, skip, etc.), always wrap it with DesktopOnlyTooltip (@/components/lib/ui/tooltip) so the user can see what it does on hover. Use the content prop for the label. Do not use the native HTML title attribute — it has a long delay and inconsistent styling.
<DesktopOnlyTooltip content="Delete">
<UiButton variant="soft-destructive" size="icon" @click="handleDelete">
<Trash2Icon class="size-4" />
</UiButton>
</DesktopOnlyTooltip>DesktopOnlyTooltip automatically skips rendering the tooltip on touch devices (no hover capability), so no extra mobile handling is needed.
When the tooltipped button is the slot trigger for ResponsiveDialog / ResponsiveAlertDialog, nesting DialogTrigger > DesktopOnlyTooltip > Button silently breaks the click (reka-ui as-child can't merge through the tooltip's fragment root). Order: tooltip outside, <span class="inline-flex"> wrapper, dialog inside.
<DesktopOnlyTooltip content="Delete">
<span class="inline-flex">
<DeleteFooDialog :foo-id="id">
<UiButton size="icon" variant="ghost-destructive" aria-label="Delete">
<Trash2Icon class="size-4" />
</UiButton>
</DeleteFooDialog>
</span>
</DesktopOnlyTooltip>Not needed for plain Button @click with v-model:open — only slot-triggered dialogs.
Default to ResponsiveDialog for every new dialog. Unless the user explicitly asks for a different primitive (raw Dialog, Drawer, Popover, etc.), any new modal/sheet/picker UI must use one of the responsive wrappers. They auto-adapt to Drawer on mobile and Dialog / AlertDialog on desktop, so they work in both contexts without extra wiring.
ResponsiveDialog (@/components/common/responsive-dialog.vue) for general-purpose modals (forms, detail views, pickers)ResponsiveAlertDialog (@/components/common/responsive-alert-dialog.vue) for confirmations and destructive actionsDialog, AlertDialog, or Drawer primitives directly for user-facing modals unless the user explicitly approves it for that case#title slot (visible or via VisuallyHidden) so Radix has an accessible name — a missing DialogTitle triggers an a11y warningWhen a page or section has no data, display an empty state with the following layout: icon + title + description + action (if applicable). Look at existing empty states in the codebase for reference before creating new ones.
Use skeleton placeholders to represent loading content. Skeletons should approximate the shape/layout of the real content to prevent layout shift.
All critical actions that delete data must follow this pattern:
ResponsiveAlertDialog to confirm the user's intentiondestructive variant<ResponsiveAlertDialog
v-model:open="isDeleteOpen"
confirm-label="Delete"
confirm-variant="destructive"
@confirm="handleDelete"
>
<template #title>Delete item?</template>
<template #description>This action cannot be undone.</template>
</ResponsiveAlertDialog>Always use constants from VUE_QUERY_CACHE_KEYS or VUE_QUERY_GLOBAL_PREFIXES in @/common/const/vue-query.ts. Never hardcode query key strings.
After every create / update / delete operation:
useMutation({
mutationFn: deleteItem,
onMutate: async ({ id }) => {
await queryClient.cancelQueries({ queryKey: VUE_QUERY_CACHE_KEYS.itemsList });
const previous = queryClient.getQueryData(VUE_QUERY_CACHE_KEYS.itemsList);
queryClient.setQueryData(VUE_QUERY_CACHE_KEYS.itemsList, (old) => old?.filter((item) => item.id !== id));
return { previous };
},
onError: (_err, _vars, context) => {
if (context?.previous) {
queryClient.setQueryData(VUE_QUERY_CACHE_KEYS.itemsList, context.previous);
}
},
onSettled: () => {
queryClient.invalidateQueries({ queryKey: VUE_QUERY_CACHE_KEYS.itemsList });
},
});Disable submit buttons and show loading indicators while mutations are in progress:
<Button :disabled="mutation.isPending.value" :loading="mutation.isPending.value">
Save
</Button>$t vs t$t() — it's globally available and requires no import.t() function inside <script setup> when you need translations in computed properties, composables, or other JS/TS logic that runs outside the template.Do not break a sentence into multiple $t() calls when there are inline elements or components in the middle. Translations must represent complete sentences/phrases — splitting them makes proper translation impossible.
<!-- WRONG — splits sentence around a link -->
<p>{{ $t('Please read the') }} <a href="/terms">{{ $t('terms') }}</a> {{ $t('before continuing.') }}</p>
<!-- CORRECT — use <i18n-t> with slots -->
<i18n-t keypath="pleaseReadTerms" tag="p">
<template #link>
<a href="/terms">{{ $t('terms') }}</a>
</template>
</i18n-t>The corresponding translation key uses {link} as a placeholder:
{
"pleaseReadTerms": "Please read the {link} before continuing.",
"terms": "terms"
}<i18n-t> componentUse the <i18n-t> component (from vue-i18n) whenever a translated string contains inline elements or components (links, bold text, icons, etc.). It interpolates Vue slots into translation placeholders, keeping the full sentence in a single translation key.
© letehaha, 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
Just SKILL.md in .claude/skills/frontend-rules of letehaha/moneymatter.
Open the folder on GitHubat commit de5319f
Frontend Rules 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 |
|---|---|---|---|---|---|---|
| Frontend Rules this skillletehaha/moneymatter | 160 | — | ~3.8k | Automated safety check: Pass | AGPL-3.0 | |
| UI StylingOhh-889/skyroc | 795 | 13 repos | ~2.5k | Automated safety check: Pass | MIT | |
| Frontend Design Routercode-yeongyu/oh-my-openagent | 70k | — | ~5.3k | Automated safety check: Pass | Custom licence | |
| Local Testinglobehub/lobe-ui | 2.2k | — | ~2.1k | Automated safety check: Pass | MIT | |
| Refero Designreferodesign/refero_skill | 295 | — | ~5.3k | Automated safety check: Pass | MIT | |
| Muiblencorp/claude-code-kit | 106 | 2 repos | ~2.4k | Automated safety check: Pass | MIT |
Ohh-889/skyroc
Create beautiful, accessible user interfaces with shadcn/ui components (built on Radix UI + Tailwind), Tailwind CSS utility-first styling, and canvas-based visual designs.
code-yeongyu/oh-my-openagent
Routes frontend and UI work through design reference rulesets, with a design-system gate plus layout and print guidance, before any UI code is written.
lobehub/lobe-ui
Local browser verification for the lobe-ui component library and documentation site.
referodesign/refero_skill
Primary/default skill for UI design, product design, web design, landing pages, dashboards, product screens, redesigns, visual polish, frontend/CSS styling, design systems, components, responsive…
blencorp/claude-code-kit
Material-UI v7 component library patterns including sx prop styling, theme integration, responsive design, and MUI-specific hooks.
skydashnet/material-design-3-ui-skill
Guides designing, reviewing or implementing interfaces that follow Google's Material Design 3 system: semantic tokens, component states, adaptive layout and accessibility.
letehaha/moneymatter
Deep-dive specification planner. An agent skill from letehaha/moneymatter.
letehaha/moneymatter
Add a new tool to the MoneyMatter MCP server. An agent skill from letehaha/moneymatter.
letehaha/moneymatter
Hunt "AI slop" in this codebase — duplication, reinvented wheels, over-engineering, defensive cruft, dead code, comment slop, performance antipatterns.
letehaha/moneymatter
Occasional i18n catch-up: strip unused en keys, then fill any uk translations that slipped through via i18n-editor subagents.
letehaha/moneymatter
Creates backend e2e tests for new or existing endpoints. An agent skill from letehaha/moneymatter.
letehaha/moneymatter
Smart PRD generator. An agent skill from letehaha/moneymatter.
Categories
Frontend conventions and component usage rules. An agent skill from letehaha/moneymatter. Frontend Rules is an agent skill from letehaha/moneymatter. Frontend conventions and component usage rules.
Frontend Rules fits situations like: /frontend-rules; starting frontend work.
Run `npx skills add letehaha/moneymatter --skill frontend-rules -a claude-code`. Or copy the skill folder (.claude/skills/frontend-rules in letehaha/moneymatter) into .claude/skills/frontend-rules in your project. Claude Code loads it when a task matches its description.
Run `npx skills add letehaha/moneymatter --skill frontend-rules -a codex`. Or copy the skill folder (.claude/skills/frontend-rules in letehaha/moneymatter) into .agents/skills/frontend-rules 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 letehaha/moneymatter --skill frontend-rules -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/frontend-rules, .gemini/skills/frontend-rules, .github/skills/frontend-rules and .opencode/skills/frontend-rules in your project.
SKILL.md names no scripts, command-line tools or credentials: Frontend Rules is instructions for the agent only. Its frontmatter pre-approves these tools: Read, Grep, Glob.
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.
Frontend Rules 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 3.8k tokens (SKILL.md is roughly 15k 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 Frontend Rules: UI Styling (Ohh-889/skyroc, 795 stars), Frontend Design Router (code-yeongyu/oh-my-openagent, 70k stars), Local Testing (lobehub/lobe-ui, 2.2k stars) and Refero Design (referodesign/refero_skill, 295 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
letehaha (a GitHub user) maintains it in letehaha/moneymatter, which has 160 GitHub stars. The repository holds 10 skills in this directory. The repository was last updated on October 7, 2026.
Source: letehaha/moneymatter on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.