Case study · CCA Group · 2024Completed
Dynamic form engine
Angular 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.
Role · Fullstack Engineer
- approximately halfp95 latency, roughly halvedCCA GroupKotlin coroutines ran independent downstream calls concurrently, which roughly halved p95 latency under peak load.
- days to hoursNew form typeCCA GroupEffort to create a new form type went from days to hours.
Overview
A configurable form engine for an admin panel and a customer-facing application at CCA Group. Instead of hand-building each new form, operators compose forms from templates, and the engine handles rendering, validation and submission end to end.
Problem
Every new form type was a development task that needed its own components, validation rules and backend handling. Creating one took days, and small variations between forms meant inconsistent behaviour for users and duplicated code for the team.
My role
I owned both sides of the stack: the Angular engine and component library on the frontend, and the Java/Kotlin services behind it, including the integration contract between them.
Goals
- Reduce the time to create a new form type from days to hours.
- Support conditional validation and real-time updates without custom code per form.
- Keep the admin panel and the customer-facing app visually and behaviourally consistent.
Technical approach
- An Angular engine that renders fields from customisable templates, applies conditional validation and updates dependent fields in real time as users type.
- A library of strongly-typed Angular components and shared services used by both the admin panel and the customer app, so a new form behaves the same in both by default.
- Java/Spring services that handle form processing and submission behind REST APIs.
- Versioned REST contracts documented with OpenAPI/Swagger, and authenticated calls between the Angular frontend and the Spring backend.
Challenges
The latency-sensitive backend paths made several independent downstream calls in sequence. I refactored those services from Java to Kotlin and used coroutines to run the independent calls concurrently.
Decisions & trade-offs
- Templates cost some flexibility for unusual forms, but they turned a development task into a configuration task for the common case.
- I moved only the latency-sensitive services to Kotlin instead of rewriting everything, which kept the migration risk small.
Results
- New form types went from days to hours to create.
- Concurrent downstream calls with coroutines roughly halved p95 latency under peak load.
- The admin panel and the customer-facing app share one component library.
Lessons learned
Most of the value came from the boring parts: a solid component library and a versioned contract between frontend and backend. The engine itself was the smaller half of the work.
Stack
- Angular
- RxJS
- TypeScript
- Java
- Kotlin
- Kotlin Coroutines
- Spring
- REST
- OpenAPI / Swagger
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
- Self-service menu platformAngular 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.NCR Voyix · 2025–2026 · Completed · Java · Spring · Microservices · Angular
- 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