Lonely Planet

Lonely Planet is the world's most trusted travel brand — and one of the most content-rich. With decades of destination knowledge behind them and millions of monthly visitors, keeping that platform modern, fast, and extensible is no small feat. When the time came to migrate their editorial content to a headless CMS and lay the backend groundwork for a new mobile travel app, Lonely Planet turned to Curiosum.
We stepped in as a backend engineering partner to help modernize the content delivery architecture — bridging a legacy CMS with its modern successor while keeping production traffic uninterrupted — and to design and build the microservices layer powering both the existing website and the brand-new Flutter-based mobile application.
The result is a distributed, event-driven Elixir platform running on AWS and Kubernetes: reliable, observable, and built to scale with the brand's global reach.

Technologies
Project Overview
Lonely Planet needed to evolve two foundational layers of their platform simultaneously: their content management infrastructure and their mobile product backend.
On the content side, they were in the process of moving from a long-standing Drupal-based CMS to a modern headless CMS. This migration had to be handled with surgical precision — the new and old systems needed to coexist and serve consistent, merged content to the website without disruption to editorial workflows or end users.
On the mobile side, Lonely Planet was building a new travel planning application in Flutter, and needed a robust, well-structured backend to power it — one capable of assembling complex UI-ready data from multiple sources and delivering it efficiently to the app.
Curiosum's engineers were embedded in the Lonely Planet backend team, taking ownership of key microservices across both of these fronts.
The Challenge
Migrating content infrastructure at scale is never straightforward. The challenge here was twofold: the new CMS had to be integrated progressively, without a hard cutover, meaning the backend had to intelligently merge and reconcile data from both Drupal and the new CMS in real time. Content objects needed to be normalized, enriched, and distributed across services — all while maintaining the reliability that a high-traffic consumer website demands.
At the same time, the mobile app introduced a different kind of complexity. A Flutter frontend requires tightly composed, UI-oriented data structures — very different from the general-purpose content APIs serving the web. Building a dedicated Backend for Frontend layer meant designing a clean abstraction that could fetch, assemble, and serve just the right data to just the right consumer, without bleeding complexity into shared services.
Tying all of this together across distributed services also required a coherent observability story — which meant consolidating and making sense of a heterogeneous monitoring stack across the platform.


The Solution
Event-Driven CMS Integration
We built and maintained a dedicated microservice responsible for consuming incoming events from the new CMS and transforming them into the platform's internal data structures. Using AWS cloud event infrastructure, content changes are captured and routed as events to the appropriate downstream services — keeping the system decoupled, resilient, and easy to reason about.
Unified Content API
The core backend service powering lonelyplanet.com was extended and maintained by our team. It serves as the authoritative data layer for the website, merging content from both CMS systems into a unified response model. The API is built with Absinthe, Elixir's GraphQL toolkit, and consumed directly by the frontend. Inter-service communication is handled via ERPC, keeping latency low and leveraging the strengths of the BEAM's distributed runtime.
Backend for Frontend — Mobile App
We built a Backend for Frontend service purpose-built to serve the Lonely Planet Flutter mobile app (available on the App Store). Rather than exposing a generic API, this service is responsible for assembling composite "view objects" — pulling identifiers from an internal assembly layer, fetching the required content via ERPC from the content API, and composing structured GraphQL responses tailored precisely to what the app needs to render each screen. Cluster coordination is handled via libcluster, ensuring reliable service discovery across Kubernetes nodes.
Backend for the Next-Generation Website
A parallel BFF service was designed and built to serve as the backend for a redesign of the Lonely Planet website — mirroring the mobile BFF's architecture but serving a distinct set of content assemblies and UI compositions suited to the web experience.
Observability
We worked to consolidate the platform's monitoring posture across a multi-tool stack, ensuring that performance metrics and service health were consistently captured and actionable across all microservices.

The Result
Curiosum's work gave Lonely Planet a coherent, maintainable backend foundation across both their web and mobile platforms. The CMS migration progressed without disruption to production traffic. The mobile app launched with a solid, scalable BFF layer built to evolve alongside the product. And the distributed architecture — built on Elixir, BEAM's proven concurrency model, and AWS-native event infrastructure — is positioned to support the platform's continued growth.
This engagement is a testament to Curiosum's ability to integrate deeply into large, complex engineering organizations, take ownership of critical infrastructure, and deliver production-grade Elixir systems at scale.
