Skip to main content

A Laravel-grade 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 Laravel

If you're coming from PHP, arvel will feel familiar: facades, the service container, providers, migrations, factories, gates & policies, and a Laravel-style 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.44.0.tar.gz (704.4 kB view details)

Uploaded Source

Built Distribution

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

arvel-0.44.0-py3-none-any.whl (293.7 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for arvel-0.44.0.tar.gz
Algorithm Hash digest
SHA256 c5dd7f86f505615346bb8065460d1ef93427f7743dbd2940562715025bcd3bdb
MD5 c17d05b0d9845c641ed631e894854fbc
BLAKE2b-256 c67022dbef325a3672b722e00c618d62db68bba45021a34ff19c149fa3fdd8e5

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: arvel-0.44.0-py3-none-any.whl
  • Upload date:
  • Size: 293.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.44.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4ea41cbe27770b8af2482aea1fc056b07e4ef63a483a20f1c69bf28496cb14b4
MD5 4c5ea57172efff647af2fe160c89cc4f
BLAKE2b-256 e302c0a6b45f2c8d9c2795417847045a069ff82f713f3ceafe6eb3bf60a3577b

See more details on using hashes here.

Provenance

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