Prana is a zero-cost AQI + weather monitoring platform. Python/FastAPI backend ingests OpenAQ data, enriches with Open-Meteo weather, serves read-only JSON API.
prana/
├── apps/
│ └── backend/ # FastAPI + MongoDB (the application)
│ ├── src/ # Production code
│ │ ├── api/ # Routers, middleware, schemas
│ │ ├── db/ # Repository pattern (Motor/MongoDB)
│ │ ├── models/ # Pydantic v2 models
│ │ ├── scripts/ # CLI tools (ingestion, retention)
│ │ └── services/ # Business logic
│ ├── specs/ # Feature specifications
│ └── tests/ # pytest (async, respx mocking)
├── pyproject.toml # Root workspace config (uv workspaces)
├── AGENTS.md # Development guidelines
└── .github/workflows/ # GitHub Actions (CI/CD)
# From repository root (uses workspace)
uv sync --extra dev
# Or from apps/backend/
cd apps/backend && uv sync --extra dev
pytest tests/ -v # Run tests
ruff check src/ && ruff format src/ # Lint
mypy src # Type check
uvicorn src.api.main:app --reload # Dev serverGET /health- Health checkGET /api/v1/cities- City snapshotGET /api/v1/stations- Station dataGET /api/v1/stations/{id}- Individual station