A personal cookbook app. Track your recipe collection, plan meals for the week, and let the bowl pick what you cook next.
| Layer | Tech |
|---|---|
| Backend | Spring Boot 4 · Kotlin · PostgreSQL · Flyway |
| Frontend | Angular 21 · Tailwind CSS v4 |
| Auth | Keycloak 26 (PKCE) |
| Infra | Kubernetes · SOPS/age · GitHub Actions |
| Observability | Prometheus · Grafana |
Prerequisites: Docker, Java 24, Node 22
# Start PostgreSQL + Keycloak
cd recipe-cicd
docker compose up -d
# Backend (localhost:8080)
cd recipe-server
./gradlew bootRun
# Frontend (localhost:4200)
cd recipe-client
npm install
npm startDefault Keycloak admin: admin / admin (change on first login).
Default app user: configured in Keycloak admin at localhost:8180.
cd recipe-cicd
docker compose --profile monitoring up -d
# Prometheus → localhost:9090
# Grafana → localhost:3000 (admin / admin)# Backend
cd recipe-server && ./gradlew test
# Frontend
cd recipe-client && npm testImages are built and pushed to GHCR, then deployed to Kubernetes via Kustomize.
cd recipe-cicd
# Build & push all images (server, client, keycloak)
bash build.sh
# Deploy to production
KUBECONFIG=~/Downloads/config-k8gdc.yml bash k8s/apply.sh prodSecrets are encrypted with SOPS + age.
The age key lives at ~/.config/sops/age/keys.txt (not in this repo).
| Variable | Used by | Description |
|---|---|---|
SPOONACULAR_API_KEY |
recipe-server | Calorie lookup via Spoonacular |
ANTHROPIC_API_KEY |
recipe-server | Dutch→English recipe name translation |
KEYCLOAK_ADMIN_PASSWORD |
recipe-cicd | Keycloak admin password |
POSTGRES_PASSWORD |
recipe-cicd | Database password |