Atlas / Skills / nuxt / Nuxt UI

Nuxt UICAUTION

skills/nuxt/contributing

The Intuitive Vue UI Library powered by Reka UI & Tailwind CSS.

Verdict
CAUTION
Grade
D
Trust score
70 /100
Version
—
Hosts
7 documented
License
MIT
Stars
7,023
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[![npm version][npm-version-src]][npm-version-href] [![npm downloads][npm-downloads-src]][npm-downloads-href] [![License][license-src]][license-href] [![Nuxt][nuxt-src]][nuxt-href]

Nuxt UI is a library of accessible, typed Vue components built on Reka UI, Tailwind CSS and Tailwind Variants. It works as a module in Nuxt and as a Vite plugin in plain Vue apps.

[!NOTE] You are on the v4 branch. Check out the v3 branch for Nuxt UI v3 or the v2 branch for Nuxt UI v2.

Documentation

Visit https://ui.nuxt.com to explore the documentation.

Templates

Start your project from one of the Nuxt UI templates below, or browse them all on the templates page.

  • Starter: A minimal template to get started with Nuxt UI.
  • Landing: A landing page template powered by Nuxt Content.
  • Docs: A documentation template powered by Nuxt Content.
  • SaaS: A SaaS template with landing, pricing, docs and blog powered by Nuxt Content.
  • Dashboard: A dashboard template with multi-column layout.
  • Chat: An AI chatbot template with GitHub authentication and persistent chat history powered by Vercel AI SDK.
  • Portfolio: A portfoli
Read from source at commit 5c43bfa38bb1OBSERVED · 2026-10-20
Advertisement
02

Install

Commands as the repository documents them. They are shown, not run.

npm install @nuxt/ui tailwindcss
npm install @nuxt/ui tailwindcss @comark/nuxt @shikijs/langs @nuxthub/core drizzle-orm drizzle-kit @libsql/client ai @ai-sdk/vue zo
npm install @nuxt/ui tailwindcss
npm install @nuxt/ui tailwindcss
npm install @nuxt/ui tailwindcss
npm install @nuxt/ui tailwindcss
03

Host compatibility

What the documentation claims. We have not run a compatibility test.

HostStatusNotes
claude-codementioned
claude-desktopmentioned
codexmentioned
copilotmentioned
cursormentioned
gemini-climentioned
windsurfmentioned
04

What it tells the agent

The instruction file, verbatim from the audited commit — this is the text the model reads, and the surface the audit's instruction layer examines. Quoted here so you can judge it without cloning anything.

---
name: nuxt-ui
description: Build UIs with @nuxt/ui v4 — 125+ accessible Vue components with Tailwind CSS theming. Use when creating interfaces, customizing themes to match a brand, building forms, or composing layouts like dashboards, docs sites, and chat interfaces.
---

# Nuxt UI

Vue component library built on [Reka UI](https://reka-ui.com/) + [Tailwind CSS](https://tailwindcss.com/) + [Tailwind Variants](https://www.tailwind-variants.org/). Works with Nuxt, Vue (Vite), Laravel (Vite + Inertia), and AdonisJS (Vite + Inertia).

## MCP Server

For component API details (props, slots, events, full documentation, examples), use the [Nuxt UI MCP server](https://ui.nuxt.com/docs/getting-started/ai/mcp). If not already configured, add it:

**Cursor** — `.cursor/mcp.json`:

```json
{ "mcpServers": { "nuxt-ui": { "type": "http", "url": "https://ui.nuxt.com/mcp" } } }
```

**Claude Code**:

```bash
claude mcp add --transport http nuxt-ui https://ui.nuxt.com/mcp
```

Key MCP tools:
- `search-components` — find components by name, category, or intent (no params = list all)
- `search-composables` — find composables by name or description (no params = list all)
- `search-icons` — search Iconify icons (defaults to `lucide`), returns `i-{prefix}-{name}` names
- `get-component` — full component documentation with usage examples
- `get-component-metadata` — props, slots, events (lightweight, no docs content)
- `get-example` — real-world code examples

When you need to know **what a component accepts** or **how its API works**, use the MCP. This skill teaches you **when to use which component** and **how to build well**.

## Core rules (always apply)

1. **Always wrap the app in `UApp`** — required for toasts, tooltips, and programmatic overlays. Accepts a `locale` prop for i18n.
2. **Always use semantic colors** — `text-default`, `bg-elevated`, `border-muted`, etc. Never use raw Tailwind palette colors like `text-gray-500`.
3. **Read generated theme files for slot names** — Nuxt: `.nuxt/ui/<component>.ts`, Vue: `node_modules/.nuxt-ui/ui/<component>.ts`. These show every slot, variant, and default class for any component.
4. **Override priority** (highest wins): `ui` prop / `class` prop → global config → theme defaults.
5. **Icons use `i-{collection}-{name}` format** — `lucide` is the default collection. Use the MCP `search-icons` tool to find icons, or browse at [icones.js.org](https://icones.js.org).

## How to use this skill

Based on the task, load the relevant reference files **before writing any code**. Don't load everything — only what's needed.

### Reference files

**Guidelines** — design decisions and conventions:
- [design-system](references/guidelines/design-system.md) — semantic colors, theming, brand customization, variants, the `ui` prop
- [component-selection](references/guidelines/component-selection.md) — decision matrices: when to use Modal vs Slideover, Select vs SelectMenu, Toast vs Alert, etc.
- [conventions](references/guidelines/conventions.md) — coding patterns, slot naming, items arrays, composables, keyboard shortcuts
- [forms](references/guidelines/forms.md) — form validation, field layout, error handling, Standard Schema

**Layouts** — full page structure patterns:
- [landing](references/layouts/landing.md) — landing pages, blog, changelog, pricing
- [dashboard](references/layouts/dashboard.md) — admin UI with sidebar and panels
- [docs](references/layouts/docs.md) — documentation sites with navigation and TOC
- [chat](references/layouts/chat.md) — AI chat with Vercel AI SDK
- [editor](references/layouts/editor.md) — rich text editor with toolbars

**Recipes** — complete patterns for common tasks:
- [data-tables](references/recipes/data-tables.md) — tables with filters, pagination, sorting, selection
- [auth](references/recipes/auth.md) — login, signup, forgot password forms
- [overlays](references/recipes/overlays.md) — modals, slideovers, drawers, command palette
- [navigation](references/recipes/navigation.md) — headers, sidebars, breadcrumbs, tabs

**Quick reference:**
- [components](references/components.md) — categorized component index for finding the right component name

### Routing table

| Task | Load these references |
|---|---|
| Build a landing page | design-system, conventions, landing |
| Build a dashboard / admin UI | conventions, component-selection, dashboard |
| Add a settings page | conventions, forms |
| Create a login / signup form | conventions, forms, auth |
| Display data in a table | conventions, component-selection, data-tables |
| Customize theme / brand colors | design-system |
| Add a chat interface | conventions, chat |
| Add a modal, slideover, or drawer | conventions, component-selection, overlays |
| Build site navigation | conventions, component-selection, navigation |
| Build a documentation site | conventions, docs |
| Render markdown | component-selection, components, docs |
| Add a rich text editor | conventions, editor |
| General UI work | conventions, component-selection |

## Installation

### Nuxt

```bash
pnpm add @nuxt/ui tailwindcss
```

```ts
// nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@nuxt/ui'],
  css: ['~/assets/css/main.css']
})
```

```css
/* app/assets/css/main.css */
@import "tailwindcss";
@import "@nuxt/ui";
```

```vue
<!-- app.vue -->
<template>
  <UApp>
    <NuxtPage />
  </UApp>
</template>
```

### Vue (Vite)

```bash
pnpm add @nuxt/ui tailwindcss
```

```ts
// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'

export default defineConfig({
  plugins: [
    vue(),
    ui()
  ]
})
```

```ts
// src/main.ts
import './assets/css/main.css'
import { createApp } from 'vue'
import { createRouter, createWebHistory } from 'vue-router'
import ui from '@nuxt/ui/vue-plugin'
import App from './App.vue'

const app = createApp(App)
const router = createRouter({
  routes: [],
  history: createWebHistory()
})

app.use(router)
app.use(ui)
05

Trust audit

CAUTIONgrade D · trust 70/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (4 observation(s))
Network
declared (1 observation(s))
Shell
none-observed
Dependencies
not all pinned
Secrets in source
found

Findings (25)

MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
src/runtime/locale/fa_ir.ts:66
noData: 'دادهای موجود نیست',
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
src/runtime/locale/fa_ir.ts:67
noMatch: 'دادهای یافت نشد',
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
src/runtime/locale/fa_ir.ts:83
noMatch: 'دادهای یافت نشد',
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
src/runtime/locale/fa_ir.ts:126
noData: 'دادهای موجود نیست',
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
src/runtime/locale/fa_ir.ts:127
noMatch: 'دادهای یافت نشد',
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
docs/app/utils/theme/engine/types.ts:219
{ token: '--ui-text-highlighted', label: 'Highlighted', ramp: 'neutral', group: 'text', defaults: { light: 900, dark: 'white' } },
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
docs/app/utils/theme/engine/types.ts:223
{ token: '--ui-border-accented', label: 'Accented', ramp: 'neutral', group: 'border', defaults: { light: 300, dark: 700 } },
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
docs/app/utils/theme/engine/types.ts:224
{ token: '--ui-border-inverted', label: 'Inverted', ramp: 'neutral', group: 'border', defaults: { light: 900, dark: 'white' } }
LOWInventory / provenance · inv.hidden_file · CWE-1104
.nuxtrc
.nuxtrc
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.release-it.json
.release-it.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
docs/content/docs/1.getting-started/.navigation.yml
.navigation.yml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
docs/content/docs/1.getting-started/2.installation/.navigation.yml
.navigation.yml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
docs/content/docs/1.getting-started/6.integrations/.navigation.yml
.navigation.yml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
cli/commands/make/component.mjs:6
import { appendFile, appendThemeDefault, sortFile } from '../../utils.mjs'
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
cli/commands/make/component.mjs:7
import templates from '../../templates.mjs'
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
cli/commands/make/locale.mjs:4
import { appendFile, sortFile, normalizeLocale } from '../../utils.mjs'
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
cli/templates.mjs:173
import ${upperName} from '../../${content ? '../' : ''}src/runtime/components/${content ? 'content/' : ''}${upperName}.vue'
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
docs/app/components/chat/ChatMarkdown.client.ts:4
import { SHIKI_OPTIONS } from '../../utils/markdown'
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
docs/app/utils/theme/link.ts:58
bytes = Uint8Array.from(atob(value.replace(/-/g, '+').replace(/_/g, '/')), char => char.charCodeAt(0))
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
test/fixtures/consumer/full/package.json
@tanstack/vue-table, @tiptap/core, @tiptap/extension-bubble-menu, @tiptap/extension-code, @tiptap/extension-drag-handle, @tiptap/extension-drag-handle-vue-3, @tiptap/extension-floating-menu, @tiptap/e
Why it matters. 28 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
test/fixtures/consumer/minimal/package.json
nuxt, vue, typescript, vue-tsc
Why it matters. 4 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
CHANGELOG.md:279
* **Form:** add `method="post"` to prevent credential leaking via GET before hydration ([#6512](https://github.com/nuxt/ui/issues/6512)) ([7a0825a](https://github.com/nuxt/ui/commit/7a0825ad6a17627ce4
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/content/docs/4.typography/4.images-and-embeds.md:76
<iframe src="https://www.youtube-nocookie.com/embed/_eQxomah-nA?si=pDSzchUBDKb2NQu7" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyro
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/content/docs/4.typography/4.images-and-embeds.md:81
<iframe src="https://www.youtube-nocookie.com/embed/_eQxomah-nA?si=pDSzchUBDKb2NQu7" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyro
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/content/docs/4.typography/4.images-and-embeds.md:89
<iframe src="https://codesandbox.io/p/devbox/nuxt-ui-xgrzw5" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy=
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine

Gates applied: no_behavioural_pass.

Audited 2026-10-20 · audit v0.4.1 · source sha 5c43bfa38bb1full audit observations/trust-audit/skill/nuxt__contributing.json · Report an issue / request a re-scan
06

Audit history

Every audit this skill has had.

DateSourceVerdictGradeScoreChange
2026-10-205c43bfa38bb1CAUTIOND70first audit
07

Questions

What does the contributing — nuxt/ui skill do?

The Intuitive Vue UI Library powered by Reka UI & Tailwind CSS.

Is contributing — nuxt/ui safe to install?

With care. The audit graded it D (70/100) and found 25 things worth knowing before you trust this skill, listed below with the exact line each was found on.

What can contributing — nuxt/ui access on my machine?

The audit observed that it reaches the network and reads or writes files. Each of those is consistent with what it says it does. Secrets in the source: found — see the findings.

Which assistants does contributing — nuxt/ui work with?

Its documentation mentions claude-code, claude-desktop, codex, copilot, cursor, gemini-cli and windsurf. That is what the text claims, not a compatibility test we ran.

How current is this page?

The grade is for one exact copy of the source (5c43bfa38bb1), read on 2026-10-20. The repository is watched, and a new audit runs when it changes — this is the first audit.

Add this badge to your README

Shows this page's audit result and links back to it. It updates when the audit does.

ModelsAtlas audit badge

Markdown
[![ModelsAtlas audit: Nuxt UI](https://modelsatlas.com/skills/nuxt/contributing/badge.svg)](https://modelsatlas.com/skills/nuxt/contributing/)

Not your listing, or something out of date? Claim or update your listing.

Advertisement