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.63.3.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.63.3-py3-none-any.whl (579.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: arvel-0.63.3.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.63.3.tar.gz
Algorithm Hash digest
SHA256 0b6613029da06e8ed1d790838328c27882e3ca5a15134a70cc69b1bcf7cd271a
MD5 f5ae7c34d49b1f687415674652d1848b
BLAKE2b-256 d8413fb615df2b3a6af355a4a1f81310929ad5f02a95956809e026c53dc79eff

See more details on using hashes here.

Provenance

The following attestation bundles were made for arvel-0.63.3.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.63.3-py3-none-any.whl.

File metadata

  • Download URL: arvel-0.63.3-py3-none-any.whl
  • Upload date:
  • Size: 579.9 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.63.3-py3-none-any.whl
Algorithm Hash digest
SHA256 d0db6c399b3a488f431f018389dadc407f0835372c3f6b1abbd345612d2db213
MD5 5533a9cedb4d51ce7dfcb53f3a284aed
BLAKE2b-256 b6f03ece6670ad27931812346729694b43bf2168474c1a318e0e44a1f7ca6b83

See more details on using hashes here.

Provenance

The following attestation bundles were made for arvel-0.63.3-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