Architecture Overview
Module Status
| Module | Status | Notes |
|---|---|---|
| Core/Platform | ๐ง In Progress | AbstractId, Timestamps, DomainEventInterface, TenantId, FileStorage, org context contracts |
| Core/Identity | ๐ง In Progress | Tenant, User, ApiKey aggregates, Zitadel OIDC auth, API key auth, admin CRUD |
| Module/Organization | ๐ง In Progress | Full DDD module: Organization + OrgMembership, ltree hierarchy, admin + API |
| Module/People | ๐ Designed | User profiles, privacy, directory. Modeled on User aggregate. |
| Module/Groups | ๐ง In Progress | Full DDD module: Group + GroupMembership, member management, admin + API |
| Module/Events | ๐ง In Progress | Full DDD module: Event + EventRegistration, publish/cancel, recurrence, admin + API |
| Module/News | ๐ Designed | Multi-level feed, push notifications |
| Module/Giving | โณ Phase 2 | Donations, pledges, campaigns |
| Module/Chat | โณ Phase 2 | Group chat, 1:1 messaging |
| Pipeline/Audit | ๐ง In Progress | AuditEntry, async handler, superadmin UI |
| Pipeline/History | ๐ง In Progress | EntitySnapshot, versioned snapshots |
Architecture Layers
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Presentation Layer โ
โ API Controllers ยท Admin (Twig + Vue 3) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Application Layer โ
โ Commands ยท Queries ยท Handlers ยท DTOs โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Domain Layer โ
โ Aggregates ยท Value Objects ยท Domain Events ยท Contracts โ
โ โ Pure PHP, no framework โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Infrastructure Layer โ
โ Doctrine ยท Messenger ยท Flysystem ยท Zitadel ยท Redis โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Project Structure
src/
โโโ Core/ โ Platform, Identity (shared contracts)
โ โโโ Platform/ โ AbstractId, Timestamps, TenantId, events
โ โโโ Identity/ โ User, Tenant, ApiKey, auth
โโโ Module/ โ Feature modules (DDD bounded contexts)
โ โโโ Organization/
โ โโโ Groups/
โ โโโ Events/
โ โโโ People/ โ Designed, not yet implemented
โ โโโ News/ โ Designed, not yet implemented
โโโ Pipeline/ โ Observe & Protect (cross-cutting)
โโโ Audit/ โ Append-only audit log
โโโ History/ โ Entity version snapshots
Key Architecture Rules
- Domain layer is pure PHP. No Doctrine, no Symfony, no framework imports.
- Modules communicate via domain events or contract interfaces. Never import another module's domain or infrastructure.
- Every domain event is JSON-serializable with a
versionfield. - Deptrac enforces all boundaries. If Deptrac fails, the code doesn't merge.
- No cross-module database queries. One module, one schema prefix.
- Tests accompany every feature. Unit tests for domain, integration for infrastructure.
Tech Stack
| Layer | Technology |
|---|---|
| Backend | Symfony 8.0, PHP 8.4+ |
| Database | PostgreSQL 16 + ltree |
| Cache/Queue | Redis 7 + Symfony Messenger |
| Identity | Zitadel (self-hosted OIDC) |
| Frontend | React Native (Expo) โ iOS, Android, Web |
| Storage | Cloudflare R2 + CDN |
| Hosting | Hetzner, Docker, Cloudflare Pages |
| IaC | OpenTofu |
| CI/CD | GitLab CI/CD |