← Back to Projects

Yum Recipes

Production-grade engineering practices on a simple recipe app

Yum Recipes preview
Yum Recipes — Angular frontend with recipe browsing, search, and detail views

Overview

This is not a demo or toy app — it reflects my actual working approach. The domain is intentionally simple so the focus stays on the engineering practices rather than business logic. The point is to show how I think about building software that is ready for production: containerised, orchestrated, tested at multiple layers, and deployed with a real CI/CD pipeline.

Stack

Layer Technology
FrontendAngular 11 — Node.js 16
BackendNode.js 24 / Express
DatabaseMongoDB
Reverse ProxyNginx
ContainerisationDocker + Docker Compose
OrchestrationKubernetes (K3d / K3s)
CIGitHub Actions
CDRender (frontend + backend)

CI/CD

  • ci.yml runs on every PR: Jest unit tests, frontend build, and Playwright e2e tests
  • Render auto-deploys on push to master using Build Filters — frontend only deploys when frontend/ changes, backend only when backend/ changes
  • Playwright HTML report uploaded as a GitHub Actions artifact after each CI run
  • No secrets required — Render uses GitHub integration
GitHub Actions workflow runs
GitHub Actions — workflow run history
CI run — Backend, Frontend and E2E checks passing
CI run — backend, frontend, and E2E checks all passing

Testing

Unit — Jest

Backend unit tests covering core business logic.

End-to-End — Playwright

Full browser automation tests. Runs in CI on every PR. Requires Node 24.

Performance — autocannon

HTTP load testing against the running app on localhost:80.

Kubernetes

Local Kubernetes runs on K3d (K3s in Docker). Kustomize overlays handle environment-specific configuration without duplicating manifests. Two ingress options are supported: Traefik and Nginx.

npm run k8s:traefik npm run k8s:nginx
Project architecture overview — local dev to CI to production
Full pipeline: local dev (K3d / Docker Compose) → GitHub Actions CI → Render production

Docker Compose Environments

File Use
docker-compose.dev.ymlLocal development — source code is bind-mounted so changes reflect instantly without rebuilding the image
docker-compose.prod.ymlProduction simulation — fully baked images, only port 80 exposed via Nginx, no dev tooling
docker-compose.ci.ymlUsed in GitHub Actions — builds fresh images from source on every run to catch build failures early

Intentionally Out of Scope

Monitoring/observability, log aggregation, authentication/RBAC, rate limiting, and HTTPS/TLS certificates are out of scope — not because they don't matter, but because this project exists to demonstrate infrastructure and delivery practices, not to be a complete production system.