Community Hub
FastAPI flagship portal — salon archive, curricula browser, contributor profiles, full-text search, adaptive syllabus, Atom feeds, WebSocket live rooms
flagshipGRADUATEDACTIVECIPlatinum
architecture
``` community-hub/ ├── src/community_hub/ │ ├── app.py # FastAPI app with lifespan, CORS, CSRF, rate limiting │ ├── config.py # Environment-based settings │ ├── csrf.py # Double-submit cookie CSRF middleware │ ├── logging_config.py # Structured logging │ ├── routes/ │ │ ├── api.py # JSON API endpoints │ │ ├── salons.py # Salon HTML routes │ │ ├── curricula.py # Curricula HTML routes │ │ ├── community.py # Events, contributors, stats │ │ ├── search.py # Full-text search (HTML + JSON) │ │ ├── syllabus.py # Learning path generation │ │ ├── feeds.py # Atom 1.0 syndication feeds │ │ └── live.py # WebSocket live salon rooms │ ├── templates/ # Jinja2 templates │ └── static/ # CSS ├── scripts/ │ └── entrypoint.sh # Docker entrypoint (runs Alembic then uvicorn) ├── tests/ # 122 tests ├── Dockerfile ├── render.yaml └── pyproject.toml ``` **Key dependencies:** - **koinonia-db** — shared SQLAlchemy models, Alembic migrations (installed from git) - **FastAPI** — async web framework - **psycopg 3** — PostgreSQL async driver (Neon-compatible) - **Jinja2** — HTML templating - **slowapi** — rate limiting (per-IP) **Security:** - CSRF protection via double-submit cookie on all POST routes - Rate limiting on syllabus generation endpoints (10-20/min) - WebSocket rate limiting (10 msg/sec) and message size limits (4 KB) - HTML escaping on all WebSocket broadcast messages - CORS configurable via `ALLOWED_ORIGINS`
Git Stats
- Commits
- 18
- Velocity
- 3.3/wk
- First
- 2026-02-17
- Last
- 2026-03-10
Dependencies
- organvm-vi-koinonia/koinonia-db