Nuxt Ultra Init
Creates a new Nuxt 4 project with create nuxt and turns it into an opinionated full-stack app, or adds features to an existing Nuxt 4 project. The Create step scaffolds the project, the Baseline step normalises it, then each selected feature is applied from its reference file.
Start Command
The skill is installed once, globally, and run from the folder where the project should be created:
npx skills add Kiansa/nuxt-ultra -g
/nuxt-ultra-init
"Init Nuxt Ultra" triggers the same flow.
Interaction Contract
Always follow this sequence:
- Detect the mode. If the current directory has a
package.jsonwith anuxtdependency, this is an existing project: skip the Create step and theprojectNameandgitInitquestions. Otherwise this is a new project. - Ask the setup questions below. Do not create or edit files yet.
- Resolve dependencies (see Feature Dependencies) and summarize the final selection.
- New project only: run the Create step. Everything after this happens inside
<projectName>/. - Apply the Baseline steps, then the reference file for each selected feature, in the Apply Order.
- Write
nuxt.config.tsonce, merging every feature's additions. - Install packages with the chosen package manager.
- Verify (see Verification) and report all created/updated files and commands run.
Questions
Ask these in order. Skip a conditional question if its condition is not met.
General
projectName(new project only): directory and package name, kebab-case, e.g.my-apppackageManager:npm,pnpm,yarn,bungitInit(new project only): initialise a git repository, default yesrepoName: app name for titles (default:projectName, or thenameinpackage.jsonfor an existing project)devPort: default3000
Features (multi-select, each group is optional)
| Group | Options | Notes |
|---|---|---|
| UI | @nuxt/ui, shadcn/nuxt |
shadcn/nuxt not yet implemented |
| Linter | @nuxt/eslint, oxlint, prettier |
only @nuxt/eslint implemented |
| DB | @nuxtjs/supabase, nuxt-postgrest |
pick one |
| Auth | @nuxtjs/supabase, nuxt-auth-utils |
pick one |
| Dashboard | user, admin |
either or both |
| i18n | @nuxtjs/i18n |
|
| SEO | @nuxtjs/seo |
|
| Validation | zod |
others (yup, valibot, ...) not yet implemented |
| AI | openai, xai, gemini, claude |
multi-select |
| Storage | cloudflare-r2 |
|
| Deployment | cloudflare, node, vercel, other |
always ask |
Conditional
- If
@nuxtjs/i18n:i18nMode(filesorremote),defaultLocale,locales(list of codes, e.g.en, fa) - If
@nuxtjs/seo:siteUrl,siteName,siteDescription - If Auth is
nuxt-auth-utils:oauthProviders(multi-select fromgithub,google, or none) andemailProvider(resendornone;noneskips OTP confirmation and password reset) - If Auth is
@nuxtjs/supabase:oauthProviders(multi-select fromgithub,google, or none) - If Dashboard:
dashboardRoute(defaultdashboard, giving/dashboard; answer/for an app with no public home page where the dashboard is the root) - If Deployment is
cloudflare:cloudflareWorkerName
If an option is marked not implemented, tell the user and skip it.
Feature Dependencies
Resolve these before summarizing. Add the dependency automatically and tell the user why.
| Selected | Requires |
|---|---|
| Auth (either) | UI @nuxt/ui, Validation zod |
Auth @nuxtjs/supabase |
DB @nuxtjs/supabase |
Auth nuxt-auth-utils |
a DB (@nuxtjs/supabase or nuxt-postgrest) for the users table |
| Dashboard | UI @nuxt/ui, Auth (either) |
i18n remote mode |
a DB |
Storage cloudflare-r2 |
nothing (works on any host via S3 API) |
dashboardRoute = / |
Dashboard user (the dashboard replaces the public home page) |
Auth and Dashboard pages are written with plain English strings. When i18n is also selected, apply the i18n addendum section at the end of the auth reference after the main blocks.
Create (new project only)
Run with the chosen package manager, then cd <projectName>:
pnpm create nuxt@latest <projectName> --template minimal --packageManager pnpm --no-install
Translate for the other package managers (npm create nuxt@latest <projectName> -- --template minimal ..., yarn create nuxt, bun create nuxt) and pass the same --packageManager value. Add --gitInit when gitInit is yes. The flags are required: the agent's terminal is non-interactive and the CLI exits without --template. --no-install is deliberate; packages are installed once, after every feature is applied.
Baseline (always apply)
Apply baseline.md first. It sets the dev/build scripts with --dotenv, creates .env.example plus .env.local and .env.production, adds app/pages/, devServer.port, the placeholder logo, MCP config, and .npmrc for pnpm. Features append env keys to both env files.
Conventions the references rely on
- Route groups. Pages under
app/pages/(protected)/andapp/pages/(guest)/getto.meta.groups(['protected'],['guest']) from Nuxt; the folder name never appears in the URL. Auth middleware keys on these groups. Put every signed-in page under(protected). useAuth()is the provider-neutral composable (user,loggedIn,displayName,avatar,logout) that both auth references create and the dashboard uses.useDb(event)is the server-side admin database handle both DB variants expose for auth code.- Server routes stay thin:
readValidatedBody(event, schema.parse)with schemas fromshared/utils/, then a helper fromserver/utils/. - Icons are bundled from
@iconify-json/*packages, never fetched at runtime.
Execution References
Load only the reference files for the user's selections.
| Feature | Reference file |
|---|---|
@nuxt/ui |
feature-ui.md |
@nuxt/eslint |
feature-nuxt-eslint.md |
DB (@nuxtjs/supabase, nuxt-postgrest) |
feature-db.md |
Auth @nuxtjs/supabase |
feature-auth-supabase.md |
Auth nuxt-auth-utils |
feature-auth-nuxt-auth-utils.md |
| Dashboard | feature-dashboard.md |
@nuxtjs/i18n |
feature-i18n.md |
@nuxtjs/seo |
feature-seo.md |
| Validation | feature-validation.md |
| AI | feature-ai.md |
| Storage | feature-storage.md |
| Deployment | feature-deployment.md |
Each reference file lists path-scoped blocks. A block headed ### Path: <file> means create that file with the content, or patch it minimally if it already exists. A block headed ### Path: terminal command is a command to run with the chosen package manager (translate npm install / npm install -D accordingly).
Apply Order
UI → Linter → DB → Auth → Dashboard → i18n → SEO → Validation → AI → Storage → Deployment.
When multiple features add entries to nuxt.config.ts (modules, runtimeConfig, nitro, css, module config keys), collect them and write the file once. Keep modules in this order: @nuxt/ui, @nuxt/eslint, @nuxtjs/supabase, nuxt-auth-utils, @nuxtjs/i18n, @nuxtjs/seo. Local modules under modules/ are auto-registered by Nuxt and must not be listed.
Guardrails
- Preserve unrelated user changes.
- Keep runs idempotent: re-running with the same selection must not duplicate entries, scripts or env keys.
- Patch existing files minimally instead of overwriting them. The exception is
app/app.vueandapp/pages/index.vue, which the baseline and the UI feature own. - Never write secrets into files. Env values are placeholders the user fills in.
- Do not hardcode package versions in
package.json; let the package manager resolve the latest.
Verification
After installing packages:
- Run
npx nuxt prepare(or the package manager equivalent) so.nuxt/types exist. - Run
npm run typecheck. If@nuxt/eslintwas selected, also runnpm run lint. - Fix errors caused by this setup. Report anything left for the user (for example, env values they must fill in, or a database table they must create).