A CLI tool for scaffolding Python backend projects
Project description
backendctl
Stop rewriting the same boilerplate. Start with a solid foundation.
backendctl is an interactive CLI that generates a batteries-included backend
project — auth, database, migrations, rate limiting, tests, linting, and optional
AI-assistant config — for the framework of your choice. Pick FastAPI,
Flask, or Django REST Framework, answer a few questions, and start coding
your actual business logic.
Features
- Three frameworks — FastAPI (SQLModel), Flask (SQLAlchemy), or Django REST Framework.
- JWT auth out of the box — register / login / refresh, Argon2 password hashing,
a
Usermodel, and a/users/meendpoint. - Database choice — PostgreSQL (with SQLite for tests), MongoDB, or both.
- Sane defaults — rate limiting, CORS, env-based config, layered settings.
- Migrations — Alembic (FastAPI), Flask-Migrate, or Django migrations.
- Tests included —
pytestsuite wired up with fixtures. - Tooling —
ruff,mypy,.pre-commit-config.yaml,.editorconfig. - AI-assistant ready — optional
CLAUDE.md/AGENTS.md,.cursorrules,mcp.json, and SDK dependency. uvorpip— your choice of package manager.
Installation
Requires Python 3.11+.
# Run without installing (recommended)
uvx backendctl new
# Or install as a tool
uv tool install backendctl
# Or with pip
pip install backendctl
From source
git clone https://github.com/dipto0321/backendctl
cd backendctl
uv sync
uv run backendctl --help
Usage
Interactive wizard
backendctl new
You'll be guided through:
- Project name
- Package manager (
uv/pip) - Framework (FastAPI / Flask / Django REST Framework)
- Database (PostgreSQL+SQLite / MongoDB / both)
- Authentication (JWT / none)
- Optional
namefield on theUsermodel - AI-assistant config (Claude / OpenAI / none)
- Git initialization
Non-interactive flags
Any flag you pass skips the matching wizard step:
backendctl new myapi --framework fastapi --db postgres --pm uv --no-ai
| Flag | Values | Description |
|---|---|---|
project_name |
string | Name of the new project (positional). |
--framework, -f |
fastapi | flask | django |
Web framework. |
--db |
postgres | mongodb | both |
Database. |
--pm |
uv | pip |
Package manager. |
--no-git |
flag | Skip git initialization. |
--no-ai |
flag | Skip AI-assistant setup. |
--version, -v |
flag | Print version and exit. |
What you get
After generation, backendctl runs pre-flight checks, writes the project, sets up
git (optional), and installs dependencies. Then:
cd myapi
cp .env.example .env # fill in your secrets
uv run fastapi dev # or: flask run / python manage.py runserver
Generated project layout
FastAPI
myapi/
├── src/myapi/
│ ├── main.py # app factory + lifespan
│ ├── core/ # config, database, security
│ ├── middleware/ # rate limiting
│ ├── api/v1/router.py # versioned router
│ └── modules/
│ ├── auth/ # models, schemas, service, deps, router
│ └── users/ # /me endpoint
├── alembic/ # migrations
├── tests/ # pytest suite
├── pyproject.toml
└── .env.example
Flask
myapi/
├── src/myapi/
│ ├── __init__.py # app factory
│ ├── config.py # Config / TestConfig
│ ├── extensions.py # db, jwt, limiter, migrate
│ ├── models/user.py
│ └── blueprints/
│ ├── auth/ # routes + service
│ └── users/ # /me endpoint
├── migrations/ # Flask-Migrate
├── tests/
├── pyproject.toml
└── .env.example
Django REST Framework
myapi/
├── config/
│ ├── settings/ # base / development / production
│ ├── urls.py, wsgi.py, asgi.py
├── apps/
│ ├── users/ # custom User model + /me
│ └── authentication/ # register + JWT token views
├── core/ # pagination, exception handler
├── tests/
├── manage.py
├── pyproject.toml
└── .env.example
Development
uv sync # install dev dependencies
uv run pytest # run the test suite
uv run ruff check src # lint
uv run ruff format src # format
uv run mypy src # type-check
The repository is laid out as:
src/backendctl/
├── main.py # Typer entry point
├── cli/new.py # `new` command + interactive wizard
├── core/ # config dataclasses, console helpers, pre-flight checks
├── generators/ # per-framework file writers (BaseGenerator + subclasses)
└── templates/ # pure functions returning file contents
To add or change generated output, edit the relevant function in
templates/ and the matching _scaffold() in generators/. The test suite
compiles every generated .py file, so syntax regressions are caught
automatically.
License
MIT © Dipto Karmakar
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
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 backendctl-0.2.0.tar.gz.
File metadata
- Download URL: backendctl-0.2.0.tar.gz
- Upload date:
- Size: 68.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
16f70056f7af342cf8f93edb9006d9c640c6d745aeda29978c1ef5d09e3f8d11
|
|
| MD5 |
cc1930fb845efcce1a94eee2a939329e
|
|
| BLAKE2b-256 |
78ffa74ab2739f21e8edce5e9b2052bda052ee651970ede9b836726fcadfc797
|
File details
Details for the file backendctl-0.2.0-py3-none-any.whl.
File metadata
- Download URL: backendctl-0.2.0-py3-none-any.whl
- Upload date:
- Size: 37.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7bd836b41102f71323008f8875f8f0c3b240eb147e01a46a4f7d16b3cbc6ae96
|
|
| MD5 |
4e0eace4590f96462f92cc45e4228ad5
|
|
| BLAKE2b-256 |
7e1457b757e3864392704542ea23403ba386c10c0636a05ccb7f51165a055929
|