An independent Python framework · Issue 001

Python web apps, made to be built on.

A well-marked application structure for the work ahead: routes, controllers, templates, services, and explicit plugins on a Starlette ASGI foundation.

For small beginnings
and long-lived apps.

A familiar first route

Begin with one page. Keep the room to grow.

Start with server-rendered pages or an API. Add realtime, a React frontend, or a focused plugin only when your application needs it.

from pyrora import Pyrora, json, render

app = Pyrora(debug=True)

@app.get("/")
async def home(request):
    return render(request, "home.html", title="Hello, Pyrora")

@app.get("/api/health")
async def health(request):
    return json({"ok": True})

What’s in the box

A considered core. Nothing bolted on by default.

01

ASGI at the core

Starlette routing, Uvicorn development, sync or async handlers, and clear HTTP behavior.

02

Pages or APIs

Jinja templates autoescape by default. JSON APIs and optional React/Vite starters stay first-class.

03

Explicit extensions

Provider-style plugins add services, routes, middleware, commands, assets, and lifecycle hooks.

04

Realtime, responsibly

WebSockets, in-memory rooms, and WebRTC signaling—without claiming to be a media server.

The loose-leaf section

Bring the infrastructure that fits your work.

Database, authentication, queues, mail, billing, admin tools, Redis broadcasting, Socket.IO, and media infrastructure belong in dedicated integrations—not every app’s dependency tree.

Open source · MIT

Take Pyrora for a first walk.

pip install "pyrora[server]"Python 3.10+
View Pyrora on GitHub