{"id":30034371,"url":"https://github.com/gdc94/helios","last_synced_at":"2026-04-10T02:03:25.237Z","repository":{"id":306992061,"uuid":"1017688726","full_name":"GDC94/Helios","owner":"GDC94","description":"Helios Full stack app","archived":false,"fork":false,"pushed_at":"2025-07-28T20:19:08.000Z","size":1118,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-28T22:09:12.297Z","etag":null,"topics":["dock","docker-compose","expressjs","graphql","node-cron","nodejs","react-query","react-router","shadcn-ui","tailwindcss","type","typescript","vite"],"latest_commit_sha":null,"homepage":"https://helios-five-ochre.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/GDC94.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-07-11T00:15:32.000Z","updated_at":"2025-07-28T20:19:37.000Z","dependencies_parsed_at":"2025-07-28T22:19:18.129Z","dependency_job_id":null,"html_url":"https://github.com/GDC94/Helios","commit_stats":null,"previous_names":["gdc94/helios"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/GDC94/Helios","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GDC94%2FHelios","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GDC94%2FHelios/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GDC94%2FHelios/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GDC94%2FHelios/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GDC94","download_url":"https://codeload.github.com/GDC94/Helios/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GDC94%2FHelios/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269176080,"owners_count":24373087,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-06T02:00:09.910Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["dock","docker-compose","expressjs","graphql","node-cron","nodejs","react-query","react-router","shadcn-ui","tailwindcss","type","typescript","vite"],"created_at":"2025-08-06T23:47:02.187Z","updated_at":"2025-10-12T23:12:21.591Z","avatar_url":"https://github.com/GDC94.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"Dashboard AMM para monitoreo de liquidez y APR de pares Uniswap v2 con datos en tiempo real de The Graph.\n\n## Inicio\n\n### capturas\n\n## Home\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./frontend/src/assets/home.png\" width=\"600\" alt=\"Captura de pantalla principal\" /\u003e\n\u003c/p\u003e\n\n## Dashboard con skeletons de carga y empty state\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./frontend/src/assets/dash-capture.png\" width=\"600\" alt=\"Captura de pantalla principal\" /\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./frontend/src/assets/empty.png\" width=\"600\" alt=\"Captura de pantalla principal\" /\u003e\n\u003c/p\u003e\n\n## Not found page\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./frontend/src/assets/not-found.png\" width=\"600\" alt=\"Captura de pantalla principal\" /\u003e\n\u003c/p\u003e\n\n## Global Metrics y Annualized Returns con data dinamica, skeletons y empty state\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./frontend/src/assets/metrics-cards.png\" width=\"600\" alt=\"Captura de pantalla principal\" /\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./frontend/src/assets/metrics.png\" width=\"600\" alt=\"Captura de pantalla principal\" /\u003e\n\u003c/p\u003e\n\n---\n\n## 🚀 DEPLOYMENT EN PRODUCCIÓN\n\n### 📋 Archivos de configuración creados:\n- `backend/render.yaml` - Infraestructura como código para Render\n- `frontend/vercel.json` - Configuración para Vercel\n- `DEPLOYMENT.md` - Guía completa paso a paso\n\n### 🌐 URLs de producción:\n- **Frontend**: `https://sentora-frontend.vercel.app` \n- **Backend**: `https://sentora-backend.onrender.com`\n- **API Docs**: `https://sentora-backend.onrender.com/api/health`\n\n### ⚡ Deploy rápido:\n\n**Backend en Render:**\n1. Conectar repo en [render.com](https://render.com/)\n2. Crear Blueprint desde `backend/render.yaml`\n3. Render creará automáticamente PostgreSQL + Web Service\n\n**Frontend en Vercel:**\n```bash\ncd frontend\nnpm i -g vercel\nvercel --prod\n```\n\n📖 **Ver guía completa**: [DEPLOYMENT.md](./DEPLOYMENT.md)\n\n---\n\n### Prerequisitos (Desarrollo Local)\n- Docker y Docker Compose instalados\n- Puertos 3001 (backend) y 5173 (frontend) disponibles\n\n###  **Comando para levantar todo:**\n\n```bash\n# Clonar el repositorio\ngit clone \u003curl\u003e\ncd sentora\n\ncd backend \u0026\u0026 ./scripts/start.sh\n```\n\nEste comando:\n- ✅ Levanta PostgreSQL + Backend automáticamente\n- ✅ Configura base de datos con migraciones\n- ✅ Inicia captura de datos de The Graph\n- ✅ Verifica que todo funcione\n- ✅ Muestra endpoints para testing\n\n### 🖥️ **Frontend (en nueva terminal):**\n\n```bash\n# Mientras el backend arranca, en otra terminal:\ncd frontend\nnpm install\nnpm run dev\n# Frontend disponible en http://localhost:5173\n```\n\n### 🔍 **Verificar que todo funciona:**\n\n```bash\n# ✅ Backend health check\ncurl http://localhost:3001/api/health\n\n# ✅ Ver datos capturados\ncurl http://localhost:3001/api/metrics/snapshots\n```\n\n---\n\n## 📊 Stack Tecnológico\n\n### Backend\n- **Node.js + TypeScript + Express** - API REST\n- **PostgreSQL + Prisma ORM** - Base de datos y migrations\n- **GraphQL (The Graph)** - Datos DeFi en tiempo real\n- **Docker + Docker Compose** - Orquestación completa\n- **Redis** - Cache y almacenamiento temporal\n- **Cron Jobs (node-cron)** - Captura automática de snapshots\n- **Zod** - Validación de schemas y tipos\n- **CORS** - Habilitación de cross-origin requests\n- **ESLint + Prettier** - Linting y formateo de código\n\n### Frontend\n- **React + TypeScript** - Interfaz moderna\n- **TailwindCSS** - Estilos responsive y utilidades CSS\n- **Recharts** - Visualización de datos y gráficos interactivos\n- **React Query (TanStack Query)** - Gestión de estado servidor\n- **Shadcn/ui** - Componentes consistentes y accesibles\n- **Framer Motion** - Animaciones fluidas y interacciones\n- **React Router** - Navegación entre páginas\n- **React Icons** - Iconografía consistente\n- **Vite** - Build tool moderno y rápido\n- **ESLint + Prettier** - Linting y formateo de código\n\n### Deployment \u0026 DevOps\n- **Render** - Backend hosting con PostgreSQL\n- **Vercel** - Frontend hosting con auto-deploy\n- **Docker** - Containerización para desarrollo\n- **GitHub Actions** - CI/CD pipeline (auto-deploy)\n\n---\n\n## 🏗️ Arquitectura\n\n```\n┌─────────────────┐    GraphQL    ┌──────────────┐\n│   The Graph     │◄─────────────┤   Backend    │\n│   (Uniswap v2)  │               │   Node.js    │\n└─────────────────┘               │              │\n                                  │  ┌────────┐  │\n                ┌─────────────────┤  │ Cron   │  │\n                │                 │  │ Jobs   │  │\n                │                 │  └────────┘  │\n                │                 └──────────────┘\n                │                        │\n                │                        │ REST API\n                │                        ▼\n    ┌───────────▼────────┐     ┌─────────────────┐\n    │   PostgreSQL       │     │    Frontend     │\n    │   (Snapshots)      │     │    React        │\n    └────────────────────┘     │                 │\n                               │  ┌──────────┐   │\n                               │  │ Charts   │   │\n                               │  │ Filters  │   │\n                               │  │ APR Calc │   │\n                               │  └──────────┘   │\n                               └─────────────────┘\n```\n\n---\n\n## 🛠️ Herramientas de Desarrollo\n\n### **Calidad de Código**\n- **TypeScript** - Tipado estático para mayor robustez\n- **Husky** - Git hooks para pre-commit\n- **Lint-staged** - Linting solo en archivos modificados\n- **Prettier** - Formateo automático de código\n- **ESLint** - Análisis estático y detección de errores\n\n### **Testing**\n- **Vitest** - Testing framework moderno\n- **React Testing Library** - Testing de componentes\n- **MSW** - Mocking de APIs para testing\n\n### **Desarrollo**\n- **Vite** - Build tool rápido con HMR\n- **React DevTools** - Debugging de componentes\n- **Postman/Insomnia** - Testing de APIs\n\n### **Hooks Personalizados**\n- **useGetChartData** - Datos para gráficos con cache\n- **useGetGlobalMetrics** - Métricas globales del dashboard\n- **useGetAnnualizedReturns** - Retornos anualizados por período\n\n\u003e **Nota**: Se han eliminado hooks no utilizados (useGetSnapshots, useGetPairs, useGetPairAPR, useGetAllPairsAPR, useMetricsCache) para mantener el código limpio y optimizado.\n\n---\n\n## 📈 Funcionalidades Principales\n\n### ⚡ **Tiempo Real**\n- Captura automática de datos cada 60 minutos\n- Snapshots de liquidez, volumen y fees\n- Cálculo automático de APR\n\n### 📊 **Dashboard Interactivo**\n- Gráficos responsivos con Recharts\n- Filtros temporales: 7d, 1m, 3m, 6m, 1y, YTD, Custom, All\n- Date picker para rangos personalizados\n- Tooltips con información detallada\n\n### 🎯 **Métricas Avanzadas**\n- APR calculado con moving averages\n- Visualización de gaps en datos faltantes\n- Escalas Y uniformes y optimizadas\n- Formateo inteligente de fechas\n\n### 🎨 **Animaciones y UX**\n- **Framer Motion** - Transiciones fluidas y micro-interacciones\n- **Hover Effects** - Efectos sutiles en cards y botones\n- **Loading States** - Skeletons animados durante carga\n- **Error States** - Estados de error con animaciones\n- **Page Transitions** - Transiciones entre páginas\n- **Responsive Design** - Adaptación a todos los dispositivos\n\n---\n\n## 🗂️ Estructura del Proyecto\n\n```\nsentora/\n├── backend/              # Node.js + Express API\n│   ├── src/\n│   │   ├── routes/       # Endpoints REST\n│   │   ├── services/     # Lógica de negocio\n│   │   ├── graphql/      # Cliente The Graph\n│   │   └── types/        # TypeScript types\n│   ├── prisma/           # Schema + migraciones\n│   ├── scripts/\n│   │   └── start.sh      # 🎯 Setup automático\n│   ├── render.yaml       # 🚀 Configuración Render\n│   └── docker-compose.yml\n├── frontend/             # React + TypeScript\n│   ├── src/\n│   │   ├── components/   # UI components\n│   │   ├── hooks/        # Custom hooks\n│   │   └── pages/        # Páginas\n│   ├── vercel.json       # 🚀 Configuración Vercel\n│   └── package.json\n├── DEPLOYMENT.md         # 📖 Guía de deployment\n└── README.md            # 📖 Este archivo\n```\n\n---\n\n## 🔧 Comandos de Desarrollo\n\n### Backend\n```bash\ncd backend\n\n# 🚀 Inicio completo (recomendado)\n./scripts/start.sh\n\n# 🛠️ Solo desarrollo local\nnpm run dev\n\n# 📊 Ver logs en tiempo real\ndocker logs -f sentora-backend\n\n# 🗄️ Acceso directo a PostgreSQL\ndocker exec -it sentora-postgres psql -U sentora_user -d sentora_db\n\n# 🧹 Limpiar y resetear todo\ndocker compose down -v\n```\n\n### Frontend\n```bash\ncd frontend\n\n# Desarrollo\nnpm run dev\n\n# Build para producción\nnpm run build\n\n# 🧪 Testing\nnpm test              # modo wathc\nnpm run test:run      # Ejecutar todos los tests\nnpm run test:ui       # Interfaz gráfica de tests\n```\n\n---\n\n## 🧪 Testing\n\n### Stack de Testing\n- **Vitest** \n- **React Testing Library** - testing de componentes React\n- **jsdom** - dom virtual para testing\n- **@vitest/ui** - interfaz gráfica para tests\n\n### Comandos de Testing\n```bash\ncd frontend\n\n# Ejecutar todos los tests\nnpm test\n\n# Ejecutar tests una sola vez\nnpm run test:run\n\n# Interfaz gráfica de tests (navegador)\nnpm run test:ui\n\n# Reporte de cobertura\nnpm run coverage  # Requiere: npm install --save-dev @vitest/coverage-v8\n```\n\n### Estructura de Tests\n```\nsrc/\n├── App.test.tsx                                    # Test principal de la app\n├── components/\n│   ├── commons/SectionTitle/SectionTitle.test.tsx # Tests de componentes comunes\n│   └── Dashboard/MetricsCard/MetricsCard.test.tsx # Tests de componentes dashboard\n└── test/\n    └── setup.ts                                   # Configuración global de tests\n```\n\n### Mocks Configurados\n- **IntersectionObserver** - Para componentes con framer-motion\n- **ResizeObserver** - Para componentes responsivos\n- **matchMedia** - Para tests de media queries\n- **requestAnimationFrame** - Para animaciones\n\n### Escribir Tests\n```typescript\nimport { render, screen } from \"@testing-library/react\";\nimport { describe, it, expect } from \"vitest\";\n\ndescribe(\"MiComponente\", () =\u003e {\n  it(\"renders correctly\", () =\u003e {\n    render(\u003cMiComponente /\u003e);\n    expect(screen.getByText(\"Expected Text\")).toBeInTheDocument();\n  });\n});\n```\n\n---\n\n## API Endpoints Disponibles\n\n### 🔍 **Health \u0026 Status**\n- `GET /api/health` - Estado del servicio\n- `GET /api/db-check` - Verificar base de datos\n- `GET /` - Información general\n\n### 📊 **Métricas Core (Utilizados por Frontend)**\n- `GET /api/metrics/global` - Métricas globales del dashboard\n- `GET /api/metrics/annualized-returns` - Retornos anualizados por período\n- `GET /api/metrics/chart?timeRange=7d` - Datos para gráficos\n- `GET /api/metrics/chart?timeRange=custom\u0026from=2025-07-01\u0026to=2025-07-05` - Rango personalizado\n\n### 📊 **Métricas Adicionales**\n- `GET /api/metrics/snapshots` - Todos los snapshots\n- `GET /api/metrics/snapshots?pairAddress=0x...` - Por par específico\n- `GET /api/metrics/pairs` - Pares monitoreados\n- `GET /api/metrics/apr` - Cálculo APR con moving averages\n- `GET /api/metrics/apr/all` - APR para todos los pares\n\n---\n\n\n\n### **Endpoints para Insomnia/Postman**\n\n```http\n### Health Check\nGET http://localhost:3001/api/health\n\n### Ver Snapshots Recientes\nGET http://localhost:3001/api/metrics/snapshots\n\n### Datos para Chart (7 días)\nGET http://localhost:3001/api/metrics/chart?timeRange=7d\n\n### Datos Custom Range\nGET http://localhost:3001/api/metrics/chart?timeRange=custom\u0026from=2025-07-02\u0026to=2025-07-08\n\n### Pares Monitoreados\nGET http://localhost:3001/api/metrics/pairs\n```\n---\n\n## Contacto\n\n**German Derbes Catoni**\n- 📧 Email: germanderbescatoni@gmail.com\n- 🐙 GitHub: [https://github.com/GDC94]\n\n---\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgdc94%2Fhelios","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgdc94%2Fhelios","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgdc94%2Fhelios/lists"}