Caesars Entertainment is an American hotel and casino company that operates more than 50 properties across the US. I partner with their Hospitality sector and lead on digital strategy and architecture.
What shipped (so far)
- caesars.com (builder.io, akeneo, aws)
- Dynamic templating system to support different site layouts
- Custom static page renderer (AWS Lambda) to massively boost performance of all react native web pages built with Expo
- Reusable omnichannel monorepo codebase
- Written in react native with exports for native and mobile
- Design system to component library supporting over 50 themes, driven by design tokens
- Monorepo ecosystem with NX and pnpm to accelerate delivery
- Shared content API (AppSync GraphQL)
- Structured product catalog defined in Akeneo and exposed through shared GraphQL layer
- Non-product content models managed in builder.io and exposed through shared GraphQL layer
- Rich autoamated workflows with Workato to transform data for channels
Impact
- Performance: Significant page load reduction and time-to-interactive (↑45% lighthouse score, 95+)
- Cost/efficiency: >$500k+/yr saved
- Time-to-market: New pages in minutes with ContentOps
My role & scope
- Led discovery at beginning of transformation to identify pain points and shape multi-year technical roadmap
- Partned with Cyber security to establish first set of AWS accounts for deploying future infrastructure for .com
- Led architecture and implementation of first major channel - caesars.com website - in AWS, powered by React Native web in monorepo
- Guided and mentored team members into new tech stack and ways of working
Key decisions & trade-offs
- Custom static page renderer vs established framework (e.g. NextJS)
- Designed and implemented a lightweight custom Lambda that uses Puppeteer to scrape the page, extract virtual react native web styles and save a static HTML page. This was necessary because the react-native-web and module federation ecosystem did not support established frameworks, and Expo's static rendering as too immature - failing basic hydration on a number of dependencies.
- Monorepo vs multiple reports
- Monorepo allows us to centralise and re-use code without friction, and duplication was a huge challenge we were solving
- Multiple repos allows individual teams to move faster but sharing code becomes more complex and duplication is a lot more likely
- Reuse react native code for web vs write a web variant in pure React
- Reusing code theoretically allows teams to move faster from the same base for all channels, but complexity of those components increases
- Having a separate React web library allows for faster website delivery with easier web optimisations
- Achieving static responsive styles in react native web
- React Native does not support media queries - it uses runtime JavaScript - meaning our static pages were not responsive
- Tactically, I had to create 3 versions of each page (mobile, tablet, desktop) to serve static HTML for each viewport (via CloudFront-Is-X-Viewer headers and Lambda origin routing)
- Strategically, I implemented a custom
styled
function internally that enabled media queries on web, forked from react-native-media-query, allowing us to move to a single static export and realize full performance benefits
What's coming
- Caesars Rewards iOS and Android mobile apps, shipped from monorepo
- A hotel check-in kiosk app
- A full back-end modernization strategy with AWS and Node.js
- Native TV apps built with react-native
See it in action
Some example live pages include:
- https://www.caesars.com/harrahs-ak-chin/restaurants
- https://www.caesars.com/harrahs-ak-chin/restaurants/agaves-restaurant
- https://www.caesars.com/horseshoe-st-louis/restaurants
- https://www.caesars.com/grand-victoria-casino/restaurants
Tech stack
- AWS for all infrastructure, including some of the below:
- CloudFront, Lambdas, CloudFront VPC origins, S3, ALB
- AppSync, DynamoDB
- CloudWatch, CloudTrail
- Terraform for provisioning infrastructure
- Expo + React Native, including:
- react native web expo export
- react-native-media-query for responsive styles in web
- Storybook (for iOS, Android, web)
- TypeScript, Node.js
- Playwright, vitest, React Testing Library
- GitHub & GitHub Actions