app/(tabs)/ — Main tab navigation (Home, Discover, Messages)
_layout.tsx — Tab bar configuration
index.tsx — Home (daily content + LMS)
discover.tsx — Map + activities discovery
messages.tsx — Matches list
profile.tsx — User profile (standalone route, not a tab)
app/ — Standalone routes
design-system.tsx — Design system preview (standalone route, not a tab)
app/chat/ — Chat routes
[id].tsx — Individual match conversation
vicky.tsx — Direct Vicky AI wingman chat
app/moment/ — Moment detail
[id].tsx — Single moment view
components/ — Reusable UI components
ui/ — Primitive components
home/ — Home screen components
chat/ — Chat UI components
discover/ — Discovery feature components
messages/ — Messages list components
features/ — Feature-specific components
shared/ — Cross-feature shared components
hooks/ — Custom React hookslib/ — Services and utilitiesservices/ — API service layersconstants/ — App-wide constantstypes/ — TypeScript type definitionsdata/ — Static data and mock dataassets/ — Images, fonts, etc.
The backend (Hono/tRPC) and frontend (Next.js) services were removed from this repo in May 2026.
The mobile app communicates directly with the Mastra AI runtime for all features.
Main navigation uses Expo Router’s native tab trigger system:
Tab
File
Icon
Purpose
Home
index.tsx
House icon
Daily content, LMS courses
Discover
discover.tsx
Sparkles icon
Activities discovery
Messages
messages.tsx
Chat icon
Match conversations, Vicky AI
Search
—
Magnifying glass
Not yet implemented
The Assistant tab was removed — Vicky AI is accessed via the Messages tab header. User settings
are accessed via app/user-settings.tsx. A Search tab trigger exists in the tab layout but
search.tsx has not been implemented (no corresponding route file).
Direct fetch calls to Mastra LMS endpoints. Used in app/(tabs)/index.tsx for the home screen courses list.
const MASTRA_URL = process.env.EXPO_PUBLIC_MASTRA_URL ?? 'https://nous-mastra.curlynguyen95.workers.dev'export async function getPublishedCourses(): Promise<Course[]>export async function getCourseById(courseId: string): Promise<CourseDetail>export async function getUserEnrollments(userId: string): Promise<unknown[]>export async function enrollInCourse(userId: string, courseId: string): Promise<void>export async function updateLessonProgress( userId: string, lessonId: string, watchedSeconds: number): Promise<void>
lib/api-client.ts contains TanStack Query hooks for the same LMS endpoints, but these are not
yet integrated into the app — services/lms-service.ts is currently used directly.
TanStack Query hooks wrapping LMS API with caching and state management. Defined but not yet integrated into app components.
export function useCourses() // Fetch all published coursesexport function useCourse(courseId) // Fetch single course with lessonsexport function useEnroll() // Enroll in a courseexport function useEnrollments(userId) // Get user's enrolled coursesexport function useUpdateProgress() // Update lesson progressexport function useVideoUrl(lessonId) // Get video streaming URL