pyvel
Batteries-included Laravel-shaped DX for Python API backends on FastAPI.
Pyvel gives you an Artisan-like CLI (pyvel / artisan), convention-based project layout, and small runtime bases (AppError, register, events). It is backend/API only — no Blade, Vite, or frontend stack.
Long-term plans: see the workspace
roadmap/.
Install
uv add pyvel-fastapi
# or
pip install pyvel-fastapi
The import and CLI stay pyvel:
from pyvel import AppError, register
Quick start
uvx --from pyvel-fastapi pyvel init myapp
cd myapp
uv sync
uv run dev
Scaffold into the current directory:
mkdir myapp && cd myapp
uvx --from pyvel-fastapi pyvel init
Monorepo / unpublished local checkout:
uv run pyvel init myapp --pyvel-path /path/to/packages/pyvel
Stable CLI (0.1)
Entry points: pyvel, artisan (alias), and dev.
| Command | Purpose |
|---|---|
pyvel init [name] |
Scaffold a new API app (--force, --pyvel-path) |
pyvel make:exc |
Exception + HTTP handler |
pyvel make:req / make:res |
Request / response models |
pyvel make:middleware |
Middleware class |
pyvel make:router |
APIRouter module |
pyvel make:service |
Service class |
pyvel make:dependency |
FastAPI dependency |
pyvel make:schema / make:enum / make:config |
Schema, enum, settings |
pyvel make:event / make:listener / make:job |
Events, listeners, jobs |
pyvel make:test |
Pytest stub |
pyvel make:resource |
Router + requests + response + service |
pyvel list:routes |
List registered FastAPI routes |
dev |
Run uvicorn using pyvel.toml [dev] |
Stable public API (0.1)
Supported imports for application code:
from pyvel import AppError, EventDispatcher, dispatcher, register
# optional
import pyvel
print(pyvel.__version__)
| Symbol | Role |
|---|---|
AppError |
Base application error (override via [bases].error) |
register(app) |
Auto-register handlers, middleware, routers, listeners |
dispatcher / EventDispatcher |
In-process events |
Everything else under pyvel.* (templates, generate, make, config internals, …) is private and may change without notice.
See also API.md.
Config (pyvel.toml, optional)
All keys optional. Defaults:
app = "myapp" # required in practice — set by `init`
src = "src"
[dev]
module = "myapp.main:app" # default: "{app}.main:app"
host = "0.0.0.0"
port = 8000
reload = true
[paths]
errors = "http/exception/errors"
handlers = "http/exception/handlers"
requests = "http/requests"
responses = "http/responses"
middleware = "http/middleware"
routers = "http/routers"
dependencies = "http/dependencies"
services = "services"
schemas = "schemas"
enums = "domain/enums"
config = "config"
events = "events"
listeners = "listeners"
jobs = "jobs"
tests = "tests" # relative to project root
[bases]
error = "pyvel.errors:AppError"
Fallback: [tool.pyvel] app = "..." in pyproject.toml.
Out of scope (for now)
- Laravel-like
routes.py+RouteDSL / controllers — Phase 1 - Database / migrations — Phase 2 (
pyvel-db) - Auth / policies — Phase 3 (
pyvel-auth) - Queues, cache, mail — Phase 4+
- Frontend scaffolding — never (API-only)
Publish (maintainers)
From the package directory, build into a local dist/ then publish (workspace root builds go to the repo dist/ by default):
cd packages/pyvel
uv build --out-dir dist
uv publish
# Uploads as distribution name: pyvel-fastapi
# or TestPyPI:
# uv publish --publish-url https://test.pypi.org/legacy/
From the workspace root (if artifacts are already in ./dist):
uv publish dist/pyvel_fastapi-* dist/pyvel-fastapi-*
Until published, verify locally from a wheel:
uvx --from ./dist/pyvel_fastapi-0.1.0-py3-none-any.whl pyvel init /tmp/demoapp
# (wheel filename uses underscores; project name uses hyphens)
Roadmap
Workspace plans: roadmap/README.md. Phase 0 complete; next is Phase 1 (Artisan routing).
Release files for pyvel-fastapi 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pyvel_fastapi-0.1.0.tar.gz | 13.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pyvel_fastapi-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 31.5 kB
Release files / pyvel_fastapi-0.1.0.tar.gz
| Download URL | pyvel_fastapi-0.1.0.tar.gz |
|---|---|
| Size | 13.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f8d72f332572f08bc4582fd2b1b7e3531363539ead032f8201e2d3f35be9d62e
|
|
BLAKE2b-256 checksum How to use checksums |
a4b84411b0cf5949c4014158295bbfd44bab4f9c3a84f6c6899bb55900444a8a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.18 {"installer":{"name":"uv","version":"0.12.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / pyvel_fastapi-0.1.0-py3-none-any.whl
| Download URL | pyvel_fastapi-0.1.0-py3-none-any.whl |
|---|---|
| Size | 18.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9b831b258231484209da8bffe578c1d3fb3e07852bec1ecae73c39f760cd4f07
|
|
BLAKE2b-256 checksum How to use checksums |
e06c31050bbacfbea00a4dab049f9c6f6ff42931b94f23196642ba0f12c8a744
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.18 {"installer":{"name":"uv","version":"0.12.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|