arvel
The batteries-included, async-first web framework for Python — type-safe and modular.
Expressive facades, an Active-Record ORM, a real queue, auth, mail, caching, views and a
powerful CLI — one coherent, fully-typed, async/await-native toolkit. You get a productive,
high-level developer experience without giving up Python's type system or performance.
Install
uv add arvel # light core — no heavy dependencies
uv add 'arvel[standard]' # the common set: http, db, queue, cache, view, mail, image
uv add 'arvel[all]' # everything
Requires Python 3.14+. Capabilities are opt-in extras — you install only what you use,
and import arvel stays light because engines are imported lazily.
Quickstart
arvel new blog # scaffold a new app
cd blog && uv sync
source .venv/bin/activate # activate the virtualenv
arvel serve --reload # http://127.0.0.1:8000
arvel new gives you a runnable project: an ASGI entrypoint, a bootstrap/app.py factory, web/api
route groups, config files, a User model with migrations and a factory, and a test suite.
A taste
Routing — define routes with the Route facade; web (stateful) and api (JSON) groups:
from arvel import Route, Schema
async def show(request):
return {"hello": request.path_param("name")}
Route.get("/hello/{name}", show, name="hello")
class CreatePost(Schema): # typed request/response → automatic OpenAPI at /schema
title: str
async def store(request, data: CreatePost) -> CreatePost:
return data
Route.post("/posts", store, name="posts.store")
ORM — an Active-Record model on SQLAlchemy Core:
from arvel import Model
class Post(Model):
__fillable__ = ["title", "body"]
__casts__ = {"published": "bool", "meta": "json"}
post = await Post.create(title="Hello", body="…")
posts = await Post.where("published", True).order_by("created_at", "desc").get()
await Post.with_("author").get() # eager-load relations — no N+1
Validation — concise rules, returning only the validated data:
from arvel import Validator
data = Validator(request_body, {
"email": "required|email",
"age": "nullable|integer|min:18",
}).validate()
Queues, authorization, mail, cache — the facades you'd expect, all async:
from arvel import Job, Gate, Mail, Cache
await SendWelcome.dispatch(user_id=42) # background job
await SendWelcome.dispatch_after(600, user_id=42) # …or run it in 10 minutes
if await Gate.allows("update", post): ... # authorization
await Mail.to(user).send(WelcomeMail()) # mailables
await Cache.remember("stats", 300, compute_stats) # cache-aside
More: notifications, events & listeners, task scheduling, file storage (local/S3/GCS/Azure),
localization, server-rendered views, and a rich Str/Arr/Collection helper set.
Why arvel
- Batteries included, async-first. Routing, ORM, queue, cache, auth, mail, views, CLI — one
coherent DX, built
async/await-native from the ground up. - Type-safe. Strict typing across the public API, so your editor and CI catch mistakes before runtime — no stub-chasing.
- Lightweight & modular. One package, opt-in extras, lazy imports. You pay only for what you use, and the CLI stays fast.
- Convention over configuration. Sensible defaults, expressive facades, and a familiar project layout — scaffold and ship without wiring boilerplate.
The four gates
Engineering guarantees enforced in CI from the first commit:
- G1 — boundaries.
import-linterkeeps modules honest: kernel isolation, a layered DAG, and no heavy import at module load. - G2 — startup.
import arvelpulls zero heavy libraries; the CLI stays snappy. - G3 — types. Strict
mypyandpyrighton every public API. - G4 — stack fidelity. Each capability is built on its mandated engine (Litestar, SQLAlchemy Core, whenever, Typer, …) — verified by a per-module test.
Extras
| Extra | Adds |
|---|---|
http, server |
Litestar routing · the granian/uvicorn dev server |
sqlite, postgres, mysql |
SQLAlchemy + the matching async driver + Alembic |
queue, queue-redis, queue-amqp |
taskiq jobs · Redis broker · RabbitMQ/AMQP broker |
redis |
cashews caching (Redis backend) |
jwt, oauth, 2fa |
JWT tokens · OAuth providers · TOTP two-factor (auth is core) |
mail, notifications |
SMTP mail · multi-channel notifications (Apprise) |
view |
Jinja2 templating |
s3, gcs, azure, supabase |
filesystem disks |
image, video, media |
media handling (Pillow / PyAV) |
search, vector |
Meilisearch · pgvector |
i18n, telemetry |
Babel localization · OpenTelemetry/Sentry |
arvel[standard] bundles the everyday set; arvel[all] installs everything.
Development
uv venv && uv pip install -e '.[dev]'
./tools/validate.sh # ruff · mypy · pyright · import-linter · bandit · pip-audit · pytest
Inspired by
If you're coming from PHP, arvel will feel familiar: facades, the service container, providers, migrations, factories, gates & policies, and a project layout are all here. Arvel is built natively for async Python, embraces the type system end to end, and stands on best-in-class Python engines (Litestar · SQLAlchemy Core · Alembic · whenever · Typer · taskiq · Babel · msgspec · cashews · fsspec · Jinja2).
License
MIT.
Metadata
Release files for arvel 0.66.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| arvel-0.66.1.tar.gz | 1.5 MB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| arvel-0.66.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 2.1 MB
Release files / arvel-0.66.1.tar.gz
| Download URL | arvel-0.66.1.tar.gz |
|---|---|
| Size | 1.5 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c2db99770ea89c0eebfd6ec34e8ac914d3b0fb897ac85b6e4a3878b6e5210611
|
|
BLAKE2b-256 checksum How to use checksums |
258e98edc2248befcc7dc62c417e0053beaa2bdb9fcf3b4ae133595c696a9641
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 17, 2026.
Transparency logRelease files / arvel-0.66.1-py3-none-any.whl
| Download URL | arvel-0.66.1-py3-none-any.whl |
|---|---|
| Size | 631.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1cf6ac0f1b95dc35d0e75f563cbcf6b644fb817378360c24946ebbcacaafb57f
|
|
BLAKE2b-256 checksum How to use checksums |
30b475a8a44317ea589d52a19c5dc3eb2a24e51365f4c2085803c46fff3f031b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 17, 2026.
Transparency logSecurity for arvel 0.66.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for arvel-0.66.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 17, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.