Flask scaffolding CLI with component architecture and support for SQLAlchemy, Redis caching, async tasks, and Elasticsearch analytics
Project description
overflask
A CLI tool that scaffolds Flask projects with component-based architecture, and a runtime library that adds SQLAlchemy models, Redis caching, async/recurring tasks, and Elasticsearch analytics on top of Flask.
Create a project
Via Docker (no install required):
docker run --rm -it -u $(id -u):$(id -g) -v $(pwd):/workspace overflask/overflask create myapp
Or install and run locally:
pip install overflask @ git+https://gitlab.com/overflask/overflask.git
overflask create myapp
The CLI prompts for an initial component name and Postgres/Redis connection details, generates the project, pre-fills .env, and optionally starts the database containers.
myapp/
├── manage.py # project CLI
├── settings.py # configuration
├── requirements.pip # dependencies
├── compose.yaml # Docker Compose
├── conftest.py # pytest fixtures
├── ops/
│ ├── env.template
│ ├── migrations/ # Alembic
│ └── setup-traefik.sh
├── docs/
└── components/
└── myapp/
├── models.py
├── views.py
├── services.py
├── cli.py
├── tasks.py
└── tests.py
Add a component
python manage.py component add auth
Creates components/auth/ with the same structure and registers it in settings.COMPONENTS.
Runtime library
Generated projects import directly from overflask:
Models
from overflask import ModelBase
from sqlalchemy.orm import Mapped, mapped_column
class User(ModelBase):
# __tablename__ auto-set to "auth_users"
id: Mapped[int] = mapped_column(primary_key=True)
email: Mapped[str] = mapped_column(String(255), unique=True)
Table names are derived automatically as {component}_{plural_snake_case_model_name}.
Redis cache
from overflask import cached
@cached(ttl=300)
def get_user(user_id: int):
...
Backed by Redis db 15 with stampede prevention via locking.
Async tasks
from overflask import async_task
@async_task
def send_welcome_email(user_id: int, email: str) -> None:
...
# Enqueue immediately or with a delay
send_welcome_email.queue(user_id=42, email="alice@example.com")
send_welcome_email.queue(timedelta(minutes=5), user_id=42, email="alice@example.com")
Recurring tasks
from overflask import recurring_task
@recurring_task("0 9 * * MON-FRI")
def daily_report() -> None:
...
Tasks are stored in Elasticsearch and dispatched via Redis. Run the supporting processes:
python manage.py tasks scheduler # polls ES, dispatches due tasks
python manage.py tasks worker # executes tasks from Redis queue
Analytics
from overflask.analytics import Analytics
Analytics.record("user.registered", area="auth", plan="free")
Analytics.record("purchase.completed", area="billing", amount=99)
Events are buffered in-process and bulk-flushed to Elasticsearch in the background. Each area gets its own monthly index (myapp_analytics_auth-2026.03).
Database migrations
python manage.py db migrate -m "add users table"
python manage.py db upgrade
python manage.py db downgrade 001
Testing
pytest # all tests
pytest -m unit # unit tests only (no DB)
pytest -m integration
pytest -n auto # parallel
Integration tests run against a real PostgreSQL instance using a cloned template database — fast isolation without create_all() per test. Redis is always replaced with fakeredis.
Deployment
The generated project ships with a Gunicorn config and Traefik integration for HTTPS:
bash ops/setup-traefik.sh # one-time Traefik setup per server
docker compose up -d
docker compose exec web python manage.py db upgrade
See docs/traefik.md and docs/gunicorn.md in the generated project for details.
Development
pip install -e ".[dev]"
pytest
ruff check src/ tests/
ruff format src/ tests/
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file overflask-0.8.1.tar.gz.
File metadata
- Download URL: overflask-0.8.1.tar.gz
- Upload date:
- Size: 82.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0b297d9352a963c585f67a799c09355cdb9391e25b57a7a6e483ed9a78540609
|
|
| MD5 |
4e43fb8da909ef68639ae6bcc35f8192
|
|
| BLAKE2b-256 |
cd221d2530f6b3f81d26b7b884daefdc562dc2a502f0c2c7d8acb2513fd7ee97
|
File details
Details for the file overflask-0.8.1-py3-none-any.whl.
File metadata
- Download URL: overflask-0.8.1-py3-none-any.whl
- Upload date:
- Size: 77.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f11d96bfd7f56c3dca47de339567d86e19617ebb2bcddd3e30c3bfa59f57b834
|
|
| MD5 |
feae6893e8027e81529fbfb277e821c4
|
|
| BLAKE2b-256 |
67a574aee00ca4e21dd318f5e0e8d2d926e444a006ad7210d1f774c16edd5066
|