apps/mobile — Expo + React Native + react-native-web. Same JavaScript UI for:
public/ during npm run build, served by the same deployment as the API.Next.js app/api/* — production API matches scripts/dev-api-stub.mjs behavior:
app/api/explore/route.ts — iTunes top charts by category; ?q= uses iTunes Search (full catalog) plus DB matches for RSS-ingested shows.app/api/[...path]/route.ts — catch-all for /api/dashboard, /api/feed, /api/feed-filters, search, podcast detail, radio, video channels, subscribe/hide, add-by-url, and stub fallbacks for playlists/stats/etc.Logic lives under lib/api/ (handle-request.ts dispatches; feed, dashboard, podcast-social, radio, video-channels, add-by-url).
www.podzooka.com)The root npm run build pipeline:
@podzooka/sharedexpo export --platform web → apps/mobile/dist-web/public/next build — serves public/ at the site root and registers /api/* serverless routesmiddleware.ts rewrites HTML5-style paths (e.g. /podcast/:id) to /index.html so React Navigation on web works, while /api/* and static files (/_expo/*, /assets/*, etc.) are unchanged.
EXPO_PUBLIC_API_URL — your public site origin (no path), e.g. https://www.podzooka.com. Required for native store builds so they reach your production API.
Expo web on Vercel does not need this if the app and API share the same deployment: the client uses window.location.origin when the env var is unset, so /api/* stays same-origin.
# Native / explicit override
EXPO_PUBLIC_API_URL=https://www.podzooka.com
Supabase: EXPO_PUBLIC_SUPABASE_URL, EXPO_PUBLIC_SUPABASE_ANON_KEY, and server-only SUPABASE_SERVICE_ROLE_KEY / CRON_SECRET as today.
npm run dev:mobile-web — stub API on :3000 + Expo dev web.npm run prepare:web then npm run dev:web — same-origin localhost for API + SPA (set EXPO_PUBLIC_API_URL accordingly).