Por qué una herramienta tan simple merece un artículo

Un generador de códigos QR no es, a primera vista, un proyecto técnicamente interesante. Genera una imagen a partir de un texto y ya está. Pero justamente por lo pequeña que es la herramienta, las decisiones sobre qué incluir y qué dejar fuera se notan mucho más que en un proyecto grande. Cada función de más es una función que hay que mantener, explicar y probar.

Construí el generador de QR de caprini.dev con esa idea en mente: que fuera rápido de usar, gratuito y sin fricciones, aunque eso significara renunciar a funciones que otras herramientas similares sí ofrecen.

Qué decidí que la herramienta debía hacer

El objetivo era cubrir los casos de uso más comunes sin obligar a nadie a crear una cuenta ni a pasar por un muro de pago:

  • Generar un código QR a partir de texto libre, una URL o datos de contacto básicos.
  • Permitir descargar el resultado como imagen, sin depender de hacer una captura de pantalla manual.
  • Que el resultado se generara en el propio navegador siempre que fuera posible, para no depender de un backend con estado y para responder de forma prácticamente instantánea.
  • Que funcionara igual de bien en móvil que en escritorio, porque buena parte del uso real de un QR ocurre precisamente al querer compartir algo rápido desde el teléfono.

Qué decidí que la herramienta no debía hacer

Esta parte es tan importante como la anterior. Dejé fuera, a propósito:

  • Analíticas de escaneo (cuántas veces se ha escaneado un código, desde dónde). Añadir esto habría requerido guardar los códigos en un backend con estado, gestionar identificadores únicos y, probablemente, pedir registro. Rompía por completo la idea de herramienta simple y sin fricción.
  • Personalización avanzada del diseño del QR (colores, logotipos incrustados, formas personalizadas). Es una función habitual en herramientas de pago, pero añade complejidad de interfaz que no aporta nada a quien solo necesita un QR funcional y legible.
  • Cuentas de usuario o historial de códigos generados. Sin cuenta no hay datos personales que proteger ni sesión que gestionar, lo cual simplifica también la parte de privacidad.

Cada "no" de esta lista es, en realidad, una decisión de producto tan deliberada como cualquier "sí".

Un problema técnico que no esperaba: la legibilidad

El reto técnico más interesante no fue generar el QR en sí (existen librerías bien probadas para eso), sino garantizar que el código generado sea legible en condiciones reales: pantallas pequeñas, impresión en baja calidad, cámaras de móvil con poca luz.

Esto me llevó a revisar dos parámetros que al principio no había considerado con suficiente cuidado:

  1. El nivel de corrección de errores del propio estándar QR, que permite que el código siga siendo legible aunque una parte de la imagen esté dañada o mal impresa. Elegí un nivel intermedio como valor por defecto, priorizando legibilidad sobre densidad de datos.
  2. El margen (quiet zone) alrededor del código. Un QR sin margen suficiente falla al escanear en muchos lectores, aunque visualmente parezca correcto.

Ninguno de estos ajustes se nota en un vistazo rápido a la herramienta, pero son la diferencia entre un QR que funciona siempre y uno que falla justo cuando alguien más lo necesita.

Límites que la herramienta sigue teniendo

Soy consciente de que esta herramienta, tal y como está hoy, tiene límites que no oculto:

  • No guarda historial: si cierras la pestaña sin descargar el código, tienes que generarlo de nuevo.
  • No genera QR dinámicos (donde el destino final se puede cambiar después sin regenerar el código), una función que sí ofrecen algunas herramientas de pago.
  • Al ser una utilidad ligera, no está pensada para volúmenes masivos de generación automatizada.

Prefiero que estas limitaciones estén claras a prometer una herramienta que hace más de lo que realmente hace.

Cómo pruebo que el resultado funciona de verdad

No basta con que el código QR se vea correcto en pantalla; tiene que escanear bien en condiciones reales. Antes de dar por buena cualquier modificación en la herramienta, la pruebo con varios lectores distintos: la cámara nativa de al menos dos móviles diferentes y alguna aplicación de escaneo dedicada, porque no todos interpretan igual de bien un código con poco margen o con un nivel de corrección de errores insuficiente.

También pruebo deliberadamente con datos "incómodos": una URL muy larga con parámetros, un texto con tildes y símbolos, y una cadena vacía o con solo espacios, para comprobar que la herramienta responde con un mensaje claro en lugar de generar un código vacío o inválido sin ningún aviso. Este tipo de prueba manual, aunque parezca poco sofisticada, ha detectado más fallos reales que cualquier otra comprobación que haya hecho durante el desarrollo.

Por qué la mantengo gratuita

No monetizo esta herramienta directamente, y no tengo planes de ponerla detrás de un muro de pago para las funciones básicas. La construí originalmente porque la necesitaba yo mismo para otros proyectos, y mantenerla pública y gratuita es, en la práctica, el coste de mantenimiento más bajo posible: sin cuentas, sin backend con estado, sin soporte de facturación.

Puedes probarla directamente en caprini.dev; si en algún momento no la encuentras enlazada desde la portada, es porque sigo reorganizando la navegación del sitio, no porque la haya retirado.

Conclusión

Construir una herramienta pequeña no es una versión reducida de construir una herramienta grande; es un ejercicio distinto, centrado en decidir qué se deja fuera. El generador de QR me lo confirmó: la mayor parte del tiempo de diseño no se fue en lo que la herramienta hace, sino en discutir conmigo mismo todo lo que decidí que no iba a hacer.