Tabla de contenido
Una vez más aquí. Hoy vengo a dejar otro pequeño programa que se me ocurrió hace dos semanas cuando le escuché a una persona dentro del supermercado decir que no tenía suficiente dinero encima para para comprar algo. Entonces pensé, coño, con lo fácil que es mirar primero los precios por internet y después ir a tiro fijo a comprar lo que sea… y poco a poco he ido escribiendo el código de algo que terminé llamando CestIA, y que sirve justo para eso.
Al final del todo, tras escribir código una o dos semanas, terminó resultando en este programa. Que es algo que si buscas una forma práctica de comparar precios entre supermercados en España sin depender de una app oficial de una sola cadena, CestIA es una opción pensada justo para eso. Se trata de un programa de escritorio de código abierto (licencia GNU GPL-3.0) que funciona en tu ordenador: consultas catálogos de varias tiendas, unificas resultados, montas una cesta, anotas gastos, creas alertas y, si quieres, también te va a permitir utilizar inteligencia artificial para planificar la compra. El repositorio oficial está en en GitHub como siempre.
¿Qué es CestIA y qué problema resuelve?
El precio de un mismo producto cambia según la cadena, la zona y el momento. Comparar a mano entre webs de Mercadona, Carrefour, Alcampo, Froiz, Eroski, Lidl, Dia o Gadis es lento y fácil de abandonar. CestIA centraliza esa búsqueda en una interfaz de escritorio (Python + PySide6): escribes lo que necesitas, la app consulta en paralelo las tiendas que tengas activas y te muestra un listado con supermercado, precio, marca, ofertas detectadas y comparación multi-tienda.
Ante de anda, quiero aclarar que CestIA no está afiliada, asociada ni patrocinada por ninguna cadena de supermercados. No vende productos, no gestiona pedidos ni pagos, y no sustituye las webs o apps oficiales. Los precios se obtienen de fuentes de acceso público usadas por el ecommerce de cada tienda; pueden cambiar o dejar de estar disponibles. El uso previsto es personal y local.
Cómo empezar en un minuto
El arranque habitual es sencillo. Como en la mayoría de mis programas escritos en Python, basta con abrir una terminal (Ctrl+Alt+T) y escribir desde el directorio del programa el siguiente comando:
python3 run_app.py

Ese script prepara el entorno virtual si hace falta, instala dependencias y lanza la aplicación. Después, en Configuración activas las tiendas que te interesan (al menos una), guardas y empiezas a buscar en la pestaña Productos. Si quieres el asistente de compras, pegas tu clave de Google Gemini desde Configuración (botón «Obtén tu clave Gemini aquí») Solo necesitas una cuenta de gmail.
Funcionalidades principales de CestIA

- Búsqueda multi-supermercado. Los resultados llegan unificados, con columna de tienda, filtros por precio, Nutri-Score (si existe), rebajados o sin gluten, y la opción de comparar el mismo producto entre cadenas. También se muestran productos de parafarmacia e higiene cuando el catálogo los ofrece, no solo alimentación.
- Ficha de producto. Precio, foto, ingredientes, alérgenos, Nutri-Score (ficha de tienda u Open Food Facts), tabla nutricional, gráfico de evolución del precio con fechas en formato español y alternativas más baratas. Desde la ficha puedes añadir a la cesta, a una lista, marcar favorito, crear una alerta o enviar el producto a Comparar.
- Cesta y presupuesto. Cantidades enteras, subtotales, presupuesto semanal o mensual, cálculo de cesta óptima multi-tienda y un resumen nutricional estimado.
- Listas de la compra. Plantillas reutilizables: cargas en cesta, copias la cesta a la lista, quitas productos, ajustas cantidades y ves el total estimado. También puedes registrar el total de una lista en el registro de gastos.
- Registro de gasto. No es un historial de pedidos online (CestIA no compra por ti): es un diario local de lo que gastaste. Puedes registrar desde la cesta o desde una lista, duplicar un gasto o eliminarlo.
- Comparador de precios. Evolución aproximada a seis meses según lo que hayas buscado y guardado en local. Los productos entran al abrir fichas; no hay que «añadir» a mano una lista opaca. La pestaña Comparar, en cambio, pone dos productos lado a lado desde el botón de la ficha.
- Alertas, estadísticas, escáner e IA. Alertas cuando un producto baja de un precio objetivo; estadísticas de gasto; escáner de códigos (webcam o EAN a mano); asistente Gemini multi-supermercado con respuestas en Markdown.
Privacidad: datos en tu disco

CestIA no crea una cuenta en la nube propia. Productos, precios, cesta, listas y gastos viven en SQLite (datos/cestia.db). La clave de Gemini, si la guardas desde la interfaz, también queda ahí; si prefieres, puedes usar un archivo .env. Sin IA configurada, la lista de la compra no se envía a ningún servicio de inteligencia artificial.
Arquitectura del código: las piezas que más importan
Para quien quiera entender el proyecto o contribuir, estas son las partes más relevantes del código.
1) Arranque y ventana principal
run_app.py y cestia.py ponen en marcha la aplicación. La clase VentanaPrincipal (cestia/interfaz/ventana_principal.py) monta la barra lateral, el stack de páginas (Productos, Cesta, Listas, Registro de gasto, Comparador, Alertas, IA, etc.), los atajos de teclado y el icono de la bandeja del sistema (mostrar/ocultar ventana y salir). Es el «router» de la UI: las páginas emiten señales (abrir producto, añadir a cesta, tema cambiado) y la ventana principal las conecta.
2) Catálogo multi-tienda: el corazón de la búsqueda
cestia/catalogo.py define ServicioCatalogo. Cuando buscas, buscar_async lanza en paralelo (asyncio + hilos) la consulta a cada tienda activa. Luego unifica resultados, aplica coincide_consulta (en cestia/normalizacion.py) para evitar falsos positivos del tipo «manzana» → «manguera», ordena con prioridades (incluyendo parafarmacia cuando la consulta lo pide) y persiste productos y precios en SQLite.
Cada cadena tiene su cliente en cestia/cliente/: Mercadona, Carrefour (Empathy), Alcampo, Froiz, Eroski, Lidl, Dia, Gadis. No todas exponen el mismo nivel de detalle; por ejemplo Froiz a menudo necesita leer el precio de la ficha HTML. Hay caché en disco y límite de peticiones (cestia/cliente/limite_y_cache.py) para no martillar las APIs y para poder avisar de cuándo se actualizaron los precios mostrados (fecha en formato español dd/mm/aaaa HH:MM).
3) Base de datos local
cestia/base_datos/ crea el esquema SQLite y Repositorio encapsula productos, historial de precios, cesta, compras (registro de gasto), alertas, favoritos, listas y ajustes (tema, tiendas, clave Gemini, presupuestos). El historial de precios alimenta el comparador, las estadísticas y la detección de rebajas cuando no hay precio tachado en origen.
4) Interfaz de usuario
cestia/interfaz/paginas.py y paginas_extras.py concentran la mayor parte de pantallas. La búsqueda muestra estado, aviso de frescura de precios y tabla de resultados. La ficha integra Nutri-Score, gráficos Matplotlib y enriquecimiento con Open Food Facts (cestia/enriquecimiento.py). Temas claro/oscuro viven en estilos.py y temas.py.
5) Lógica de negocio ligera
cestia/logica/busqueda.py agrupa productos entre tiendas y calcula textos de comparación claros («Más barato en Dia: 0,95 € (ahorras 0,25 €)»). cestia/logica/cesta_optima.py ayuda a repartir la cesta entre cadenas cuando interesa ahorrar.
6) Asistente de IA

cestia/asistente_ia.py habla con Google Gemini (modelos de la serie 3.x recomendados para claves nuevas). Normaliza modelos obsoletos, prueba conexión y construye prompts multi-supermercado para que la IA no se presente solo como «asistente de Mercadona». La clave se lee primero de ajustes locales y después de variables de entorno.
7) Web opcional
cestia/servidor_web.py ofrece una API/HTML experimental con FastAPI. No es el uso principal: el producto estrella es la app de escritorio.
Limitaciones honestas
CestIA no garantiza el precio en caja. Si una tienda cambia su web o su API, la búsqueda puede fallar hasta actualizar el cliente. El Nutri-Score no siempre está disponible. El comparador solo refleja lo que hayas consultado antes. La IA puede equivocarse. Y las ofertas de folleto «del lunes al domingo» aún no se modelan como campañas fechadas: hoy se detectan rebajas por precio anterior o historial local.
Conclusión
Para el usuario final, el valor de esta aplicación viene a ser ahorrar tiempo al comparar precios entre supermercados, llevar control de cesta y gasto, y tener alertas sin entregar el historial a una plataforma de terceros. Para el desarrollador, el interés está en un ejemplo real de app PySide6 con clientes HTTP heterogéneos, SQLite, caché, concurrencia y una integración opcional de Gemini, todo bajo GPL-3.0 y documentación en español en la carpeta docs/.
CestIA es una herramienta local para analizar el precio de tu compra: buscar, comparar, organizar y, si quieres, preguntar a una IA. No sustituye al supermercado online, pero sí reduce la fricción de mirar ocho webs distintas. Si te interesa probarla o contribuir, el código y las guías están en Github. Solo necesitar clonar y ejecutar python3 run_app.py y empieza por Configuración y una búsqueda sencilla. Comparar precios de supermercado desde el escritorio, con datos en tu PC, es exactamente el enfoque del proyecto.
