Skip to content
'; user_status_content.firstChild.appendChild(avatarContainer); } else { // Placeholder for LoggedOutUserMenu let loggedOutContainer = document.createElement('div'); // if LoggedOutUserMenu fallback let userBtn = document.createElement('button'); userBtn.style.width = "33px"; userBtn.style.height = "33px"; userBtn.style.display = "flex"; userBtn.style.alignItems = "center"; userBtn.style.justifyContent = "center"; userBtn.style.color = "var(--ds-gray-900)"; userBtn.style.border = "1px solid var(--ds-gray-300)"; userBtn.style.borderRadius = "100%"; userBtn.style.cursor = "pointer"; userBtn.style.background = "transparent"; userBtn.style.padding = "0"; // user icon ( from geist) let svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); svg.setAttribute('data-testid', 'geist-icon'); svg.setAttribute('height', '16'); svg.setAttribute('stroke-linejoin', 'round'); svg.setAttribute('style', 'color:currentColor'); svg.setAttribute('viewBox', '0 0 16 16'); svg.setAttribute('width', '16'); let path = document.createElementNS('http://www.w3.org/2000/svg', 'path'); path.setAttribute('fill-rule', 'evenodd'); path.setAttribute('clip-rule', 'evenodd'); path.setAttribute('d', 'M7.75 0C5.95507 0 4.5 1.45507 4.5 3.25V3.75C4.5 5.54493 5.95507 7 7.75 7H8.25C10.0449 7 11.5 5.54493 11.5 3.75V3.25C11.5 1.45507 10.0449 0 8.25 0H7.75ZM6 3.25C6 2.2835 6.7835 1.5 7.75 1.5H8.25C9.2165 1.5 10 2.2835 10 3.25V3.75C10 4.7165 9.2165 5.5 8.25 5.5H7.75C6.7835 5.5 6 4.7165 6 3.75V3.25ZM2.5 14.5V13.1709C3.31958 11.5377 4.99308 10.5 6.82945 10.5H9.17055C11.0069 10.5 12.6804 11.5377 13.5 13.1709V14.5H2.5ZM6.82945 9C4.35483 9 2.10604 10.4388 1.06903 12.6857L1 12.8353V13V15.25V16H1.75H14.25H15V15.25V13V12.8353L14.931 12.6857C13.894 10.4388 11.6452 9 9.17055 9H6.82945Z'); path.setAttribute('fill', 'currentColor'); svg.appendChild(path); userBtn.appendChild(svg); loggedOutContainer.appendChild(userBtn); loggedOutContainer.style.display = 'flex'; loggedOutContainer.style.gap = '8px'; loggedOutContainer.style.alignItems = 'center'; user_status_content.firstChild.appendChild(loggedOutContainer); } })();
Menu
 

Configuring the Runtime for Vercel Functions

Last updated March 17, 2026

The runtime of your function determines the environment in which your function will execute. Vercel supports various runtimes including Node.js, Python, Ruby, and Go. You can also configure other runtimes using the vercel.json file. Here's how to set up each:

By default, a function with no additional configuration will be deployed as a Vercel Function on the Node.js runtime.

api/hello.ts
export function GET(request: Request) {
  return new Response('Hello from Vercel!');
}
api/hello.js
export function GET(request) {
  return new Response('Hello from Vercel!');
}
app/api/hello/route.ts
export function GET(request: Request) {
  return new Response('Hello from Vercel!');
}
app/api/hello/route.js
export function GET(request) {
  return new Response('Hello from Vercel!');
}

If you're not using a framework, you must either add "type": "module" to your package.json or change your JavaScript Functions' file extensions from .js to .mjs

For Go, write a server in main.go, cmd/api/main.go, or cmd/server/main.go. The server must listen on the PORT environment variable:

main.go
package main
 
import (
  "fmt"
  "log"
  "net/http"
  "os"
)
 
func main() {
  http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Hello from Go on Vercel")
  })
 
  port := os.Getenv("PORT")
  if port == "" {
    port = "3000"
  }
 
  log.Fatal(http.ListenAndServe(":"+port, nil))
}

Vercel also supports file-based Go functions under /api. For that model, export an http.HandlerFunc from a .go file. For more details, see Using the Go Runtime with Vercel Functions.

For Python, write an ASGI (Asynchronous Server Gateway Interface) or WSGI (Web Server Gateway Interface) application that exposes an app variable in app.py, index.py, server.py, or main.py. Here's a FastAPI example:

app.py
from fastapi import FastAPI
 
app = FastAPI()
 
@app.get("/")
def home():
    return {"message": "Hello from Python on Vercel"}

Vercel also supports file-based Python functions under /api. For that model, define a handler class or an app variable in a .py file. For more details, see Using the Python Runtime with Vercel Functions.

For Ruby, define an HTTP handler from .rb files within an /api directory at your project's root. Ruby files must have one of the following variables defined:

  • Handler proc that matches the do |request, response| signature
  • Handler class that inherits from the WEBrick::HTTPServlet::AbstractServlet class

For example:

api/index.rb
require 'cowsay'
 
Handler = Proc.new do |request, response|
  name = request.query['name'] || 'World'
 
  response.status = 200
  response['Content-Type'] = 'text/text; charset=utf-8'
  response.body = Cowsay.say("Hello #{name}", 'cow')
end

Don't forget to define your dependencies inside a Gemfile:

Gemfile
source "https://rubygems.org"
 
gem "cowsay", "~> 0.3.0"

You can configure other runtimes by using the functions property in your vercel.json file. For example:

vercel.json
{
  "$schema": "https://openapi.vercel.sh/vercel.json",
  "functions": {
    "api/test.php": {
      "runtime": "[email protected]"
    }
  }
}

In this case, the function at api/hello.ts would use the custom runtime specified.

For more information, see Community runtimes


Was this helpful?

supported.