Mapa colaborativo de precios de combustible en Colombia. Los usuarios reportan y verifican precios de Corriente, Extra y Diésel en tiempo real.
🚀 Probar Demo: gasolinapp.oiramu.com
| Capa | Tecnología | Por qué |
|---|---|---|
| Frontend | React 18 + Vite | Rápido, moderno, HMR |
| UI | shadcn/ui + Tailwind CSS | Componentes accesibles y customizables |
| Iconos | Lucide React (shadcn.io/icons) | Consistentes, livianos, tree-shakeable |
| Mapa | React-Leaflet + Leaflet.js | Open-source, sin costo de tiles, flexible |
| Estado | Zustand | Liviano, sin boilerplate, ideal para POC |
| Backend | Supabase ⭐ | Ver sección abajo |
Supabase es un Firebase open-source construido sobre PostgreSQL. Es la mejor opción para este producto porque:
- PostGIS nativo → queries geoespaciales (
ST_Distance,ST_Within) para clustering real sin biblioteca extra - Realtime → WebSocket integrado: los precios se actualizan en el mapa sin refrescar
- Row Level Security → seguridad granular directamente en la DB
- Edge Functions → lógica de backend cuando escales (validación de precios, anti-spam)
- Auth incluido → usuarios anónimos → cuentas reales sin reescribir nada
Free tier: 500 MB DB · 2 proyectos · 50K rows · 50K MAU — suficiente para POC
Pro ($25/mes): 8 GB DB · ilimitados · realtime ilimitado — para MVP
Team ($599/mo): SLA, backups, soporte priority — producción
| Opción | Problema |
|---|---|
| Firebase | NoSQL = sin PostGIS, precio escala mal, vendor lock-in |
| PocketBase | Self-hosted, tú manejas infraestructura |
| Appwrite | Menos maduro, ecosistema más pequeño |
| Railway + Postgres | Flexibilidad máxima pero tú configuras todo |
git clone <repo>
cd gasolinapp
npm install- Ir a supabase.com → New Project
- Nombre:
gasolinapp, región: la más cercana a tus usuarios - Guardar la contraseña de la DB
- En Supabase Dashboard → SQL Editor
- Pegar el contenido de
database/schema.sql - Ejecutar → crea tablas, índices, RLS, seed data
cp .env.example .envEditar .env con los valores de Project Settings > API:
VITE_SUPABASE_URL=https://xxxx.supabase.co
VITE_SUPABASE_ANON_KEY=eyJhbGci...npm run dev
# → http://localhost:5173Sin Supabase configurado, la app funciona con datos mock (
VITE_USE_MOCK_DATA=trueen.env).
gasolinapp/
├── src/
│ ├── components/
│ │ ├── map/
│ │ │ ├── MapView.jsx # react-leaflet, zoom switching
│ │ │ └── markers.jsx # Iconos SVG para pins de gasolinera y zona
│ │ ├── panels/
│ │ │ └── StationPanel.jsx # Side panel: precios + reportes + votos
│ │ ├── modals/
│ │ │ └── ReportPriceModal.jsx # Modal para reportar precios
│ │ ├── TopBar.jsx
│ │ ├── MapLegend.jsx
│ │ └── Toast.jsx
│ ├── hooks/
│ │ └── useStations.js # Fetch + realtime + submit helpers
│ ├── lib/
│ │ ├── supabase.js # Cliente de Supabase
│ │ ├── fuel.js # Constantes y helpers de combustible
│ │ ├── mockData.js # Datos para desarrollo sin Supabase
│ │ └── utils.js # cn() helper
│ ├── store/
│ │ └── appStore.js # Estado global (Zustand)
│ ├── App.jsx
│ ├── main.jsx
│ └── index.css
├── database/
│ └── schema.sql # Schema Supabase completo con seed
├── .env.example
├── vite.config.js
├── tailwind.config.js
└── package.json
Zoom < 12 → Marcadores de zona con precio promedio (RPC: get_zone_averages)
Zoom ≥ 12 → Marcadores individuales por gasolinera
• Verde + precio = datos verificados por usuarios
• Gris + precio~ = estimado del promedio de zona
- Mapa dark con tiles de CartoDB
- Zoom switching entre vistas de zona (promedios) e individuales
- Panel lateral con precios por tipo de combustible (Corriente, Extra, Diésel)
- Estaciones sin datos muestran promedio de zona + banner de advertencia
- Modal para reportar precios con validación
- Sistema de votos en reportes (Verificar / Incorrecto)
- Realtime via Supabase WebSocket
- Mobile responsive & PWA ready
- Auth con Supabase (anonimo → cuenta con email)
- Gamificación básica: puntos por reportes verificados
- Búsqueda de gasolineras por nombre
- Geolocalización del usuario + "gasolineras cerca de mí"
- Filtro por tipo de combustible
- Historico de precios + gráfica de tendencia
- Notificaciones push cuando baja el precio de tu zona
- App nativa con React Native + mismo backend
- API pública para que otras apps consuman los precios
- Panel de administración para gasolineras verificadas
- Integración con APIs gubernamentales de precios oficiales
El proyecto está desplegado en: gasolinapp.oiramu.com
Para desplegar tu propia instancia:
# Build
npm run build
# Deploy en Vercel (recomendado)
npx vercel deploy --prodAsegúrate de configurar VITE_SUPABASE_URL y VITE_SUPABASE_ANON_KEY en las variables de entorno de tu plataforma de deploy.