O Weatherly web e o Expo falam com Route Handlers do Next.js (`/api/weather`, `/api/geocode`, `/api/details`). Isso é um BFF: o browser e o celular nunca recebem a OPENWEATHERMAP_API_KEY.
Key só no servidor
Se a key fosse embutida no JS do cliente, qualquer um leria no DevTools e consumiria sua cota. No BFF, a key vive em variável de ambiente (local `.env.local`, produção Vercel).
Mesma API para web e mobile: o Expo só muda o EXPO_PUBLIC_API_BASE.
Cache ~15 minutos
Clima não muda a cada segundo. Usamos fetch com revalidate em torno de 900s. Isso reduz chamadas upstream, acelera respostas repetidas e mantém o free tier saudável — sem mentir “tempo real absoluto”.
Páginas SEO como `/clima/joao-pessoa-pb` chamam a mesma lib `fetchForecast` no servidor: HTML com temperatura real para o crawler, e um link para abrir o app interativo.