One OS process. Many isolated apps on V8 isolates. Portable sliver bundles with precompiled bytecode and zero-downtime hot-swap. WinterTC compatible.
Production-ready edge runtime with comprehensive API support
Slivers carry V8 bytecode built at pack time, so the first request skips JavaScript parse and compile.
One OS process hosts many isolated apps in separate V8 isolates with strong per-app boundaries.
Full fetch(), Request, Response, Headers, URL, TextEncoder, TextDecoder support per WinterTC spec.
Configurable per-request CPU limits with timer-based termination. Prevents infinite loops and resource exhaustion.
Per-isolate memory limits with LRU eviction and soft termination. 4-tier pressure monitoring prevents OOM conditions.
Automatic metrics collection per hostname. Prometheus exposition format at /_admin/metrics endpoint.
V8 built-in WASM engine for executing binary modules. Source hash caching for integrity verification.
Full crypto.subtle implementation: AES-GCM, HMAC, SHA-256/384/512, PBKDF2. JWK key import/export.
Portable tar bundles: app files + precompiled bytecode. Deploy once, run anywhere. Zero-downtime hot-swap on SIGHUP.
WebSocketPair API compatible with Cloudflare Workers. Per-connection V8 isolate with CPU/memory enforcement per frame.
Learn more →EdgeStore-backed key-value store per app. Hostname-namespaced, zero config. JSON helpers, named namespaces, prefix listing. import { kv, openKV } from 'nano:kv'
Drop-in browser localStorage API backed by nano:kv. Front-end code and Cloudflare Workers patterns using localStorage.* run unchanged — no rewrite needed.
require('path'), require('buffer'), require('assert'), process.env, btoa/atob — common npm packages work without a bundler shim.
Run .gs files unchanged on nano-rs. SpreadsheetApp, DriveApp, PropertiesService, Logger and more — backed by a service account.
NANO speaks three dialects. Pick the one your code already uses.
Standard fetch(), Request, Response, WebCrypto, streams. Drop-in for Workers code.
export default {
async fetch(request) {
const url = new URL(request.url);
return Response.json({
path: url.pathname,
});
}
};
require('path'), require('buffer'), require('assert'), process.env — common npm packages work without a bundler shim.
const path = require('path');
const { from } = require('buffer');
export default {
async fetch(req) {
const env = process.env.NODE_ENV;
return new Response(env);
}
};
localStorage shim, nano:kv for structured storage — front-end code and Cloudflare KV patterns work without changes.
import { kv, openKV } from 'nano:kv';
const hits = (await kv.getJSON('c')) ?? 0;
await kv.setJSON('c', hits + 1);
// Or use the localStorage shim
await localStorage.setItem('theme', 'dark');
Set GAS_COMPAT=true and upload your .gs file. SpreadsheetApp, PropertiesService, Logger and more — backed by a service account.
async function doGet(e) {
const sheet = SpreadsheetApp
.getActiveSpreadsheet()
.getActiveSheet();
const rows = await (
await sheet.getDataRange()
).getValues();
return JSON.stringify(rows);
}
Follow the quick start guide to build and run your first NANO application.
View Quick Start Guide