Deploy TypeScript functions that run in a Deno V8 isolate pool with under 50ms cold-start. HTTP-triggered, with allowlist-only environment injection, Prometheus metrics, and SSE log streaming. A self-hosted alternative to Cloudflare Workers or Supabase Edge Functions — running on your own server.
Requires nSelf v1.0.9+. Set your license key with nself license set nself_pro_... before installing.
nself license set nself_pro_...
nself plugin install functions-v8
nself build
nself start// hello.ts
export default async function handler(req: Request): Promise<Response> {
const { name } = await req.json()
return Response.json({ message: `Hello, ${name}!` })
}# Deploy
curl -X POST http://127.0.0.1:3825/functions/deploy \
-F "file=@hello.ts" \
-F "name=hello" \
-F "env_keys=HASURA_URL,MY_API_KEY"
# Invoke
curl -X POST http://127.0.0.1:3825/functions/invoke/hello \
-H "Content-Type: application/json" \
-d '{"name": "world"}'| Variable | Required | Default | Description |
|---|---|---|---|
PLUGIN_FUNCTIONS_POOL_SIZE | No | 10 | Number of V8 isolates in the warm pool |
PLUGIN_FUNCTIONS_TIMEOUT_MS | No | 30000 | Max function execution time in milliseconds |
PLUGIN_FUNCTIONS_MAX_MEMORY_MB | No | 128 | Per-isolate memory limit |
| Endpoint | Method | Description |
|---|---|---|
/functions/deploy | POST | Deploy or update a function |
/functions/invoke/:name | POST | Invoke a function by name |
/functions/list | GET | List deployed functions with version info |
/functions/logs/:name | GET | Stream recent logs (SSE) |
/functions/delete/:name | DELETE | Remove a deployed function |
/metrics | GET | Prometheus metrics endpoint |
/health | GET | Plugin health check |
nself plugin remove functions-v8Category: Infrastructure | Requires: nSelf v1.0.9+ | Last Updated: April 2026 | Plugin Version 1.1.1