Zeython 2.0 — stable release

The async-first,
batteries-included MVC framework for Python

A dependency injection container, a service-provider boot lifecycle, an Active-Record-style async ORM, and a Laravel-style CLI — built on Starlette and SQLAlchemy 2.0.

terminal
$ pip install git+https://github.com/zaber-dev/Zeython.git
$ zeython new "My App"
$ cd my_app && pip install -e . && zeython serve
Why Zeython

Assembled once, so you don't hand-roll it per project

Python has excellent web libraries. It has very few opinionated, batteries-included frameworks in the Django/Laravel/Rails sense — Zeython is that assembly, done once.

Async all the way down

Request handling, the ORM, and migrations — no bolted-on asyncio.run calls anywhere in the stack.

Request-scoped DB sessions

Managed via contextvars, not a session shared globally or hand-rolled per call.

Convention over configuration

Controllers, models, and routes live in predictable places: app/Controllers, app/Models, routes/.

A real CLI

zeython new, serve, make:*, db:* cover project creation, code generation, and migrations.

Live API docs from real routes

A generated OpenAPI spec and Swagger UI at /docs, built by reading what's actually registered.

Real-time out of the box

@app.websocket(...) handlers and a WebSocketHub broadcast registry — no separate server.

AI-agent ready

An MCP server (zeython mcp) gives coding agents tools to inspect real routes, schema, and docs.

Small, typed, tested core

Full type hints and a real pytest suite — not scaffolding wrapped around unfinished features.

AI-capable apps

zeython.ai binds an LLM client in the container, zero-config by default, one line to go live.

A taste of it

A model, a controller, and a route

That's a working JSON API — validation, error handling, and serialization included.

app/Models/post.py
from sqlalchemy import String, Text
from sqlalchemy.orm import Mapped, mapped_column
from zeython import Model

class Post(Model):
    __tablename__ = "posts"
    title: Mapped[str] = mapped_column(String(255))
    body: Mapped[str] = mapped_column(Text)
app/Controllers/post_controller.py
from starlette.responses import JSONResponse
from zeython import Controller, NotFoundException
from app.Models.post import Post

class PostController(Controller):
    async def index(self, request):
        return JSONResponse([p.to_dict() for p in await Post.all()])

    async def store(self, request):
        data = await request.json()
        post = await Post.create(**data)
        return JSONResponse(post.to_dict(), status_code=201)
Batteries included

Everything a production app needs, already wired

Not a hello-world demo — auth, security, background work, and observability, all shipped and tested.

✓  Session & API token auth
✓  RBAC-style authorization
✓  CSRF protection
✓  Security response headers
✓  Rate limiting (incl. Redis)
✓  Multi-tenancy
✓  Background job queues
✓  Cron-like scheduler
✓  WebSockets & broadcast hub
✓  Mail (SMTP + log driver)
✓  Caching (in-memory + Redis)
✓  File storage (local + S3)
✓  OpenAPI & Swagger UI
✓  Admin panel (auto CRUD)
✓  Localization / i18n
✓  Structured logging + Sentry
✓  Factories & seeders
✓  N+1 query detection
✓  Health checks + Docker
✓  Plugin registry
Laravel-style CLI

Code generation for the whole stack

One command per concept — models, controllers, jobs, policies, middleware, migrations.

# scaffold a model, controller, and migration
zeython make model Post
zeython make controller Post
zeython db revision -m "add posts table"
zeython db migrate

# jobs, policies, middleware, seeders — same pattern
zeython make job SendWelcomeEmail
zeython make policy PostPolicy
zeython route:list
MIT License Python 3.11+ CI status GitHub stars

Ready to build something real?

Scaffold a project, wire a route, and be serving requests in under a minute.