|
| 1 | +--- |
| 2 | +slug: rethinking-frontend-architecture-for-composable |
| 3 | +title: Rethinking frontend architecture - from enterprise pain points to composable frontends you can use too |
| 4 | +date: 2025-09-15 |
| 5 | +tags: [tech, frontend] |
| 6 | +authors: [jan.jagoda] |
| 7 | +--- |
| 8 | + |
| 9 | +Over the past few years, we’ve worked on many large-scale solutions. E-commerce applications, customer support portals, |
| 10 | +B2B service hubs - all combining content, integrations (PIM, search, e-commerce, ERP, IAM, custom APIs) and user-facing functionality, |
| 11 | +where delivering strong user and customer experience has always been a key priority. |
| 12 | + |
| 13 | + |
| 14 | +Many of those platforms were built on top of enterprise products. These provided headless backend APIs and, in some cases, |
| 15 | +their own frontend layer as well. |
| 16 | + |
| 17 | +Usually in practice, the frontend quality was rarely good enough. |
| 18 | + |
| 19 | + |
| 20 | + |
| 21 | +<!--truncate--> |
| 22 | + |
| 23 | +What we kept seeing was: |
| 24 | + |
| 25 | +- limited modularity, leading to slower development, duplicated work, and higher maintenance effort |
| 26 | +- outdated tech stack, making onboarding harder, limiting integration options, and increasing technical debt |
| 27 | +- no standard way to integrate with multiple backend APIs, leading to complete vendor lock-in and solution scaling related issues |
| 28 | +- performance bottlenecks, especially on integration-heavy pages |
| 29 | +- no proper UI library, which made consistent design hard to achieve |
| 30 | +- poor accessibility, often falling short of WCAG requirements |
| 31 | + |
| 32 | +In real-world projects, the impact of these issues became even clearer. Here are a few stories from systems we took over after previous vendors. |
| 33 | + |
| 34 | +## Real project stories |
| 35 | + |
| 36 | +### Performance in enterprise storefronts |
| 37 | + |
| 38 | +Recently, we conducted performance audits for headless and enterprise e-commerce frontends for two clients. In both cases, |
| 39 | +Core Web Vitals scores were below 10/100, even though the frontend was supplied by products licensed for hundreds of thousands of euros. |
| 40 | + |
| 41 | + |
| 42 | + |
| 43 | +Looking at the results, was this cost justified? Could the client have chosen a better solution? |
| 44 | + |
| 45 | +### Lack of reusable UI components |
| 46 | + |
| 47 | +In one project we observed that the application was built without a proper set of reusable UI components. Each new feature |
| 48 | +introduced its own styling and markup, which quickly led to inconsistencies across different areas of the interface. |
| 49 | +Even when some components already existed, there was no documentation in a tool like Storybook. As a result, teams — |
| 50 | +especially newly onboarded developers — often did not know where to find them, which led to further duplication. |
| 51 | +The lack of a shared library made it hard to maintain visual consistency and slowed down development. |
| 52 | +Small UI adjustments required repetitive work in many places, increasing the chance of introducing regressions and visual bugs. |
| 53 | +This not only affected developer velocity but also the overall user experience. |
| 54 | + |
| 55 | +### Coupling frontend and backend |
| 56 | + |
| 57 | +In another project we took over from a different vendor, integrations with backend systems were implemented directly in the frontend layer. |
| 58 | +Each frontend component communicated with APIs in its own way, without any form of backend-for-frontend or integration middleware. |
| 59 | + |
| 60 | + |
| 61 | + |
| 62 | +As a result, every change introduced by backend teams required parallel updates in multiple frontend components. |
| 63 | +This was time-consuming, error-prone, and caused dependency bottlenecks between teams. Instead of being able to work independently, |
| 64 | +teams often had to wait for each other, which slowed down delivery and raised the risk of introducing breaking changes into critical user-facing flows. |
| 65 | + |
| 66 | +### Vendor lock-in |
| 67 | + |
| 68 | +Another client faced rising costs for a headless SaaS API they used. Due to that, they wanted to switch to an alternative. |
| 69 | +The integration was so tightly coupled with the frontend that migrating would have been very costly and carried the risk of disrupting critical functionality. |
| 70 | + |
| 71 | +This illustrates a broader issue: when the frontend is too tightly bound to specific backend services, the cost of change becomes overwhelming. |
| 72 | +Instead of being able to adapt and evolve, companies find themselves locked into technology choices that no longer fit their needs. |
| 73 | + |
| 74 | +### Clients' doubts |
| 75 | + |
| 76 | +Faced with such complexity, many clients began asking the same question: **is migration even possible without disrupting the frontend experience?** |
| 77 | + |
| 78 | +The answer is far from simple. |
| 79 | + |
| 80 | +How to build something without introducing the same problems? |
| 81 | + |
| 82 | +How do you avoid rebuilding the same UI over and over again or at least do it to a lesser extent? |
| 83 | + |
| 84 | +How do you design something that is fully decoupled from the backend and more resilient to its changes? |
| 85 | + |
| 86 | +We also started asking ourselves those questions project after project. And as we looked for better ways to approach frontend in composable architecture, we gradually built a solution - improving it along the way. |
| 87 | + |
| 88 | +## Turning challenges into practical solutions |
| 89 | + |
| 90 | +The difficulties we observed were not isolated cases. As a team working together for years at [Hycom](https://hycom.digital/), |
| 91 | +we’ve gained extensive experience across industries, delivering and evolving large-scale customer-facing platforms. |
| 92 | +Over time, the same patterns and pain points kept reappearing. |
| 93 | + |
| 94 | +We’ve implemented self-service platforms for the energy sector, a digital platform combining customer support and sales features, |
| 95 | +B2B e-commerce and self-service portals for manufacturing, as well as e-commerce and customer support solutions for telecom. |
| 96 | +Along the way, we worked with clients such as **Orange Energia, Fortum, Dormer Pramet, T-Mobile, Osadkowski, and Salzburg AG.** |
| 97 | + |
| 98 | +These projects gave us a unique perspective: while the use cases varied, the underlying architectural challenges were very similar. |
| 99 | +Performance bottlenecks, lack of modularity, vendor dependencies, and integration complexity kept slowing down teams and increasing costs. |
| 100 | + |
| 101 | +## Our open-source approach to modern composable frontends |
| 102 | + |
| 103 | +The result of all that experience is an open-source development kit we’ve been building to support modern frontend applications. |
| 104 | +**It focuses strongly on customer self-service and support portals.** At the same time, **it can power digital platforms that combine |
| 105 | +multiple capabilities such as content, commerce, and customer engagement.** All of this is based on composable architecture. |
| 106 | + |
| 107 | +We called it **Open Self Service (O2S)**. It brings together best practices around modularity, performance, and accessibility, |
| 108 | +and introduces a consistent way to integrate with multiple backend APIs. O2S makes it easier to migrate or replace backend systems without |
| 109 | +disrupting the frontend layer, helping teams avoid vendor lock-in and stay in control of their architecture. |
| 110 | + |
| 111 | +### How O2S addresses the challenges |
| 112 | + |
| 113 | +- **Performance bottlenecks** → The Next.js-based foundations are optimized for Core Web Vitals with SSR/ISR, caching and best practices that directly address performance issues seen in enterprise frontends. |
| 114 | +- **Lack of reusable UI components** → A set of modular, CMS-driven components with Storybook documentation helps maintain consistency, speed up development and avoid duplication. |
| 115 | +- **Coupling frontend and backend** → A backend integration layer (NestJS-based) acts as a backend-for-frontend or middleware, decoupling frontend from backend changes and reducing cross-team dependencies. |
| 116 | +- **Vendor lock-in** → By isolating integrations behind a consistent API layer, backend services can be swapped or extended without disrupting the frontend code. |
| 117 | +- **Accessibility issues** → UI components are designed with WCAG compliance in mind, making accessibility a core part of the architecture rather than an afterthought. |
| 118 | + |
| 119 | +### Application starters |
| 120 | + |
| 121 | +To make all these capabilities easier to adopt, we develop [**application starters**](https://www.openselfservice.com/docs/app-starters/overview). |
| 122 | +This is one of the crucial parts of the project - starters are preconfigured frontend apps with ready-to-use integrations and UI components for specific use cases. |
| 123 | +Starters cover the most basic features for each use case, so they help start your implementations faster. You can freely extend or customize them. |
| 124 | + |
| 125 | +The first one we built was dedicated to [customer portals](https://openselfservice.com/), providing out-of-the-box features with room to expand into adjacent areas. |
| 126 | +More recently, we introduced a [starter for content-driven digital platforms](https://openselfservice.com/dxp), |
| 127 | +which offers a foundation for large-scale DXP setups and can be extended towards self-service or even commerce scenarios. |
| 128 | + |
| 129 | + |
| 130 | + |
| 131 | +### Wrapping up |
| 132 | + |
| 133 | +This is just the beginning. We continue to evolve both the framework and the starters, adding new features and integrations, |
| 134 | +and improving documentation and developer experience along the way. |
| 135 | + |
| 136 | +In our own projects, this approach has already made a difference. We can build faster, adapt to backend changes more easily, |
| 137 | +and deliver better user experience. |
| 138 | + |
| 139 | +And since the project is open-source, you can use it too. |
| 140 | + |
| 141 | +If you’re working on digital platforms, especially those that offer customer self-service features, and wonder whether the **composable architecture** |
| 142 | +concepts from commerce could also work in your world - maybe this is a good starting point? |
| 143 | + |
| 144 | +--- |
| 145 | + |
| 146 | +**Customer portal starter:** [https://www.openselfservice.com/](https://www.openselfservice.com/) |
| 147 | + |
| 148 | +**DXP frontend starter:** [https://www.openselfservice.com/dxp](https://www.openselfservice.com/dxp) |
| 149 | + |
| 150 | +**Open Self Service Docs:** [https://www.openselfservice.com/docs](https://www.openselfservice.com/docs) |
0 commit comments