Build in Python.
Bring pages to life.

Your routes, your templates, just the interactivity you need. Z8ter brings them together on Starlette.

01 / A SMALL START

A Python view.
A page of HTML.
Room to grow.

Create a project
uvx --from z8ter z8 new myapp

Open source · Public alpha · APIs may change

From Python to a page you can use.

An illustrated walkthrough
PYTHON / SERVERYOUR APP
endpoints/views/hello.py
from z8ter.endpoints.view import View
class Hello(View):
async def get(self, request):
return self.render(
request, "pages/hello.jinja",
{"title": "Hello from Python."}
)
Route discovered at startup
localhost:8000/hello
hello appBROWSER
GET /hello

A page is requested.

Waiting for the HTML response.

Request in progress

A URL finds its Python view.

When the app starts, Z8ter discovers your view classes. A request to /hello reaches the view in endpoints/views/hello.py.

WHY IT HELPS

Fewer routes to wire by hand.

Example flow, not a live Python server. The counter represents a custom element you add to your app.

Explore views & templates

Why Z8ter?

Python on the server, rendered HTML for your pages, and focused tools for the parts you add next

⚡

Async-First Architecture

Write async Python handlers on Starlette and await database or network calls without blocking on their results.

📄

SSR by Default

Render page content with Jinja on the server, then add browser-side behavior where your application needs it.

🌐

Interactive Islands

The starter uses Solid-powered custom elements for focused interactivity within server-rendered pages.

📦

File-Based Routing

View classes are discovered under endpoints/views. Their file paths define page URLs, with explicit overrides when needed.

🔒

Authentication Tools

Configure session authentication and route guards, with Argon2 hashing and helpers for account lockouts and signed tokens.

🛡️

Opt-in Security

Enable CSRF checks, rate limits, and security headers through explicit builder configuration for your application.

📧

Transactional Email

Pluggable email providers (console, SMTP) with async sending and Jinja-templated messages.

⏱️

In-Process Tasks

Schedule recurring jobs and start one-off async tasks alongside your app. Tasks run within the application process.

✍️

Project & Page Scaffolding

Generate a starter project or a page's view, Jinja template, content file, and TypeScript module from the CLI.

Simple & Expressive

Configure your app, render a Jinja page, and expose a JSON endpoint

main.py
from z8ter.builders.app_builder import AppBuilder

# Choose the integrations your application uses
builder = AppBuilder()
builder.use_config(".env")
builder.use_templating()
builder.use_vite()
builder.use_errors()
builder.use_security_headers()
builder.use_health_check()

app = builder.build(debug=True)
asgi_app = app.starlette_app

From an empty folder to your first page

Make it yours.

Four steps. A working app. Follow along at your own pace.

You’ll need Python 3.10+, Node.js 22.12+ and npm.

Python setup

Choose a step to see what happens.

Terminal · project parent
uvx --from z8ter z8 new myapp
Step 01 / 04Run in your own terminal

The CLI creates a project with Python routes, Jinja templates, and a frontend build setup. Give it your own name when you’re ready.

Inside your new myapp/ folder

main.pyYour app configuration
endpoints/Views and JSON APIs
templates/Server-rendered pages
src/TypeScript and styles

Ready to Build Something Amazing?

Dive into our comprehensive documentation to learn more