Strautomator
Strava 활동을 자동화해 주는 Strautomator는 IFTTT와 비슷하지만 Strava 전용이다
실시간 사격·제외·히트맵·선수 효율·AI 분석·리그 순위표 제공, 베타는 무료
Registrá tiros, atajadas y exclusiones en vivo. Mapas de calor, eficacia por jugador, análisis con IA y tabla de tu liga. Gratis durante la beta.
스포츠·피트니스TypeScript · PLpgSQLGitHub @marianodip12온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
App móvil-first para registrar estadísticas de handball en vivo: eventos por zona de cancha, cuadrante del arco, rendimiento de arqueros, heatmap, evolución de temporada. • Metodología Superpowers — spec → plan → chunks testeables → review. • Design system UI UX Pro Max — Soft UI Evolution + Dimensional Layering, paleta OLED para uso al costado de la cancha. • Stack moderno — Vite + React 18 + TypeScript strict + Tailwind + Zustand + TanStack Query + Zod + Vitest. Pantallas pendientes (siguientes milestones): Live Match, Match Analysis, Teams, Evolution, Stats.README 전문 보기 ↗
App móvil-first para registrar estadísticas de handball en vivo: eventos por zona de cancha, cuadrante del arco, rendimiento de arqueros, heatmap, evolución de temporada.
Reescritura completa de la v8 aplicando:
| Capa | Estado |
|---|---|
| Setup del proyecto (Vite, TS strict, Tailwind, paths) | ✅ |
| Design system (tokens CSS, Inter + JetBrains Mono, paleta) | ✅ |
Capa de dominio con tipos (CourtZoneId, GoalZoneId, HandballEvent…) | ✅ |
Lógica pura: computeScore, computeMatchStats, buildGoalkeeperMap, buildHeatCounts, buildScorers, buildSeasonStats | ✅ |
| 28 tests unitarios del dominio — todos passing | ✅ |
| UI base: Button, Card, Dialog, Badge, Input, Feedback (Spinner, EmptyState) | ✅ |
Componentes de dominio: CourtView (geometría corregida), GoalGrid (arco con franjas) | ✅ |
| Store global (Zustand) + query client (TanStack Query) | ✅ |
| Cliente Supabase tipado (placeholder hasta que cargues las env vars) | ✅ |
| Router + shell (header + bottom nav) | ✅ |
| Pantalla Matches completa (season summary + live banner + history + new match modal) | ✅ |
| Seed data de ejemplo para ver la UI sin Supabase | ✅ |
Pantallas pendientes (siguientes milestones): Live Match, Match Analysis, Teams, Evolution, Stats.
# 1. Instalar deps
npm install
# 2. (Opcional) Conectar Supabase
cp .env.example .env.local
# → pegá tu VITE_SUPABASE_URL y VITE_SUPABASE_ANON_KEY
# 3. Correr en dev
npm run dev
# abre http://localhost:5173
# Otros
npm run typecheck # verifica tipos
npm run test # tests en watch
npm run test:run # tests una sola vez
npm run build # build producción
Sin .env.local, la app igual arranca pero muestra data seed local. Ideal para iterar el diseño.
src/
├── app/ # Shell, router, providers
├── domain/ # Lógica pura — sin React ni Supabase
│ ├── types.ts # CourtZoneId, GoalZoneId, HandballEvent, MatchSummary…
│ ├── constants.ts # COURT_ZONES, GOAL_QUADRANTS, EVENT_TYPES, NAV_ITEMS
│ ├── events.ts # mapDbEvent, mapDbMatch, computeScore, calcNextScore
│ ├── stats.ts # computeMatchStats, buildGoalkeeperMap, buildHeatCounts…
│ └── __tests__/ # Vitest — 28 tests
├── features/ # Feature verticals
│ ├── matches/ # ← implementada en M1
│ ├── live-match/ # (placeholder)
│ ├── match-analysis/ # (placeholder)
│ ├── teams/ # (placeholder)
│ └── evolution/ # (placeholder)
├── components/
│ ├── ui/ # Primitives (button, card, dialog, badge, input, feedback)
│ └── handball/ # Domain-specific (court-view, goal-grid)
├── lib/ # Infra: supabase client, zustand store, cn(), seed
└── styles/
└── globals.css # Design tokens + resets
La capa de dominio es pura — funciones que reciben eventos y devuelven stats. No importa nada de React ni de Supabase, y está 100% cubierta por tests. Si rompés algo en la UI, los tests del dominio siguen pasando y te dicen dónde no rompiste.
CourtView usa viewBox="0 0 360 300". Las 9 zonas se definen con paths SVG:
| ID | Descripción | Ubicación |
|---|---|---|
extreme_left | Extremo Izq. | Borde izquierdo, contra arco de 6m |
lateral_left | Lateral Izq. | Anillo entre 6m y 9m, izquierda |
center_above | Centro | Anillo entre 6m y 9m, centro |
lateral_right | Lateral Der. | Anillo entre 6m y 9m, derecha |
extreme_right | Extremo Der. | Borde derecho, contra arco de 6m |
near_left | Cerca Izq. | Abajo del arco de 9m, izq |
near_center | Pivote | Abajo del arco de 9m, centro |
near_right | Cerca Der. | Abajo del arco de 9m, der |
7m | Penal 7m | Badge blanco centrado, también cubierto por center_above |
Corrección v11: en v8 las zonas LI/CE/LD se extendían desde la línea de 9m hasta el borde superior del SVG. En v11 están contenidas en el "anillo" real entre arcos de 6m y 9m, que es dónde físicamente se ejecutan esos lanzamientos.
GoalGrid usa viewBox="0 0 320 148". 9 cuadrantes (tl/tc/tr/ml/mc/mr/bl/bc/br) + meta-regiones out (fuera), post (palo/travesaño) y long_range (arco-a-arco). Los postes y el travesaño conservan las franjas alternadas rojo/blanco del diseño original — es código visual del handball real.
Todos en src/styles/globals.css como variables HSL. Tailwind los consume como bg-surface, text-fg, bg-goal, bg-save, bg-danger, etc.
| Token | Uso |
|---|---|
--bg | Fondo de página #0A0F1C |
--surface | Cards #131B2E |
--surface-2 | Elevadas #1C2742 |
--primary | Azul brand #3B82F6 |
--goal | Gol #10B981 |
--save | Atajada #60A5FA |
--danger | Error/roja #EF4444 |
--warning | Amarilla/sanción #F59E0B |
--exclusion | Exclusión 2' #F97316 |
28/28 tests passing · typecheck limpio · build 91kB gzipped