Can I Ride?
Abres la app y toda la pantalla se pone verde, ámbar o roja para la hora a la que piensas salir. Un motor de veredicto en el dispositivo, un proxy mínimo para los proveedores meteorológicos y un nivel Pro en RevenueCat.
- Producto propio
- 2026
- iOS y Android
- Rol: todo
- Estado: publicada en Google Play



Todos los moteros tienen el mismo ritual por la mañana: abrir una app del tiempo, recorrer una tabla de diez días, entornar los ojos ante un mapa de radar y adivinar. La información está toda ahí y la respuesta sigue sin estar. Can I Ride? la hizo un motero harto de volver a casa empapado, para sustituir ese ritual por una pantalla y una palabra.
Es el cuarto producto de ZubiLabs y el primero con un componente de servidor, por pequeño que sea. Los otros tres llevan todo dentro del binario; una app del tiempo no puede, porque los datos vienen de proveedores de pago cuyas claves tienen que quedarse en algún sitio que los usuarios no puedan leer.
Una previsión no es una decisión. Un 40 % de lluvia es un NO para ir al trabajo y un SÍ para una vuelta de domingo; rachas de 60 km/h van bien en una trail y son desagradables en una naked. La app tenía que convertir números en un veredicto con el que el motero esté de acuerdo, y dejar que cada uno mueva la línea.
Un viaje también son dos tramos. Una mañana seca con tormenta a las seis de la tarde es un NO, y el motivo debe decir qué tramo es el problema. Y la respuesta tiene que sobrevivir a un móvil sin cobertura en un garaje: la última previsión debe abrirse al instante y decir con claridad que es antigua.
Una app en React Native cuya pantalla principal es la respuesta. Un SÍ o un NO enorme en el color del veredicto, sobre un halo que respira despacio, con un titular y el motivo debajo: «Lluvia prevista en unos 40 min», «Seco, pero con rachas de 65 km/h». Debajo, una franja de 24 horas con una barra de color por tramo; tocar una barra mueve la salida. Los chips de arriba eligen el lugar (GPS, casa, trabajo o buscar una ciudad), el día y la hora, y una vuelta opcional.
Las reglas corren en el dispositivo, de más a menos grave: tormenta, nieve o aguanieve; lluvia ahora; probabilidad de lluvia por encima de la tolerancia; lluvia en las próximas tres horas; después ámbar por hielo, niebla y viento; después verde. Una ida y vuelta combina los dos tramos, gana el peor y el motivo lo nombra. Los usuarios gratuitos tienen una previsión a 5 días en franjas de 3 horas de OpenWeather; Pro desbloquea 14 días, precisión horaria y WeatherAPI, como compra mensual, anual o de por vida. Lo completan una notificación diaria de «aviso matutino», una tarjeta del veredicto para compartir, lugares guardados, unidades e inglés y castellano.
Todo. Producto, las reglas del veredicto, marca e icono, la app en React Native, las dos rutas de API y su blindaje, los mapeadores de cada proveedor, el paywall propio con RevenueCat, notificaciones y tarea en segundo plano, Sentry, builds de EAS, hosting y actualizaciones, tests unitarios y las fichas de las tiendas en dos idiomas.
Decisiones clave, y por qué:
- El veredicto es una función pura. Un módulo recibe un paquete de previsión, una hora y los umbrales del motero y devuelve un tono y un motivo. Sin React, sin I/O, con tests unitarios regla por regla. La franja horaria, la ida y vuelta y la notificación matutina llaman a la misma función, así que nunca pueden discrepar.
- Un proxy, no un backend. Dos rutas de API de Expo Router en EAS Hosting: previsión y geocodificación. Guardan las claves de los proveedores, redondean las coordenadas a un kilómetro aproximado, cachean diez minutos y rechazan las peticiones sin el token de la app. Sin base de datos, sin cuentas, nada que migrar. Desplegar la exportación web despliega el servidor.
- Una forma, dos proveedores. OpenWeather y WeatherAPI tienen cada uno un mapeador puro al mismo ForecastBundle. El resto de la app nunca sabe cuál ha respondido; el selector solo lee el intervalo de horas y los días máximos del modelo. Cambiar o añadir un proveedor es un archivo y sus tests.
- Pro se verifica donde importa. El identificador anónimo de RevenueCat es la única identidad. La app lo envía con las peticiones Pro y la ruta de previsión pregunta a la API REST de RevenueCat antes de llamar al proveedor de pago, con la respuesta en caché. Conocer la URL no le da a nadie una previsión premium.
- Una notificación matutina que el sistema puede no programar nunca. Las tareas en segundo plano en iOS y Android corren cuando al sistema le apetece. La comprobación se ejecuta desde la tarea en segundo plano y otra vez cada vez que la app vuelve a primer plano, dentro de una ventana desde noventa minutos antes de la salida habitual hasta treinta después, con una marca por día para que salte una sola vez. En el peor caso, el veredicto está ahí cuando coges el móvil.
- Una cuota gratuita que cualquiera podría agotar. Una ruta de previsión abierta es una API meteorológica pública pagada por otro. Las rutas exigen un token incrustado en la app, cachean por coordenada redondeada para que los vecinos compartan una llamada, validan cada parámetro y ponen el proveedor de pago detrás de una comprobación de entitlement en el servidor. Sin los secretos configurados, las comprobaciones se saltan y se registran, así que el desarrollo sigue siendo simple.
- Un modo sin conexión que no miente. La última previsión se persiste con TanStack Query para que la app abra al instante sin cobertura, y la última posición GPS se guarda por la misma razón. Todo lo que tenga más de treinta minutos, o no se haya podido refrescar, se marca como previsión guardada con un icono de nube tachada en vez de hacerse pasar por actual.
Una 1.0 terminada: onboarding, el veredicto con franja horaria e ida y vuelta, lugares guardados y búsqueda de ciudades, umbrales y unidades, el aviso matutino, la tarjeta para compartir, caché sin conexión, un paywall propio con tres planes, informes de errores con repetición de sesión enmascarada, 33 tests unitarios y fichas en inglés y castellano listas para las dos tiendas.
Para ZubiLabs es el caso que muestra el punto medio: un producto con un servidor que es un despliegue y ninguna base de datos, y una suscripción que se hace cumplir de extremo a extremo en vez de confiarse al cliente.
- El color es la interfaz. Toda la pantalla es la respuesta, legible con guantes desde la otra punta del garaje. Cada otro elemento se ganó su sitio explicando o moviendo esa respuesta.
- El servidor, tan pequeño como el secreto. La única razón de que exista un servidor es que dos claves de API no pueden ir en un binario. Dos rutas y una caché bastan; añadir cuentas o una base de datos habría añadido coste y nada que el motero note.
- Vende precisión, no la respuesta. El nivel gratuito da el veredicto para ahora mismo y cinco días vista; Pro vende dos semanas y la hora exacta. Esconder la respuesta habría dejado inútil la app gratuita y resentida a la de pago.