← Stacks

Python API

Platform: server | python3.13

name: Python API
platform: server
language: python3.13
package_manager: uv
framework: fastapi
database: postgresql
orm: sqlalchemy
validation: pydantic
i18n: gettext or simple dict/json
auth: "shared-auth (Supabase Auth backend, or JWT for API-only)"
payments: "stripe (server-side, webhooks)"
linter: ruff (replaces flake8, isort, pyflakes)
formatter: ruff format (replaces black)
type_checker: ty (Astral, extremely fast, replaces mypy/pyright)
testing: pytest + httpx (TestClient) + pytest-asyncio + hypothesis (property-based)
pre_commit: pre-commit (ruff + ruff-format + ty hooks)
key_packages:
  - fastapi (API framework)
  - pydantic (schemas, validation  always first)
  - sqlalchemy (ORM, async)
  - alembic (migrations)
  - asyncpg (PostgreSQL async driver)
  - uvicorn (ASGI server)
  - httpx (HTTP client)
  - ruff (linter + formatter)
  - ty (type-checker, Astral  extremely fast, replaces mypy)
  - pytest + pytest-asyncio (testing)
  - hypothesis (property-based testing for schemas/edge cases)
deploy: docker | cloudflare_workers | hetzner
infra: pulumi (Python, infra/__main__.py)  Tier 2, or Cloudflare Workers for MVP (Tier 1)
ci_cd: github_actions
monitoring: posthog (analytics + errors, EU hosting)
logs:
  wrangler: "wrangler tail --format=pretty 2>&1 | head -50"
  docker: "docker logs {container} --tail=50"
  posthog: "PostHog dashboard → Error tracking"
  local_build: "uv run uvicorn src.{name}.main:app --port 8000 2>&1 | head -20"
architecture: layered (routers  services  repositories  models)
notes: |
  - uv for all dependency management (not pip/poetry)
  - Pydantic-first: models and validation before logic
  - FastAPI for HTTP API (not Flask/Django)
  - SQLAlchemy 2.0 style (mapped_column, async session)
  - Alembic for all schema migrations (never raw DDL)
  - PostgreSQL as default database
  - asyncpg for async, psycopg for sync fallback
  - ruff for linting AND formatting (replaces black + isort + flake8)
  - ty for type-checking (Astral, extremely fast — replaces mypy/pyright)
  - pytest + httpx TestClient for API tests, pytest-asyncio for async
  - hypothesis for property-based testing (schema validation, edge cases)
  - pre-commit with ruff + ty hooks
  - English first for API responses, i18n via gettext if needed
  - Project structure: src/<name>/{routers,services,models,schemas,db}/
Sources

Related