Un sistema completo, hecho para un club real y en uso hoy
appClub gestiona las cuotas, los cobros, los socios y la escuelita de escalada del Club Andino Río Cuarto. Lo diseñé y lo desarrollo yo, de la base de datos a la app del celular. Acá podés ver cómo está hecho, probarlo y usarlo.
¿Tenés un club, un gimnasio o una asociación? Mirá qué resuelve appClub para el tuyo.
Lo que se puede comprobar
Cada afirmación tiene un lugar donde mirarla. No hace falta creerme.
Cálculo de dinero con pruebas serias
El cálculo de la deuda de cada socio tiene una especificación escrita, tests y mutation testing: se rompe el código a propósito y se mide cuántas roturas detectan los tests. Hoy detectan el 94,9 %.
Ver el códigoContratos claros entre la API y las apps
Cuando falta un precio, la API responde con un código estable y los datos para explicarlo, y cada app lo muestra a su manera. El contrato se escribió antes de programar.
Leer el contratoPagos con Mercado Pago que se reconcilian
Cada pago llega por webhook y, además, un trabajo concilia cada 30 minutos por si algún aviso se perdió.
Ver cómo funcionaCada club ve solo lo suyo
Toda consulta filtra por el club. Un identificador válido de otro club no se puede leer, y esa regla está escrita y probada.
Ver la reglaCalidad automática en cada cambio
Cada pull request corre tests unitarios, tests de integración contra MongoDB real y una prueba del gateway.
Ver el CIOperación real, no una maqueta
Todo corre en una Raspberry Pi con Docker, publicada por un túnel de Cloudflare y con HTTPS en un dominio propio.
Ver la arquitectura
Cómo trabajo
Uso asistentes de IA como herramienta y las decisiones las tomo yo. Cómo lo hago, con reglas, especificaciones y pruebas que lo sostienen, está en Trabajo con IA.
Cómo se ve
Capturas del club de demostración. Los nombres y los datos son inventados.




En video
Qué incluye
Una app para los socios y un panel para la administración, sobre la misma base de datos.
Socios, cuotas y cobros, caja y movimientos, escuelita, Muro Libre, eventos, horarios, novedades con notificaciones push, advertencias, planes y precios, inventario y credencial con código QR para registrar la asistencia.
Para la administración

Auditoría con marcha atrás
Cada alta, cambio o baja queda registrada con quién la hizo, cuándo y cómo estaba el dato antes y después. Se filtra por recurso, usuario y fechas, y un cambio se puede revertir.

Roles a medida
Más de 50 permisos. Cada club crea sus propios roles, elige qué puede hacer cada uno y los edita cuando quiera. El cambio rige al momento, sin reiniciar nada.
Cobros con Mercado Pago
Link de pago, confirmación por webhook firmado y conciliación contra los movimientos de caja, con cada pago vinculado a su movimiento. Cómo funciona
Planillas de Google para el contador
Todas las noches el sistema vuelca los datos a una planilla de Google Sheets con varias pestañas (resumen con gráficos, socios, cuotas, cobros, movimientos, asistencias y más). Queda lista para el contador o para el socio que quiera ver los movimientos.
Inventario con IA
Se le saca una foto a un objeto y un modelo de visión (Gemini) propone el nombre, la categoría y la descripción para que el staff los revise y los guarde.
Para los socios

Un juego para la comunidad
“Escalada Infinita”, un mini juego dentro de la app con podio semanal y podio histórico del club. Sirve para que los socios entren seguido y se pique la competencia sana.

Topos y senderos
Cada club arma su guía de topos de escalada y senderos de trekking por provincia, con enlaces a sitios como theCrag y Wikiloc.

Cuenta al día
El socio ve lo que debe, elige qué pagar (cuotas, escuelita, la remera del club) y lo paga todo junto desde el teléfono.
Cómo está hecho
Las piezas, de las apps a la base de datos, y las decisiones que importan.
| API | Node.js 20, Express 5, Mongoose 9 |
|---|---|
| Base de datos | MongoDB 6, conjunto de réplicas |
| Panel web | React 19, TypeScript, Vite, Tailwind CSS 4 |
| App móvil | Expo SDK 56, React Native, PWA |
| Superadmin | React, Vite, Tailwind CSS |
| Pagos | Mercado Pago: cobros, webhooks y conciliación |
| Infra | Docker Compose, nginx, Cloudflare Tunnel |
| Calidad | Vitest, GitHub Actions, Stryker |
Un club por cada dato
Casi todo documento lleva el club al que pertenece y toda consulta filtra por él. Así el mismo sistema puede servir a varios clubes sin mezclar sus datos.
Permisos en un solo lugar
Cada acción tiene un permiso del tipo recurso:accion. Se verifica en un middleware, no a mano en cada pantalla, y cada club define sus roles.
Errores que dicen qué hacer
Si falta un precio, el sistema no falla: explica cuál cargar y avisa a quien puede hacerlo, con tiempo antes de que venza.
Registro de cambios
Las acciones importantes quedan en una auditoría que se consulta desde el panel.
Hosting propio y barato
Una Raspberry Pi alcanza para un club. La web de presentación está aparte, para que siga en pie aunque la Pi se caiga.
En qué punto está
Hoy lo usa un solo club. Esto es lo que ya funciona y lo que falta.
- App Android y versión web para iPhone
- Panel de staff y panel de superadmin
- Cuotas y cobros con Mercado Pago
- Escuelita de escalada y muro libre con QR
- Notificaciones y exportación a Google Sheets
- Avisos cuando falta cargar un precio o está por vencer
- Cobro de la deuda al precio de cada mes
- Reglas de baja y de meses sin pago
- Formulario público de alta de socios, con datos según la edad
- Eventos genéricos: viajes, cursos y ventas
- App para iPhone en tienda
- Este sitio en inglés
Cómo trabajo con IA: el harness
Un asistente escribe código rápido. Lo que lo hace confiable es su harness: el conjunto de reglas, límites, especificaciones y pruebas que lo rodea, y una persona que revisa.
- Harness engineering
- CLAUDE.md
- AGENTS.md
- Hooks
- Permisos
- GitHub Actions
- Spec-driven development
- Mutation testing
Archivos de contexto
Los cuatro repositorios tienen su
Leer unoCLAUDE.md, hay un mapa general que los conecta y la app suma unAGENTS.md. El asistente los lee al empezar cada sesión: estructura, comandos y reglas como “toda consulta filtra por club” o “no borrar código sin uso sin verificarlo”.Hooks que frenan lo peligroso
Un hook corre antes de cada acción del asistente y bloquea editar archivos con secretos, hacer force push a
Ver el hookmain, compilar en la Raspberry Pi y escribir en la base de producción sin confirmar. Tiene 49 pruebas propias.Permisos explícitos
Una lista de comandos permitidos y una regla clara sobre producción: se puede leer, no escribir.
Ver la configuraciónRevisión semanal automática
Una vez por semana, Claude revisa un módulo del backend en GitHub Actions, en solo lectura, y abre un issue por cada hallazgo sin duplicar los que ya existen. Ya generó más de 120.
Ver el workflowPrimero se escribe qué se quiere
Cuando la lógica es delicada (dinero, fechas, permisos), la especificación y el contrato se escriben antes del código, y los tests llevan el nombre de la regla que fijan.
Ver una especificaciónPruebas que se prueban a sí mismas
El mutation testing rompe el código a propósito y mide si los tests lo notan. Hoy detectan el 94,9 % de los cambios.
Ver el código
Las decisiones las tomo yo
Cada cambio entra por pull request, con el CI corriendo, y lo reviso antes de integrarlo. No dejo que el asistente decida el alcance, no acepto código que no entiendo y no pruebo con datos reales de socios: todo sale de un club de demostración con datos inventados. Leer cómo es el circuito completo.

Para otros clubes, gimnasios y asociaciones
Lo armé para un club de montaña, pero resuelve lo mismo que necesita cualquier organización que cobre cuotas, lleve asistencia y se comunique con sus socios. Si es tu caso, escribime.
Cómo sería empezar
Una charla
Me contás cómo trabajan hoy y qué les lleva más tiempo.
Una prueba
Miran la demo con datos de ejemplo y deciden si les sirve.
Un piloto
Cargamos sus socios y planes, lo usan unos meses y ajustamos lo que falte.
Para clubes sin fines de lucro, a conversar.
Si sos socio del CARC
La app te muestra cuánto debés y te deja pagar con Mercado Pago, guarda tu credencial con código QR, te avisa las novedades del club y registra tus visitas al muro y a las clases.
Android
Descargá la app desde esta página e instalala. El teléfono puede pedirte permiso para instalar desde el navegador.
iPhone
Abrí app.appclub.net.ar/app en Safari, tocá Compartir y elegí Agregar a pantalla de inicio.
Cómo se usa
Hay un manual paso a paso para cada rol, con un club de prueba para practicar: abrir el manual.
Apoyar el proyecto
appClub lo desarrollo en mi tiempo libre. Si te resulta útil y querés que siga creciendo, con funciones nuevas, mantenimiento y hosting, podés invitarme un cafecito. Cualquier aporte ayuda.
Invitame un cafecito