SnapExpense es una aplicacion construida con Nuxt que convierte fotos de recibos o tickets en registros de gastos estructurados. Subes una imagen, el servidor la envia a Gemini para extraer la informacion y luego el resultado puede revisarse, editarse, guardarse en MongoDB y administrarse desde la lista de gastos.
- Permite subir imagenes de recibos o tickets desde la interfaz.
- Extrae campos estructurados con Gemini usando un esquema JSON estricto.
- Permite revisar y editar los datos extraidos antes de guardarlos.
- Guarda los gastos en MongoDB.
- Muestra los gastos guardados y permite verlos, editarlos, recargarlos y eliminarlos.
- Nuxt 4
- Vue 3
- Nuxt UI
- Gemini API via
@google/generative-ai - MongoDB
- Zod para validacion de esquemas
Instala las dependencias:
pnpm installCrea un archivo .env en la raiz del proyecto:
GEMINI_API_KEY=your_gemini_api_key
GEMINI_MODEL=gemini-2.5-flash
MONGODB_URI=mongodb://localhost:27017
MONGODB_DB_NAME=SnapExpense
NUXT_PUBLIC_SITE_URL=http://localhost:3000
NUXT_PUBLIC_SITE_NAME=SnapExpenseGEMINI_API_KEY: API key de Gemini usada en el servidor para la extraccion de tickets.GEMINI_MODEL: Nombre del modelo de Gemini. Debe soportar entrada de imagen y salida JSON estructurada.MONGODB_URI: Cadena de conexion a MongoDB.MONGODB_DB_NAME: Nombre de la base de datos usada por la aplicacion.NUXT_PUBLIC_SITE_URL: URL publica base de la app Nuxt.NUXT_PUBLIC_SITE_NAME: Nombre publico de la aplicacion usado en la configuracion runtime.
El modelo predeterminado en este proyecto es gemini-2.5-flash.
Inicia el servidor de desarrollo en http://localhost:3000:
pnpm dev- Abre la aplicacion y sube una imagen del ticket.
- Haz clic en
Extraer datospara enviar la imagen a/api/extract. - El servidor reenvia la imagen a Gemini como
inlineDatay solicita una respuesta JSON estructurada. - La informacion extraida se valida contra el esquema compartido.
- Revisa y edita el resultado en el formulario antes de guardarlo.
- Los registros guardados se almacenan en la coleccion
expensesde MongoDB y se muestran en la lista principal.
pnpm dev
pnpm build
pnpm preview
pnpm generate
pnpm test
pnpm test:watch
pnpm test:coverage
pnpm test:unit
pnpm test:nuxt
pnpm test:e2e
pnpm test:e2e:ui- Las solicitudes a Gemini se ejecutan en el servidor, por lo que la API key no se expone al navegador.
- Los registros extraidos incluyen comercio, fecha de compra, moneda, totales, metodo de pago, numero de factura, articulos y notas de OCR.
- Los gastos se almacenan en una sola coleccion de MongoDB llamada
expenses. - Si el modelo Gemini seleccionado no soporta salidas estructuradas o entrada de imagen, la extraccion fallara y la API devolvera ese error.
Compila la aplicacion:
pnpm buildPrevisualiza localmente la compilacion de produccion:
pnpm preview