Skip to main content

Tech stack

The full inventory of what GreekManage runs on, where it lives in the codebase, and why we picked it.

Backend

ConcernChoiceWhy
LanguagePython 3.13Type hints + native async, Django 6 minimum
Web frameworkDjango 6.0Mature ORM, auth, admin, signals, migrations
API frameworkDjango REST Framework 3.17Standard for Django REST APIs
ASGI serverDaphneRequired for Channels (WebSockets)
Production WSGIGunicornBattle-tested for sync HTTP
RealtimeDjango Channels 4.3WebSocket support for chatbot streaming + live election results
DB driverpsycopg 3 (binary)Modern Python ↔ Postgres
Authdjangorestframework-simplejwt 5.5JWT access + refresh, blacklist, rotation
SAMLpython3-saml 1.16SAML 2.0 SP for enterprise SSO
OAuthrequests-oauthlib 2.0OAuth 2.0 / OIDC (Microsoft, Google, Okta, LinkedIn)
Encryptioncryptography 46 (Fernet, MultiFernet)PII at rest + key rotation
Background jobsCelery 5.6 + Celery BeatAsync tasks + periodic scheduling
OpenAPIdrf-spectacular 0.29Auto-generated schema → this docs site
AI providersanthropic, openai, google-genaiBYOM per org
Excel exportopenpyxl 3.1XLSX for compliance + finance reports
CORSdjango-cors-headers 4.9Frontend cross-origin
Static fileswhitenoise 6.12Serve static assets without nginx
Storage abstractiondjango-storages 1.14S3 / MinIO backend
Static env loadingdjango-environ 0.13.env file → settings

Database

  • PostgreSQL 17 with the pgvector extension
    • pgvector powers AI embeddings for semantic search and the chatbot's retrieval-augmented generation
  • Row-Level Security (RLS) for tenant isolation on org-scoped tables → Multi-tenancy & RLS
  • Indexes: standard B-tree on FKs; trigram (pg_trgm) on member-search columns

Cache + queue

  • Redis 7
    • DB 0: Celery broker + result backend
    • DB 1: E2E test isolation
    • DB 2: staging
    • Channels layer: WebSocket pub/sub

Object storage

  • MinIO locally (S3-compatible)
  • AWS S3 or any S3-compatible (Cloudflare R2, Backblaze B2, Wasabi) in production
  • Per-org override via StorageConfig model — orgs can BYO bucket

Frontend

ConcernChoiceWhy
UI libraryReact 19Server components on the way; concurrent rendering
LanguageTypeScript 5.9Strict mode, no any
Build toolVite 7Fast HMR, ESM-native
StylingTailwind CSS 4.2Utility-first; design tokens via CSS vars
Component libraryshadcn/ui (Radix UI primitives)Owned components, accessible, themeable
RoutingReact Router 7Standard client-side routing
Server stateTanStack Query 5Data fetching, caching, optimistic updates
Client stateZustand 5Lightweight stores (auth, user-context, forum-membership)
FormsReact Hook Form + ZodSchema-validated forms
ChartsRechartsLightweight, composable
AnimationFramer MotionPage transitions, sidebar slide, KPI counts
IconsLucide ReactConsistent 24px grid
Datedate-fnsTree-shakeable, immutable
Markdownreact-markdownRender user content (forum posts, bulletins)

Mobile

  • Capacitor 8 wraps the React frontend as a native iOS / Android app
  • @aparajita/capacitor-biometric-auth — Face ID / Touch ID / fingerprint unlock
  • Fastlane — iOS TestFlight + Play Store distribution
  • Build config in frontend/ios/ and frontend/android/

Infrastructure

LayerTooling
Local devDocker Compose v2
Production orchestrationKubernetes (manifests in k8s/)
TLScert-manager + Let's Encrypt
Ingressnginx-ingress
Secret managementKubernetes Secrets (raw); roadmap: External Secrets / Sealed Secrets
Image registry(Customer choice — typically GHCR or AWS ECR)

CI / CD

WorkflowTriggerPurpose
ci.ymlPush, PRBackend tests + frontend build + Android Gradle build + SAST + audit
e2e.ymlPush, PRPlaywright smoke + ZAP API + ZAP baseline
security-nightly.yml6am ET dailyFull ZAP active scan, opens GitHub issue on failure
claude-code-review.ymlPR opened/readyClaude Code review (advisory)
docs-site.ymlPath-filtered to docs-site/**Builds Docusaurus, deploys to GitHub Pages

Quality + security tools

ToolWhat it checksWhere
SonarQubeQuality gate (coverage, code smells, duplicates)sonar-project.properties
BanditPython SAST.bandit.yml
SemgrepMulti-language SAST.semgrep.yml
pip-auditPython dependency CVEsCI
npm auditJS dependency CVEsCI
TrivyFilesystem + image CVEs.trivyignore
gitleaksSecret leaks in commits.gitleaks.toml
OWASP ZAPDynamic app scanning (DAST)E2E + nightly

Observability

Currently minimal. Logs ship via container stdout; no APM, metrics, or aggregation in place. Adding Sentry + Prometheus is on the roadmap.

Observability

Testing

LayerTool
Backend unit + integrationpytest + pytest-django
Backend coveragecoverage.py (target ≥80%)
Frontend unitVitest + React Testing Library
E2EPlaywright (browser auth fixture, ~132 tests)
API securityOWASP ZAP (credentialed scan)
Mobile UIManual on TestFlight / Play Store internal track

Testing guide

What's intentionally not used

  • GraphQL — REST + auto-generated OpenAPI is sufficient and easier to cache
  • WebPack — Vite is faster
  • Redux — Zustand + React Query covers everything
  • Material-UI — shadcn/ui gives ownership of components
  • Heroku / Render — K8s for production-grade scaling and observability
  • MongoDB / NoSQL — Postgres + JSONB covers semi-structured cases

Versioning

Backend: SemVer per backend/VERSION and CHANGELOG.md. Frontend: SemVer per frontend/package.json. API contract: tracked via drf-spectacular schema; breaking changes bump major version.