Night is a tiny, single-file ASGI web framework for Python 3.11+ with portable Web-runtime adapters for browsers, Node.js, and serverless platforms.
The core stays dependency-free. The recommended standard profile adds the fast CPython server stack, Midnight, and Cloudflare development/runtime helpers.
Minimal dependency-free core:
pip install -U all-nightRecommended full install:
pip install -U "all-night[standard]"all-night[standard] installs uvicorn[standard], orjson, workers-runtime-sdk, and the separate all-night-midnight distribution. Starting with 0.1.5, the night_midnight* modules are no longer bundled in the minimal all-night wheel.
from night import Night
app = Night()
@app.get("/")
def index():
return {"hello": "night"}
@app.get("/users/<int:user_id>")
def user(user_id: int):
return {"id": user_id}Run with Night's CLI:
night run app.pyor any ASGI server:
uvicorn app:app --reloadnightcli manages a Night project through a small, portable night.toml.
It creates a project without forcing a hosting platform and can validate the
configured application before it is deployed.
nightcli new my-api --template api
cd my-api
nightcli doctor
nightcli check
nightcli routes --format json
nightcli devTemplates are api, site, midnight, and cloudflare. Use
nightcli info to inspect the nearest project, or pass
--project path/to/project from elsewhere. nightcli openapi writes the app's OpenAPI document to openapi.json (or a project-relative --output path).
With the standard profile installed, enable Night's optional CPython fast path with app.fast():
from night import Night
app = Night().fast()
@app.get("/")
def index():
return {"hello": "fast night"}app.fast() switches Night's dict/list response serialization to orjson. When the application is launched with night run, Night also selects uvloop, httptools, and websockets when those backends are available from uvicorn[standard]. If you launch with an external ASGI command such as uvicorn app:app, that server still controls its own event loop/backend selection; Uvicorn's auto mode will normally use its installed standard accelerators.
- Single-file core — the framework core stays in
night.pyand has no required runtime dependencies on normal CPython. - Fast routing — static routes use direct indexes; common dynamic routes are compiled into specialized fast paths so large route tables do not require linear scans.
- Fast response path — common JSON/text/HTML responses avoid unnecessary temporary header dictionaries and
app.fast()can useorjson. - Sync + async — handlers are classified at registration time and Night compiles route-specific invokers to reduce per-request branching.
- HTTP batteries included — JSON, forms, multipart uploads, cookies, sessions, CSRF helpers, streaming, SSE, WebSocket, static files, middleware, hooks, and error handlers.
- Typed request bodies — validate nested dataclasses, optional values, and
list[T]request bodies. - Tooling — built-in in-process
TestClient, CLI, named routes, OpenAPI generation, extensions, JSON-RPC, and a lightweight SQLite ORM. - MCP 2026-07-28 — the optional
night_mcpmodule exposes the existing RPC registry as statelessserver/discover,tools/list, andtools/callHTTP endpoints without adding runtime dependencies. - Cloudflare Python Workers —
Night.cloudflare_fetch()bridges Workers Requests into Night, whileNight.cloudflare_rpc()exposes the same@app.rpc(...)registry over Workers RPC/Service Bindings. - Vercel Functions — Vercel's Python runtime accepts Night directly as an ASGI
app; no request/response adapter is needed. - Node.js 22 / 24 —
night_node.mjsruns the same Night application under Node through Pyodide and Web-standardRequest/Response. - Netlify Functions — the official Node 24 template uses Netlify's modern
Request -> ResponseFunctions API and the shared Night Node adapter. - Browser Night — run Night entirely in a browser tab with Pyodide.
from night import Night
from night_mcp import enable_mcp
app = Night()
mcp = enable_mcp(app)
@mcp.tool(description="Add two integers")
def add(a: int, b: int):
return {"value": a + b}Existing @app.rpc(...) methods are also visible as MCP tools. See the MCP guide.
Night keeps the Workers adapter in the core package. The standard profile additionally installs workers-runtime-sdk on Python 3.13+ for local typing/runtime integration.
For actual Python Workers deployment, use Cloudflare's Workers-native toolchain rather than Uvicorn:
[project]
dependencies = ["all-night==0.1.5"]
[dependency-groups]
dev = [
"workers-py",
"workers-runtime-sdk",
]from night import Night
from workers import WorkerEntrypoint
app = Night()
@app.get("/")
def index():
return {"hello": "edge"}
class Default(WorkerEntrypoint):
async def fetch(self, request):
return await app.cloudflare_fetch(request)Cloudflare Python Workers run inside Pyodide, so app.fast()'s CPython uvloop/httptools path is not used there. See the Cloudflare Workers guide.
Midnight is Night's bidirectional Python ↔ HTML bridge for DOM events, structured DOM updates, custom events, forms, reusable components, and optional WebSocket transport.
Since 0.1.5, Midnight is installed through the standard profile:
pip install -U "all-night[standard]"This pulls the separate all-night-midnight wheel, which provides night_midnight, night_midnight_component, night_midnight_dev, and night_midnight_form. See the Midnight guide.
Night can run entirely in the browser through Pyodide and the night_web adapter. No Python server is required: routes execute inside the tab and Web-style requests are bridged into the same Night application.
The GitHub Pages demo lives under deploy/browser-night. See the Browser Night guide.
- Normal ASGI / CPython — Uvicorn, Hypercorn, or another ASGI server
- Vercel Functions — direct ASGI application
- Cloudflare Python Workers — Workers-native
cloudflare_fetch()bridge - Node.js 22 / 24 — Pyodide +
night_node.mjs - Netlify Functions — Node adapter and Web-standard Request/Response
- Browser Night — Pyodide inside the browser tab
See Deployment.
Start with the documentation index.
Recommended reading order:
- Quickstart
- HTTP guide
- Application and routing reference
- Request / Response reference
- Tooling and CLI
- Deployment
Additional guides:
- Templates
- Realtime / WebSocket / SSE
- Midnight
- Browser Night / Pyodide
- Node.js runtime
- MCP
- Cloudflare Workers
- Vercel Functions
- Netlify Functions
- 日本語ドキュメント
For coding agents and automated tooling, see SKILL.md.
Current release target: 0.1.5. Night requires Python 3.11+.
Night is alpha software. Benchmark numbers in this repository are development measurements; in-process test clients do different bookkeeping and should not be treated as production HTTP throughput results.