Tech Stack
Single source of truth for all technology choices, versions, and rationale.
Backend
| Technology | Version | Purpose | Cost |
|---|---|---|---|
| Symfony | 8.0 | Web framework, DDD-friendly, modular monolith | Free |
| PHP | 8.4+ | Backend language (enums, fibers, typed properties) | Free |
| PostgreSQL | 16 | Primary database (ltree for hierarchy, JSONB flexibility) | Included in Hetzner |
| PgBouncer | — | Connection pooling for PostgreSQL | Free |
| Redis | 7 | Cache + Symfony Messenger transport (async events, job queues) | Included in Hetzner |
| Doctrine ORM | 3.x | Database abstraction (XML mapping, custom types) | Free |
| Deptrac | — | Architecture boundary enforcement | Free |
| PHPStan | Level 8 | Static analysis | Free |
Frontend
| Technology | Version | Purpose | Cost |
|---|---|---|---|
| React Native | — | Cross-platform mobile + web framework | Free |
| Expo | SDK 52+ | Build tooling, OTA updates, router | Free |
| Expo Router | v4 | File-based routing (tabs, stacks, modals) | Free |
| TypeScript | 5.x | Type safety for frontend code | Free |
Identity & Auth
| Technology | Version | Purpose | Cost |
|---|---|---|---|
| Zitadel | Self-hosted | OIDC identity provider, universal login | Free |
| JWT | — | API authentication (bearer tokens from Zitadel) | — |
Infrastructure
| Technology | Version | Purpose | Cost |
|---|---|---|---|
| Hetzner | CPX21 + CPX11 | App server + DB server (EU data residency) | ~€12/mo |
| Docker | Compose | Container orchestration (all environments) | Free |
| OpenTofu | — | Infrastructure as Code (server provisioning) | Free |
| Cloudflare R2 | — | Object storage (media, profile images) | Free tier |
| Cloudflare CDN | — | Content delivery, DDoS protection | Free tier |
| Cloudflare Pages | — | PWA hosting (web app builds) | Free tier |
| MinIO | — | S3-compatible storage for local development | Free |
Email & Notifications
| Technology | Version | Purpose | Cost |
|---|---|---|---|
| Mailgun | EU region | Transactional email (password reset, invites, verification) | Free tier → ~€35/mo |
| Firebase FCM | — | Push notifications (Android) | Free tier |
| APNs | — | Push notifications (iOS) | Free |
Monitoring & Quality
| Technology | Version | Purpose | Cost |
|---|---|---|---|
| Uptime Kuma | Self-hosted | Uptime monitoring | Free |
| Prometheus + Grafana | Self-hosted | Metrics and dashboards | Free |
| Sentry | Self-hosted | Error tracking | Free |
| Mailpit | — | Email testing (local dev) | Free |
CI/CD
| Technology | Version | Purpose | Cost |
|---|---|---|---|
| GitLab CI/CD | Free tier | Automated pipeline (lint, test, deploy) | Free |
| Expo EAS | — | Native app builds (iOS, Android) | Free tier |
Total Monthly Cost
| Environment | Cost |
|---|---|
| Development | €0 (Docker Compose on laptop) |
| Staging | ~€4.50/mo (Hetzner CPX11) |
| Production | ~€12/mo (Hetzner CPX21 + CPX11) |
| Free tier → ~€35/mo at scale | |
| Total MVP | ~€25-35/mo |
Key Design Rationale
- Symfony 8 over Laravel: Better DDD support, explicit configuration, stable LTS cycle. Symfony’s service container and Messenger component fit the modular monolith pattern.
- PostgreSQL over MySQL: ltree extension for hierarchical queries (org trees), JSONB for flexible data, mature ecosystem.
- React Native + Expo over Flutter: JavaScript ecosystem, web support via Expo Web, OTA updates, larger talent pool.
- Zitadel over Keycloak: Modern OIDC provider, built-in multi-tenancy, better developer experience, Go-based (lighter than Java).
- Hetzner over AWS: EU data residency (GDPR), 5-10x cheaper for equivalent compute, simpler for a solo founder.
- Redis over RabbitMQ: Simpler to operate, sufficient for Symfony Messenger, doubles as cache layer.
- Cloudflare R2 over AWS S3: Zero egress fees, Cloudflare CDN integration, S3-compatible API.