Cómo nació
Esto no empezó con un problema. Empezó con las ganas de conocer Colombia.
Con esos viajes de fin de semana a un pueblo del que uno nunca había oído hablar. Con la carretera, que muchas veces vale más que el destino. Con la costumbre de llegar a un lugar nuevo y pensar "de este ya puedo decir que estuve".
En algún momento me di cuenta de que quería llevar la cuenta. No como una lista en el celular, sino como algo que se viera: un mapa que se fuera llenando. Y como no existía, lo construí.
Qué es Exploradores
Una app móvil que convierte el mapa de Colombia en el diario de tus viajes.
Cada viaje deja una huella. Registras un municipio al que fuiste y ese territorio se pinta en tu mapa. Con el tiempo deja de ser el mapa de Colombia y se vuelve el mapa de tu vida: por dónde has andado, qué te falta, cuál es la región que sigue.
Son 1.121 municipios en 33 regiones. Nadie los va a completar todos y ese es justamente el encanto: siempre hay algo más allá.
Qué hace
El mapa de conquista. Cada departamento se colorea según cuánto llevas: sin explorar, explorando, conquistado. Es la pantalla a la que uno vuelve.
Mascotas regionales. Al pasar el 70% de un departamento se desbloquea su mascota: 33 personajes, uno por región. Pasan de silueta a ilustración completa.
Viajes. Planificas por días, marcas paradas, llevas presupuesto del grupo, subes fotos. Marcar una parada como visitada pinta el mapa: ese puente es el corazón de la app.
Lugares. Un catálogo de sitios con fotos y tips de la comunidad, para descubrir qué hay cerca de donde estás.
Sin rachas diarias, sin notificaciones que reclamen. Uno viaja tres o cuatro veces al año; una app que exige entrar todos los días solo genera culpa.
Qué usé y por qué
Flutter para la app. Un solo código para Android e iOS, y la velocidad de iteración que necesitaba trabajando solo. Estado con BLoC/Cubit, navegación con go_router.
.NET 8 en el backend, con arquitectura por capas estricta. Es el stack donde más profundidad tengo y donde quería demostrar disciplina: lógica de negocio en su capa, controladores que solo orquestan, validación centralizada.
PostgreSQL con PostGIS. La decisión técnica que define el producto. Toda la geometría de departamentos y municipios vive ahí, así que saber en qué municipio cayó una coordenada GPS es una consulta espacial contra polígonos reales, no una tabla de aproximaciones.
Redis para caché, con los namespaces declarados en un solo archivo. MongoDB para jobs de Hangfire. MinIO + imgproxy para las imágenes: nunca binarios en la base de datos ni servidos desde la API.
Next.js 16 con React 19 y Tailwind 4 para el panel de administración: moderar tips, curar el catálogo geográfico, gestionar mascotas, revisar caché y logs.
Todo corriendo en un VPS propio con Docker Compose y Traefik.
Lo que me dejó construirlo
Afianzó mi stack de una forma que un proyecto de trabajo no permite: aquí las decisiones son mías y también lo son las consecuencias.
Me obligó a aprender datos geoespaciales de verdad — proyecciones, geometrías, consultas espaciales sobre 1.121 polígonos.
Me enseñó a pensar en costos como parte de la arquitectura. Cada llamada a las APIs de Google pasa por un sistema de cuota mensual y revisa caché antes de salir. Cuando pagas la infraestructura de tu bolsillo, el costo por request deja de ser un detalle.
Y me dio espacio para construir cosas que quería probar: un servidor MCP con OAuth y scopes granulares que expone todo el panel de administración, para poder operar la plataforma conversando con un asistente en lugar de hacer clic.
Sobre todo, me dejó claro que la parte difícil no es el código. Es decidir qué no construir.
Dónde está
- Web: exploradores.co
- Android: disponible en Google Play (
co.exploradores.app) - iOS: en el roadmap
Stack
- App móvil: Flutter, BLoC/Cubit, go_router, Dio, Firebase Auth
- Backend: .NET 8, EF Core, Hangfire
- Datos: PostgreSQL + PostGIS, Redis, MongoDB
- Archivos: MinIO + imgproxy
- Panel admin: Next.js 16, React 19, Tailwind 4
- Infraestructura: Docker Compose, Traefik, VPS propio
- Integraciones: servidor MCP con OAuth y scopes granulares
