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)
- Database name / user / password (defaults: slug / slug / auto-generated)
- 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. |
--db-name |
string | Database name (default: project slug). |
--db-user |
string | PostgreSQL user (default: project slug). |
--db-password |
string | PostgreSQL password (default: auto-generated). |
--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. A docker-compose.yml is generated for
your chosen database, and .env ships with working credentials that already match
it — no manual copying or editing required to get a database running. Then:
cd myapi
docker compose up -d # start the database
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
Metadata
Release files for backendctl 0.4.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 | Provenance | |
|---|---|---|---|---|
| backendctl-0.4.0.tar.gz | 97.5 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| backendctl-0.4.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 139.4 kB
Release files / backendctl-0.4.0.tar.gz
| Download URL | backendctl-0.4.0.tar.gz |
|---|---|
| Size | 97.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b28f8b6ccad5f12f12da3ea2e693e4fdcdab3b4289f7e205deac4166acc266b0
|
|
BLAKE2b-256 checksum How to use checksums |
689a09e4bfcc3647004f8dfaa2bc9b877f507a1e18fbde54ac7e21b6335bafb3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","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}
|
Release files / backendctl-0.4.0-py3-none-any.whl
| Download URL | backendctl-0.4.0-py3-none-any.whl |
|---|---|
| Size | 41.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e5627c34466d4fd5948f62fba7a2832ae227f37da6cbb8a23f7c891fc2ae83cd
|
|
BLAKE2b-256 checksum How to use checksums |
6c9a8cc017eda628cc327d66d3b43ea586426632dfff1fe1d700d9c130d5053b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","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}
|
Security for backendctl 0.4.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.