Getting Started
PolePosition is designed around a uv-first workflow, while still supporting a
normal pip and virtualenv setup.
Install
Install the CLI as a tool:
uv tool install poleposition
Or install with pip:
pip install poleposition
Create a Project
polepos start shop-api
cd shop-api
cp .env.example .env
uv sync --extra dev
polepos db upgrade
uv run python -m shop_api.run
The generated runner reads .env at process startup, creates the FastAPI app
through create_app(), and serves the ASGI app exposed from shop_api.main.
Importing shop_api.app by itself does not initialize settings or logging.
polepos start defaults to --db sqlite. Use --db postgres when the generated
project should start with PostgreSQL settings, or --db none for a database-free
starter that omits SQLAlchemy and Alembic wiring.
Open the generated FastAPI docs at:
http://127.0.0.1:8000/docs
For all generated .env values, see the
Configuration Reference.
Add a Module
polepos add module customers
The command creates a module under src/shop_api/modules/customers/, adds
starter tests, wires the router, and registers model imports for Alembic
metadata discovery.
Generated module endpoint paths are relative to the module router. The standard
starter uses collection handlers such as @router.get("/") and
@router.post("/"), while api/router.py includes that router with a
module-specific prefix:
api_router.include_router(customers_router, prefix="/customers", tags=["customers"])
With the default API_V1_PREFIX, those handlers are served as:
GET /api/v1/customers/
POST /api/v1/customers/
Refine the generated files for the real domain:
model.pyschemas.pyservices/<module>_service.pyrepository.pyrouter.py
Use a different module template when the boundary is clearer:
polepos add module customers --template crud
polepos add module webhooks --api-only
polepos add module assistant --template ai-prompt
See Module Templates for the generated file layouts and tradeoffs.
If you generated the wrong boundary, remove it before adding the replacement:
polepos remove module customers
The remove command deletes the generated module, generated tests, and managed router/model/export wiring. It stops before deleting files if the wiring has drifted away from a managed layout.
If the module directory was already deleted manually, rerun
polepos remove module customers to clean the remaining generated tests and
managed router, model, and export wiring.
Removal does not change the live database. If the removed database-backed module had a table and you want that table removed too, create and review a migration after the code cleanup:
polepos db revision -m "remove customers table"
polepos db upgrade
Validate the Project Contract
polepos check
polepos check --json
polepos check --fix
The default check command is read-only and file-based. It reports lifecycle
drift without installing dependencies, running migrations, starting services, or
contacting external systems. Use --json for CI or agent workflows. Use
--fix when safe managed markers should be restored after a merge conflict.
Create and Apply Migrations
polepos db status
polepos db revision -m "add customers table"
polepos db upgrade
PolePosition generated projects are migration-first. Keep schema changes in Alembic instead of creating tables during application startup.
For details on polepos db, DATABASE_URL, PostgreSQL, and direct Alembic
usage, see Database and Migrations.
If something drifts, run polepos check and use the
Troubleshooting and FAQ guide.
Docker Workflow
Generated projects include a Docker setup with PostgreSQL:
cp .env.example .env
docker compose up --build
docker compose run --rm app uv run alembic upgrade head
The Docker migration command runs Alembic directly inside the generated app
container. For the host workflow, keep using polepos db upgrade.