Nitro is the server engine behind Nuxt, Analog, and SolidStart. But you can use it standalone to build APIs that deploy to 15+ platforms with zero config changes.
The Pitch
Write your server once. Deploy to:
- Node.js
- Cloudflare Workers
- Deno Deploy
- Vercel Edge
- Netlify Edge
- AWS Lambda
- Azure Functions
- Bun
- Static hosting
- ...and more
Same code. Different output. One command.
Getting Started
npx giget@latest nitro my-api
cd my-api && npm install && npm run dev
File-Based API Routes
// routes/hello.ts
export default defineEventHandler(() => {
return { message: "Hello from Nitro!" };
});
// GET /hello → { "message": "Hello from Nitro!" }
// routes/users/[id].ts
export default defineEventHandler((event) => {
const id = getRouterParam(event, "id");
return { userId: id };
});
// GET /users/123 → { "userId": "123" }
// routes/users/index.post.ts
export default defineEventHandler(async (event) => {
const body = await readBody(event);
return { created: body };
});
// POST /users → creates user
Built-in Features
Caching
// routes/data.ts
export default defineCachedEventHandler(async () => {
const data = await fetchExpensiveData();
return data;
}, {
maxAge: 60 * 10, // Cache for 10 minutes
swr: true, // Stale-while-revalidate
});
Storage (Universal Key-Value)
// Use any storage: fs, redis, S3, Cloudflare KV, etc.
export default defineEventHandler(async () => {
await useStorage().setItem("cache:users", { data: [...] });
const cached = await useStorage().getItem("cache:users");
return cached;
});
Configure storage backends:
// nitro.config.ts
export default defineNitroConfig({
storage: {
cache: { driver: "redis", url: "redis://localhost:6379" },
assets: { driver: "fs", base: "./assets" },
},
});
Tasks (Background Jobs)
// tasks/cleanup.ts
export default defineTask({
meta: { description: "Clean expired sessions" },
run() {
// Your cleanup logic
return { result: "Cleaned 42 sessions" };
},
});
WebSockets
// routes/_ws.ts
export default defineWebSocketHandler({
open(peer) {
peer.send("Welcome!");
peer.subscribe("chat");
},
message(peer, message) {
peer.publish("chat", message.text());
},
close(peer) {
peer.unsubscribe("chat");
},
});
Deploy (One Config Change)
// nitro.config.ts
export default defineNitroConfig({
preset: "cloudflare-pages", // or "vercel", "netlify", "deno-server", "bun", etc.
});
npm run build
# Output is optimized for the target platform
Need universal API solutions? I build web tools and data pipelines. Email spinov001@gmail.com or explore my Apify tools.
Top comments (0)