01phuket-tourist.tsxMobile App
Travel Discovery & Planner
Phuket TouristA travel-discovery app for Phuket connecting tourists with local events, restaurants and businesses. Discover places on an interactive Mapbox map, save favourites and build a day-by-day itinerary, while a multi-provider ingestion pipeline scrapes, dedupes, geocodes and AI-enriches events from across the web — all backed by a type-safe Fastify API.
React NativeExpoExpo RouterTypeScriptReact 19ZustandReact Hook FormZodBetter AuthMapboxSocket.IOExpo NotificationsFastifyTypeBoxDrizzle ORMKyselyPostgreSQLBunAnthropic ClaudePlaywrightCheerioSharpCloudflare R2Supabase
// key_features
▸
Interactive Map Discovery
A Mapbox map with custom markers for events and businesses, category filtering and clustering to explore what’s nearby.
▸
Multi-source Event Ingestion
A scheduled pipeline pulling events from Eventbrite, Phuket101, SoftEvents and local news sites with deduplication, geocoding and venue resolution.
▸
AI Event Extraction
Anthropic Claude reads Facebook Smart News posters and unstructured listings to extract structured event data automatically.
▸
Business Directory
Restaurants, bars and attractions enriched from Google Places and OpenStreetMap with photos, opening hours and locations.
▸
Saved & Favourites
Save events and businesses to a personal collection, synced to the account across sessions.
▸
Day-by-day Planner
Build an itinerary from saved items, grouped and timelined into a date-by-date agenda.
▸
Editorial Design System
A cream/teal editorial theme with custom typography (Newsreader / Hanken Grotesk) and a polished, content-first UI.
▸
Authentication
Email + password and Google sign-in via Better Auth, shared across the Expo client and Fastify server.
▸
Push Notifications
Expo Notifications for new events and itinerary reminders.
▸
Server-side Image Pipeline
Uploads optimized with Sharp and delivered via Cloudflare R2 and Supabase storage.
▸
Type-safe API
Fastify with TypeBox schemas validating every request/response over Drizzle + Kysely on PostgreSQL.
© 2026 marius mariakinas · all rights reserved · built from scratch