Skip to content

The async web framework for Python.

Batteries-included and type-safe — routing, ORM, queue, cache, auth, mail, views, and a fast CLI in one coherent toolkit.

$ uv tool install arvel
◇ MIT licensed⚡ Python 3.14+◧ Zero heavy deps at import
app/routes.py
from arvel import Route, Model

class Post(Model):
    __fillable__ = ["title", "body"]

# eager-load the author relation — no N+1
posts = await Post.with_("author") \
    .where(published=True).get()

Route.resource("posts", PostController)  # 7 routes
Why arvel

Everything you need, natively async.

Every layer is async to the core and strictly typed — so concurrency is the default and your editor catches mistakes before CI does.

Async-first

Routing, ORM, queues, mail and cache are async end-to-end. High-concurrency Python without blocking surprises.

async / await

Type-safe to the core

Strict static typing on every public API, modern generics, and mechanically-enforced boundaries.

strict typing

Batteries included

ORM, Auth, validation, queues, events, mail, notifications, storage, templates and a test kit — one toolkit.

one toolkit

An ORM you'll enjoy

Active-Record with relations, eager loading, soft-deletes, casts and migrations — no N+1, multi-dialect SQL.

no N+1

A first-class CLI

Scaffold apps, run migrations, drive queue workers and open a REPL — all from one fast command.

arvel new

Light by default

import arvel pulls zero heavy libraries. Each capability loads only when you use it.

lazy imports
A taste

Familiar, expressive, type-safe.

Resource routes, relations, dispatchable jobs and fluent validation — clean, readable APIs with Python types from end to end.

app/routes.py
from arvel import Route

Route.resource("posts", PostController)        # 7 RESTful routes
Route.get("/users/{user}", show, name="users.show")

Route.middleware("auth").group(lambda: (
    Route.post("/posts", store),
))
Enforced from the first commit

Four gates keep the framework honest.

Not aspirations — CI checks. Every commit must pass all four, so quality is mechanical, not a matter of discipline.

G1

Boundaries

import-linter keeps modules honest: kernel isolation, a layered DAG, no heavy import at load.

G2

Startup

import arvel pulls zero heavy libraries; the CLI stays instant.

G3

Types

Strict mypy + pyright on every public API surface.

G4

Verified behavior

Every capability is exercised by a dedicated per-module test, proving it works as documented.

Ready to build?

Scaffold an app and serve it in under a minute.