Skip to main content

A batteries-included web framework for Python — async-first, type-safe, modular.

Project description

arvel

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-linter keeps modules honest: kernel isolation, a layered DAG, and no heavy import at module load.
  • G2 — startup. import arvel pulls zero heavy libraries; the CLI stays snappy.
  • G3 — types. Strict mypy and pyright on 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.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

arvel-0.62.0.tar.gz (1.4 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

arvel-0.62.0-py3-none-any.whl (573.7 kB view details)

Uploaded Python 3

File details

Details for the file arvel-0.62.0.tar.gz.

File metadata

  • Download URL: arvel-0.62.0.tar.gz
  • Upload date:
  • Size: 1.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for arvel-0.62.0.tar.gz
Algorithm Hash digest
SHA256 1ae7186d2ff01f7a14255e351efa8afae44462b36f0403a0780e07a22f6aff38
MD5 cdaeba305889467908961ae94d909290
BLAKE2b-256 b951ce02c12d26198d2fab42b5016b7494ca960a203a36902a31db32a7cfd724

See more details on using hashes here.

Provenance

The following attestation bundles were made for arvel-0.62.0.tar.gz:

Publisher: publish.yml on mohamed-rekiba/arvel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file arvel-0.62.0-py3-none-any.whl.

File metadata

  • Download URL: arvel-0.62.0-py3-none-any.whl
  • Upload date:
  • Size: 573.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for arvel-0.62.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ff6fbc0e06441c330707f7cf364b9495eaf2e31e7640872e9bac97253cde5da3
MD5 2d496fb0088b2b3243775203c5673ba8
BLAKE2b-256 f9809b07135e949ab456884c401931de4645b2f16539b681dd40afa6dcb44887

See more details on using hashes here.

Provenance

The following attestation bundles were made for arvel-0.62.0-py3-none-any.whl:

Publisher: publish.yml on mohamed-rekiba/arvel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page