H.
Est. 2024

SONATA
RESORT

"A digital banquet of performance, elegance, and scale."

The Concept

Sonata Resort is not just a destination; it's a sensory experience. The digital platform needed to mirror this—serving a complex inventory of accommodations and dining experiences with the grace of fine service.

We engineered a headless ecosystem that orchestrates content relationships like a well-run kitchen, delivering sub-second page loads to guests worldwide, from the first course to the last.

Chef de CuisineFull Stack Engineer
ServiceCMS, Frontend, Infra
SourcingNext.js 16, Payload, R2
Premium Sourcing

The Ingredients

1

Next.js 16

Base

The foundation. Server Components for rich flavor without the weight.

2

Payload CMS

Core

The heart. Strictly typed content management for pure consistency.

3

Cloudflare R2

Preservation

Zero-egress storage handling massive media assets effortlessly.

4

MongoDB

Pantry

Flexible document storage for complex, nested data structures.

Back of House

Kitchen Architecture

Just as a kitchen is separated into stations for efficiency, we decoupled the architecture to ensure every service layer operates at peak performance.

The Pass (Next.js)

The presentation layer. Using ISR to plate up content that is pre-prepared but always fresh. Server Actions handle the orders (user interactions) efficiently.

The Larder (Cloudflare)

Direct browser-to-bucket uploads bypass the bottleneck of the main server, allowing high-fidelity imagery (50MB+ RAWs) to be stored instantly.

workflow.ts
interface Service {
  type: 'Fine_Dining' | 'Casual';
  capacity: number;
}

// Strictly Typed Schema
const Kitchen: Collection2<Service> = {
  slug: 'kitchen',
  fields: [
    {
      name: 'status',
      type: 'select',
      options: ['prep', 'service', 'closed']
    }
  ]
}

Chef's Notes

Overcoming the heat of the kitchen.

CHALLENGE 01

The Upload Limits

Vercel's serverless functions have a strict payload diet (4.5MB). Serving a 50MB photoshoot through the main pass would crash the service.

Solution: Presigned URLs direct to R2.
CHALLENGE 02

Localization Sync

Menus change daily. Guests speak many languages. Keeping 3 languages in sync without breaking the type safety was critical.

Solution: Automated Type Generation.