App Builder
Undertone0809/rudder
Create and iteratively improve local web products from natural-language requests, then prepare them to run as Rudder Apps.
A skill your agent uses when building or reviewing a Vue 3 + Nuxt 4 app — <script setup reactivity, SSR/SSG/hybrid routeRules, the app/+server/ layout, SSR-safe fetching (useFetch/useAsyncData) and…
$ npx skills add ericrisco/rsc-harness --skill vue-nuxt -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ericrisco/rsc-harness vue-nuxt --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/ericrisco/rsc-harness.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/vue-nuxt .claude/skills/vue-nuxt && 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 "vue-nuxt" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/vue-nuxt into .claude/skills/vue-nuxt/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "vue-nuxt", 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/ericrisco/rsc-harness/tree/main/skills/vue-nuxtType 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 ericrisco/rsc-harness --skill vue-nuxt -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ericrisco/rsc-harness vue-nuxt --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/vue-nuxt .agents/skills/vue-nuxt && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "vue-nuxt" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/vue-nuxt into .agents/skills/vue-nuxt/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "vue-nuxt", 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 ericrisco/rsc-harness --skill vue-nuxt -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ericrisco/rsc-harness vue-nuxt --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/vue-nuxt .cursor/skills/vue-nuxt && 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 "vue-nuxt" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/vue-nuxt into .cursor/skills/vue-nuxt/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "vue-nuxt", 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/ericrisco/rsc-harness.git --path skills/vue-nuxt--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 ericrisco/rsc-harness --skill vue-nuxt -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ericrisco/rsc-harness vue-nuxt --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/vue-nuxt .gemini/skills/vue-nuxt && 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 "vue-nuxt" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/vue-nuxt into .gemini/skills/vue-nuxt/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "vue-nuxt", 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 ericrisco/rsc-harness vue-nuxtInstalls 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 ericrisco/rsc-harness --skill vue-nuxt -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/vue-nuxt .github/skills/vue-nuxt && 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 "vue-nuxt" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/vue-nuxt into .github/skills/vue-nuxt/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "vue-nuxt", 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 ericrisco/rsc-harness --skill vue-nuxt -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ericrisco/rsc-harness vue-nuxt --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/vue-nuxt .opencode/skills/vue-nuxt && 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 "vue-nuxt" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/vue-nuxt into .opencode/skills/vue-nuxt/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "vue-nuxt", 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.
vue-nuxtA skill your agent uses when building or reviewing a Vue 3 + Nuxt 4 app — <script setup reactivity, SSR/SSG/hybrid routeRules, the app/+server/ layout, SSR-safe fetching (useFetch/useAsyncData) and…
Vue Nuxt is an agent skill from ericrisco/rsc-harness. Use when building or reviewing a Vue 3 + Nuxt 4 app — <script setup reactivity, SSR/SSG/hybrid routeRules, the app/+server/ layout, SSR-safe fetching (useFetch/useAsyncData) and state (useState/Pinia), Nitro routes, hydration mismatches, Nuxt 3→4 migration. NOT React/RSC (that is nextjs), NOT a static islands site (that is astro).
Its SKILL.md is about 4.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 10 other files, including scripts and reference files (for example `evals/README.md`, `evals/cases.yaml` and `references/data-and-state.md`).
It sits in Frontend & Design, covering Static sites and blogs. It works with Nuxt, Vue.js, Next.js and React. The repository describes itself as: Your agent invents things because it has no memory, and can't touch your database because it has no arms. rsc is the meta-harness that gives it both, plus the trade to know the… The licence is MIT.
Read from SKILL.md and the folder at commit e3d5b33. 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.
Ships 1 file in scripts/ (Shell), which the agent can run.
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.
Vue Nuxt loads about 4.2k tokens when it runs, and up to ~8.9k if it reads all its reference files. Until then it costs about 89 tokens; SKILL.md has 1,462 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); the scripts in this folder are not scanned.
The full file from ericrisco/rsc-harness at commit e3d5b33, republished under its MIT licence (© ericrisco). 1,462 words, ~4,167 tokens.
.claude/skills/vue-nuxt/SKILL.md (or your agent's skills folder). This skill also uses 7 other files; get the full folder from GitHub.Build and review Vue 3 (<script setup> + Composition API) on the Nuxt 4 meta-framework:
SSR/SSG/hybrid rendering, the app/ + server/ layout, SSR-safe fetching and state, Nitro
server routes, and the reactivity discipline that keeps hydration correct. Nuxt's render model
is whole-component render-then-hydrate — there is no React-style "server component" boundary,
so never import RSC mental models here.
Not this skill: React / Next App Router / server actions → nextjs or
react. Content-first site mixing frameworks/islands →
astro; fine-grained signals → solid-js;
compiler-first no-VDOM peer → svelte; angular.
Backend not in Nitro/JS → fastapi, go,
laravel. Test strategy beyond the Vitest + @vue/test-utils +
@nuxt/test-utils setup named here → e2e-testing /
testing-web. Generic security review →
secure-coding; SEO/content strategy →
marketing; component visual language → design.
Never prescribe useFetch/useState/auto-imports in a project that does not have them. Detect
before you write a line.
| Signal in the repo | Verdict | What is available |
|---|---|---|
nuxt.config.{ts,js,mjs} + app/ dir holding pages/,components/ | Nuxt 4 (current) | full auto-imports, useFetch/useState, server/, routeRules |
nuxt.config.* + root pages/,components/ (no app/) | Nuxt 3 layout | same APIs; flag the migration (see references/migration-nuxt4.md) |
vite.config.* + createApp(...).mount(...), no nuxt.config | plain Vue 3 SPA | Vue reactivity only — NO useFetch/useState/Nitro/auto-imports |
Rule: in a plain-Vue SPA, fetch with the browser fetch/a client library inside onMounted or a
composable, manage shared state with reactive/provide/Pinia — useFetch/useState do not
exist there. Confirm nuxt is in package.json before reaching for any Nuxt API.
Use <script setup lang="ts"> for every SFC. Prefer ref over reactive — ref survives
destructuring through .value, works for primitives, and reads uniformly. Reach for reactive
only for a grouped object you never destructure.
<script setup lang="ts">
import { ref, computed, watch, onWatcherCleanup } from 'vue'
const count = ref(0)
const doubled = computed(() => count.value * 2) // cached, recomputes on dep change
watch(count, async (next, _prev, onCleanup) => { // explicit dep, gets old value
const ctrl = new AbortController()
onCleanup(() => ctrl.abort()) // or onWatcherCleanup(...) (3.5)
await fetch(`/api/log?n=${next}`, { signal: ctrl.signal })
})
</script>watch vs watchEffect: use watch when you need the previous value or an explicit dependency;
use watchEffect for "run now and re-run when anything I touched changes". Register teardown with
onWatcherCleanup() (Vue 3.5) or the onCleanup arg to cancel stale async work — why: a watcher
that fires faster than its async settles will otherwise apply an out-of-order result.
Reactive props destructure is stable in Vue 3.5 — the compiler rewrites count to
props.count, so the binding stays reactive and you get clean default syntax:
<script setup lang="ts">
const { count = 0, label } = defineProps<{ count?: number; label: string }>()
// `count`/`label` here ARE reactive — compiler maps them back to props.x
</script>Two-way binding uses defineModel() (stable since 3.4), replacing the manual
props+emit('update:x') pair. Template DOM refs use useTemplateRef('name') (3.5), not a
manually-named ref.
<script setup lang="ts">
import { useTemplateRef } from 'vue'
const model = defineModel<string>() // parent: <Comp v-model="x" />
const input = useTemplateRef('inputEl') // <input ref="inputEl">
</script>reactive()<script setup lang="ts">
import { reactive, toRefs } from 'vue'
const state = reactive({ name: 'a', age: 1 })
// Bad — `name` is a detached plain string; mutating state.name won't update it.
const { name } = state
// Good — keep the proxy, or toRefs to preserve reactivity per key.
const { name: nameRef } = toRefs(state) // nameRef.value stays linked
// or just read state.name where you need it.
</script>Deep reactivity, effect scope, advanced provide/inject, and render-function/JSX notes live in
references/reactivity.md.
Type defineProps/defineEmits with generics, not the runtime object form — you get
compile-time checking for free:
<script setup lang="ts">
const props = defineProps<{ id: string; tags?: string[] }>()
const emit = defineEmits<{ select: [id: string]; close: [] }>()
defineExpose({ focus }) // only what a parent template-ref may call
</script>Extract reusable logic into composables/useX.ts returning refs — a composable, never a mixin
(why: mixins merge invisibly and collide on names; composables are explicit and tree-shakeable).
No side effects at module scope (that runs once per server process and leaks across requests — see
state below). Use typed provide/inject with an InjectionKey for dependency injection down a
tree instead of prop-drilling.
This is where most Nuxt bugs live. Pick deliberately:
| API | Use it for | SSR behavior |
|---|---|---|
useFetch(url, opts) | the common case — fetch a URL in a page/component | fetches once on server, transfers payload to client, no refetch on hydration |
useAsyncData(key, fn) | wrap custom logic / multiple $fetch calls / a non-URL source | same once-then-transfer; you control the fn |
$fetch(url) | inside event handlers, server routes, or after mount | a plain request; NOT for top-level setup data |
$fetch in setup double-fetches on SSR<script setup lang="ts">
// Bad — runs on the server render AND again during client hydration (2× the API hit,
// possible mismatch). $fetch does not transfer a payload.
const product = await $fetch(`/api/products/${id}`)
// Good — one server fetch, payload serialized into the page, reused on hydration.
const { data: product, status, error, refresh } = await useAsyncData(
`product:${id}`, // stable key → dedupe + shared ref across components
() => $fetch(`/api/products/${id}`),
)
// equivalently for a plain URL: useFetch(`/api/products/${id}`, { key: `product:${id}` })
</script>Key options: key (shared/deduped result — same key returns the same data/error/status ref,
auto-cleaned on last unmount), lazy: true (don't block navigation), server: false (client-only
fetch), transform (reshape before storing), pick (keep only listed fields — shrinks payload),
watch/reactive keys (a ref/computed/getter key refetches when it changes). Type the result
with useFetch<T>() / useAsyncData<T>(). In Nuxt 4 the returned data is a shallowRef —
replace the whole value, don't deep-mutate, to trigger updates. Nuxt 4.2 adds AbortController
signal support for request cancellation. Re-run with the returned refresh(), or invalidate
broadly with refreshNuxtData(key).
Full option matrix, custom $api factory, optimistic UI, and error/pending patterns are in
references/data-and-state.md.
On the server one Node process serves many requests. A module-level ref is created once and
shared by every visitor — a textbook cross-request data leak.
| Approach | Per-request? | When |
|---|---|---|
module-level ref/reactive | NO — leaks across requests | never for request data; fine only for true constants |
useState(key, init) | yes — serialized after SSR, restored on hydration, shared by key | lightweight shared value |
Pinia store (@pinia/nuxt) | yes — hydrated from Nuxt payload | structured state, actions, multiple consumers |
ref → useState// Bad — module scope: one instance for the whole server, shared between users.
import { ref } from 'vue'
export const user = ref(null)
// Good — per-request, hydration-safe, shared by key.
export const useUser = () => useState('user', () => null)Pinia 3 (dropped Vue 2) with @pinia/nuxt auto-imports stores from app/stores/. Use the
setup-store form; SSR state hydrates from the payload automatically:
// app/stores/cart.ts
export const useCartStore = defineStore('cart', () => {
const items = ref<Item[]>([])
const count = computed(() => items.value.length)
function add(i: Item) { items.value.push(i) }
return { items, count, add }
})A mismatch means the server-rendered HTML differs from the client's first render. Common causes:
Date.now()/new Date()/Math.random() in render, reading localStorage/window/document in
setup, locale/timezone differences, invalid HTML nesting (<p> wrapping a <div>), and
non-deterministic iteration order.
Fix kit: wrap genuinely client-only UI in <ClientOnly>; branch with import.meta.client /
import.meta.server; do browser work in onMounted (never in setup body); and pin a
server-generated value with useState so the client reuses the exact same value instead of
recomputing it.
<template>
<ClientOnly><LiveClock /></ClientOnly>
</template>
<script setup lang="ts">
const seed = useState('seed', () => Math.random()) // generated once on server, reused on client
onMounted(() => { /* safe: window/localStorage here */ })
</script>Files in server/api/* and server/routes/* run on Nitro (Nuxt's server engine). Name by method
with .get.ts/.post.ts. Validate input; throw createError for HTTP errors.
// server/api/products/[id].get.ts
export default defineEventHandler(async (event) => {
const id = getRouterParam(event, 'id')
const { fields } = getQuery(event)
if (!id) throw createError({ statusCode: 400, statusMessage: 'id required' })
const config = useRuntimeConfig() // private keys server-only
const data = await fetchFromDb(id, config.dbUrl)
if (!data) throw createError({ statusCode: 404, statusMessage: 'Not found' })
return data
})useRuntimeConfig() exposes top-level keys only on the server; only config.public.* reaches
the browser bundle. Rule: a secret in runtimeConfig.public (or any NUXT_PUBLIC_* env) ships to
every client — keep API keys, DB URLs, and tokens at the top level, never under public. Type
calls to your own API with $fetch<ProductDto>('/api/...'). Handlers, route-rule recipes,
middleware, and defineCachedEventHandler caching live in
references/nitro-and-rendering.md.
Set per-route rendering in nuxt.config.ts with routeRules; the right mix is usually hybrid,
not all-SSR.
export default defineNuxtConfig({
routeRules: {
'/': { prerender: true }, // SSG at build
'/blog/**': { swr: 3600 }, // stale-while-revalidate cache 1h
'/products/**': { isr: true }, // incremental static regeneration
'/admin/**': { ssr: false }, // client-only SPA island
'/old': { redirect: '/new' },
'/api/**': { headers: { 'cache-control': 's-maxage=60' } },
},
})nuxt build produces an SSR server; nuxt generate prerenders a fully static site. The Nitro
preset chooses the deploy target (node-server, vercel, netlify, cloudflare-pages, …) — pick the
preset here, then hand platform specifics to deployment,
vercel, netlify, or
cloudflare.
shallowRef/shallowReactive for large payloads/lists — skip deep proxy cost; replace the whole
value to update. Why: deep reactivity on a 10k-row array is pure overhead.v-memo to freeze a subtree on stable deps; v-once for render-once static content.defineAsyncComponent and Nuxt's auto Lazy<Component> prefix to code-split below the fold.<NuxtImg> / @nuxt/image for responsive, optimized images (a top LCP lever).pick/transform on useFetch/useAsyncData.<script setup vapor>) is
a 2026 preview targeting mid-2026 stable — treat as opt-in, not the default.| Smell | Why it is wrong | Do instead |
|---|---|---|
await $fetch() for page data in setup | runs on server AND client → double API hit, mismatch | useAsyncData(key, () => $fetch(...)) / useFetch |
Module-level ref/reactive for shared state | one instance per server process → leaks across requests | useState(key, init) or a Pinia store |
window/localStorage/document in setup body | undefined on server → hydration mismatch | onMounted, import.meta.client, or <ClientOnly> |
| Treating Nuxt like Next RSC ("use server", server components) | Vue has no RSC boundary; whole component renders + hydrates | model it as SSR + client hydration |
Destructuring a reactive() object | detaches the value from the proxy → loses reactivity | toRefs(), or read state.x, or prefer ref |
Secret in runtimeConfig.public / NUXT_PUBLIC_* | shipped into the client bundle | top-level runtimeConfig, server-only |
useFetch/useState in a plain-Vue (non-Nuxt) app | those auto-imports don't exist there | client fetch in onMounted + Pinia/provide |
<ClientOnly> wrapping everything to "fix" mismatches | kills SSR, hurts SEO/LCP, hides the real bug | find the non-deterministic source; pin with useState |
Same fetch in two components without a shared key | duplicate requests, divergent refs | one stable key → shared deduped result |
ref(hugeArray) / deep reactive on big lists | per-element proxy overhead | shallowRef/shallowReactive, replace whole value |
scripts/verify.sh runs from the project root. With a nuxt.config.{ts,js,mjs} it runs nuxi typecheck (fallback vue-tsc --noEmit), the package lint script if present, vitest run if
Vitest is present, then nuxi build; with no Nuxt config, vue-tsc --noEmit, lint, vitest, then
vite build. Keep strict: true in tsconfig so the typecheck is worth running. Every missing tool
is a yellow SKIP, never a failure; everything is read-only except the final build, which writes
.nuxt//.output/ (or dist/). No installs, no network mutations, safe to re-run, exits 0 on a
clean/empty target.
In a project with a 02-DOCS/ layer (the harness Karpathy wiki), read
02-DOCS/wiki/stack/vue-nuxt.md first and stay consistent with it. If it is missing or stale,
create/update it with this app's real choices — rendering mode per route (routeRules), the
useFetch/useAsyncData conventions, useState vs Pinia, the Nitro preset/deploy target, the
design-system hookup — bump its Updated date, and link it from a ## Knowledge map section in
the root CLAUDE.md (creating that section, and CLAUDE.md itself, if absent). No 02-DOCS/
layer? Skip silently. Technical conventions are recorded, not gated — never block the task.
Nuxt 3 → 4 deltas (app/ move, compatibilityVersion, shared-key data, shallowRef payload,
renamed APIs) and Vue 3.4 → 3.5 changes are in
references/migration-nuxt4.md.
© ericrisco, MIT. 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 (scripts, references) in skills/vue-nuxt of ericrisco/rsc-harness.
Open the folder on GitHubat commit e3d5b33
Vue Nuxt 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 |
|---|---|---|---|---|---|---|
| Vue Nuxt this skillericrisco/rsc-harness | 167 | — | ~4.2k | Automated safety check: Pass | MIT | |
| App BuilderUndertone0809/rudder | 292 | — | ~2k | Automated safety check: Pass | Apache-2.0 | |
| Sanity Best Practicesrobotostudio/turbo-start-sanity | 182 | — | ~940 | Automated safety check: Pass | MIT | |
| Launch With AWSaws/agent-toolkit-for-aws | 2.8k | — | ~3.2k | Automated safety check: Pass | Apache-2.0 | |
| Cloudbase Sites RuntimeTencentCloudBase/CloudBase-AI-Toolkit | 1.1k | — | ~5k | Automated safety check: Notes | MIT | |
| Docs LookupProgrammerAnthony/Expert-Coding-Harness | 235 | — | ~640 | Automated safety check: Pass | MIT |
Undertone0809/rudder
Create and iteratively improve local web products from natural-language requests, then prepare them to run as Rudder Apps.
robotostudio/turbo-start-sanity
Sanity development best practices for schema design, GROQ queries, TypeGen, Visual Editing, images, Portable Text, Studio structure, localization, migrations, Sanity Functions, Blueprints, and…
aws/agent-toolkit-for-aws
Migrates vibe-coded web applications to AWS. An agent skill from aws/agent-toolkit-for-aws.
TencentCloudBase/CloudBase-AI-Toolkit
A skill your agent uses when the user wants to develop, run, preview, save, deploy, or roll back a CloudBase Web app in this conversation as a Lovable/Codex-Sites-like vibe- coding session — i.e.
ProgrammerAnthony/Expert-Coding-Harness
通过 Context7 MCP 获取库和框架的实时最新文档,而非依赖训练数据,防止 API 幻觉。适用于查询任何库或框架的用法、配置、示例代码。触发词:怎么用、怎么配置、API参考、文档、示例代码、用法、接口、库文档、框架文档、documentation、docs、how to use、API…
secondsky/claude-skills
Framework integration for Cloudflare Workers. An agent skill from secondsky/claude-skills.
ericrisco/rsc-harness
A skill your agent uses when designing or analyzing a controlled experiment — falsifiable hypothesis, sample size from an MDE, reading significance/CI/power, CUPED, or rescuing tests that won't go…
ericrisco/rsc-harness
A skill your agent uses when making a web UI conform to WCAG 2.2 Level AA — axe-core or Lighthouse a11y violations, keyboard operability, focus management, ARIA roles/names/live regions, contrast…
ericrisco/rsc-harness
A skill your agent uses when running or fixing paid acquisition on Google or Meta — campaign structure (Performance Max, Demand Gen, Search, Advantage+), platform-fit creative, budget/scaling rules…
ericrisco/rsc-harness
A skill your agent uses when measuring whether an LLM or agent system actually got better and gating merges on it: golden sets, fixing an inflated LLM-as-judge, scoring RAG (faithfulness, contextual…
ericrisco/rsc-harness
A skill your agent uses when a creative goal must become a finished media file: pick and order generative-media models per modality — AI voiceover, image-to-video clips, score — then glue them with…
ericrisco/rsc-harness
A skill your agent uses when instrumenting product or web analytics — GA4/PostHog SDK wiring, event taxonomy, funnels, double-counted events, consent gating, PII scrubbing.
A skill your agent uses when building or reviewing a Vue 3 + Nuxt 4 app — <script setup reactivity, SSR/SSG/hybrid routeRules, the app/+server/ layout, SSR-safe fetching (useFetch/useAsyncData) and…. Vue Nuxt is an agent skill from ericrisco/rsc-harness. Use when building or reviewing a Vue 3 + Nuxt 4 app — <script setup reactivity, SSR/SSG/hybrid routeRules, the app/+server/ layout, SSR-safe fetching (useFetch/useAsyncData) and state (useState/Pinia), Nitro routes, hydration mismatches, Nuxt 3→4 migration.
Vue Nuxt fits situations like: reviewing a Vue 3 + Nuxt 4 app — <script setup reactivity; SSR/SSG/hybrid routeRules; the app/+server/ layout; SSR-safe fetching (useFetch/useAsyncData) and state (useState/Pinia).
Run `npx skills add ericrisco/rsc-harness --skill vue-nuxt -a claude-code`. Or copy the skill folder (skills/vue-nuxt in ericrisco/rsc-harness) into .claude/skills/vue-nuxt in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ericrisco/rsc-harness --skill vue-nuxt -a codex`. Or copy the skill folder (skills/vue-nuxt in ericrisco/rsc-harness) into .agents/skills/vue-nuxt 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 ericrisco/rsc-harness --skill vue-nuxt -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/vue-nuxt, .gemini/skills/vue-nuxt, .github/skills/vue-nuxt and .opencode/skills/vue-nuxt in your project.
Going by SKILL.md and its folder, Vue Nuxt needs a shell for the scripts in its folder. Our summary lists: A Bash shell.
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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Vue Nuxt is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.2k tokens (SKILL.md is roughly 17k 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 4.8k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Vue Nuxt: App Builder (Undertone0809/rudder, 292 stars), Sanity Best Practices (robotostudio/turbo-start-sanity, 182 stars), Launch With AWS (aws/agent-toolkit-for-aws, 2.8k stars) and Cloudbase Sites Runtime (TencentCloudBase/CloudBase-AI-Toolkit, 1.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ericrisco (a GitHub user) maintains it in ericrisco/rsc-harness, which has 167 GitHub stars. The repository holds 227 skills in this directory. The repository was last updated on October 7, 2026.
Source: ericrisco/rsc-harness on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.