From first launch to the right stay.
Intelligent vacation rental discovery app built with Expo SDK 58, React Native 0.88, Sanity Content Lake, Clerk, and Groq AI.
π¬ Natural Language Stay Search in Action
"Quiet pet-friendly cabin with a hot tub in Lake Arrowhead under $300 a night"β³ Parsed in real-time server-side:
β’ Category:CabinΒ |Β Location:Lake Arrowhead, CAΒ |Β Budget:β€ $300/night
β’ Hard Amenities:Hot TubΒ·Pets AllowedΒ |Β Soft Intent / Vibe:QuietΒ·CozyΒ·Secluded
Roamify bridges natural conversational search with exact constraint filtering. Stays are ranked by semantic relevance and strict pricing/amenity filters, while guest questions about booking terms, cancellation policies, and house rules are answered verbatim from verified Sanity policy text with zero hallucinated claims.
| Step | Screen | Experience |
|---|---|---|
| 01 | Welcome | Cinematic destination carousel with immersive photography and smooth onboarding transitions |
| 02 | Sign Up | Clerk-authenticated onboarding via Email OTP or Google & Apple SSO with secure token caching |
| 03 | Discover | Natural sentence search bar with trending vibe chips, recent suggestions, and category tabs |
| 04 | Choose | High-resolution photo galleries, transparent per-night pricing, and instant favoriting |
| 05 | Know the Rules | Direct access to stay rules, check-in windows, quiet hours, and house guidelines up front |
| 06 | Ask | Conversational Q&A answered word-for-word from stay house rules & policies with citations |
| 07 | Understand | Visual cancellation timeline & refund guarantee with clear tier dates and policy badges |
| 08 | Trust | Verified host profiles ("Meet your host"), response rates, badges, and hosted properties |
| 09 | Compare | Fast filter refinement with price sorting, amenity toggles, and live stay counts |
| 10 | Profile | User account management, saved favorites, trips, and secure Clerk session sign-out |
graph TD
subgraph Client ["Client Layer (Expo / React Native)"]
UI["Mobile App / Standalone APK"]
Auth["Clerk Token Cache"]
SearchUI["Natural Sentence Input"]
AskUI["Policy Q&A Sheet"]
end
subgraph Backend ["Serverless API (Vercel / Expo Router)"]
APIRoute["Vercel Serverless Function (api/index.js)"]
AuthGuard["Clerk Session Guard (requireSession)"]
SearchHandler["POST /api/search"]
AskHandler["POST /api/ask"]
GroqParser["Groq (openai/gpt-oss-120b)"]
KBVerification["Policy Text Verifier (Zero Hallucination)"]
end
subgraph Sanity ["Sanity Content Platform"]
ContentLake["Sanity Content Lake (Public CDN)"]
Studio["Sanity Studio v6 (30 Stays, 10 Hosts, 10 Policies)"]
Embeddings["Dataset Semantic Embeddings (text::semanticSimilarity)"]
PolicyKB["Sanity Knowledge Base (kbHPPfGlUOvp)"]
end
UI --> Auth
SearchUI -->|"POST /api/search (Query + Token)"| APIRoute
AskUI -->|"POST /api/ask (Question + Slug)"| APIRoute
APIRoute --> AuthGuard
AuthGuard --> SearchHandler
AuthGuard --> AskHandler
SearchHandler --> GroqParser
GroqParser -->|"Structured Constraints & Intent"| SearchHandler
SearchHandler -->|"GROQ Query + text::semanticSimilarity"| Embeddings
Embeddings --> ContentLake
ContentLake -->|"Ranked Stays & Totals"| SearchHandler
AskHandler --> PolicyKB
AskHandler -->|"Raw Policy Text Query"| ContentLake
AskHandler --> KBVerification
KBVerification --> GroqParser
GroqParser -->|"Select Exact Excerpts"| AskHandler
AskHandler -->|"Verbatim Answer Cards + Citations"| AskUI
Studio --> ContentLake
- π Natural Language Stay Search
Describe your stay in plain words ("quiet cabin with hot tub under $300"). Server-side structured extraction (powered by Groqopenai/gpt-oss-120bvia AI SDK) converts natural queries into typed constraints and GROQ filters with strict confidence scoring (low,medium,high). - π¬ Zero-Hallucination Policy Q&A
Policy and house rule questions route through Sanity's Knowledge Base (kbHPPfGlUOvp). Answers display the stay's verified facts and official policy passages word-for-word with explicit citationsβno LLM makes up rules, hidden costs, or refund dates. - π‘ 30 Curated Stays & 10 Verified Hosts
Seeded in Sanity Content Lake with deterministic IDs, multi-photo galleries, geo-coordinates, and verified amenity tags. Powered by Sanity public CDN caching for instant loads. - π Enterprise-Grade Authentication
Secured by Clerk with automatic session token caching (@clerk/expo/token-cache), protected route groups(auth)vs(app), and automatic route redirection. - π¨ Fluid Native Design System
Engineered with NativeWind v5 (Tailwind CSS v4), Plus Jakarta Sans typography, continuous iOS corner curvature, custom liquid glass bottom tab bar (GlassTabBar), and tactile haptic feedback on every touch. - π Cloud API & Standalone APK
Expo Router server routes (/api/search,/api/ask) compile and deploy seamlessly to Vercel via@expo/serveradapter, enabling standalone Android APKs built with EAS to connect securely to live AI and CMS services. - π Privacy-First Telemetry
Integrated with PostHog for product metrics with user identification upon login, total session reset on logout, and zero capture of typed queries or PII.
| Domain | Tools & Libraries | Description |
|---|---|---|
| Core Framework | Expo SDK 58, React Native 0.88 | High-performance native mobile engine |
| Routing & Navigation | Expo Router v58 | Typed file-based routing with server routes |
| Styling & Design | NativeWind v5 RC0, Tailwind CSS v4 | Tailwind compiler with react-native-css |
| Typography | Plus Jakarta Sans | Custom Google font typography tokens |
| Authentication | Clerk (@clerk/expo, @clerk/backend) |
Session tokens, secure storage cache & route guards |
| CMS & Knowledge Base | Sanity Studio v6 | Content Lake, GROQ, Knowledge Base Mode |
| AI Inference | Groq (openai/gpt-oss-120b) |
Ultra-fast structured outputs via AI SDK |
| Motion & Haptics | React Native Reanimated 4, Gesture Handler, Expo Haptics | 60/120fps physics animations and touch feedback |
| Backend & Serverless | Vercel via @expo/server/adapter/vercel |
Serverless deployment for Expo Router API endpoints |
| DevOps & Builds | EAS CLI | Cloud builds for standalone Android APKs and iOS |
| Product Analytics | PostHog (posthog-react-native) |
Anonymous privacy-preserving product telemetry |
Roamify/
βββ api/ # Vercel serverless function entry handler (api/index.js)
βββ assets/ # App icons, splash screens, and showcase graphics
β βββ images/ # Onboarding slides, brand assets, and app overview
βββ prompts/ # Project history, architecture specs, and step-by-step plans
βββ src/
β βββ app/ # Expo Router file-based screens & API routes
β β βββ (app)/ # Protected tab group: Home, Search, Trips, Profile
β β βββ (auth)/ # Authentication: Sign-in, Sign-up, Email OTP
β β βββ api/ # Server API routes (POST /api/search, POST /api/ask)
β β βββ stay/[slug]/ # Stay details, Policy Q&A modal, and Trip summary
β β βββ design-system.tsx# Live component catalog & design token preview
β β βββ onboarding.tsx # Visual destination slider
β βββ components/ # Reusable UI primitives, cards, inputs, and modals
β βββ hooks/ # Stays hooks, search state machines, and Q&A loaders
β βββ lib/ # Sanity client, Clerk auth verification, search & PostHog
β βββ theme/ # Design tokens (colors, typography, spacing, radius, motion)
βββ studio/ # Sanity Studio schemas, migration scripts, and seed data
β βββ schemaTypes/ # Property, Host, Policy, and Review schemas
β βββ scripts/ # Data seeding and image deduplication scripts
βββ eas.json # EAS build configuration (Preview APK, Production)
βββ vercel.json # Vercel serverless deployment config for Expo web export
βββ package.json # Root dependencies and project scripts
- Node.js (v18 or higher)
- npm or bun
- Physical device with Expo Go or an iOS Simulator / Android Emulator
# Clone the repository
git clone https://github.com/Anmol1578/Roamify.git
cd Roamify
# Install dependencies (use npx expo install for native packages)
npm installCreate a .env file in the project root:
cp .env.example .envFill in the required configuration keys:
| Environment Variable | Description | Source |
|---|---|---|
EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY |
Clerk Publishable Key for client authentication | Clerk Dashboard |
CLERK_SECRET_KEY |
Clerk Secret Key for server-side route validation | Clerk Dashboard |
EXPO_PUBLIC_SANITY_PROJECT_ID |
Sanity Project ID for Content Lake queries | Sanity Manage |
EXPO_PUBLIC_SANITY_DATASET |
Sanity Dataset name (production) |
Sanity Manage |
GROQ_API_KEY |
Groq API Key for intent parsing and Q&A | Groq Console |
SANITY_ORGANIZATION_TOKEN |
Sanity Org Token for Knowledge Base access | Sanity Manage |
SANITY_CONTEXT_MCP_URL |
Sanity Context MCP search endpoint | Sanity Context App |
SANITY_POLICIES_MCP_URL |
Sanity Policies MCP endpoint | Sanity Context App |
SANITY_CONTEXT_KB_URL |
Sanity Context Knowledge Base endpoint (kbHPPfGlUOvp) |
Sanity Context App |
EXPO_PUBLIC_API_URL |
Deployed backend base URL (e.g. https://roamify-studio.vercel.app) |
Vercel Deployment |
EXPO_PUBLIC_POSTHOG_KEY |
PostHog API project token (Optional) | PostHog |
EXPO_PUBLIC_POSTHOG_HOST |
PostHog Ingestion Host URL (Optional) | PostHog |
π Security Note: Keys without the
EXPO_PUBLIC_prefix (CLERK_SECRET_KEY,GROQ_API_KEY,SANITY_ORGANIZATION_TOKEN) are strictly confidential and never bundled into the client app.
# Start the Expo development server
npm run start- Press i to launch on iOS Simulator
- Press a to launch on Android Emulator
- Press w to launch in Web Browser
- Scan the terminal QR code using Expo Go on your physical device
Manage listings, hosts, policies, and reviews via the embedded Sanity Studio:
# Navigate to the studio directory
cd studio
# Install studio dependencies
npm install
# Start local Sanity Studio development server
npm run dev
# Seed 30 properties, 10 hosts, and 10 policies to Sanity Content Lake
npx tsx scripts/seed.ts
# Verify that there are no duplicate image URLs across listings
npx tsx scripts/check-duplicates.ts
# Deploy Sanity Studio to production
npm run deployRoamify's server routes (/api/search and /api/ask) are configured to deploy as a Vercel Serverless Function:
- Connect the repository to Vercel.
- Set the build command to
npx expo export -p weband output directory todist/client(configured automatically viavercel.json). - Add the server environment variables in your Vercel Project Settings:
CLERK_SECRET_KEYGROQ_API_KEYSANITY_ORGANIZATION_TOKENEXPO_PUBLIC_SANITY_PROJECT_IDEXPO_PUBLIC_SANITY_DATASETSANITY_CONTEXT_MCP_URLSANITY_POLICIES_MCP_URLSANITY_CONTEXT_KB_URL
- Deploy the project and note your production URL (e.g.,
https://roamify-studio.vercel.app).
Build an installable preview APK that connects directly to your deployed Vercel backend:
# Build standalone Android APK via EAS
npx eas-cli@latest build -p android --profile preview# Run TypeScript typecheck across all files
npm run typecheck
# Run Expo ESLint checks
npm run lint
# Check Expo dependencies for compatibility
npx expo-doctorLicensed under the MIT License.
