Case study · NCR Voyix · 2025–2026Completed
Self-service menu platform
Angular platform that lets US-market restaurant clients customise their menus themselves, on top of Java/Spring backend-for-frontend and aggregator services in a system serving ~2 million users.
Role · Senior Fullstack Engineer
- about 2 millionUsers servedNCR VoyixEnterprise system serving around two million users, run on GCP with full observability.
- up to 8Services behind one BFFNCR VoyixOne backend-for-frontend and aggregator over up to eight downstream services.
Overview
Part of a large distributed retail platform at NCR Voyix serving around two million users. I designed and maintained the JVM microservices that feed the client-facing applications, and built an Angular platform that lets US-market clients update their menus through self-service.
Problem
Menu updates went through a manual process: clients requested changes and someone applied them, which was slow for clients and expensive to operate. On the backend, client applications needed data from many downstream services, and each consumer stitching that together on its own led to duplicated logic and inconsistent responses.
My role
Senior fullstack engineer: microservice design and maintenance on the backend, the Angular self-service product on the frontend, production operations on GCP, and technical direction through code review and architecture input.
Goals
- Replace the manual menu update process with self-service for clients.
- Give client applications one consistent, purpose-built API instead of many downstream calls.
- Run the services in production with full observability.
Technical approach
- A Java/Spring backend-for-frontend shaped around what the client applications need, so the frontend stays simple and the downstream topology can change without breaking it.
- An aggregator service that combines data from up to 8 downstream services into one response.
- An Angular self-service platform with dynamic menu customisation and the workflows US-market clients need to publish their own changes.
- Metrics, logging and alerting for every service on GCP, so we catch incidents before clients notice.
- LLM and agentic tooling, including MCP integrations, to automate test scaffolding and internal data lookups.
Challenges
Consolidating eight downstream services means eight ways to be slow or unavailable. The aggregator had to degrade gracefully and stay observable enough to tell which dependency was the problem.
Decisions & trade-offs
- A BFF adds a network hop but removes coupling, and the extra service pays off when the frontend has to evolve independently of a large distributed backend.
- Self-service moves responsibility to the clients, so guardrails and validation in the platform matter more than raw flexibility.
Results
- US-market clients can update menus themselves, replacing the manual update process.
- Client applications consume one aggregated API instead of integrating with up to eight services.
- Services run on GCP with full metrics, logging and alerting for a system serving ~2 million users.
Lessons learned
In a system this size I treat observability as part of each feature from the first commit. The LLM tooling paid off most on scaffolding and data lookups, the routine work that slows a team down.
Stack
- Java
- Spring
- Microservices
- Angular
- GCP
- Observability
- LLM tooling
- MCP
More projects
All projects- OwniraA compliance operations inbox for official Czech data-box mail (datová schránka): every message becomes tracked work for accounting and tax practices. In pilot.Ownira · Pilot · Kotlin · Java 21 · Spring Boot · PostgreSQL
- Dynamic form engineAngular form engine with conditional validation, real-time updates and customisable templates, backed by Java/Kotlin services. Cut the effort to create new form types from days to hours.CCA Group · 2024 · Completed · Angular · RxJS · TypeScript · Java
- Three services in three monthsTicketing, booking and subscription services in Kotlin and Spring Boot, built from scratch in a three-month engagement, plus CI queue times cut from hours to minutes.CreativeDock · 2026 · Completed · Kotlin · Spring Boot · SpringMockK · Testcontainers