v0.2 · early release · MIT

The batteries‑included Python web framework.

FastAPI on the server, React on the client, Inertia in between. Routing, an async ORM, auth, queues and an artisan-style CLI, ready on day one.

Quick start

Needs uv, Python 3.12+ and Node 22+.

~/code
$ uvx aso new myapp
Creating a new Aso application in ./myapp...
$ cd myapp && uv run aso dev
  App   http://127.0.0.1:8000   <- open this one

How it reads

One feature, top to bottom, in four small files.

A route, a controller, a validated request and a React page. No serializers, no API client, no glue.

routes/web.py
from aso.routing import Route

from app.http.controllers.post_controller import PostController

with Route.middleware("auth").group():
    Route.get("/posts", [PostController, "index"]).name("posts.index")
    Route.post("/posts", [PostController, "store"]).name("posts.store")

What's included

Everything a real app needs, already in the box.

If you know Laravel, you already know where things go. If you know Python, you already know how they work.

01

An artisan-style CLI

make:model, make:controller, make:request, migrate, queue:work, route:list. Generators write the boring parts so you start from working code.

aso make:model Post -mcr
02

React pages, no API layer

Controllers return Inertia pages with their props. The browser gets a real React app; you never write fetch calls or JSON endpoints for your own UI.

inertia("posts/index", {...})
03

An async ORM that reads well

Models, relationships, scopes, eager loading and pagination on SQLAlchemy 2. Lazy loads raise instead of silently hitting the database.

await Post.with_("author").paginate(15)
04

Auth from the first run

Registration, login, password reset, email verification and profile settings, already wired to pages in the React starter kit.

Route.middleware("auth")
05

Typed routes in TypeScript

Your Python routes become typed TypeScript helpers. Rename a route and the compiler tells you every link that broke.

aso routes:generate
06

Queues, mail, cache, storage

Jobs, a worker, mailables, cache and file storage with the same small, consistent API. Local mail lands in a log so nothing leaks while you build.

aso queue:work

Built for people and agents

Conventions your coding agent can't quietly break.

Every app ships with an AGENTS.md and architecture tests that run with your suite. Raw SQL with f-strings, queries in controllers, models that import HTTP code: they fail the build, whoever wrote them.

$ uv run pytest tests/architecture

✓ A1 controllers don't import sqlalchemy

✓ A2 models work without a request

✓ A3 input arrives through a FormRequest

✓ A4 every Inertia page exists

✓ A6 no interpolated SQL

… 13 rules, all green

Get started

From nothing to a running app in about a minute.

  1. 01

    Create an app

    Python deps, npm packages and the first migration, in one go.

  2. 02

    Start everything

    Server, Vite and the route watcher (plus a queue worker if you use one). Port taken? It picks the next free one.

  3. 03

    Build your thing

    Model, migration, controller and form requests. Then open resources/js/pages.

Make something good.

Aso is young and moving fast. Try it, break it, and tell us what you'd want next.