Nitro
Anthony FuCommunityCreated by Anthony Fu
- Skill
- Tool integration
- Software development
- MIT
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
Nitro is a server toolkit designed to build and deploy web servers that run on Node.js, Bun, Deno, and various cloud platforms like Cloudflare, Vercel, and Netlify. It provides a unified codebase for server development, featuring filesystem-based routing, a built-in KV storage layer, caching mechanisms, and support for tasks, WebSockets, and OpenAPI documentation. Nitro v3 introduces significant changes including a package rename, the removal of auto-imports, and a shift toward web-standard H3 v2 APIs.
What it does
- Provides filesystem-based routing with H3 v2 event handlers.
- Manages server configuration and runtime settings via nitro.config.ts.
- Handles caching and storage using an unstorage-based KV layer.
- Supports on-demand and scheduled tasks, WebSockets, and SSE.
- Generates OpenAPI specifications automatically from route metadata.
- Enables deployment to multiple runtimes and platforms through presets.
When to use it
- When building a web server that needs to be portable across different deployment environments.
- When you require a unified toolkit for handling routing, storage, and caching in a server project.
- When migrating existing server projects from Nitro v2 to v3.
- When you need to implement server-side tasks, WebSockets, or OpenAPI documentation.
Advantages
- Framework-agnostic design allows for use with or without other frameworks.
- Deployment-agnostic architecture supports a wide range of runtimes and cloud providers.
- Unified storage and caching layer simplifies data management.
- Declarative route rules for handling redirects, headers, and CORS.
- Built-in support for modern web standards via H3 v2.
Usage examples
- “How do I define a basic server route in Nitro v3?”
- You create a file in your server directory and export a handler using defineHandler from the nitro package.
- “How do I access KV storage in my Nitro server?”
- You use the useKV function imported from nitro/kv to interact with your configured storage mount points.
- “What is the correct way to import Nitro utilities in v3?”
- You must use explicit imports from specific subpaths like nitro, nitro/kv, or nitro/h3, as auto-imports are no longer supported.
- “How do I configure public assets in Nitro?”
- You define a publicAssets array in your nitro.config.ts file, specifying the directory and base URL for your assets.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/antfu/nitro/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip nitro.zip -d .agents/skills
Documentation by Anthony Fu
The skill is based on Nitro v3 (beta, 3.0.260903), generated at 2026-09-25.
Nitro is a framework-agnostic, deployment-agnostic server toolkit powered by H3 v2, unstorage, and Vite/Rolldown/Rollup. It powers Nuxt and works standalone. From one codebase it builds optimized output for Node.js, Bun, Deno, Cloudflare, Vercel, Netlify, and more.
Key capabilities:
Filesystem routing with H3 v2 event handlers, dynamic params, and method suffixes.
Route rules for declarative caching, headers, redirects, proxying, and CORS.
Caching layer (cached handlers/functions, SWR) on top of the unstorage KV layer.
Runtime config overridable via
NITRO_*env vars.Tasks (on-demand + scheduled/cron), WebSockets/SSE, a SQL database layer, and OpenAPI auto-docs.
Plugins & lifecycle hooks, custom renderer/server entry, and portable deployment presets.
Key v3 changes (vs.
nitropackv2): the package is renamednitropack→nitrowith H3 v2 (web-standardRequest/Response); auto-imports are removed (import everything explicitly); directory scanning is opt-in viaserverDir;useStorage→useKV(nitro/kv) and thestorageconfig option →kv; cacheswrnow defaults tofalse. If unsure about v2-vs-v3 APIs, read advanced-migration first.
Core
| Topic | Description | Reference |
|---|---|---|
| Routing | File-based routes, defineHandler, params, middleware, route rules, errors | core-routing |
| Configuration | nitro.config.ts, defineConfig, key options, runtime config | core-configuration |
| Storage | unstorage KV, mount points, drivers, dynamic mounts | core-storage |
| Cache | defineCachedHandler, defineCachedFunction, SWR, invalidation | core-cache |
| Assets | Public assets, compression, server assets via storage | core-assets |
| Rendering | Renderer (HTML/SSR), server entry, framework integration | core-rendering |
Features
| Topic | Description | Reference |
|---|---|---|
| Plugins & Hooks | definePlugin, runtime lifecycle hooks, error capture | features-plugins |
| Tasks | On-demand & scheduled (cron) tasks, runTask | features-tasks |
| WebSocket & SSE | defineWebSocketHandler, pub/sub, namespaces, event streams | features-websocket |
| Database | Built-in SQL layer via db0, useDatabase, connectors | features-database |
| OpenAPI | Auto spec from defineRouteMeta, Scalar/Swagger UIs | features-openapi |
Advanced / Deployment
| Topic | Description | Reference |
|---|---|---|
| Deployment Presets | Runtimes & providers, compatibility dates, platform integration | deploy-presets |
| v2 → v3 Migration | Package rename, nitro/* imports, H3 v2 API, preset changes | advanced-migration |
Files
- ATTRIBUTION.mdAdded by AutoGineer892 B
- GENERATION.md135 B
- LICENSELicence file added by AutoGineer1.1 KiB
- SKILL.md3.7 KiB
- references/advanced-migration.md6.8 KiB
- references/core-assets.md3.7 KiB
- references/core-cache.md7.9 KiB
- references/core-configuration.md5.7 KiB
- references/core-rendering.md5.0 KiB
- references/core-routing.md8.3 KiB
- references/core-storage.md4.4 KiB
- references/deploy-presets.md3.8 KiB
- references/features-database.md3.5 KiB
- references/features-openapi.md3.5 KiB
- references/features-plugins.md3.9 KiB
- references/features-tasks.md4.0 KiB
- references/features-websocket.md3.8 KiB
references/advanced-migration.md
name: migration description: Nitro v2 to v3 migration - package rename, subpath imports, H3 v2 API, and preset changes
Migration: Nitro v2 → v3
Nitro v3 has intentional breaking changes. This is the highest-value reference for agents whose training data assumes nitropack v2 / H3 v1 patterns.
Package & imports
The nitropack package is renamed to nitro.
- import { defineNitroConfig } from "nitropack/config"
+ import { defineConfig } from "nitro"Runtime utils moved to dedicated nitro/* subpaths:
| Capability | v3 import |
|---|---|
| Handlers, config, plugins, errors | nitro (defineHandler, defineConfig, definePlugin, defineErrorHandler, HTTPError, defineWebSocketHandler, defineRouteMeta, defineServerEntry, serverFetch) |
| KV storage | nitro/kv (useKV, formerly useStorage from nitro/storage) |
| Cache | nitro/cache (defineCachedHandler, defineCachedFunction) |
| Runtime config | nitro/runtime-config (useRuntimeConfig) |
| Database | nitro/database (useDatabase) |
| Tasks | nitro/task (defineTask, runTask) |
| App / hooks | nitro/app (useNitroApp, useNitroHooks, getRouteRules) |
| H3 utilities | nitro/h3 |
| Types | nitro/types |
| Vite plugin | nitro/vite |
Removed: nitropack/kit, nitropack/presets, nitropack/core (use nitro/builder). Use NitroModule from nitro/types instead of defineNitroModule.
Other renames:
defineNitroPlugin→definePlugindefineNitroConfig→defineConfigdefineNitroErrorHandler→defineErrorHandlerNode.js minimum is now 20.
App config (
app.config.ts+useAppConfig()) was removed — import a regular.tsmodule instead.
Auto-imports are removed
v2 auto-imported defineEventHandler, useStorage, useRuntimeConfig, defineCachedFunction, defineNitroPlugin, #imports, and your server/utils/. All gone in v3 — the imports option, #imports, and nitro-imports.d.ts no longer exist. Add explicit imports everywhere, including relative imports from your own utils/:
import { defineHandler, definePlugin, defineErrorHandler, HTTPError, serverFetch } from "nitro";
import { useKV } from "nitro/kv";
import { useRuntimeConfig } from "nitro/runtime-config";
import { defineCachedFunction, defineCachedHandler } from "nitro/cache";
import { useDatabase } from "nitro/database";
import { defineTask, runTask } from "nitro/task";
import { useNitroApp, useNitroHooks } from "nitro/app";
import { getQuery, getCookie } from "nitro/h3";Server directory scanning is opt-in
srcDir is deprecated for serverDir, which defaults to false — nothing (routes/, api/, middleware/, plugins/, tasks/) is scanned until you set it. Set serverDir: "./server" (or "." for the v2 root layout; true = "server").
Storage & cache config renames
useStorage→useKV(nitro/storage→nitro/kv).storageconfig option →kv;devStorage→kvinside$development(and$prerender).Cache:
swrnow defaults tofalse(wastrue); persist cache by mounting acachepoint underkv.
Internal server fetch
useNitroApp().localFetch → serverFetch from nitro (returns a web Response). There is also a fetch export routing absolute (/) paths to the server.
Route rule types
NitroRouteConfig/NitroRouteRules are deprecated for RouteRuleConfig/RouteRules (from nitro/types). redirect, proxy, cors, headers, cache, swr are now defined by h3-rules; isr, prerender, static remain Nitro-specific. There is no auth/basicAuth route rule.
H3 v2 API
H3 v2 is built on web standards (URL, Headers, Request, Response). All H3 utils import from nitro/h3.
Return / throw, don't send
- import { send, sendRedirect, sendStream } from "nitro/h3"
- send(event, value); sendStream(event, stream); sendRedirect(event, loc, code)
+ import { redirect } from "nitro/h3"
+ return value
+ return stream
+ return redirect(event, loc, code)Also: sendError → throw createError/HTTPError; sendNoContent → return noContent(event); sendProxy → return proxy(event, target).
Event shape
event.web → event.req (a web Request). event.node.{req,res} only exists on Node.
- const body = await readBody(event)
+ const body = await event.req.json() // or .text() / .formData(); event.req.body for the streamHeaders (always plain strings)
- getHeader(event, "x-foo"); setHeader(event, "x-foo", "bar"); getResponseStatus(event)
+ event.req.headers.get("x-foo")
+ event.res.headers.set("x-foo", "bar")
+ event.res.statusHandlers & errors
- import { eventHandler, defineEventHandler, createError } from "nitro/h3"
+ import { defineHandler, HTTPError } from "nitro"
+ throw new HTTPError({ status: 404, message: "Not found" })
+ HTTPError.isError(error)lazyEventHandler → defineLazyEventHandler; useBase → withBase. Node utils: defineNodeListener/toNodeListener/fromNodeMiddleware → defineNodeHandler/toNodeHandler/fromNodeHandler.
defineEventHandler/createErrorstill work in many places (re-exported), but prefer the v3 names:defineHandlerandHTTPError.
Cloudflare bindings
- const binding = event.context.cloudflare.env.MY_BINDING
+ const { env } = event.req.runtime.cloudflare
+ const binding = env.MY_BINDINGPreset renames
| v2 | v3 |
|---|---|
node | node_middleware (export is now middleware) |
cloudflare, cloudflare_worker, cloudflare_module_legacy | cloudflare_module |
deno-server-legacy / deno | deno_server (Deno v2) / deno_deploy |
netlify-builder | netlify or netlify_edge |
vercel-edge | vercel (Fluid compute) |
azure, azure_functions | azure_swa |
firebase | firebase_app_hosting |
iis | iis_handler |
edgio, cli, service_worker | removed/discontinued |
Hooks
If you accessed useNitroApp().hooks outside a plugin it may be undefined — use useNitroHooks() to guarantee an instance.
Key Points
Replace
nitropackwithnitroand split imports intonitro/*subpaths.Auto-imports are gone — import everything explicitly; set
serverDiror nothing is scanned.useStorage→useKV(nitro/kv),storage→kv,devStorage→$development.kv.Handlers return/throw; use
event.req.json()and webHeaders(nosend*/readBody/getHeader).Use
HTTPErrorinstead ofcreateError;definePlugin/defineHandler/defineConfig/defineErrorHandlerinstead of v2 names.Cloudflare bindings moved to
event.req.runtime.cloudflare.env.Many presets were renamed/removed — update
presetaccordingly.
<!-- Source references: - https://nitro.build/docs/migration - https://h3.dev -->
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Anthony Fu
- Publisher
- Anthony Fu (Community)
- Source
- antfu/skills · skills/nitro · commit f63e9ec
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE.md)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Anthony Fu.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download nitro.zip