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.59.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.59.0-py3-none-any.whl (558.3 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: arvel-0.59.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.59.0.tar.gz
Algorithm Hash digest
SHA256 78078f1b308c7a52b12574df11eab98dad74a51e38fd215427feb33ad47a80c2
MD5 c2f12b73d16ace067430d465f8fdf675
BLAKE2b-256 5e6d00da99e014727353df6b1cdc41aedde48ae7d399ce293a2fdf3d34e2baf0

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: arvel-0.59.0-py3-none-any.whl
  • Upload date:
  • Size: 558.3 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.59.0-py3-none-any.whl
Algorithm Hash digest
SHA256 418f4ac3d856e8cdd4aaea054ccde9c97a76868b34e88dd04a5352de71048260
MD5 284ddafc53eb4adb1c99cfc8eb7eda52
BLAKE2b-256 13a3a87d4abe3da2bcd49714d5a49ef6c5233a848d29bd24b806123a14b5392e

See more details on using hashes here.

Provenance

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