{"id":28294122,"url":"https://github.com/h0kd/climate-analytics","last_synced_at":"2026-05-18T06:37:23.318Z","repository":{"id":291659547,"uuid":"978333304","full_name":"h0kd/climate-analytics","owner":"h0kd","description":"Climate Analytics Dashboard — Aplicación full‑stack en Next.js para consultar, almacenar y visualizar datos meteorológicos en tiempo real e histórico, con exportación de reportes y cron jobs automáticos.","archived":false,"fork":false,"pushed_at":"2025-05-06T15:03:06.000Z","size":107,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-08-08T16:38:49.526Z","etag":null,"topics":["chartjs","clerk-auth","cron","nextjs","openweather","prisma","react","tailwindcss","typescript","vercel"],"latest_commit_sha":null,"homepage":"https://climate-analytics.vercel.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/h0kd.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-05T20:29:41.000Z","updated_at":"2025-05-06T15:14:02.000Z","dependencies_parsed_at":"2025-05-05T22:32:57.178Z","dependency_job_id":"8fa0ed57-8700-49e5-9719-2d4a978c922b","html_url":"https://github.com/h0kd/climate-analytics","commit_stats":null,"previous_names":["h0kd/climate-analytics"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/h0kd/climate-analytics","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/h0kd%2Fclimate-analytics","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/h0kd%2Fclimate-analytics/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/h0kd%2Fclimate-analytics/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/h0kd%2Fclimate-analytics/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/h0kd","download_url":"https://codeload.github.com/h0kd/climate-analytics/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/h0kd%2Fclimate-analytics/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33167781,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-18T05:43:36.989Z","status":"ssl_error","status_checked_at":"2026-05-18T05:43:19.133Z","response_time":71,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chartjs","clerk-auth","cron","nextjs","openweather","prisma","react","tailwindcss","typescript","vercel"],"created_at":"2025-05-22T07:15:20.463Z","updated_at":"2026-05-18T06:37:23.292Z","avatar_url":"https://github.com/h0kd.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🌤️ Climate Analytics Dashboard\n\n[![Vercel](https://img.shields.io/badge/deploy-via%20vercel-blue)](https://vercel.com/…)\n[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n\nUna plataforma full‑stack para consultar, almacenar y visualizar datos meteorológicos en tiempo real e histórico.\n\n---\n\n## 📝 Descripción\n\n**Climate Analytics** es una aplicación web construida con Next.js (App Router), Tailwind CSS y Prisma que ofrece:\n\n- 🔍 **Clima en tiempo real** por ciudad usando la API de OpenWeather.\n- 💾 **Persistencia** de las lecturas (temperatura, humedad, viento) en una base de datos (SQLite local / PostgreSQL en producción).\n- 📈 **Gráficos históricos** interactivos (Chart.js + react‑chartjs‑2).\n- 🗃️ **Exportación** de reportes a CSV (papaparse) y PDF (jsPDF + autotable).\n- 🔒 **Autenticación** con Clerk.\n- 🕒 **Recolección automática** diaria de datos con Cron Jobs (node‑cron local / Vercel Cron Jobs).\n\nIdeal para demostraciones de: React, Next.js App Router, TailwindCSS, Prisma, consumo de APIs, generación de archivos, cron jobs y despliegue en la nube.\n\n---\n\n## 🚀 Tecnologías\n\n- **Frontend**: Next.js (App Router), React, TailwindCSS\n- **Backend**: Next.js Route Handlers (Node.js runtime)\n- **BD dev**: SQLite + Prisma\n- **BD prod**: PostgreSQL + Prisma\n- **Gráficos**: Chart.js + react‑chartjs‑2\n- **Auth**: Clerk (`@clerk/nextjs`)\n- **Exportación**: papaparse, jsPDF + autotable\n- **Cron local**: node‑cron\n- **Cron prod**: Vercel Cron Jobs (`vercel.json`)\n\n---\n\n## ⚙️ Instalación y arranque local\n\n1. **Clona el repo**\n\n   ```bash\n   git clone https://github.com/h0kd/climate-analytics.git\n   cd climate-analytics\n   ```\n\n2. **Instala dependencias**\n\n   ```bash\n   npm install\n   ```\n\n3. **Crea** un fichero `.env.local` con tus credenciales:\n\n   ```env\n   # OpenWeather\n   WEATHER_API_KEY=TU_OPENWEATHER_KEY\n\n   # Clerk\n   NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_xxx\n   CLERK_SECRET_KEY=sk_test_xxx\n\n   # Base de datos local (SQLite)\n   DATABASE_URL=\"file:./dev.db\"\n\n   # (Opcional si migras a Postgres)\n   # DATABASE_URL=postgresql://USER:PASS@HOST:PORT/DB\n\n   # Cron\n   CRON_SECRET=S3cureCr0nT0ken!\n\n   # URL pública de tu app (para rutas internas en cron)\n   NEXT_PUBLIC_APP_URL=http://localhost:3000\n   ```\n\n4. **Inicializa BD y Prisma**\n\n   ```bash\n   npx prisma migrate dev --name init\n   npx prisma generate\n   ```\n\n5. **(Opcional) Si quieres poblar datos**\n\n   ```bash\n   npm run seed          # semillas de ciudades\n   npm run seed-weather  # histórico sintético últimos 7 días\n   ```\n\n6. **Arranca en modo dev**\n\n   ```bash\n   npm run dev\n   ```\n\n   → Visita [http://localhost:3000](http://localhost:3000)\n\n---\n\n## 🛠️ Scripts disponibles\n\n| Script                 | Descripción                                       |\n| ---------------------- | ------------------------------------------------- |\n| `npm run dev`          | Servidor de desarrollo (Next.js + Turbopack)      |\n| `npm run build`        | Genera build de producción                        |\n| `npm run start`        | Inicia servidor en modo producción                |\n| `npm run lint`         | Ejecuta ESLint                                    |\n| `npm run seed`         | Poblar tabla **City**                             |\n| `npm run seed-weather` | Poblar tabla **WeatherData** con datos sintéticos |\n\n---\n\n## 📄 Uso básico\n\n1. Regístrate o inicia sesión con Clerk.\n2. Selecciona una ciudad en el desplegable.\n3. Consulta clima actual y descarga CSV / PDF.\n4. Ajusta el rango de fechas para tu histórico en el gráfico.\n\n---\n\n## 🕒 Cron Jobs\n\n### Local\n\nEn `scripts/fetchAndStore.ts` usamos `node-cron` para lanzar automáticamente la recolección diaria.\nPara probarlo manualmente:\n\n```bash\nnpm run fetch-and-store\n```\n\n### Producción (Vercel)\n\n1. Crea un archivo **vercel.json** en la raíz:\n\n   ```json\n   {\n     \"crons\": [\n       {\n         \"path\": \"/api/cron\",\n         \"schedule\": \"0 2 * * *\"\n       }\n     ]\n   }\n   ```\n\n2. Asegúrate en **Settings → Cron Jobs** de Vercel que esté **Enabled**.\n3. Añade tu `CRON_SECRET` en **Environment Variables** del proyecto.\n4. La ruta `/api/cron` validará `Authorization: Bearer $CRON_SECRET` y disparará la recolección.\n\n---\n\n## 📦 Despliegue en Vercel\n\n1. Empuja tu rama `master` a GitHub.\n2. Importa el repo en Vercel, selecciona **Next.js**.\n3. Configura tus **Environment Variables** en el dashboard (mismas que `.env.local`).\n4. Comprueba el **Activity → Functions** para ver invocaciones de:\n\n   - `/api/weather/fetch-and-store` (manual o cron)\n   - `/api/cron` (programado)\n\n---\n\n## 📄 Licencia\n\nMIT © \\[h0kd]\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fh0kd%2Fclimate-analytics","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fh0kd%2Fclimate-analytics","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fh0kd%2Fclimate-analytics/lists"}