Carta Clara: carta QR, administración y lectura de fotos con Gemini

Una carta QR con panel por restaurante y lectura de fotos mediante Gemini. Código abierto, edición manual y revisión antes de incorporar platos.

Cambiar un precio en una carta no debería obligarte a volver a imprimir todos los códigos QR. La dirección puede mantenerse mientras los platos, las descripciones y la disponibilidad cambian por debajo.

Esa es la idea de Carta Clara, una base abierta para cartas digitales de restaurantes. Incluye cuentas separadas, panel de edición, página pública y QR descargable. También incorpora una conexión opcional con Gemini para convertir una foto de la carta en un borrador revisable.

El proyecto está en GitHub, con licencia MIT, instrucciones y una carta ficticia de ejemplo.

Portada real de Carta Clara con una carta ficticia y acceso al panel

Primero, una carta que funcione sin IA

Puedes crear categorías, añadir platos, escribir una descripción, cambiar precios y ocultar lo que esté agotado. Cada restaurante tiene un identificador único que forma parte de su dirección pública.

El panel guarda los cambios cuando pulsas Guardar carta. La página pública utiliza la última versión guardada; lo que tengas a medio editar todavía no aparece allí. El QR apunta a esa dirección, no a una fotografía fija del menú.

La edición usa Next.js y SQLite. No necesita un proyecto Firebase ni una clave de Gemini para probar el recorrido manual.

Arrancar y preparar el ejemplo

Descarga el proyecto, entra en su carpeta y ejecuta:

npm ci
cp .env.example .env.local

En la copia de configuración, cambia ENABLE_SIGNUP=true para crear cuentas en tu instalación local. Después:

npm run dev

Abre http://127.0.0.1:3000, entra en Administración y crea una cuenta de prueba con datos ficticios. Pulsa Cargar carta de ejemplo, abre la pestaña Restaurante y elige un identificador disponible.

Guarda. Cambia el precio de un plato y oculta otro. Vuelve a guardar y abre la carta pública: deberías ver el precio nuevo y el plato oculto ya no debería aparecer.

Panel real de edición con platos, categorías, precios y disponibilidad

El QR contiene una dirección real

En Tu QR puedes descargar un SVG para imprimir. El código utiliza APP_URL y el identificador del restaurante. En la prueba se ha generado y decodificado el QR para comprobar su contenido.

Hay un detalle práctico: 127.0.0.1 es el propio dispositivo. Un cliente que escanee un QR de localhost con su teléfono no llegará al servidor de tu ordenador. Para utilizarlo en un restaurante necesitas alojar la aplicación y configurar su dominio HTTPS. Si cambias el identificador después de imprimir, el QR anterior dejará de apuntar a una carta disponible.

Carta pública real con platos de ejemplo y el QR generado por la aplicación

Dónde entra Gemini

La pestaña de lectura acepta una foto JPEG, PNG o WebP. El servidor verifica la sesión, el tipo de imagen, su tamaño y dimensiones. Después reduce la imagen, elimina metadatos al convertirla y la envía a Gemini con un esquema de salida.

La clave se configura en GEMINI_API_KEY, únicamente en servidor. El modelo es configurable con GEMINI_MODEL; el ejemplo utiliza gemini-3.8-flash, incluido en la documentación oficial de modelos consultada.

Si falta la clave, el panel lo explica y el análisis queda deshabilitado. El editor manual sigue funcionando.

Pantalla real que indica que Gemini no está configurado y permite seleccionar una foto sin enviarla

Esta captura muestra el estado realmente comprobado sin clave. No se ha simulado una respuesta de Gemini para ilustrar un escaneo exitoso.

La revisión forma parte de la función

La IA devuelve platos con categoría, nombre, descripción y precio. Si un precio no se puede leer, queda vacío. No se inventa un cero para que el formulario parezca completo.

El resultado aparece como borrador. Primero corriges los campos, después incorporas los platos al editor y, por último, guardas la carta. La herramienta no deduce alérgenos ni garantiza que un plato sea apto para una dieta. Esa información necesita la confirmación del negocio.

Para activar esta parte en tu instalación, revisa los precios, los límites y las condiciones de Gemini. Los límites internos del ejemplo —diez intentos por restaurante y cincuenta por instalación cada veinticuatro horas— son controles de la aplicación, no cuotas gratuitas del proveedor ni un límite de gasto garantizado.

Qué he probado

Se han probado registro, sesión, edición, guardado y lectura pública. Una segunda cuenta no obtiene la carta de la primera ni puede apropiarse de su identificador. El QR se genera como SVG y se ha comprobado su dirección.

Para Gemini hay dos comprobaciones locales: el contrato del SDK con una respuesta de prueba y el flujo de revisión en navegador con una respuesta simulada expresamente identificada. Se ha verificado que un precio vacío bloquea la incorporación y que incorporar no guarda automáticamente. No se ha enviado una foto a Gemini ni comprobado una extracción real con una clave activa.

Qué falta para convertirlo en tu servicio

Esta edición ofrece el núcleo de la carta y la administración por restaurante. No incluye cobro de suscripciones, verificación por correo, recuperación de contraseñas, traducciones o mapas externos. Necesita una instancia Node con almacenamiento persistente; no es una configuración para escalar varias réplicas sin adaptar la base de datos.

Un buen primer cambio puede ser añadir horarios. Es concreto, visible y no obliga a introducir otra integración:

Lee Carta Clara y propón cómo añadir horarios del restaurante al panel y
la carta pública. Mantén el aislamiento entre cuentas y la validación del
servidor. No añadas servicios externos ni cambies el funcionamiento del QR.
Incluye una prueba con una segunda cuenta que no pueda editar esos horarios.

Descarga Carta Clara desde GitHub. Empieza por el editor manual; cuando esa parte esté clara, decide si la lectura de fotos encaja con tu instalación.