Personal finance app — track expenses, manage budgets, and get spending alerts.
cp .env.example .env
# Generate these values and paste them into the matching entries in .env
openssl rand -base64 32 # BETTER_AUTH_SECRET
openssl rand -base64 24 # GRAFANA_ADMIN_PASSWORD
docker compose config --quiet
docker compose up -d --buildOpen http://localhost:9099. See Development Setup for the full guide (native Nx mode, endpoints, per-service instructions).
This also brings up the observability stack - metrics, logs and alerting in Grafana at http://localhost:3001 (log in as admin with the GRAFANA_ADMIN_PASSWORD you set in .env). See Observability.
| Environment | App | Drizzle Studio |
|---|---|---|
| Stage | https://stage.t99.stud.k8s.aet.cit.tum.de | https://studio.stage.t99.stud.k8s.aet.cit.tum.de |
| Prod | https://t99.stud.k8s.aet.cit.tum.de | https://studio.t99.stud.k8s.aet.cit.tum.de |
| Azure VM | https://expenseflow-app.spaincentral.cloudapp.azure.com | — |
Metrics, dashboards and alerting. Behind the same GitHub OAuth gate as Drizzle Studio - repo collaborators only, one login per environment covers all three.
| Environment | Grafana | Alertmanager | Alert mail |
|---|---|---|---|
| Stage | https://grafana.stage.t99.stud.k8s.aet.cit.tum.de | https://alerts.stage.t99.stud.k8s.aet.cit.tum.de | Resend → noreply@1ho.st |
| Prod | https://grafana.t99.stud.k8s.aet.cit.tum.de | https://alerts.t99.stud.k8s.aet.cit.tum.de | Resend → noreply@1ho.st |
| Local | http://localhost:3001 | http://localhost:9093 | http://localhost:8025 (MailHog) |
Part of the app's Helm chart, so it deploys with everything else. Firing alerts are emailed through Resend on the cluster; locally they are captured by MailHog at http://localhost:8025 instead of being delivered, so no SMTP credentials are needed for dev. See Observability.
Every push to main is automatically deployed to stage. Promote to prod via the Deploy to Production workflow dispatch in GitHub Actions. For manual deploys: bun deploy:k8s. See Kubernetes Deployment.
All three members contributed across the full stack throughout the project. Responsibilities rotated heavily — the areas below reflect where each person took the lead, not exclusive ownership.
| Member | Primary focus |
|---|---|
| Daniel Günther (@danielgnth) | Monorepo tooling (NX), CI/CD pipelines, Kubernetes / Helm infrastructure |
| Stefania Mocan (@stefaniamocan) | Azure VM deployment (Terraform + Ansible), Docker Compose stack, OpenAPI generation, architecture docs |
| Bilgehan Savgu (@bilgehansavgu) | Playwright end-to-end testing, Java microservices foundation, authentication (Better Auth), React client (UI/shadcn), budget feature, Caddy setup, GenAI service |
| Topic | Link |
|---|---|
| Development setup | docs/development/SETUP.md |
| Architecture & services | docs/architecture/SERVICE_OVERVIEW.md |
| Auth dev guide | docs/development/AUTHENTICATION.md |
| OpenAPI & generated clients | docs/development/API_CLIENTS.md |
| Kubernetes deployment | docs/deployment/KUBERNETES.md |
| Azure VM deployment | docs/deployment/AZURE.md |
| Scripts reference | docs/development/SCRIPTS.md |
| Observability | docs/deployment/OBSERVABILITY.md |
| Problem statement | docs/problem/PROBLEM_STATEMENT.md |