- Client work
- Full-stack development (sole developer)
- Mar - Jun 2025
Local Buddy Travel
Bilingual site for a Sicilian tourism business, with content read from Google Sheets and bookings sent via WhatsApp.

- Next.js
- React
- TypeScript
- Tailwind CSS
- Radix UI
- shadcn/ui
- Swiper
- Google Sheets API
The problem
A tourism business in Sicily offering excursions, car rental and airport transfers needed a site for both foreign and Italian tourists. The client wanted to update tours and cars on their own, and to receive bookings without running a backend.
What I built
I was the only developer. The site is bilingual (Italian and English) and includes:
A home page made of sections: hero, about, experiences, car rental, airport transfers and a call to action.
An experiences grid with filters, and detail pages for experiences and cars.
A booking form that builds a prefilled message and opens WhatsApp, plus a contact modal with the same logic.
Interesting decisions
Google Sheets as a CMS. Tours, cars, images and translations live in one spreadsheet. The server reads it with a read-only service account and turns it into typed objects, so the client updates the site by editing the sheet.
In-memory cache. Each range read is cached for five minutes to stay within the Google API quotas.
Translations from the sheet. A locale route and a React context handle the language.
WhatsApp instead of a booking backend. The message is generated on the client. It is a pragmatic choice for an audience already used to WhatsApp.
What I would do differently today
Using Google Sheets as the CMS turned out to be awkward and unnecessary. Today I would use a real CMS, such as Contentful or Payload.
Need something similar?
Tell me about your project: I usually reply within one working day.
Get in touch