1616
1717- [ FastAPI] ( https://fastapi.tiangolo.com ) — API framework
1818- [ Alembic] ( https://alembic.sqlalchemy.org ) — database migrations
19- - [ Celery] ( https://docs.celeryq.dev ) + Redis — background task queue
19+ - [ Celery] ( https://docs.celeryq.dev ) + [ Redis] ( https://redis.io ) — background tasks queue
2020- [ Ruff] ( https://docs.astral.sh/ruff ) — linter & formatter
2121- [ Loguru] ( https://loguru.readthedocs.io ) — logging
2222- [ Scalar] ( https://scalar.com ) — API docs
23+ - [ Quran Foundation OAuth2] ( https://api-docs.quran.foundation ) — user authentication via OAuth 2.0 Authorization Code + PKCE
2324
2425** Shared** (` packages/core ` )
2526
@@ -196,19 +197,26 @@ Always import new models in `alembic/env.py` for autogenerate to detect them.
196197
197198Create a ` .env ` file in the project root with the following variables:
198199
199- | Variable | Description |
200- | ------------------- | -------------------------------- |
201- | ` VITE_API_URL ` | Backend API base URL |
202- | ` DATABASE_URL ` | PostgreSQL connection string |
203- | ` REDIS_URL ` | Redis connection string |
204- | ` SECRET_KEY ` | Application secret key |
205- | ` POSTGRES_USER ` | DB user (used by Docker Compose) |
206- | ` POSTGRES_PASSWORD ` | DB password |
207- | ` POSTGRES_DB ` | DB name |
208- | ` OPENAI_API_KEY ` | OpenAI API key |
209- | ` OPENAI_BASE_URL ` | OpenAI-compatible base URL |
210- | ` VITE_GOOGLE_CLIENT_ID ` | Google OAuth client ID (frontend) |
211- | ` GOOGLE_CLIENT_ID ` | Google OAuth client ID (backend) |
200+ | Variable | Description |
201+ | ----------------------- | -------------------------------------------------------------------------------------------------- |
202+ | ` VITE_API_URL ` | Backend API base URL |
203+ | ` DATABASE_URL ` | PostgreSQL connection string |
204+ | ` REDIS_URL ` | Redis connection string |
205+ | ` SECRET_KEY ` | Application secret key |
206+ | ` POSTGRES_USER ` | DB user (used by Docker Compose) |
207+ | ` POSTGRES_PASSWORD ` | DB password |
208+ | ` POSTGRES_DB ` | DB name |
209+ | ` OPENAI_API_KEY ` | OpenAI API key |
210+ | ` OPENAI_BASE_URL ` | OpenAI-compatible base URL |
211+ | ` VITE_GOOGLE_CLIENT_ID ` | Google OAuth client ID (frontend) |
212+ | ` GOOGLE_CLIENT_ID ` | Google OAuth client ID (backend) |
213+ | ` VITE_QF_CLIENT_ID ` | Quran Foundation client ID (frontend, feature flag) |
214+ | ` QF_CLIENT_ID ` | Quran Foundation OAuth2 client ID |
215+ | ` QF_CLIENT_SECRET ` | Quran Foundation OAuth2 client secret (server-side only) |
216+ | ` QF_AUTH_BASE_URL ` | QF OAuth2 base URL (` https://oauth2.quran.foundation ` / ` https://prelive-oauth2.quran.foundation ` ) |
217+ | ` QF_API_BASE_URL ` | QF User API base URL (` https://apis.quran.foundation ` / ` https://apis-prelive.quran.foundation ` ) |
218+ | ` QF_REDIRECT_URI ` | Callback URL registered with QF (e.g. ` https://api.qalbwise.app/auth/qf/callback ` ) |
219+ | ` FRONTEND_URL ` | Frontend origin for OAuth callback redirect |
212220
213221Both the API and frontend load environment variables from the root ` .env ` file:
214222- API: ` apps/api/app/core/settings.py ` loads from ` ROOT_DIR / ".env" `
@@ -234,6 +242,10 @@ git commit -m "chore: bump dependencies"
234242
235243The ` pre-commit ` hook automatically runs Biome (JS/TS) and Ruff (Python) on staged files. The ` commit-msg ` hook validates the commit message format.
236244
245+ ## License
246+
247+ [ MIT] ( LICENSE ) — Copyright (c) 2026 Qalbwise
248+
237249## Boilerplate Inspirations
238250
239251- [ indrazm/moonrepo-kickstart] ( https://github.com/indrazm/moonrepo-kickstart )
0 commit comments