Django's structure. FastAPI's speed.
What is FastAPI-Jet?
FastAPI-Jet helps you build and manage modular, multi-app FastAPI projects with a familiar, Django-inspired workflow.
It is not a full-stack generator. It is a structure and CLI tool for teams who want clear app boundaries and commands that stay useful after day one.
Who is it for?
- Teams outgrowing a single
main.py - Developers coming from Django who want
startproject/startapp - Tech leads defining a consistent FastAPI layout
Quick start
pip install fastapi-jet
# Create a project
fastjet startproject myapi
cd myapi
# Install and run (generated project is self-contained)
pip install -e ".[dev]"
fastjet runserver
Visit http://127.0.0.1:8000/docs — you'll see a /health endpoint and a sample core app at /core/.
CLI commands
| Command | Description |
|---|---|
fastjet startproject <name> |
Create a modular project skeleton |
fastjet startapp <name> |
Add a new app under apps/ |
fastjet startapp <name> --crud |
App with schemas, services, dependencies |
fastjet startapp <name> --versioned |
/v1/<name> prefix pattern |
fastjet startapp <name> --register |
Auto-add to INSTALLED_APPS (AST-safe) |
fastjet runserver |
Run the dev server (Uvicorn) |
fastjet apps |
List registered apps |
fastjet routes |
Show the full route map (tags, deps) |
fastjet check |
Validate structure, imports, and settings |
fastjet shell |
REPL with app and settings loaded |
Aliases: fastapi-jet and fastjet.
Project layout
myapi/
├── base/
│ ├── main.py # FastAPI app + INSTALLED_APPS
│ ├── core.py # Settings
│ └── routing.py # Router registration (no runtime jet dependency)
├── apps/
│ └── core/ # Sample app included in new projects
├── tests/
├── pyproject.toml
└── .fastapi-jet # Project marker
Adding a feature
fastjet startapp users
fastjet startapp billing --crud --register
fastjet startapp api --versioned
With --register, the app is added to INSTALLED_APPS in base/main.py automatically (AST-safe). Without it, the CLI prints the line to paste manually.
Register manually in base/main.py if you prefer:
INSTALLED_APPS: list[AppRoute] = [
AppRoute(name="core", prefix="/core", tags=["core"]),
AppRoute(name="users", prefix="/users", tags=["users"]),
]
Then inspect your API:
fastjet routes
What FastAPI-Jet is not
- Not a "generate my entire SaaS" tool — try fastapi-forge or fastapi-spawn
- Not zero-opinion raw FastAPI — use FastAPI directly if you want no structure
- Not schema-first codegen — try feathers
See CONTRIBUTING.md and docs/CONVENTIONS.md for app layer structure and workflow.
Contributing
Contributions are welcome. Before opening a PR:
pip install -e .
pip install pytest ruff pre-commit
ruff check .
pytest
pre-commit run --all-files
See .cursor/rules/fastapi-jet.mdc for project conventions.
License
MIT — see LICENSE.
Acknowledgements
Inspired by Django's project/app model and the manage-fastapi project.
Metadata
Release files for fastapi-jet 1.2.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 | |
|---|---|---|---|
| fastapi_jet-1.2.0.tar.gz | 15.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| fastapi_jet-1.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 49.3 kB
Release files / fastapi_jet-1.2.0.tar.gz
| Download URL | fastapi_jet-1.2.0.tar.gz |
|---|---|
| Size | 15.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
73360d36e4ae004f2f25445a37b2a45e6061396ec44c37a504eb4b4bd9ca3602
|
|
BLAKE2b-256 checksum How to use checksums |
151e0a8347d9c499ebbbd66af8f303f43e8faba1d7e2d050dd0a04bcd6d3cf7a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Release files / fastapi_jet-1.2.0-py3-none-any.whl
| Download URL | fastapi_jet-1.2.0-py3-none-any.whl |
|---|---|
| Size | 33.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
292cd92912a5a3bc389db34a3d34d5e4b1b5bd51f11e858e5a9f7a56012b1831
|
|
BLAKE2b-256 checksum How to use checksums |
e558ae5124aae5b782ae17cd4ac067472eff07fbaa11d072955a11c7020a4434
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|