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ódigo
  • Contratos 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 contrato
  • Pagos 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 funciona
  • Cada 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 regla
  • Calidad 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 CI
  • Operació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.

Pantalla de ingreso de la app: logo del Club Andino Río Cuarto sobre una foto de montañas, campos de correo y contraseña y botón para ingresar con Google
Ingreso: con correo y contraseña, o con Google.
Pantalla de inicio de la app: saludo, estado de cuota, accesos y novedades del club
Inicio del socio: estado de cuota, accesos y novedades.
Pantalla de cuotas: deuda de una cuota social, precio mensual y botón para pagar con Mercado Pago
Cuotas: lo que se debe y el pago con Mercado Pago.
Pantalla de secretaría para registrar un cobro de cuatro meses adeudados
Secretaría: registrar un cobro de varios meses.

En video

Pagos desde el celular: el socio ve lo que debe, elige qué pagar y lo paga todo junto con Mercado Pago. 31 segundos, con narración y subtítulos.
Cobros en secretaría: buscar al socio, ver cuánto debe, cobrar varios meses y que quede en la caja. 30 segundos, con narración y subtítulos.

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

  • Pantalla de Auditoría del panel de staff: lista de cambios con usuario, acción, recurso y estado, y los enlaces Ver detalle y Revertir

    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.

  • Edición de un rol en el panel de superadministración: nombre y permisos agrupados por módulo, con casillas para elegir cada uno

    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

  • Juego Escalada Infinita con el podio total y semanal de 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.

  • Pantalla de topos de escalada con zonas por provincia, como La Calera y Los Gigantes en Córdoba

    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.

  • Pantalla de cuotas del socio con cuota social, cuota de escuelita y remera del club tildadas, y el botón para pagar todo junto con Mercado Pago

    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.

Arquitectura de appClub Las apps y los paneles llegan por Cloudflare a una Raspberry Pi. Ahí, un túnel entrega el tráfico a un gateway nginx, que lo pasa a la API Node.js, que guarda en MongoDB. La API habla con Mercado Pago, el login de Google, Google Sheets y las notificaciones. CLIENTES App móvilExpo / React Native: Android y PWA Panel de staffReact + TypeScript Panel de superadminReact, varios clubes BORDE Cloudflare DNS y HTTPS Túnel de salida RASPBERRY PI · DOCKER COMPOSE cloudflaredrecibe el túnel Gateway nginxrutas /, /staff, /admin, /api API Node.js + Express un club por cada dato (clubId) permisos por rol, trabajos programados MongoDBconjunto de réplicas SERVICIOS EXTERNOS Mercado Pagocobros y avisos Login de Googleingreso con cuenta Google Sheetsexportación contable Notificacionespush al celular
Piezas y herramientas
APINode.js 20, Express 5, Mongoose 9
Base de datosMongoDB 6, conjunto de réplicas
Panel webReact 19, TypeScript, Vite, Tailwind CSS 4
App móvilExpo SDK 56, React Native, PWA
SuperadminReact, Vite, Tailwind CSS
PagosMercado Pago: cobros, webhooks y conciliación
InfraDocker Compose, nginx, Cloudflare Tunnel
CalidadVitest, 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.

En producción
  • 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
En desarrollo
  • 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
Próximo
  • 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
El harness de appClub Un asistente de IA recibe contexto: archivos CLAUDE.md y AGENTS.md, especificaciones y contratos, y un issue. Mientras trabaja, un hook y una lista de permisos limitan lo que puede hacer. Su cambio pasa a un pull request con CI, mutation testing y mi revisión, y recién entonces se integra a main. Una vez por semana, una revisión automática con Claude en GitHub Actions lee el código y abre issues nuevos, que vuelven a empezar el circuito. CONTEXTO CLAUDE.md · AGENTS.mdreglas de los cuatro repos Especificacionesy contratos antes del código Issuequé se quiere y por qué ASISTENTE Asistente de IA Claude Code propone y escribe LÍMITES MIENTRAS TRABAJA Hook PreToolUse bloquea .env y force push frena builds en la Raspi confirma escrituras en prod. 49 pruebas propias Permisos comandos permitidos por lista producción: leer sí, escribir no VERIFICACIÓN Pull request + CI tests unitarios e integración prueba del gateway Mutation testing detecta el 94,9 % de roturas Revisión mía antes de integrar Integrado a main CONTROL CONTINUO Revisión semanal con Claude GitHub Actions · un módulo por vez, solo lectura · abre un issue por hallazgo
  • Archivos de contexto

    Los cuatro repositorios tienen su CLAUDE.md, hay un mapa general que los conecta y la app suma un AGENTS.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”.

    Leer uno
  • 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 main, compilar en la Raspberry Pi y escribir en la base de producción sin confirmar. Tiene 49 pruebas propias.

    Ver el hook
  • Permisos explícitos

    Una lista de comandos permitidos y una regla clara sobre producción: se puede leer, no escribir.

    Ver la configuración
  • Revisió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 workflow
  • Primero 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ón
  • Pruebas 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.

Clase en el muro de escalada del Club Andino Río Cuarto: un grupo de alumnos y profesores al pie de un muro de colores, con la bandera del club colgada a la izquierda
El muro de escalada del Club Andino Río Cuarto, donde se usa el sistema.

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.

contacto@appclub.net.ar

Cómo sería empezar

  1. Una charla

    Me contás cómo trabajan hoy y qué les lleva más tiempo.

  2. Una prueba

    Miran la demo con datos de ejemplo y deciden si les sirve.

  3. Un piloto

    Cargamos sus socios y planes, lo usan unos meses y ajustamos lo que falte.

Para clubes sin fines de lucro, a conversar.

Logo del Club Andino Río Cuarto

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

Quién lo hace

Soy Nicolás Pelichotti, tesorero del club y desarrollador. Ingeniero en Telecomunicaciones (UNRC), trabajo como desarrollador fullstack con Node.js, MongoDB y React. Si buscás a alguien para un proyecto parecido, escribime.