Plataforma móvil para centralizar y facilitar la adopción de animales, conectando adoptantes con refugios y rescatistas.
El proyecto está estructurado como un monorepo gestionado con npm workspaces:
Huellas/
├── Mobile/ # App React Native con Expo
├── Server/ # API REST construida con Node.js + Express
└── Shared/ # Tipos TypeScript y esquemas de validación Zod compartidos entre frontend y backend
| Capa | Stack tecnológico |
|---|---|
| Mobile | React Native, Expo (SDK 54), Expo Router, Zustand (gestión de estado), Axios, React Native Maps, Expo Location, Lucide React Native, Lottie React Native, Zod |
| Server | Node.js, Express, TypeScript, Prisma ORM, Better-Auth (autenticación), PostgreSQL, Multer (subida de imágenes local) |
| Shared | TypeScript puro, esquemas de validación Zod comunes |
Seguí estos pasos para configurar y ejecutar el entorno de desarrollo local:
Asegurate de tener instalado:
- Node.js (versión 18 o superior recomendada)
- npm (incluido con Node.js)
- Docker y Docker Compose (para la base de datos)
- Un emulador de Android (Android Studio), simulador de iOS (Xcode, solo macOS) o la aplicación Expo Go en tu dispositivo físico para probar la app.
Creá los archivos .env basándote en los ejemplos provistos:
- Copiá el archivo
.env.examplede la raíz a un nuevo archivo.enven la raíz. - Copiá el archivo
Server/.env.exampleaServer/.env. - Verificá y configurá las variables según tu entorno local:
DATABASE_URL: URL de conexión a la base de datos (por defecto apunta al contenedor PostgreSQL de Docker).BETTER_AUTH_SECRET: Clave secreta para la sesión y encriptación de Better Auth.BETTER_AUTH_URL: URL base del backend server (ej:http://localhost:3000).EXPO_PUBLIC_API_URL: URL del backend expuesta a la app móvil (ej:http://localhost:3000o la IP local de tu red si usás un dispositivo físico).
Instalá todas las dependencias del monorepo (raíz y subproyectos Mobile, Server y Shared) ejecutando desde la raíz:
npm install- Levantá el servicio de PostgreSQL utilizando Docker Compose:
docker compose up -d
- Ejecutá las migraciones de Prisma para crear las tablas de base de datos e iniciar Better Auth:
npm run prisma:migrate --workspace=@huellas/server
- Generá el cliente de Prisma:
npm run prisma:generate --workspace=@huellas/server
Podés iniciar el backend y la app móvil de forma independiente desde la raíz del monorepo:
npm run serverEl servidor se ejecutará por defecto en el puerto 3000.
npm run mobileUna vez que Expo inicie en tu terminal, podés:
- Escanear el código QR con la cámara (iOS) o la app Expo Go (Android) para correrla en tu celular físico (asegurate de configurar
EXPO_PUBLIC_API_URLcon la IP local de tu computadora en lugar delocalhost). - Presionar
apara iniciar en un emulador de Android. - Presionar
ipara iniciar en un simulador de iOS. - Presionar
wpara correr la versión web en tu navegador.
La app móvil se comunica con el backend a través de la variable de entorno EXPO_PUBLIC_API_URL. Por defecto, si no se configura, toma http://localhost:3000. La lógica en Mobile/src/shared/services/api.ts aplica las siguientes reglas:
| Entorno | Comportamiento |
|---|---|
Desarrollo (__DEV__) con localhost |
Reemplaza localhost por la IP que el celular/emulador usa para conectarse a Metro (el servidor de Expo). Esto permite que la app funcione en emuladores y dispositivos físicos en red local sin configurar nada. |
APK de producción (EAS Build) sin EXPO_PUBLIC_API_URL |
El valor http://localhost:3000 queda "horneado" (baked-in) en el bundle. La APK intentará conectar a localhost:3000, lo cual solo funciona si el backend corre en el mismo dispositivo, lo cual no es el caso habitual. |
APK de producción con EXPO_PUBLIC_API_URL |
La URL configurada se usa tal cual. Es la forma correcta de apuntar a un servidor remoto. |
- El backend debe escuchar en
0.0.0.0:3000(no solo127.0.0.1), porque el emulador Android usa10.0.2.2para mapear al host. - Ejemplo:
node dist/server.jscon el servidor Express escuchando en0.0.0.0. - La app detecta automáticamente la IP de Metro y reemplaza
localhost.
- La PC que corre el backend y la que corre Expo deben estar en la misma red.
- El backend debe escuchar en
0.0.0.0:3000. - La app usa la IP LAN del host (ej:
192.168.1.50) automáticamente gracias al reemplazo delocalhost.
- Setear la variable de entorno antes de buildear con EAS:
EXPO_PUBLIC_API_URL=https://api.huellas.example.com eas build --platform android
- Puede configurarse también desde el dashboard de EAS como secret.
- En este caso la URL se usa literal, sin reemplazo de IP.
El servidor necesita su propio .env (Server/.env):
DATABASE_URL— conexión a PostgreSQLBETTER_AUTH_SECRET— clave de sesión de Better AuthBETTER_AUTH_URL— debe coincidir con la URL desde la cual el backend es accesible (interna y externamente)PORT— puerto del servidor (default:3000)
La plataforma cuenta con integración en el backend para realizar autocompletado de direcciones consultando la API oficial y gratuita de Georef Argentina.
- No requiere API key ni configuración de cuentas de facturación externas.
- El autocompletado está restringido a Argentina y combina nombres de calles y localidades. Cuando no se cuenta con el punto exacto de la altura, Georef ubica el centroide oficial de la localidad para referenciar la publicación de manera aproximada.