Bingo de 90 bolas · ayudante de cartones

Canta el bingo sin perder de vista ningún cartón.

Fotografías tus cartones, CheckBingo los reconoce y los guarda. Vas marcando los números que salen del bombo y la app vigila todos tus cartones a la vez, avisándote en cuanto hay línea o bingo. Pensada para partidas caseras y fiestas de pueblo, sin registro y sin conexión. Con letra grande, para que la use cualquiera, también quien no se lleva bien con la tecnología.

Para jugar

Cómo funciona, en tres pasos

Lo que ve quien solo quiere echar una partida.

1
Fotografía tus cartones
La app los lee con la cámara y los guarda. Corriges con un toque lo que haga falta.
2
Marca lo que canta el bombo
Vas tocando los números conforme salen. Sin lápiz y sin tachones.
3
Deja que vigile por ti
CheckBingo comprueba todos los cartones a la vez y avisa en cuanto hay línea o bingo.
En pantalla

La app por dentro

Cinco pantallas del recorrido, de añadir un cartón a cantar bingo.

Pantalla de inicio de CheckBingo
Inicio. Empiezas añadiendo tus cartones.
Reconocimiento del cartón
Reconocimiento. La app lee el cartón desde la foto.
Corrección de números
Corrección. Ajustas cualquier número con un toque.
Partida en curso
Partida. Marcas los números que van saliendo.
Aviso de línea y bingo
Aviso. La app detecta línea y bingo por ti.
Para curiosos

Con qué está construida

Una app móvil multiplataforma, offline-first, con arquitectura hexagonal y OCR en el propio dispositivo.

Frontend
Vue 3Ionic 8Capacitor 8TypeScriptPiniaViteVitestPlaywright
Datos
SQLiteoffline-firstarquitectura hexagonal
Visión y OCR
Vision (iOS)ML Kit (Android)plugin nativo propiok-means 1D
Por qué existe

Un proyecto para aprender IA aplicada

CheckBingo se eligió a propósito como banco de pruebas para trabajar con IA aplicada, reconocimiento de texto (OCR), visión por computador, tratamiento de imágenes y algoritmos como k-means. Es un proyecto de autoaprendizaje, lo que la app hace importa menos que cómo está hecha.

Así se hizo

De la ambición al criterio

Primero un problema, luego una decisión, después otro problema, y así hasta una solución proporcionada.

01 · Cimientos
Primero, las reglas del juego
Antes de tocar la cámara, modelé el dominio del bingo como lógica pura, 15 números por cartón, rangos por columna, sin repetidos, y la detección de línea y bingo. Con arquitectura hexagonal, esas reglas no dependen de Vue, de la base de datos ni del OCR, y se prueban sin simular ningún framework.
02 · El reto
Después, lo difícil, leer un cartón desde una foto
Un OCR genérico no entiende una cuadrícula de números sueltos, junta celdas, confunde dígitos parecidos y se salta los huecos. Necesitaba algo más que reconocer texto, necesitaba saber a qué celda pertenece cada número.
03 · Primer plan
Mi primera idea fue ambiciosa, un pipeline de visión por computador
Con OpenCV, detectar el contorno del cartón, corregir la perspectiva con una homografía, segmentar la cuadrícula y leer celda a celda. La meta que me marqué, cero errores automáticos.
04 · El muro
Y apareció el primer muro, OpenCV no cargaba en iOS
Lo comprobé con una sonda instrumentada en un iPhone real, no con suposiciones. No era el tamaño del archivo, era la memoria, el motor pedía más de 1 GB y el WebView de iOS corta alrededor de 1,4 GB. La pantalla se quedaba congelada.
05 · Investigación
En vez de insistir a ciegas, medí las alternativas
Evalué cuatro caminos con evidencia real, APIs de visión nativas, servir el binario aparte, un web worker y un plugin nativo de OpenCV. Ninguno era trivial y ninguno resolvía de raíz el problema de memoria. Todos costaban semanas para un proyecto de una sola persona.
06 · La pregunta
Entonces me hice la pregunta que debí hacerme antes
¿De verdad este problema necesita tanta ingeniería? Es un juego gratuito para preparar una partida, no un digitalizador de documentos crítico. La corrección a mano no es un defecto, es parte natural de la experiencia, como repartir las fichas antes de empezar.
07 · El giro
Replanteé todo, el OCR como borrador, no como oráculo
Foto, OCR nativo del sistema, Vision en iOS y ML Kit en Android, y el usuario remata con un toque sobre una rejilla en la que puede modificar los números detectados. Adiós a OpenCV y adiós al problema de memoria.
08 · La pieza fina
Quedaba lo delicado, colocar cada número en su fila y su columna
El OCR devuelve los números con su posición en la imagen, pero no sabe a qué celda van. Como el usuario elige el tipo de cartón, sé de antemano cuántas filas y columnas debe haber, 3 y 9.
09 · k-means
La solución, un k-means 1D hecho a medida
Agrupo las posiciones verticales de los números en 3 grupos, las filas, y las horizontales en 9 grupos, las columnas. Cada número cae en su celda por pura geometría. De regalo, el algoritmo aparta como outlier el número de serie del cartón, que siempre queda lejos de la rejilla.
10 · Ajuste
Luego, afinar con datos, no con intuiciones
Subí la resolución de trabajo de 1000 a 2400 píxeles y el acierto pasó de un 73% a cerca de un 80%. Adopté un enfoque híbrido, recortar cada celda para leerla mejor y situarla por su posición.
11 · El resultado
El resultado que acepto, y por qué
Entre un 73% y un 87% de celdas se rellenan solas, el resto con un toque. Una foto clara y bien iluminada es lo máximo que se le puede pedir a alguien que solo quiere jugar al bingo. Persigo utilidad real, no una demo perfecta.

Profundización técnica

Tres diagramas para ver cómo encaja la parte de IA, del píxel a la celda.

El pipeline completo, de la foto al cartón

El OCR nativo devuelve números sueltos con su posición, pero no sabe a qué celda van. El resto del pipeline convierte esa lista en una rejilla, la muestra sobre la foto y deja que el usuario remate con un toque.

El proceso crítico, situar cada número con k-means 1D

Como el usuario elige el tipo de cartón, sé que hay 3 filas y 9 columnas. Agrupo las posiciones verticales en 3 grupos y las horizontales en 9, así cada número recibe su par (fila, columna). Un número que queda lejos del centro de su grupo se marca como outlier, que es justo lo que le pasa al número de serie del cartón.

Por dentro del k-means, un bucle sencillo

La "IA" aquí es un algoritmo clásico bien aplicado. Se parte de centros repartidos, se asigna cada valor al más cercano, se recalculan los centros y se repite hasta que se estabilizan o se alcanzan 20 iteraciones. Al final se ordenan los clústeres para que el 0 sea siempre arriba o a la izquierda.

Criterio de decisión

  • Evidencia antes que hipótesis. El bloqueo de OpenCV en iOS se diagnosticó con una sonda instrumentada en un iPhone real, no con suposiciones.
  • Decisiones documentadas y reversibles. Cada elección importante es un ADR con opciones y consecuencias. El ADR-0010 sustituye al ADR-0009 sin borrar la historia.
  • El mejor código es el que no se escribe. Recortar el alcance y aceptar un 73-87% de acierto automático con corrección de un toque fue la mejor decisión técnica del proyecto.
Arquitectura hexagonal Offline-first Plugin nativo propio k-means 1D Sin backend Sin seguimiento Accesibilidad, letra grande

Versión 1. Seguiré explorando nuevas vías para mejorar la calidad del reconocimiento de cartones en próximas versiones.

Cómo se gestionó

Un proyecto pequeño gestionado como uno grande

Decisiones como ADRs
12 registros de decisión de arquitectura. Cada elección relevante tiene contexto, opciones con pros y contras, y consecuencias. Cambiar de rumbo deja rastro.
Calidad verificable
Más de 900 tests automáticos. Nada se da por hecho: cada entrega se verifica de forma independiente antes de aprobarse.
Alcance con criterio
Lo difícil no es añadir, es decidir qué no entra en la v1: nuevas variantes de cartón, tests E2E y mejoras de reconocimiento quedaron diferidos de forma explícita y documentada.
Desarrollo asistido por IA
La programación se ha hecho asistida por Claude Code, con un flujo definido: análisis y decisión primero, implementación después, y revisión y verificación humana e independiente de cada cambio. Coordinar agentes de IA es parte del proyecto tanto como el código.
Descarga y verificación

Verificar la descarga de Android

Si descargas el APK de CheckBingo 1.0.0 para Android, puedes verificar que no ha sido modificado comparando su huella digital SHA-256 con la publicada aquí.

Descargar en el App Store

En iOS la verificación de firma la hace el App Store automáticamente. Las huellas publicadas en esta página aplican solo al APK de Android.

Descargar APK para Android

Huella del certificado de firma

67f51a6fec00db8ecabb1a28081fa1d2e6d3ba95c462b89342c4e54ce8572bc2

CN=Luis Julve, O=Nonsense Development Group, C=ES

Huella del fichero APK

059ab58b9dbf75f70c28c32f34e18bcaa83002638a785b52c3d01910f151db30

CheckBingo_1.0.0.apk, 74.427.477 bytes

Cómo comprobar la huella del archivo paso a paso

En macOS o Linux. Abre Terminal, ve a la carpeta donde has descargado el archivo y ejecuta:

shasum -a 256 CheckBingo_1.0.0.apk

En Windows. Abre PowerShell o el símbolo del sistema en la carpeta de descarga y ejecuta:

certutil -hashfile CheckBingo_1.0.0.apk SHA256

Directamente en el móvil Android. Hay aplicaciones gratuitas en Play Store que calculan checksums de archivos (por ejemplo "Hash Droid" o "Hash Checker"). Instala una, abre el APK descargado desde ella y compara el SHA-256 que muestra con el de esta página.

El resultado debe coincidir carácter a carácter con el SHA-256 publicado más arriba. Si coincide, la descarga es íntegra. Si no coincide, no instales el archivo y vuelve a descargarlo desde el enlace original.

el laboratorio

Más proyectos

<ndg> </ndg>
Nonsense Development Group

Mi laboratorio personal de apps móviles, desarrolladas en solitario de extremo a extremo: frontend, backend e infraestructura. Una sola persona, todas las capas.

Desarrollo end-to-end iOS & Android Full-stack en solitario
Privacidad

Política de privacidad

Términos

Términos de uso