Sistema colaborativo de alertas ciudadanas para Tucumán, Argentina.
Demo: https://tucalerta.vercel.app
Durante las emergencias climáticas en Tucumán, la falta de información oficial sobre zonas afectadas por lluvias e inundaciones deja a los ciudadanos sin herramientas para tomar decisiones. La desinformación y las fake news complican aún más la situación.
Este proyecto nació como una respuesta concreta a ese problema: una plataforma donde la comunidad reporta y valida incidentes en tiempo real. Fue desarrollado con asistencia de IA como ejemplo de cómo esta tecnología puede usarse para resolver problemas reales y generar impacto positivo.
- Mapa interactivo con reportes geolocalizados en tiempo real
- Sectorización por localidades de Tucumán (33 localidades)
- Sistema de votación comunitaria (confirmar / reportar falso)
- Auto-verificación: reportes con +3 votos positivos son verificados
- Auto-ocultamiento: reportes con -3 votos son marcados como falsos
- Anti-spam: límite de 1 reporte cada 45 minutos por dispositivo
- 100% responsive, mobile-first
- Actualizaciones automáticas cada 2 minutos
| Tecnología | Uso |
|---|---|
| React 18 | UI |
| Vite | Build tool |
| TypeScript | Type safety |
| TailwindCSS | Estilos |
| Leaflet | Mapas open source |
| Zustand | Estado global |
| TanStack Query | Data fetching |
| Tecnología | Uso |
|---|---|
| Node.js | Runtime |
| Express | Framework |
| TypeScript | Type safety |
| PostgreSQL | Base de datos |
| Prisma ORM | Database client |
| Servicio | Uso |
|---|---|
| Vercel | Frontend |
| Railway | Backend + PostgreSQL |
| pnpm | Package manager |
| Turborepo | Monorepo |
tucalerta/
├── apps/
│ ├── web/ # Frontend React + Vite
│ │ └── src/
│ │ ├── components/ # Map, AlertCard, AlertForm, etc.
│ │ ├── hooks/ # useAlerts, useVote
│ │ ├── store/ # Zustand store
│ │ ├── lib/ # API client, fingerprint
│ │ └── config/ # Constantes, localidades
│ └── api/ # Backend Express + Prisma
│ ├── src/
│ │ ├── routes/ # alerts, localities
│ │ ├── controllers/
│ │ ├── services/
│ │ └── middleware/ # validation, rateLimit, errorHandler
│ └── prisma/
│ ├── schema.prisma
│ └── seed.ts
├── packages/
│ └── types/ # Tipos TypeScript compartidos
├── turbo.json
├── pnpm-workspace.yaml
└── package.json
- Node.js >= 18
- pnpm >= 8
- PostgreSQL >= 14
git clone https://github.com/ginona/tucalerta.git
cd tucalertapsql -U postgres
CREATE DATABASE tucalerta;cp apps/api/.env.example apps/api/.env
cp apps/web/.env.example apps/web/.envapps/api/.env:
DATABASE_URL="postgresql://postgres:tu_password@localhost:5432/tucalerta?schema=public"
PORT=3001
NODE_ENV=development
FRONTEND_URL=http://localhost:5173apps/web/.env:
VITE_API_URL=http://localhost:3001pnpm installcd packages/types && pnpm build && cd ../..cd apps/api
pnpm db:generate
pnpm db:migrate --name init
pnpm db:seed# Desde la raíz (frontend + backend)
pnpm devO en terminales separadas:
# Terminal 1
cd apps/api && pnpm dev
# Terminal 2
cd apps/web && pnpm dev- Frontend: http://localhost:5173
- Backend: http://localhost:3001
- Health check: http://localhost:3001/health
- Prisma Studio:
cd apps/api && pnpm db:studio
| Script | Descripción |
|---|---|
pnpm dev |
Frontend y backend en desarrollo |
pnpm build |
Compila todos los paquetes |
pnpm lint |
Linter en todo el proyecto |
pnpm type-check |
Verifica tipos TypeScript |
pnpm db:migrate |
Ejecuta migraciones |
pnpm db:studio |
Abre Prisma Studio |
pnpm db:seed |
Carga localidades en la DB |
pnpm db:reset |
Resetea la base de datos |
- Device fingerprinting: cada dispositivo tiene un ID único persistente
- Rate limiting: máximo 1 reporte cada 45 minutos por dispositivo
- Vote limiting: 1 voto por alerta por dispositivo
- Self-vote prevention: no se puede votar en la propia alerta
- Validation score: alertas con score <= -3 se ocultan automáticamente
- Conectar repositorio en Vercel
- Root Directory:
apps/web - Build Command:
pnpm build - Output Directory:
dist - Variable:
VITE_API_URL=https://tu-api.railway.app
- Crear proyecto en Railway
- Agregar servicio PostgreSQL
- Conectar repositorio, Root Directory:
apps/api - Las variables de entorno se configuran automáticamente
- El
railway.jsonejecuta migraciones en cada deploy
| Método | Ruta | Descripción |
|---|---|---|
| GET | /health |
Health check |
| GET | /alerts |
Lista alertas (filtros: type, localityId, includeHidden) |
| GET | /alerts/:id |
Obtiene una alerta |
| POST | /alerts |
Crea nueva alerta |
| POST | /alerts/:id/vote |
Vota en una alerta |
| GET | /localities |
Lista localidades |
- Fork el repositorio
- Crea tu branch:
git checkout -b feature/nueva-feature - Commit:
git commit -m 'Add nueva feature' - Push:
git push origin feature/nueva-feature - Abre un Pull Request
MIT — Hecho para Tucumán, Argentina