Novedades · Changelog

Cada semana, un poco mejor.

Mejoramos GarBotGPT casi a diario. Estas son las novedades más recientes: nuevas herramientas, mejoras de velocidad y arreglos, contadas en claro.

  1. v9.5.63

    🎨 Pestaña Personalización (estilo y tono)

    Ajustes reorganiza Instrucciones y Memoria en una sola pestaña "Personalización" (como ChatGPT) y añade control de estilo y tono del asistente: Cálido, Entusiasta, Títulos y listas, y Emoji, cada uno en Menos / Predeterminado / Más. A diferencia de un ajuste decorativo, estas preferencias se envían en cada mensaje y se inyectan en las instrucciones del modelo, así que cambian de verdad cómo responde. Se guardan en tu navegador.

    Nuevo

    • 🧩 Instrucciones + Memoria unificadas en la pestaña Personalización
    • ✅ El estilo afecta de verdad a las respuestas (se inyecta en el prompt)

    Mejorado

    • 🎨 Estilo y tono: Cálido, Entusiasta, Títulos/listas, Emoji (Menos/Predeterminado/Más)
  2. v9.5.62

    🗄️ Pestaña de Almacenamiento en Ajustes

    Nueva pestaña "Almacenamiento" en Ajustes (grupo Tu contenido) donde ves cuánto espacio ocupan tus cosas: el total en uso, una barra con la proporción entre imágenes y archivos, y el desglose con el número y tamaño de cada tipo. Datos reales calculados sobre tus archivos.

    Nuevo

    • 🗄️ Nueva pestaña Almacenamiento con uso total y desglose
    • 🖼️ Separa imágenes y archivos (número y tamaño de cada uno)
  3. v9.5.61

    💜 Distintivo de suscripción en tu avatar

    Igual que los administradores tienen un aro dorado alrededor de su foto, ahora los usuarios con suscripción activa tienen un aro de color (y una pequeña estrella) en su avatar, con un color distinto según el plan: violeta para Max, azul para Pro y verde para Plus. Además, en el menú de usuario aparece el nombre de tu plan junto a tu nombre. Visible tanto en escritorio como en móvil.

    Nuevo

    • 💜 Aro de color en el avatar para suscriptores (distinto del dorado de admin)
    • 🏷️ El plan aparece junto a tu nombre en el menú de usuario

    Mejorado

    • 🎨 Color por plan: Max (violeta), Pro (azul), Plus (verde)
  4. v9.5.60

    🧠 Guardar en memoria de verdad (y por carpeta)

    Corregido un fallo importante: cuando pedías al asistente "guarda en memoria" o "guarda todo", decía que lo había guardado pero NO guardaba nada (lo inventaba). Ahora, cuando pides guardar, el sistema extrae de la conversación los datos que merece la pena recordar y los guarda de verdad: si el chat está dentro de una carpeta, se guardan en la memoria de ESA carpeta; si no, en tu memoria global. Además, el asistente confirma exactamente qué ha guardado, sin inventar. Se evita duplicar memorias ya existentes.

    Nuevo

    • 🧠 "Guarda en memoria" / "guarda todo" ahora guarda de verdad (antes se inventaba)
    • 📁 Dentro de una carpeta, la memoria se guarda en esa carpeta
    • ✅ El asistente confirma exactamente qué guardó
    • 🚫 Evita duplicar lo ya guardado
  5. v9.5.59

    🔧 Los chats activos suben a "Hoy"

    Corregido: al escribir en una conversación de hace días, no subía a la parte de arriba ni al grupo "Hoy" de la barra lateral, porque la fecha de última actividad de la conversación solo se actualizaba al renombrar chats nuevos. Ahora, cada vez que entra un mensaje (envío normal, regenerar, voz o chats compartidos), la conversación se marca como actividad reciente mediante un disparador en la base de datos, así que sube correctamente a "Hoy". Cambio en base de datos; no afecta a los mensajes ni a su contenido.

    Nuevo

    • 🔧 Escribir en un chat antiguo lo sube a "Hoy" en la barra lateral
    • 🗂️ Orden por última actividad correcto en todos los casos
  6. v9.5.58

    🧪 Consumo calculado para admins

    El desglose "Dónde se van tus créditos" ahora también se ve en cuentas de administrador. Como a los admins no se les descuentan créditos, antes su consumo salía siempre a 0 y la sección quedaba vacía. Ahora, si no hay apuntes de consumo en el libro de créditos, la vista usa el coste que ya se guarda en cada mensaje (credits_cost) para mostrar "lo que habrías gastado", con barras por modelo y herramientas usadas. Se etiqueta claramente como coste calculado (no descontado). Para usuarios normales de pago no cambia nada: siguen usando el consumo real del ledger.

    Nuevo

    • 🧪 Los admins ya ven su desglose de consumo (coste calculado, no descontado)
    • 📊 Barras por modelo + herramientas también con datos calculados
    • ✅ Sin cambios para usuarios de pago (consumo real del ledger)
  7. v9.5.57

    📈 Comparador de planes + métricas de negocio

    Dos mejoras en torno a la suscripción. PARA EL USUARIO: la página de planes (/pricing) incluye ahora una tabla comparativa Gratis vs planes de pago (precio, créditos al mes y qué funciones incluye cada uno), para elegir con más claridad. PARA ADMIN: el panel de Facturación añade tres métricas de negocio nuevas junto al MRR ya existente — ARPU (ingreso medio por suscripción, exacto), churn de los últimos 30 días (% y nº de cancelaciones) y altas nuevas de los últimos 30 días. Churn y altas son aproximaciones basadas en las fechas de los entitlements.

    Nuevo

    • 📊 Comparador de planes (Gratis vs Pro) en /pricing
    • 💹 Admin: ARPU (ingreso medio por suscripción)
    • 📉 Admin: churn de 30 días (% y cancelaciones)
    • 🆕 Admin: altas nuevas de 30 días
  8. v9.5.56

    📊 Transparencia de créditos

    La pantalla de suscripción (página /suscripcion y pestaña de Ajustes) ahora muestra en qué se gastan tus créditos. NUEVO: historial de movimientos (cada otorgamiento, compra o consumo con fecha, motivo legible y signo), desglose "dónde se van tus créditos" este mes con una barra por modelo y las herramientas usadas, y un aviso de saldo bajo que estima cuántos días te duran los créditos a tu ritmo actual (banner ámbar si quedan pocos, rojo si te has quedado a cero, con acceso directo a recargar). Datos calculados sobre el libro de créditos y el detalle de cada mensaje.

    Nuevo

    • 🧾 Historial de movimientos de créditos (otorgados / comprados / consumidos)
    • 📊 Desglose "dónde se van tus créditos" por modelo + herramientas
    • ⏳ Estimación de días restantes según tu ritmo de consumo
    • 🔔 Aviso de saldo bajo y de créditos agotados con botón de recarga
  9. v9.5.55

    💳 Suscripción rediseñada

    Rediseño visual de la suscripción, tanto en la página /suscripcion como en la pestaña Suscripción de Ajustes (comparten el mismo componente). La novedad principal es una tarjeta "monedero" con degradado, el saldo de créditos en grande, el plan actual y una barra de consumo del periodo (usado frente a la asignación mensual). La tarjeta de plan es más clara, con iconos, indicador de estado en color y un aviso cuando la suscripción está marcada para cancelarse. Los botones de acción son más visibles, la carga ahora muestra un esqueleto en vez de un spinner, y el estado de invitado se ha rediseñado. Auto-recarga, referidos y facturas se mantienen.

    Nuevo

    • 🎴 Tarjeta "monedero" con saldo de créditos y barra de consumo del periodo
    • 📋 Tarjeta de plan más clara (estado en color, aviso de cancelación)
    • 🟣 Botones de acción más visibles + esqueleto de carga

    Mejorado

    • 👤 Estado de invitado rediseñado
  10. v9.5.54

    💬 Panel admin: gestión de Chats

    Nueva pestaña "Chats" en el panel de administración (grupo Principal, junto a Usuarios) para ver y gestionar TODAS las conversaciones de todos los usuarios desde un único sitio. Permite buscar por título, abrir cualquier chat en el visor de solo lectura (ahora con enlace directo a la conversación concreta), renombrarlo en línea y eliminarlo. El borrado es atómico y preserva el histórico de coste (desliga token_usage antes de eliminar la conversación y sus mensajes). La lista carga por páginas y muestra dueño, número de mensajes, modelo y última actividad. Todo protegido con verificación de admin en servidor.

    Nuevo

    • 💬 Nueva tab "Chats" en el panel admin con todas las conversaciones
    • 🔎 Búsqueda por título + paginación "Cargar más"
    • 👁️ Ver cualquier chat (visor de solo lectura con enlace directo)
    • ✏️ Renombrar en línea y 🗑️ eliminar (borrado seguro que preserva el coste)
  11. v9.5.53

    ✨ Pulido de la interfaz de escritorio

    Mejoras visuales y de usabilidad centradas en el escritorio (PC). AJUSTES: el panel de ajustes se reorganiza en secciones para que se entienda mejor de cara a cliente. CABECERA: el menú de usuario se agrupa en "Cuenta" y "Más", y todas sus opciones (Suscripción, Mis archivos, Calendario, Cambiar de cuenta, Añadir cuenta) pasan por el sistema de idiomas en vez de estar fijas en español — así respetan el idioma elegido. BARRA LATERAL: arreglado el menú contextual del chat que salía cortado y no mostraba todas las opciones (p. ej. "Eliminar"); ahora se posiciona dinámicamente según el espacio disponible. Además se unificaron radios, tipografía y sombras de la barra lateral. ADMIN: los iconos de acción en Usuarios tienen más contraste; Modelos añade una leyenda visible para los badges de capacidad (S/V/T/J/D/W/R). LIMPIEZA: borrado el código admin antiguo que ya no se usaba (5 componentes "Modern*").

    Nuevo

    • ⚙️ Panel de ajustes reorganizado en secciones
    • 👤 Menú de usuario agrupado y traducible (ya no fija el español)
    • 🛡️ Admin: iconos de Usuarios con más contraste + leyenda de capacidades en Modelos
    • 🧹 Borrado código admin muerto (Modern*)

    Mejorado

    • 🎨 Barra lateral: radios, tipografía y sombras unificados

    Arreglado

    • 🐛 Fix: menú contextual del chat ya no sale cortado (se ven todas las opciones)
  12. v9.5.52

    ⚡ Chat más rápido + endurecimiento de seguridad

    Mejoras internas de rendimiento y seguridad. RENDIMIENTO: el arranque de cada mensaje (/api/chat) ahora lee perfil + conversación + permisos + ajustes de colaboración en UNA sola consulta a la base de datos (nueva RPC get_chat_bootstrap) en lugar de varias idas y vueltas — clave porque la BD está en el NAS de casa y cada consulta cuesta. Se añade caché de 30s de app_settings (modelo de imagen/visión). Los invitados ya entran a /chat sin la pantalla "Preparando GarBotGPT…" (la sesión anónima se crea en el servidor). SEGURIDAD: la tabla guest_usage ahora tiene RLS y solo se toca vía RPC (antes un invitado podía resetear su límite por IP); search_path fijo en 7 funciones; /api/db-query registra el usuario real. FIX: el límite mensual de tokens ahora cuenta bien (antes pedía columnas inexistentes y nunca se aplicaba). Migraciones 121 y 122 aplicadas al NAS. Aparte, se subió max_connections de Postgres 100→200 y se ajustó la memoria/caché del NAS para reducir la lentitud por disco.

    Nuevo

    • 🚪 Invitados entran a /chat sin pantalla de carga

    Mejorado

    • ⚡ Arranque del chat en 1 sola consulta a BD (antes varias) → menos latencia
    • 🗂️ Caché de ajustes (imagen/visión) durante 30s

    Arreglado

    • 🐛 Fix: el límite mensual de tokens ahora se aplica de verdad

    Seguridad

    • 🔒 guest_usage con RLS — no se puede saltar el límite por IP
  13. v9.5.51

    🔧 Fix deploy: consolidación de rutas API de ubicación

    v9.5.49 y v9.5.50 añadieron 3 endpoints nuevos (/api/places/nearby, /api/user/location/home, /api/user/location/travel-mode) que cruzaron el límite de 12 Serverless Functions del plan Hobby de Vercel — el deploy fallaba después de "Build Completed". Ahora todo va en el endpoint existente /api/user/location: GET devuelve {location, home, travel, travel_mode_enabled}; PUT con body.target='home' o 'travel_mode' multiplexa; DELETE?target=home borra solo la casa. /api/places/nearby eliminado (el chat usa la lib directamente). Sin pérdida funcional para el user — las features de v9.5.49 (cerca de mí, modo viaje) siguen activas vía dynamic imports en /api/chat.

    Nuevo

    • ✅ Deploy restaurado (eran 3 funciones de más sobre el límite de 12)
    • 🔀 Endpoint unificado /api/user/location con parámetro target
    • 🗑️ Borrados /api/places/nearby, /api/user/location/home, /api/user/location/travel-mode
  14. v9.5.50

    🏠 Nueva pestaña "Ubicación" en Ajustes

    Pestaña dedicada en Ajustes → Tu cuenta → Ubicación. Tres tarjetas: (1) "Ubicación actual" muestra dónde estás según GPS guardado + zona horaria + fecha de actualización + botón "Refrescar GPS" que pide ubicación al navegador. (2) "Tu casa" muestra tu punto de referencia + botón "Usar ubicación actual como casa" + botón "Borrar". (3) Toggle "Detección automática de viaje" que activa/desactiva el modo viaje. Si estás de viaje, en la parte superior aparece un banner ámbar con la distancia a casa y badge "🌍 Extranjero" si has cambiado de país. Nota de privacidad al final. Nuevo endpoint /api/user/location/travel-mode (GET/PUT).

    Nuevo

    • 🗺️ Pestaña "Ubicación" en Ajustes → Tu cuenta
    • 🏠 Botón "Usar ubicación actual como casa"
    • 📡 Botón "Refrescar GPS" pide ubicación al navegador
    • ✈️ Toggle "Detección automática de viaje"
    • 🌍 Banner "Modo viaje activo" con distancia a casa y badge extranjero
  15. v9.5.49

    🗺️ "Cerca de mí" + Modo viaje automático

    Dos features nuevas conectadas con ubicación. (1) Búsqueda CERCA DE MÍ: ahora puedes preguntar "qué restaurantes hay cerca", "farmacia abierta", "gasolinera", "cajero", "supermercado", "hotel", "qué visitar", etc. El chat detecta la intención + categoría, consulta OpenStreetMap (Overpass API, gratis) en un radio de 2 km de tu ubicación guardada, y devuelve hasta 10 resultados con nombre, distancia, dirección, horario, teléfono y web cuando los hay. 14 categorías soportadas: restaurantes, cafés, bares, farmacias, hospitales, gasolineras, cajeros, bancos, supermercados, hoteles, aparcamientos, paradas de bus, estaciones de tren, lugares de interés. (2) MODO VIAJE automático: profiles.home_location_json guarda tu casa (separada de la ubicación actual). Si tu ubicación actual está >100 km de casa, el chat lo detecta y le dice a la IA "este usuario está de viaje en X, considera moneda local, idioma, cultura, embajadas si pregunta por emergencias". Si además es OTRO PAÍS, añade nota sobre cambio cultural. Endpoints nuevos: /api/places/nearby?category=X y /api/user/location/home (GET/PUT/DELETE). Migración 120 aplicada al NAS (copia location actual como home la primera vez).

    Nuevo

    • 🍽️ "Restaurantes cerca" / "farmacia abierta" / "gasolinera" → resultados reales
    • 🗺️ 14 categorías OSM gratis (Overpass API, sin API key)
    • ✈️ Modo viaje: si estás >100 km de casa, IA lo sabe
    • 🌍 Si estás en otro país: contexto cultural/idioma/moneda automático
    • 🏠 GET/PUT /api/user/location/home para gestionar la ubicación "casa"
  16. v9.5.48

    🛰️ Permiso ubicación TWA Android + header móvil mucho más rápido

    (1) En la TWA Android, activar el permiso de ubicación en "Ajustes de la app" NO bastaba: Chrome internamente tiene una capa por origen separada. El LocationPrompt ahora detecta el estado con navigator.permissions.query, distingue TWA de navegador, y muestra instrucciones específicas + botón "Abrir ajustes" que lleva a chrome://settings/content/siteDetails. Soporta también GPS apagado, timeout, position_unavailable con mensajes distintos. (2) Los 3 botones del MobileHeader (sidebar, modelo, ajustes) eran lo más visible del lag en gama baja: cada uno tenía backdrop-filter:blur(18px)+saturate+brightness+contrast, 6 box-shadows, 2 pseudo-elementos ::before/::after y 6 listeners onPointerMove que recalculaban CSS vars en cada movimiento del dedo. En móvil simplificado a blur(6px) + 1 box-shadow + 0 pseudo-elementos + 0 listeners de pointer. Visual menos llamativo pero suave.

    Nuevo

    • 🛰️ LocationPrompt detecta TWA vs navegador con instrucciones específicas
    • 🔘 Botón "Abrir ajustes de Chrome para este sitio" en TWA Android
    • 🎯 Cero listeners de pointer en móvil (eran 18 entre los 3 botones)

    Mejorado

    • ⚡ MobileHeader botones: blur 18→6px, 6→1 shadows, sin pseudo-elementos
  17. v9.5.47

    ⚡ Optimización rendimiento móvil gama baja (Snapdragon 6xx, Helio, Exynos 8xx)

    En móviles gama alta la app va bien, en gama baja iba lenta. Audit identificó 6 culpables principales. Fixes aplicados en globals.css (cubre toda la app de una sola pasada) + auth pages. (1) backdrop-blur-3xl/2xl/xl en móvil capeado a 8px (antes 12px, v9.5.37 ya bajó de 24+). (2) backdrop-saturate quitado en móvil (compite por GPU sin ser perceptible). (3) animate-ping deshabilitado en móvil (ahorra 8-12ms/frame por dot). (4) animate-pulse ralentizado a 2.5s (menos repaints). (5) mix-blend-mode forzado a normal en móvil (era screen/overlay/multiply, todos hacen composite extra pass). (6) SVG feTurbulence + feDisplacementMap (liquid-refract en login/register) ocultos en móvil — son los más caros de GPU móvil. (7) filter:blur ≥70px capeado a 16px (MusicPlayer, image-gen). (8) will-change permanente solo se activa al hover/focus/active (libera VRAM en idle).

    Nuevo

    • ✨ animate-ping desactivado en móvil (status dots)
    • 🌊 SVG liquid-refract solo en desktop (auth pages)
    • 🎭 mix-blend-mode forzado a normal en móvil
    • 💾 will-change solo al interactuar (libera VRAM)
    • 📉 Estimado: 50-130ms menos por frame en Snapdragon 6xx

    Mejorado

    • 🎨 backdrop-blur móvil: 12→8px + saturate stripped
  18. v9.5.46

    ✅ Bug REAL del tema: Tailwind v4 seguía el modo oscuro del sistema

    Ahora sí: la causa raíz. Tailwind v4 (que es lo que usamos con @import "tailwindcss") por DEFECTO activa la variante `dark:` con DOS condiciones unidas por OR: (1) clase `.dark` en un ancestro, (2) `@media (prefers-color-scheme: dark)`. Resultado: en Android con el sistema en dark, TODAS las clases `dark:bg-*` se activaban aunque nosotros NO añadiéramos la clase `.dark`. Por eso la app salía oscura con el sistema en oscuro pese a haber elegido claro. Fix: @custom-variant dark redefine la variante para que SOLO atienda a la clase. + meta color-scheme + color-scheme:light en :root para que el WebView Android no aplique scrollbars/inputs oscuros del sistema.

    Nuevo

    • 🎯 @custom-variant dark — Tailwind ya solo reacciona a la clase, NO al sistema
    • 🌐 meta color-scheme="light dark" — controla auto-styling de UA

    Mejorado

    • 🎨 :root color-scheme:light — scrollbars/inputs nunca oscuros por sistema
  19. v9.5.45

    ⚡ Reset forzado del tema: todos a claro en el próximo load

    v9.5.44 cambió el default a claro pero no afecta a usuarios que ya tenían "dark" guardado (la mayoría, porque antes auto-detectaba del sistema). Ahora añadido un flag de migración (geia-theme-migrated-v3): en el primer load post-v9.5.45 se ignora cualquier preferencia previa y se fuerza claro. La migración se marca con localStorage flag → solo pasa UNA vez por dispositivo. Tras este reset, si el user vuelve a Ajustes y elige oscuro explícitamente, se respeta y no se vuelve a resetear.

    Nuevo

    • 🔁 Reset one-shot: todos a light en su próximo abrir la app
    • 🚩 Flag geia-theme-migrated-v3 evita re-resetear
    • 👤 Tras el reset, la elección manual del user prevalece
  20. v9.5.44

    ☀️ App siempre en claro por defecto (ya no sigue el modo oscuro del Android)

    Antes la app respetaba el modo oscuro del sistema operativo (prefers-color-scheme: dark) cuando el usuario no había elegido tema. Resultado: si tu Android está en oscuro, la app también, aunque quisieras claro. Cambio: default a CLARO siempre. Si quieres dark, lo activas explícitamente desde Ajustes → Apariencia. La cookie + localStorage se setean al "light" en cuanto cargues por primera vez, así no volverá a evaluar el sistema. Para los usuarios que ya tenían dark elegido y guardado, su preferencia se respeta — solo afecta a primera carga sin preferencia.

    Nuevo

    • ☀️ Default = light (no más auto-oscuro porque tu Android sea dark)
    • 🧠 Si elegiste dark explícitamente, se respeta
    • 🍪 Cookie geia-theme=light fijada al primer load
  21. v9.5.43

    🎨 Tema sincronizado: la app Android respeta tu modo claro/oscuro elegido

    Bug: en la app Android (TWA) el usuario veía siempre tema oscuro aunque tuviera "claro" elegido en el navegador. Causa: el tema se guardaba SOLO en localStorage, que la TWA no hereda del Chrome del sistema → al abrirse caía a `prefers-color-scheme` (Android en dark = app en dark). Fix triple: (1) guardamos también en cookie geia-theme (TWA sí comparte cookies vía Digital Asset Links). (2) Inline script en <head> con strategy=beforeInteractive aplica el tema ANTES del primer pintado leyendo cookie → localStorage → sistema (en ese orden de prioridad). Adiós flash de tema incorrecto. (3) Persistimos en profiles.settings_json.theme via /api/user/theme; al iniciar sesión un nuevo ServerThemeSync component sincroniza con el servidor → el tema viaja entre dispositivos del mismo usuario.

    Nuevo

    • 🍪 Cookie geia-theme además de localStorage (TWA Android comparte cookies)
    • ☁️ /api/user/theme guarda en profiles.settings_json (cross-device)
    • 🔄 ServerThemeSync sincroniza al login y en TOKEN_REFRESHED

    Mejorado

    • ⚡ Script inline en <head> aplica tema antes del primer pintado
  22. v9.5.42

    🎯 Calidad de respuesta sobre documentos: 11 bugs arreglados

    Atacados los 11 bugs reales que afectaban a la calidad de la respuesta cuando preguntas algo del documento. Antes la IA podía decir "no encuentro esa información" aunque el dato estuviera en el PDF. (1) Extracto en contexto subido de 1800→6000 chars + indicador si trunca. (2) En modo búsqueda específica, contexto estructurado de 4→10 docs (antes elegía mal cuál inyectar entre muchos archivos). (3) Fallback raw chunks ya NO trae solo la portada: busca por keyword y distribuye por archivo desde la mitad del PDF. (4) Threshold similarity 0.58→0.45 (más permisivo, menos falsos negativos en preguntas en español). (5) RPC hybrid migrada a config "spanish" con stemming + peso keyword subido a 0.3 (migración 119 aplicada al NAS). (6) Regex fallback del clasificador con ~25 verbos nuevos (explica/analiza/detalla/cuenta/saca/etc). (7) Re-extract gate subido de 16k→100k chars. (8) looksLikeMashedTabular detecta también separación por múltiples espacios. (9) colGap mínimo absoluto 8→12pt para tickets/recibos estrechos. (10) Tesseract OCR sobre PDFs ahora renderiza páginas a PNG antes de pasárselas (antes crasheaba con "PDF reading is not supported"). (11) Prompt de visión exhaustivo: ahora le exigimos listar UNA A UNA cada línea de tabla (antes a veces resumía).

    Nuevo

    • 📜 Extracto en contexto: 1800→6000 chars (datos del final del PDF dejan de perderse)
    • 🎯 Modo búsqueda: 4→10 docs con contexto completo
    • 🔍 Raw fallback con búsqueda keyword + distribución por archivo
    • 🇪🇸 RPC hybrid en español + threshold 0.58→0.45
    • 🧠 Clasificador intent: +25 verbos en regex fallback
    • 👁️ Visión: prompt exige listar cada línea individual
    • 📸 OCR Tesseract PDF→imagen funcional (antes crasheaba)
  23. v9.5.41

    🔍 Tercer pase audit móvil: 1 bug real + tooltips de sidebar

    Tercer pase de audit móvil. El agente reportó 15 issues pero al verificar uno por uno la mayoría eran falsos positivos (números de línea inventados o el responsive ya estaba). Bug REAL arreglado: la última fila de "Accesos rápidos" en WelcomeScreen quedaba parcialmente tapada por el composer en algunos móviles porque el fallback CSS era 192px pero el composer real mide ~240-260px (mic + paperclip + tools). Subido el fallback a 240px y el margen extra a 16/48px. Como pulido: añadidos atributos title en truncates de SidebarSleek (nombres de carpeta y nombre/email del perfil) — long-press en móvil ahora muestra el texto completo.

    Nuevo

    • 🧱 WelcomeScreen padding-bottom: 192→240 px fallback (último card visible)
    • 🧹 Muchos hallazgos del audit eran falsos positivos verificados uno por uno

    Mejorado

    • 🏷️ SidebarSleek: titles en nombre carpeta + nombre/email del perfil
  24. v9.5.40

    🩹 Micro-fixes móvil: tooltips en truncates + type=button en chips

    Pase de pulido sobre los 12 micro-bugs del audit anterior. Añadidos atributos title en spans truncados de MobileHeader (modelo, email, nombre, Spotify track/artist, conversación) y WelcomeScreen (project context, quick action labels) — ahora con long-press aparece tooltip nativo con el texto completo. Añadido type="button" a 19 chips de cierre de tools (×) dentro de ChatInput para garantizar que NO submitean el formulario por accidente cuando estás dentro de un form.

    Nuevo

    • 🏷️ Tooltips en truncates: usuario puede ver email/modelo/título completos con long-press
    • 🔘 19 botones × de tools chip: type="button" → no envían el chat sin querer

    Seguridad

    • ✨ Sin cambios de funcionalidad, solo accesibilidad y seguridad de forms
  25. v9.5.39

    📊 Google Analytics unificado (G-1XXL8PDYBB) + tracking ampliado

    Había DOS Google Analytics IDs conflictivos en el código: G-59TNFB7ZJY (layout.tsx) y G-HJ8GEPD9NE (AnalyticsTracker). El segundo devolvía 404 en la consola del navegador → los page_views se enviaban a un property inexistente y se perdían. Unificado a G-1XXL8PDYBB (el ID nuevo que pediste). Helper centralizado src/lib/analytics.ts con track(), setAnalyticsUser() y constantes Events para evitar typos de nombre. Tracking añadido: user_id automático al cargar (con tipo guest/registered), session_start synthetic en primer load, pricing_viewed en /pricing y /landing/pricing, register_view, login_view, model_changed (con from/to). El tracking existente de chat_message_sent en ChatInput y WelcomeScreen sigue funcionando (alias trackEvent retro-compatible).

    Nuevo

    • 📍 GA ID unificado a G-1XXL8PDYBB
    • 👤 user_id automático tras login con user_type (guest/registered)
    • 💰 Eventos: pricing_viewed, model_changed, register_view, login_view
    • 🔧 Helper src/lib/analytics.ts con constantes Events para consistencia
  26. v9.5.38

    🪛 Audit móvil: 6 bugs visuales arreglados

    Audit de código de los componentes móviles (sin Playwright ni emulador, solo lectura). 6 bugs reales encontrados y arreglados: (1) Touch targets de MobileBottomNav eran ~26px de alto cuando Apple recomienda 44px mínimo → py-1 → py-2.5. (2) El @media móvil de v9.5.37 ponía transition-duration:120ms a TODO sin excluir animations, rompiendo la entrada bonita de SettingsModal y similares. Ahora solo afecta transitions, no @keyframes. (3) "Registrarte gratis · 500 créditos" se cortaba en iPhone SE (320px): label corto en <sm, completo en sm+, con "· 500 créditos" solo en md+. (4) UploadProgressWidget tenía w=340 + right-4 → se salía del viewport en pantallas <360px. Bajado a w=320. (5) LocationPrompt y LowCreditsBanner competían a z-40: el de ubicación sube a z-[45] para tener prioridad. (6) backdrop-blur móvil bajaba a 8px y los toasts con texto encima de contenido variado perdían legibilidad. Subido a 12px (suficiente para legibilidad sin matar el FPS).

    Nuevo

    • 👆 MobileBottomNav: touch targets 26px → 44px (botones Chats/Imágenes/etc)
    • 🎬 Animaciones de modales (SettingsModal sheet-up) ya no se rompen en móvil
    • 📏 Registro: etiqueta corta en <360px para no cortarse
    • 📦 UploadProgressWidget: ancho 340→320 para iPhone SE
    • 🔝 LocationPrompt z-index +5 sobre LowCreditsBanner

    Mejorado

    • 👓 backdrop-blur móvil 8→12px (mejor contraste de toasts)
  27. v9.5.37

    📱 Mejoras móvil: banner ubicación encima del input, recordar modelo, menos lag, ajustes agrupados

    Cinco arreglos de UX móvil reportados: (1) El banner "Comparte tu ubicación" se solapaba con el composer del chat — ahora se posiciona POR ENCIMA del composer + nav (usa --chat-bottom-space) y respeta el keyboard offset. Contraste mejorado en dark mode. (2) El modelo seleccionado no se persistía: cambiabas a GPT-5.5 y al recargar volvía a 5.2. Ahora se guarda en localStorage:geia:last-model y se restaura. (3) Animaciones laggy en móviles low-end: en viewports <768px reducimos transition-duration a 120ms y backdrop-blur a 8px (antes 24px+). Respeta prefers-reduced-motion global. (4) Pantalla Ajustes en móvil: antes lista plana de 15+ items, ahora agrupada en 5 secciones (Tu cuenta · Personalización IA · Tu contenido · Apariencia y voz · Progreso) con iconos 44px (antes 36px) y texto 16px (antes 15px). (5) Indirecto del fix 1: el banner ya no se solapa con texto del composer, contraste de azul más fuerte.

    Nuevo

    • 🗺️ Banner ubicación móvil: encima del composer, no encima
    • 💾 Modelo seleccionado persistido (localStorage)
    • 📋 Ajustes móvil: 5 secciones con iconos grandes en vez de lista plana

    Mejorado

    • ⚡ Móvil: transitions 120ms + backdrop-blur 8px → menos lag
  28. v9.5.36

    💳 Admin billing: plan asigna créditos + planes temporales + más opciones

    Bug arreglado: cuando el admin asignaba un plan a un usuario (ej. "Pro"), solo se actualizaba la columna plan sin otorgarle los créditos correspondientes. El usuario quedaba con plan Pro pero 0 créditos. Ahora al asignar plan se calculan automáticamente los créditos del producto, se otorgan vía grant_credits (queda en ledger) y se setean monthly_credit_grant y status=active. Nuevas opciones añadidas al modal: (1) Planes temporales con N días configurables (1-3650). (2) Renovar +N días sin tocar el plan (extiende caducidad). (3) Resetear cuota mensual (re-otorga créditos del plan ahora mismo). (4) Quitar plan con checkbox "mantener créditos". (5) Notas internas del admin (cap 1000 chars) sobre el usuario. (6) Indicador visible de días restantes y badge "temporal". (7) Validación: si seleccionas un credit_pack en vez de subscription, devuelve error claro.

    Nuevo

    • ⏰ Planes temporales con N días configurables
    • 📅 Renovar +N días sin cambiar el plan
    • 🔄 Resetear cuota mensual (re-grant ahora)
    • 🗑️ Quitar plan con opción "mantener créditos"
    • 📝 Notas internas del admin sobre el usuario

    Arreglado

    • 🐛 FIX: asignar plan ahora otorga sus créditos automáticamente
  29. v9.5.35

    🐛 Auditoría del sistema de análisis de docs: 4 bugs arreglados

    Auditoría completa del pipeline de análisis de documentos. Encontrados y arreglados 4 bugs (uno reportado era falso positivo): (1) Admin guardar config era DELETE→INSERT no atómico → ventana de 1-2s con config vacía si el INSERT fallaba. Ahora INSERT primero, DELETE viejos después. (2) Coords extractor usaba gap=15pt absoluto → en PDFs anchos las columnas con gap pequeño colapsaban. Ahora gap relativo al ancho de página (1.2%). (3) Vision en Vercel usaba useSystemFonts:true asumiendo fuentes del SO → en serverless no existen y el render salía en bloques grises. Ahora useSystemFonts solo en local, en Vercel usa las standard_fonts de pdfjs (Foxit, ~1.2MB bundladas). (4) Regex fallback del clasificador de intent perdía vocabulario común de nóminas/facturas/gastos. Ampliado con ganado/cobrado/percibido/devengado/líquido/deducciones/anual/mensual/etc. Reindex admin ya respetaba config (falso positivo del audit).

    Nuevo

    • 📐 Coords gap: relativo al ancho (1.2%) en vez de 15pt fijo
    • 🖼️ Vision Vercel: standard_fonts del paquete (no system fonts)
    • 🔤 Intent regex: +30 palabras de vocabulario financiero/RRHH

    Seguridad

    • 🔒 Admin config: INSERT antes que DELETE (atómico)
  30. v9.5.34

    📝 Docx/PDF generados sin <artifact> rotos + botones login/registro para invitados

    Dos cosas. (1) Cuando pedías "genérame un documento Word/PDF" la IA envolvía el contenido en <artifact type="markdown">…</artifact>, y el conversor markdown→docx no sabía stripear esas etiquetas → el archivo descargado contenía las etiquetas literales y se veía roto. Ahora cuando hay generación de documento activa: NO se añade el bloque de instrucciones de artifacts al prompt, en su lugar se le dice al modelo "devuelve markdown puro empezando por H1", y como red de seguridad el normalizador strippea cualquier <artifact>/[[ARTIFACT:id]] que cuele. (2) La pantalla de bienvenida no tenía CTA visible para que un invitado pasara a usuario real — solo veía el chat. Ahora arriba aparece una pill discreta: "Estás de invitado · [Iniciar sesión] [Registrarte gratis · 500 créditos]".

    Nuevo

    • 🎯 Welcome de invitados: pill con CTA "Iniciar sesión" + "Registrarte gratis"

    Arreglado

    • 🩹 Genera docx/pdf/xlsx/pptx limpios (sin etiquetas <artifact> dentro)

    Seguridad

    • 🛡️ Stripper de seguridad en normalizeMarkdownDocument

1346 versiones publicadas · página 32 de 45. Míralo dentro de la app.