Project 01Web + Mobile App

Phuket Tourist.

Travel Discovery & Planner

A web and mobile app for discovering places and planning a trip to Phuket. Behind the map, a scheduled pipeline collects events from multiple sources, removes duplicates, resolves venues and uses AI to turn listings and posters into structured data. A shared Fastify API serves the event catalogue, saved places and daily itineraries.

Explore the project
Under the hood

What makes
it work.

The stack

React NativeExpoExpo RouterTypeScriptReact 19ZustandReact Hook FormZodBetter AuthMapboxSocket.IOExpo NotificationsFastifyTypeBoxDrizzle ORMKyselyPostgreSQLBunAnthropic ClaudePlaywrightCheerioSharpCloudflare R2Supabase
01

Interactive Map Discovery

A Mapbox map with custom markers for events and businesses, category filtering and clustering to explore what’s nearby.

02

Multi-source Event Ingestion

A scheduled pipeline pulling events from Eventbrite, Phuket101, SoftEvents and local news sites with deduplication, geocoding and venue resolution.

03

AI Event Extraction

Anthropic Claude reads Facebook Smart News posters and unstructured listings to extract structured event data automatically.

04

Business Directory

Restaurants, bars and attractions enriched from Google Places and OpenStreetMap with photos, opening hours and locations.

05

Saved & Favourites

Save events and businesses to a personal collection, synced to the account across sessions.

06

Day-by-day Planner

Build an itinerary from saved items, grouped and timelined into a date-by-date agenda.

07

Editorial Design System

A cream/teal editorial theme with custom typography (Newsreader / Hanken Grotesk) and a polished, content-first UI.

08

Authentication

Email + password and Google sign-in via Better Auth, shared across the Expo client and Fastify server.

09

Push Notifications

Expo Notifications for new events and itinerary reminders.

10

Server-side Image Pipeline

Uploads optimized with Sharp and delivered via Cloudflare R2 and Supabase storage.

11

Type-safe API

Fastify with TypeBox schemas validating every request/response over Drizzle + Kysely on PostgreSQL.