{
  "1.76.5": {
    "modules": {
      "core": {
        "pt": "Navegação web e memória de rotas: digitar uma URL específica na barra de endereços agora tem prioridade total e atualiza a memória de navegação de desenvolvimento, evitando que o app force o retorno para telas acessadas anteriormente.",
        "en": "Web navigation and dev route memory: typing a specific URL into the browser bar now takes full precedence and updates dev route memory, preventing the app from forcing a bounce back to previously visited screens.",
        "es": "Navegación web y memoria de rutas: escribir una URL específica en la barra de direcciones ahora tiene prioridad total y actualiza la memoria de rutas de desarrollo, evitando que la app fuerce el retorno a pantallas visitadas anteriormente."
      }
    }
  },
  "1.76.4": {
    "modules": {
      "drive": {
        "pt": "Modo de teste (loopback) da corrida: nas telas de corrida em andamento (motorista e passageiro), a troca de papel ganhou um botão próprio na barra superior, ao lado do título. Antes ela só acontecia escondida atrás do botão de voltar, dando a impressão de que o atalho de teste tinha sumido. O botão de voltar passa a se comportar sempre como na produção (cancelar corrida ou sair da navegação), em qualquer situação.",
        "en": "Ride test mode (loopback): the role-switch action on the active-ride screens (driver and passenger) now has its own button in the top bar, next to the title. Before, it was only reachable by tapping the back arrow, which made the test shortcut look like it had disappeared. The back button now always behaves like production (cancel ride or leave navigation), regardless of loopback.",
        "es": "Modo de prueba de viaje (loopback): en las pantallas de viaje en curso (conductor y pasajero), el cambio de rol ahora tiene su propio botón en la barra superior, junto al título. Antes solo se podía activar tocando la flecha de volver, lo que daba la sensación de que el atajo de prueba había desaparecido. El botón de volver ahora siempre se comporta como en producción (cancelar viaje o salir de la navegación), sin importar el modo de prueba."
      }
    }
  },
  "1.75.0": {
    "modules": {
      "drive": {
        "pt": "Cadastro de motorista: a tela de \"Enviando foto...\" agora mostra o progresso real do upload (%) em vez de ficar parada com um spinner mudo por até 20s, dando a impressão de travamento mesmo quando o envio está avançando normalmente.",
        "en": "Driver onboarding: the \"Uploading photo...\" screen now shows real upload progress (%) instead of sitting still with a silent spinner for up to 20s, which made it look frozen even while the upload was progressing normally.",
        "es": "Registro de conductor: la pantalla \"Enviando foto...\" ahora muestra el progreso real del envío (%) en lugar de quedarse quieta con un spinner mudo por hasta 20s, lo que daba la sensación de que se había trabado aunque el envío avanzara con normalidad."
      }
    }
  },
  "1.74.4": {
    "modules": {
      "components": {
        "pt": "App Bar: o botão de voltar agora só aparece quando realmente existe uma tela anterior no histórico de navegação. Telas raiz (Home, Notificações, Configurações e qualquer tela nova gerada sem histórico) deixam de exibir o botão indesejado automaticamente.",
        "en": "App Bar: the back button now only appears when there is actually a previous screen in the navigation history. Root screens (Home, Notifications, Settings, and any newly created screen without a history) automatically stop showing the unwanted button.",
        "es": "App Bar: el botón de volver ahora solo aparece cuando realmente existe una pantalla anterior en el historial de navegación. Las pantallas raíz (Inicio, Notificaciones, Configuración y cualquier pantalla nueva creada sin historial) dejan de mostrar el botón no deseado automáticamente."
      }
    }
  },
  "1.74.3": {
    "modules": {
      "core": {
        "pt": "Modo preview (configure later): corrigido o botão X do paywall (e qualquer saída do onboarding) que ficava sem resposta. O onboarding marcava a conta como criada mas o guard de rotas achava que era um logout e mandava de volta pro login em vez de deixar seguir pro paywall/Home.",
        "en": "Preview mode (configure later): fixed the paywall's X button (and any exit from onboarding) going unresponsive. Onboarding marked the account as created, but the route guard mistook it for a post-logout state and bounced back to sign-in instead of letting the user reach the paywall/Home.",
        "es": "Modo preview (configure later): corregido el botón X del paywall (y cualquier salida del onboarding) que quedaba sin respuesta. El onboarding marcaba la cuenta como creada, pero el guard de rutas lo confundía con un estado post-logout y rebotaba al login en vez de dejar llegar al paywall/Home."
      },
      "onboarding": {
        "pt": "Modo preview (configure later): ao concluir o onboarding sem backend conectado, a conta local agora é marcada como pronta corretamente (sem chamar o backend), o que também corrige o botão X do paywall preso.",
        "en": "Preview mode (configure later): finishing onboarding without a connected backend now correctly marks the local account as done (without calling the backend), which also fixes the paywall's stuck X button.",
        "es": "Modo preview (configure later): al terminar el onboarding sin backend conectado, la cuenta local ahora se marca correctamente como lista (sin llamar al backend), lo que también corrige el botón X del paywall atascado."
      }
    }
  },
  "1.74.2": {
    "modules": {
      "core": {
        "pt": "Modo preview (configure later): cadastro/login por e-mail agora passa direto mesmo com campos vazios (o formulário validava antes de chegar no bypass). Onboarding não tenta mais criar uma conta anônima real sem backend conectado (erro \"Criando sua conta\" corrigido). kasy update core recebe automaticamente a constante kBackendConfigured em projetos criados antes dessa feature existir.",
        "en": "Preview mode (configure later): email signup/signin now passes through even with empty fields (the form validated before ever reaching the bypass). Onboarding no longer tries to create a real anonymous account without a connected backend (fixes the \"Creating your account\" error). kasy update core now backfills the kBackendConfigured constant on projects created before this feature existed.",
        "es": "Modo preview (configure later): el registro/login por email ahora pasa directo incluso con campos vacíos (el formulario validaba antes de llegar al bypass). El onboarding ya no intenta crear una cuenta anónima real sin backend conectado (corrige el error \"Creando tu cuenta\"). kasy update core ahora rellena la constante kBackendConfigured en proyectos creados antes de que esta función existiera."
      }
    }
  },
  "1.74.1": {
    "modules": {
      "core": {
        "pt": "Device Preview no iframe do Kasy Studio esconde a barra de ferramentas quando a URL tem embedStudio=1, sem precisar recompilar com dart-define. O AGENTS.md do projeto gerado documenta o modo preview (configure later): onboarding na primeira visita em iPhone/Android/iPad, Home no Desktop.",
        "en": "Device Preview in the Kasy Studio iframe hides the toolbar when the URL has embedStudio=1, without recompiling with a dart-define. The generated project's AGENTS.md documents preview mode (configure later): onboarding on first visit on iPhone/Android/iPad, Home on Desktop.",
        "es": "Device Preview en el iframe de Kasy Studio oculta la barra de herramientas cuando la URL tiene embedStudio=1, sin recompilar con dart-define. El AGENTS.md del proyecto generado documenta el modo preview (configure later): onboarding en la primera visita en iPhone/Android/iPad, Home en Desktop."
      }
    }
  },
  "1.74.0": {
    "modules": {
      "core": {
        "pt": "Novo fluxo configure later: crie o app em modo preview sem conectar Firebase/Supabase na hora (`kasy new` pergunta agora ou depois; MCP `configureLater`). Conecte depois com `kasy backend` ou MCP `configure_backend` — cria o projeto real, escreve as credenciais de verdade, ativa Google/Apple Sign-In (mesmo comportamento do `kasy new`) e roda sem travar em pergunta interativa. Em preview: onboarding aparece na primeira visita (Device Preview iPhone/Android/iPad); Desktop preview vai direto pra Home. Auth por email navega no app; login social mostra aviso ate conectar o backend real. Release iOS/Android/Codemagic avisa se o backend ainda nao foi configurado.",
        "en": "New configure-later flow: scaffold the app in preview mode without connecting Firebase/Supabase up front (`kasy new` asks now or later; MCP `configureLater`). Connect later with `kasy backend` or MCP `configure_backend` — creates the real project, writes real credentials, enables Google/Apple Sign-In (matching `kasy new`'s behavior), and runs without hanging on an interactive prompt. In preview: onboarding shows on the first visit (Device Preview iPhone/Android/iPad); Desktop preview goes straight to Home. Email auth navigates the app; social sign-in shows a toast until the real backend is connected. iOS/Android/Codemagic release warns when the backend is still unconfigured.",
        "es": "Nuevo flujo configure later: crea la app en modo preview sin conectar Firebase/Supabase al inicio (`kasy new` pregunta ahora o despues; MCP `configureLater`). Conecta despues con `kasy backend` o MCP `configure_backend` — crea el proyecto real, escribe las credenciales reales, activa Google/Apple Sign-In (mismo comportamiento que `kasy new`) y corre sin quedarse esperando una pregunta interactiva. En preview: el onboarding aparece en la primera visita (Device Preview iPhone/Android/iPad); el preview Desktop va directo a Home. El auth por email navega la app; el login social muestra un aviso hasta conectar el backend real. Release iOS/Android/Codemagic avisa si el backend aun no esta configurado."
      }
    }
  },
  "1.73.2": {
    "modules": {
      "core": {
        "pt": "Corrigido sinal de saude falso no preview web: o endpoint de health do device preview (usado pelo toolbar r/R e por integracoes que hospedam o preview remotamente) podia reportar 'pronto' para sempre depois do primeiro carregamento, mesmo que o processo do Flutter tivesse morrido depois. Agora ele confirma de verdade se a porta do app ainda esta respondendo antes de dizer que esta tudo bem.",
        "en": "Fixed a false health signal in the web preview: the device preview health endpoint (used by the r/R toolbar and by integrations that host the preview remotely) could report 'ready' forever after the first load, even if the Flutter process had died since. It now confirms the app port is actually still responding before saying everything is fine.",
        "es": "Corregida una senal de salud falsa en la vista previa web: el endpoint de salud del device preview (usado por la barra r/R y por integraciones que alojan la vista previa de forma remota) podia reportar 'listo' para siempre despues de la primera carga, aunque el proceso de Flutter hubiera muerto despues. Ahora confirma de verdad que el puerto de la app sigue respondiendo antes de decir que todo esta bien."
      }
    }
  },
  "1.73.1": {
    "modules": {
      "core": {
        "pt": "Corrigido crash no preview web ao trocar de tela com o toolbar do device preview aberto (ex.: fechar a tela de assinatura) — os tooltips novos dos botões r/R (1.73.0) usavam um Overlay que não atualizava depois do primeiro frame. Screenshot do device preview voltou ao tamanho leve (0.3x), pensado pra colar rápido em ferramentas de IA.",
        "en": "Fixed a crash in the web preview when navigating away with the device preview toolbar open (e.g. closing the paywall) — the new r/R button tooltips (1.73.0) used an Overlay that never updated after the first frame. Device preview screenshots are back to the lightweight 0.3x size, tuned for fast pasting into AI tools.",
        "es": "Corregido un crash en la vista previa web al cambiar de pantalla con la barra de herramientas del device preview abierta (p. ej. cerrar la pantalla de suscripción) — los nuevos tooltips de los botones r/R (1.73.0) usaban un Overlay que no se actualizaba después del primer frame. Las capturas del device preview volvieron al tamaño liviano (0.3x), pensado para pegar rápido en herramientas de IA."
      }
    }
  },
  "1.73.0": {
    "modules": {
      "core": {
        "pt": "Corrigido bug visual em que a barra de navegação inferior podia reaparecer sobre subpáginas de Configurações (Lembretes/Feedback) ao trocar de tema ou atualizar a tela. Tooltips novos nos botões de hot reload/restart do device preview. A sincronização da URL na web agora preserva parâmetros de consulta ao navegar.",
        "en": "Fixed a visual bug where the bottom navigation bar could reappear over Settings sub-pages (Reminders/Feedback) after a theme toggle or screen refresh. New tooltips on the device preview's hot reload/restart buttons. Web URL sync now preserves query parameters on navigation.",
        "es": "Corregido un bug visual en el que la barra de navegación inferior podía reaparecer sobre subpáginas de Configuración (Recordatorios/Comentarios) al cambiar de tema o actualizar la pantalla. Nuevos tooltips en los botones de hot reload/restart de la vista previa. La sincronización de URL web ahora preserva los parámetros de consulta al navegar."
      }
    }
  },
  "1.72.7": {
    "modules": {
      "core": {
        "pt": "Auth: logout e URLs manuais não abrem mais o app sem sessão. Web Desktop e `/onboarding` depois de sair vão para login em vez da Home com \"Cadastrar\" e sem Sair. Flag local de onboarding não conta mais como conta.",
        "en": "Auth: logout and manual URLs no longer open the app without a session. Web Desktop and `/onboarding` after sign-out go to login instead of Home with \"Register\" and no Sign out. The local onboarding flag no longer counts as a session.",
        "es": "Auth: cerrar sesión y URLs manuales ya no abren la app sin sesión. Web Desktop y `/onboarding` tras salir van al login en lugar de Inicio con \"Registrarse\" y sin Cerrar sesión. La marca local de onboarding ya no cuenta como sesión."
      }
    }
  },
  "1.72.6": {
    "modules": {
      "components": {
        "pt": "App bar: corrigido de vez o roubo de foco do campo de busca do header (1.72.5 só cobria a volta do Admin e ainda piscava). Agora o campo rejeita qualquer foco que não veio de um clique nele ou do Tab do teclado, antes do frame pintar — sem piscar e sem afetar a navegação por teclado.",
        "en": "App bar: properly fixed the header search field stealing focus (1.72.5 only covered leaving Admin and still flickered). The field now rejects any focus that didn't come from a click on it or a keyboard Tab, before the frame paints — no flicker and keyboard navigation unaffected.",
        "es": "App bar: corregido definitivamente el robo de foco del campo de búsqueda del header (1.72.5 solo cubría salir de Admin y aún parpadeaba). Ahora el campo rechaza cualquier foco que no venga de un clic en él o del Tab del teclado, antes de pintar el frame — sin parpadeo y sin afectar la navegación por teclado."
      },
      "core": {
        "pt": "Navegação: o ancoramento de foco da sidebar (Tab do teclado) agora reage a qualquer tela empurrada/removida no navigator raiz (Admin, telas de detalhe), não só troca de aba — evita a mesma disputa de foco em qualquer parte do app.",
        "en": "Navigation: the sidebar keyboard-focus anchor now reacts to any screen pushed/popped on the root navigator (Admin, detail screens), not just tab switches — prevents the same focus race anywhere in the app.",
        "es": "Navegación: el anclaje de foco de teclado de la sidebar ahora reacciona a cualquier pantalla empujada/quitada en el navigator raíz (Admin, pantallas de detalle), no solo cambio de pestaña — evita la misma disputa de foco en cualquier parte de la app."
      }
    }
  },
  "1.72.5": {
    "modules": {
      "components": {
        "pt": "App bar: busca do header desktop não rouba mais o foco ao voltar do Admin para o app (Flutter web).",
        "en": "App bar: desktop header search no longer steals focus when returning from Admin to the app (Flutter web).",
        "es": "App bar: la búsqueda del header en desktop ya no roba el foco al volver de Admin al app (Flutter web)."
      },
      "core": {
        "pt": "Demo LP (`?enter=demo`): Device Preview em Desktop (sem onboarding de iPhone), auto-login vai para `/admin` e Sign In pré-preenche o reviewer se a sessão falhar. Admin demo: `demo_admin` vê pedidos de feature sem truncar; só admin real modera.",
        "en": "LP demo (`?enter=demo`): Device Preview on Desktop (no iPhone onboarding), auto-login lands on `/admin` and Sign In prefills the reviewer if the session fails. Admin demo: `demo_admin` sees full feature requests; only full admin can moderate.",
        "es": "Demo LP (`?enter=demo`): Device Preview en Desktop (sin onboarding de iPhone), auto-login va a `/admin` y Sign In rellena al reviewer si falla la sesión. Admin demo: `demo_admin` ve solicitudes completas; solo admin real modera."
      }
    }
  },
  "1.72.4": {
    "modules": {
      "drive": {
        "pt": "Cadastro de motorista: salva o perfil antes da foto opcional (não trava se o upload falhar) e mostra erro específico de sessão ou rede em vez de só \"Erro\".",
        "en": "Driver onboarding: saves the profile before the optional photo (no longer hangs if upload fails) and shows a specific session or network error instead of a bare \"Error\".",
        "es": "Registro de conductor: guarda el perfil antes de la foto opcional (ya no se traba si falla el upload) y muestra un error concreto de sesión o red en lugar de solo \"Error\"."
      },
      "core": {
        "pt": "i18n: strings de erro do cadastro de motorista (falha genérica, sessão/permissão, rede). Rode também `kasy update drive`.",
        "en": "i18n: driver onboarding error strings (generic failure, session/permission, network). Also run `kasy update drive`.",
        "es": "i18n: textos de error del registro de conductor (fallo genérico, sesión/permiso, red). Ejecuta también `kasy update drive`."
      }
    }
  },
  "1.72.1": {
    "modules": {
      "core": {
        "pt": "`kasy prepare` / doctor / MCP: Supabase ou API sem push não pedem mais Firebase CLI, FlutterFire nem gcloud. Push depois (`kasy add notifications`) instala essas tools na hora.",
        "en": "`kasy prepare` / doctor / MCP: Supabase or API without push no longer require Firebase CLI, FlutterFire, or gcloud. Enabling push later (`kasy add notifications`) installs those tools then.",
        "es": "`kasy prepare` / doctor / MCP: Supabase o API sin push ya no piden Firebase CLI, FlutterFire ni gcloud. Activar push después (`kasy add notifications`) instala esas tools en el momento."
      }
    }
  },
  "1.72.0": {
    "modules": {
      "core": {
        "pt": "Supabase sem Firebase companion: Remote Config vira no-op (app não trava no splash). Google Sign-In desacoplado do push no `kasy new --yes`/MCP. Provedor Google já fica Enabled no Supabase Auth no create (como Apple); credenciais depois com `kasy google`.",
        "en": "Supabase without Firebase companion: Remote Config is a no-op (app no longer hangs on splash). Google Sign-In decoupled from push in `kasy new --yes`/MCP. Google provider is Enabled on Supabase Auth at create (like Apple); credentials later via `kasy google`.",
        "es": "Supabase sin Firebase companion: Remote Config pasa a no-op (la app ya no se queda en splash). Google Sign-In desacoplado del push en `kasy new --yes`/MCP. El proveedor Google queda Enabled en Supabase Auth al crear (como Apple); credenciales después con `kasy google`."
      }
    }
  },
  "1.71.12": {
    "modules": {
      "core": {
        "pt": "Web debug: Device Preview voltou no `kasy run --web` (gate `kDebugMode` restaurado após isolamento da demo LP). Novos atalhos sem conflito com Cursor/VS Code: Control+Shift+I (Dev Inspector) e Control+Shift+D (Device Preview).",
        "en": "Web debug: Device Preview is back on `kasy run --web` (`kDebugMode` gate restored after LP demo isolation). New shortcuts that avoid Cursor/VS Code conflicts: Control+Shift+I (Dev Inspector) and Control+Shift+D (Device Preview).",
        "es": "Web debug: Device Preview volvió en `kasy run --web` (gate `kDebugMode` restaurado tras el aislamiento de la demo LP). Nuevos atajos sin conflicto con Cursor/VS Code: Control+Shift+I (Dev Inspector) y Control+Shift+D (Device Preview)."
      }
    }
  },
  "1.71.11": {
    "modules": {
      "core": {
        "pt": "AGENTS.md: matriz de auth social por plataforma (web/iOS/Android) para IAs. CLI: `kasy status` mostra Auth por plataforma e `kasy status --json` para agentes; caixa de sucesso do `kasy new` separa o que já funciona do que exige `kasy apple-web` / `kasy facebook`.",
        "en": "AGENTS.md: social auth platform matrix (web/iOS/Android) for AI agents. CLI: `kasy status` shows Auth by platform plus `kasy status --json` for agents; `kasy new` success card separates what works from what still needs `kasy apple-web` / `kasy facebook`.",
        "es": "AGENTS.md: matriz de auth social por plataforma (web/iOS/Android) para IAs. CLI: `kasy status` muestra Auth por plataforma y `kasy status --json` para agentes; el resumen de `kasy new` separa lo que ya funciona de lo que aún requiere `kasy apple-web` / `kasy facebook`."
      }
    }
  },
  "1.71.10": {
    "modules": {
      "core": {
        "pt": "Republicação da 1.71.9 (tarball npm estava 404). Inclui fix do Google OAuth no Supabase+push e `kasy google --repair-companion`.",
        "en": "Republish of 1.71.9 (npm tarball was 404). Includes Supabase+push Google OAuth fix and `kasy google --repair-companion`.",
        "es": "Republicación de 1.71.9 (tarball npm devolvía 404). Incluye fix de Google OAuth en Supabase+push y `kasy google --repair-companion`."
      }
    }
  },
  "1.71.9": {
    "modules": {
      "core": {
        "pt": "Supabase + push: corrige provisionamento do Google OAuth (redirect URI duplicada no firebase deploy). Novo `kasy google --repair-companion` para reparar projetos com Google vazio no Supabase.",
        "en": "Supabase + push: fixes Google OAuth provisioning (duplicate redirect URI on firebase deploy). New `kasy google --repair-companion` to repair projects with empty Google on Supabase.",
        "es": "Supabase + push: corrige el aprovisionamiento de Google OAuth (redirect URI duplicada en firebase deploy). Nuevo `kasy google --repair-companion` para reparar proyectos con Google vacío en Supabase."
      }
    }
  },
  "1.71.5": {
    "modules": {
      "core": {
        "pt": "Novo `kasy oauth-web`: registra redirect URIs `firebaseapp.com` + `web.app` no Google Cloud e ajusta `authDomain` para projetos já existentes. `kasy update backend` também roda essa sincronização quando há projeto Firebase.",
        "en": "New `kasy oauth-web`: registers `firebaseapp.com` + `web.app` redirect URIs in Google Cloud and patches `authDomain` for existing projects. `kasy update backend` runs the same sync when a Firebase project is present.",
        "es": "Nuevo `kasy oauth-web`: registra redirect URIs `firebaseapp.com` + `web.app` en Google Cloud y ajusta `authDomain` en proyectos existentes. `kasy update backend` también ejecuta esa sincronización cuando hay proyecto Firebase."
      }
    }
  },
  "1.71.4": {
    "modules": {
      "core": {
        "pt": "`kasy new` (Firebase) registra automaticamente os redirect URIs OAuth `firebaseapp.com` e `web.app` no Google Cloud e ajusta `authDomain` para `projeto.web.app`. `kasy apple-web` e `kasy facebook` listam domínios/URLs corretos (vírgula na mesma linha no portal Apple). Docs de auth atualizadas (filtro Services IDs, Firebase vs Supabase).",
        "en": "`kasy new` (Firebase) auto-registers both `firebaseapp.com` and `web.app` OAuth redirect URIs in Google Cloud and sets `authDomain` to `project.web.app`. `kasy apple-web` and `kasy facebook` print the right domains/URLs (comma on one line in the Apple portal). Auth docs updated (Services IDs filter, Firebase vs Supabase).",
        "es": "`kasy new` (Firebase) registra automáticamente los redirect URIs OAuth `firebaseapp.com` y `web.app` en Google Cloud y ajusta `authDomain` a `proyecto.web.app`. `kasy apple-web` y `kasy facebook` imprimen dominios/URLs correctos (coma en una sola línea en el portal Apple). Docs de auth actualizadas (filtro Services IDs, Firebase vs Supabase)."
      }
    }
  },
  "1.71.3": {
    "modules": {
      "core": {
        "pt": "OAuth redirect na web: `authDomain` alinhado ao domínio do Hosting (ex. `projeto.web.app`) para browsers que bloqueiam cookies third-party (Cursor, Chrome 115+). `getRedirectResult` roda antes do router no boot.",
        "en": "Web OAuth redirect: `authDomain` matches your Hosting domain (e.g. `project.web.app`) for browsers that block third-party cookies (Cursor, Chrome 115+). `getRedirectResult` runs before the router on boot.",
        "es": "OAuth redirect web: `authDomain` alineado al dominio de Hosting (ej. `proyecto.web.app`) para navegadores que bloquean cookies third-party (Cursor, Chrome 115+). `getRedirectResult` corre antes del router al iniciar."
      }
    }
  },
  "1.71.2": {
    "modules": {
      "core": {
        "pt": "Login social no Simple Browser do Cursor/VS Code: redirect na mesma aba (Firebase). Popup no IDE abria como aba nova e o OAuth não voltava. Supabase: OAuth externo só em iframe LP.",
        "en": "Social login in Cursor/VS Code Simple Browser: same-tab redirect (Firebase). IDE popups opened as a new tab and OAuth never returned. Supabase: external OAuth only in LP iframe.",
        "es": "Login social en Simple Browser de Cursor/VS Code: redirect en la misma pestaña (Firebase). El popup en IDE abría como pestaña nueva y OAuth no volvía. Supabase: OAuth externo solo en iframe LP."
      }
    }
  },
  "1.71.0": {
    "modules": {
      "core": {
        "pt": "Login social na web em iframe, Cursor Simple Browser ou preview embutido: popup/janela externa sem redirecionar a aba do app (Firebase). Supabase: OAuth externo no iframe. Inclui helpers `isEmbeddedWebAuthHost` e redirect OAuth só em mobile web fora de iframe.",
        "en": "Web social login in iframes, Cursor Simple Browser, or embedded previews: popup/external window without hijacking the app tab (Firebase). Supabase: external OAuth in iframes. Adds `isEmbeddedWebAuthHost` and limits full-page OAuth redirect to mobile web outside iframes.",
        "es": "Login social web en iframe, Simple Browser de Cursor o preview embebido: popup/ventana externa sin redirigir la pestaña del app (Firebase). Supabase: OAuth externo en iframe. Incluye `isEmbeddedWebAuthHost` y redirect OAuth solo en mobile web fuera de iframe."
      }
    }
  },
  "1.70.0": {
    "modules": {
      "core": {
        "pt": "Auth, Settings e Push agora são módulos opcionais de verdade (não só no Rápido): desligar qualquer um deixa stubs mínimos no lugar, sem sobrar import/rota órfã. Login social (Google/Apple/Facebook) só aparece quando o provedor está configurado — sem mais botão do Google morto quando ele não foi ligado. Rotas do Admin/Settings e o layout de sub-tela foram extraídos para `core/`, então sobrevivem mesmo com Settings desligado.",
        "en": "Auth, Settings and Push are now genuinely optional modules (not just in Quick): turning any of them off leaves minimal stubs in place, with no leftover import or orphan route. Social login (Google/Apple/Facebook) only shows up when the provider is actually configured — no more dead Google button when it was never enabled. Admin/Settings route constants and the sub-page layout were extracted into `core/`, so they survive even with Settings off.",
        "es": "Auth, Settings y Push ahora son módulos realmente opcionales (no solo en el modo Rápido): apagar cualquiera deja stubs mínimos en su lugar, sin import ni ruta huérfana. El login social (Google/Apple/Facebook) solo aparece cuando el proveedor está configurado — sin más botón de Google muerto cuando nunca se activó. Las rutas de Admin/Settings y el layout de sub-página se extrajeron a `core/`, así sobreviven incluso con Settings apagado."
      },
      "components": {
        "pt": "Novo `KasyUserAvatar`: avatar do usuário logado compartilhado entre Settings e o resto do app, resolvido pelo mesmo caminho nos 3 backends. `KasySettingsTile` também migrou para `lib/components/`.",
        "en": "New `KasyUserAvatar`: the signed-in user's avatar, shared between Settings and the rest of the app, resolved the same way across all 3 backends. `KasySettingsTile` also moved into `lib/components/`.",
        "es": "Nuevo `KasyUserAvatar`: el avatar del usuario conectado, compartido entre Settings y el resto de la app, resuelto de la misma forma en los 3 backends. `KasySettingsTile` también se movió a `lib/components/`."
      }
    }
  },
  "1.69.4": {
    "modules": {
      "backend": {
        "severity": "security",
        "pt": "Correção de segurança no Firebase: a regra de notificações negava create/update/delete explicitamente, mas uma regra genérica logo acima (CRUD do dono em qualquer subcoleção de users/{id}) reabria o create por engano — o Firestore libera a operação se qualquer regra que bata com o caminho permitir, então a regra específica nunca fazia efeito. Um usuário logado conseguia gravar direto em users/{uid}/notifications/{id} e disparar um push FCM forjado para si mesmo, sem checagem nenhuma do servidor. A regra genérica virou 3 regras explícitas (ai_conversations, infos, devices) e notifications passou a permitir só read/update/delete do dono. Também: o `kasy update` agora avisa sobre correções de backend automaticamente (antes só aparecia se você já soubesse do comando `kasy update backend`).",
        "en": "Firebase security fix: the notifications rule explicitly denied create/update/delete, but a generic rule right above it (owner CRUD on any subcollection under users/{id}) silently reopened create — Firestore allows an operation if any matching rule grants it, so the specific rule never actually took effect. A signed-in user could write directly to users/{uid}/notifications/{id} and trigger a forged FCM push to themselves, with no server-side check at all. The generic rule became 3 explicit rules (ai_conversations, infos, devices), and notifications now only allows read/update/delete for the owner. Also: `kasy update` now surfaces backend fixes automatically (previously it only showed up if you already knew the `kasy update backend` command existed).",
        "es": "Corrección de seguridad en Firebase: la regla de notificaciones negaba explícitamente create/update/delete, pero una regla genérica justo arriba (CRUD del dueño en cualquier subcolección de users/{id}) reabría el create por error — Firestore permite la operación si cualquier regla que coincida con la ruta la autoriza, así que la regla específica nunca surtía efecto. Un usuario con sesión podía escribir directo en users/{uid}/notifications/{id} y disparar un push FCM forjado hacia sí mismo, sin ninguna verificación del servidor. La regla genérica pasó a ser 3 reglas explícitas (ai_conversations, infos, devices) y notifications ahora solo permite read/update/delete del dueño. Además: `kasy update` ahora avisa sobre correcciones de backend automáticamente (antes solo aparecía si ya sabías que existía el comando `kasy update backend`)."
      }
    }
  },
  "1.69.1": {
    "modules": {
      "core": {
        "pt": "Corrigido paywall no Device Preview (iPhone, Android, iPad): a rota deixava de usar o push full-screen nativo porque lia a largura do browser, não do frame. No preview mobile o paywall piscava e sumia; agora segue o mesmo fluxo do app nativo.",
        "en": "Fixed paywall on Device Preview (iPhone, Android, iPad): the route used the browser width instead of the frame width, so the paywall opened as a desktop overlay and flashed away. Mobile preview now matches the native full-screen flow.",
        "es": "Corregido el paywall en Device Preview (iPhone, Android, iPad): la ruta usaba el ancho del navegador en lugar del marco, así que el paywall se abría como overlay de escritorio y desaparecía. El preview móvil ahora sigue el flujo nativo a pantalla completa."
      },
      "revenuecat": {
        "pt": "Paywall e gatilho automático na Home alinhados ao contrato de fluxo: no preview mobile o paywall aparece nos momentos certos (como no nativo); na web SaaS (desktop ou preview desligado) só via Configurações, sem popup na Home.",
        "en": "Paywall and Home auto-prompt aligned with the product flow contract: mobile Device Preview shows the paywall at the right moments (like native); SaaS web (desktop or preview off) only via Settings, no Home popup.",
        "es": "Paywall y aviso automático en Home alineados al contrato de flujo: en preview móvil el paywall aparece en los momentos correctos (como en nativo); en web SaaS (escritorio o preview apagado) solo vía Configuración, sin popup en Home."
      }
    }
  },
  "1.67.0": {
    "modules": {
      "backend": {
        "pt": "O comando agora avisa quando o kit corrigiu um arquivo de backend que seu projeto já tinha. A sincronização continua sem sobrescrever nada (migration aplicada é imutável e sua function pode ter lógica sua), mas em vez de ficar calada ela separa o que dá pra trazer direto do que precisa de merge à mão. Quem só personalizou um arquivo, sem correção nova no kit, não recebe aviso nenhum.",
        "en": "The command now tells you when the kit fixed a backend file your project already had. The sync still overwrites nothing (an applied migration is immutable and your function may carry your own logic), but instead of staying silent it separates what you can pull straight over from what needs a manual merge. If you only customized a file and the kit did not change it, you get no warning at all.",
        "es": "El comando ahora avisa cuando el kit corrigió un archivo de backend que tu proyecto ya tenía. La sincronización sigue sin sobrescribir nada (una migración aplicada es inmutable y tu function puede tener lógica tuya), pero en vez de quedarse callada separa lo que puedes traer directo de lo que necesita merge a mano. Si solo personalizaste un archivo y el kit no lo cambió, no recibes ningún aviso."
      }
    }
  },
  "1.66.1": {
    "modules": {
      "core": {
        "severity": "security",
        "pt": "Correção de segurança: projetos gerados sem alguma das features que mexem nas rotas (onboarding, feedback, lembretes, widget, RevenueCat ou analytics) ficavam sem o gate de autenticação. Na prática, usuário deslogado caía direto na Home e o botão de sair não tirava ninguém da tela. O gate agora é um arquivo compartilhado, então vale para os 3 backends e não some mais quando você desliga uma feature.",
        "en": "Security fix: projects generated without one of the route related features (onboarding, feedback, reminders, widget, RevenueCat or analytics) shipped with no auth gate at all. In practice a signed out user landed straight on Home and the logout button left them on the current screen. The gate now lives in a shared file, so it applies to all 3 backends and no longer disappears when you turn a feature off.",
        "es": "Corrección de seguridad: los proyectos generados sin alguna de las funciones que tocan las rutas (onboarding, feedback, recordatorios, widget, RevenueCat o analytics) quedaban sin control de autenticación. En la práctica, un usuario sin sesión caía directo en el Home y el botón de salir no lo sacaba de la pantalla. Ahora el control vive en un archivo compartido, aplica a los 3 backends y ya no desaparece al desactivar una función."
      },
      "backend": {
        "severity": "security",
        "pt": "Correção de segurança no Supabase: a trava que impede o app de gravar a própria assinatura só vinha junto com o módulo Stripe. Projetos só com RevenueCat ficavam sem ela, e qualquer usuário logado conseguia se dar premium vitalício com uma única requisição. Agora a trava faz parte da base. No mesmo pacote: a restrição de insert em notificações deixou de depender do módulo Feedback, os webhooks de Stripe e RevenueCat pararam de responder sucesso quando falham ao gravar (o que fazia pagamento confirmado sumir sem nova tentativa) e a regra de votos do Firestore passou a exigir o voto no mesmo lote do contador.",
        "en": "Supabase security fix: the lock that stops the app from writing its own subscription only shipped with the Stripe module. RevenueCat only projects went without it, and any signed in user could grant themselves lifetime premium with a single request. The lock is now part of the base schema. Also included: the notifications insert restriction no longer depends on the Feedback module, the Stripe and RevenueCat webhooks stopped answering success when a write fails (which silently dropped confirmed payments with no retry), and the Firestore vote rule now requires the vote in the same batch as the counter.",
        "es": "Corrección de seguridad en Supabase: el bloqueo que impide que la app escriba su propia suscripción solo venía con el módulo Stripe. Los proyectos solo con RevenueCat quedaban sin él, y cualquier usuario con sesión podía darse premium vitalicio con una sola petición. Ahora el bloqueo es parte de la base. También incluido: la restricción de insert en notificaciones ya no depende del módulo Feedback, los webhooks de Stripe y RevenueCat dejaron de responder éxito cuando falla la escritura (lo que hacía desaparecer pagos confirmados sin reintento), y la regla de votos de Firestore ahora exige el voto en el mismo lote que el contador."
      }
    }
  },
  "1.66.0": {
    "modules": {
      "web": {
        "pt": "Primeiro acesso na web volta de verdade: limpar o storage agora zera localStorage, sessionStorage e IndexedDB (a sessão do Firebase Auth na web vive no IndexedDB, então antes o onboarding não reaparecia). O comando passa a atualizar os scripts do kit dentro do web/index.html sem tocar no seu título, favicon ou splash.",
        "en": "Web first-run really resets: clearing storage now wipes localStorage, sessionStorage and IndexedDB (the Firebase Auth web session lives in IndexedDB, so onboarding used to never come back). The command now updates the kit scripts inside web/index.html without touching your title, favicon or splash.",
        "es": "El primer acceso en web vuelve de verdad: limpiar el storage ahora borra localStorage, sessionStorage e IndexedDB (la sesión de Firebase Auth en web vive en IndexedDB, por eso el onboarding no reaparecía). El comando ahora actualiza los scripts del kit dentro de web/index.html sin tocar tu título, favicon ni splash."
      },
      "core": {
        "pt": "Nova política de rota de autenticação (auth_route_policy): usuário já logado não cai mais na tela de apresentação ao recarregar a web.",
        "en": "New auth route policy (auth_route_policy): a signed-in user no longer lands on the intro screen when reloading on web.",
        "es": "Nueva política de ruta de autenticación (auth_route_policy): un usuario con sesión ya no cae en la pantalla de presentación al recargar en web."
      },
      "onboarding": {
        "pt": "Onboarding respeita a nova política de rota: usuário autenticado não é mais levado de volta pra apresentação inicial ao recarregar a web.",
        "en": "Onboarding honors the new route policy: a signed-in user is no longer sent back to the intro screens when reloading on web.",
        "es": "El onboarding respeta la nueva política de ruta: un usuario con sesión ya no vuelve a las pantallas de introducción al recargar en web."
      }
    }
  },
  "1.65.7": {
    "modules": {
      "kanban": {
        "pt": "Corrigido Kanban no Firebase: tarefas criadas via `kasy kanban`/MCP gravavam `createdAt`/`updatedAt` como string e a tela Tarefas quebrava ao carregar. O app agora lê timestamps e strings legadas; a CLI grava timestamp de verdade.",
        "en": "Fixed Firebase Kanban: tasks created via `kasy kanban`/MCP stored `createdAt`/`updatedAt` as strings and the Tasks screen crashed on load. The app now reads timestamps and legacy strings; the CLI writes real timestamps.",
        "es": "Corregido Kanban en Firebase: las tareas creadas con `kasy kanban`/MCP guardaban `createdAt`/`updatedAt` como string y la pantalla Tareas fallaba al cargar. La app ahora lee timestamps y strings heredadas; la CLI escribe timestamps reales."
      }
    }
  },
  "1.65.6": {
    "modules": {
      "revenuecat": {
        "pt": "`kasy add revenuecat` e `kasy update revenuecat` agora restauram de verdade os arquivos de compra: antes, num projeto que teve o RevenueCat desativado, o comando reportava sucesso mas deixava os stubs falsos de assinatura no lugar.",
        "en": "`kasy add revenuecat` and `kasy update revenuecat` now truly restore the purchase files: previously, on a project that had RevenueCat disabled, the command reported success but left the fake subscription stubs in place.",
        "es": "`kasy add revenuecat` y `kasy update revenuecat` ahora restauran de verdad los archivos de compra: antes, en un proyecto que había desactivado RevenueCat, el comando reportaba éxito pero dejaba los stubs falsos de suscripción en su lugar."
      },
      "stripe": {
        "pt": "`kasy add stripe` e `kasy update stripe` corrigidos com o mesmo fix do RevenueCat (os dois compartilham o núcleo de assinaturas).",
        "en": "`kasy add stripe` and `kasy update stripe` fixed with the same RevenueCat fix (both share the subscriptions core).",
        "es": "`kasy add stripe` y `kasy update stripe` corregidos con el mismo fix de RevenueCat (ambos comparten el núcleo de suscripciones)."
      },
      "core": {
        "pt": "`kasy ios release`, `kasy apple-web` e `kasy facebook` não reportam mais sucesso falso quando faltam credenciais ou rodam sem terminal interativo (ex.: via MCP).",
        "en": "`kasy ios release`, `kasy apple-web`, and `kasy facebook` no longer report false success when credentials are missing or when running without an interactive terminal (e.g. via MCP).",
        "es": "`kasy ios release`, `kasy apple-web` y `kasy facebook` ya no reportan éxito falso cuando faltan credenciales o al ejecutarse sin terminal interactiva (por ejemplo, vía MCP)."
      }
    }
  },
  "1.65.5": {
    "modules": {
      "components": {
        "pt": "12 novos componentes: KasyBarChart, KasyLineChart, KasyRating, KasyTrendChip, KasyStepper, KasyNumberValue, KasyNumberStepper, KasySlideButton, KasyProgressButton, KasySplitView e o preview de PressableFeedback/Widget (mockup de widget de tela inicial). Corrigido bug de scroll duplicado e padding do campo de busca na galeria de Componentes.",
        "en": "12 new components: KasyBarChart, KasyLineChart, KasyRating, KasyTrendChip, KasyStepper, KasyNumberValue, KasyNumberStepper, KasySlideButton, KasyProgressButton, KasySplitView, and the PressableFeedback/Widget preview (home-screen widget mockup). Fixed a double-scroll bug and search field padding in the Components gallery.",
        "es": "12 componentes nuevos: KasyBarChart, KasyLineChart, KasyRating, KasyTrendChip, KasyStepper, KasyNumberValue, KasyNumberStepper, KasySlideButton, KasyProgressButton, KasySplitView y la vista previa de PressableFeedback/Widget (mockup de widget de pantalla de inicio). Corregido un bug de scroll duplicado y el padding del campo de búsqueda en la galería de Componentes."
      }
    }
  },
  "1.65.4": {
    "modules": {
      "components": {
        "pt": "Novos componentes de formulário: KasyControlField, KasyDateField, KasyListGroup, KasyRadioButtonGroup, KasyTextFieldGroup e KasyTextFieldOtpGroup. KasyCheckbox e KasyRadio refatorados para compartilhar o layout.",
        "en": "New form components: KasyControlField, KasyDateField, KasyListGroup, KasyRadioButtonGroup, KasyTextFieldGroup, and KasyTextFieldOtpGroup. KasyCheckbox and KasyRadio refactored to share the layout.",
        "es": "Nuevos componentes de formulario: KasyControlField, KasyDateField, KasyListGroup, KasyRadioButtonGroup, KasyTextFieldGroup y KasyTextFieldOtpGroup. KasyCheckbox y KasyRadio refactorizados para compartir el layout."
      }
    }
  },
  "1.65.3": {
    "modules": {
      "core": {
        "pt": "`kasy remove` corrigido para ai_chat (aba Support no bottom router), facebook (auth + device API) e imports órfãos de feedback/lembretes. Validação em modo Rápido nos 3 backends.",
        "en": "`kasy remove` fixed for ai_chat (Support tab in bottom router), facebook (auth + device API), and orphan feedback/reminders imports. Validated in Quick mode on all 3 backends.",
        "es": "`kasy remove` corregido para ai_chat (pestaña Support en bottom router), facebook (auth + device API) e imports huérfanos de feedback/recordatorios. Validado en modo Rápido en los 3 backends."
      }
    }
  },
  "1.65.2": {
    "modules": {
      "core": {
        "pt": "`kasy android build-aab` e builds assinados falham de imediato sem TTY (MCP/CI) em vez de travar no prompt da keystore. `kasy remove widget` e projetos sem widget não deixam mais referência órfã no language switcher.",
        "en": "`kasy android build-aab` and signed builds fail fast without a TTY (MCP/CI) instead of hanging on the keystore prompt. `kasy remove widget` and projects without widget no longer leave an orphan reference in the language switcher.",
        "es": "`kasy android build-aab` y builds firmados fallan al instante sin TTY (MCP/CI) en lugar de quedarse en el prompt de keystore. `kasy remove widget` y proyectos sin widget ya no dejan referencia huérfana en el selector de idioma."
      }
    }
  },
  "1.65.1": {
    "modules": {
      "core": {
        "pt": "`kasy deploy` em projeto Supabase não cai mais no pipeline Firebase (FCM satélite). Deploy Supabase aplica migrations (`db push`, com retry `--include-all` após `kasy add drive`) e republica edge functions.",
        "en": "`kasy deploy` on Supabase projects no longer runs the Firebase pipeline (FCM satellite). Supabase deploy applies migrations (`db push`, with `--include-all` retry after `kasy add drive`) and redeploys edge functions.",
        "es": "`kasy deploy` en proyectos Supabase ya no ejecuta el pipeline Firebase (FCM satélite). El deploy Supabase aplica migraciones (`db push`, con reintento `--include-all` tras `kasy add drive`) y vuelve a publicar edge functions."
      }
    }
  },
  "1.65.0": {
    "modules": {
      "core": {
        "pt": "`kasy remove` agora espelha o `kasy new`: limpa tile do Drive em Configurações, rotas de feedback e lembretes no bottom router, stubs de kanban/ads e pastas órfãs. `kasy add drive` respeita a região das Cloud Functions do projeto. Drive: loading no onboarding do motorista, animação da estrada e docs do Firebase Console.",
        "en": "`kasy remove` now mirrors `kasy new`: strips Drive tile in Settings, feedback and reminders routes in the bottom router, kanban/ads stubs, and orphan dirs. `kasy add drive` respects the project's Cloud Functions region. Drive: driver onboarding loading states, road animation, and Firebase Console docs.",
        "es": "`kasy remove` ahora refleja `kasy new`: quita el tile de Drive en Configuración, rutas de feedback y recordatorios en el bottom router, stubs de kanban/ads y carpetas huérfanas. `kasy add drive` respeta la región de Cloud Functions del proyecto. Drive: estados de carga en el onboarding del conductor, animación de la carretera y docs del Firebase Console."
      }
    }
  },
  "1.64.0": {
    "modules": {
      "core": {
        "pt": "`kasy configure` e MCP `configure_project_keys`: sincroniza launch.json/Makefile, faz deploy de Drive e AI Chat após secrets (Firebase e Supabase), e retorna exit code 1 em falha. `kasy add drive` restaura o tile em Configurações. Auth web/preview: experiência nativa no Device Preview, política de rotas e continuar sem conta corrigidos.",
        "en": "`kasy configure` and MCP `configure_project_keys`: sync launch.json/Makefile, deploy Drive and AI Chat after secrets (Firebase and Supabase), and exit with code 1 on failure. `kasy add drive` restores the Settings tile. Web/preview auth: native experience in Device Preview, route policy and continue-without-account fixes.",
        "es": "`kasy configure` y MCP `configure_project_keys`: sincroniza launch.json/Makefile, despliega Drive y AI Chat tras secrets (Firebase y Supabase), y sale con código 1 si falla. `kasy add drive` restaura el tile en Configuración. Auth web/preview: experiencia nativa en Device Preview, política de rutas y continuar sin cuenta corregidos."
      }
    }
  },
  "1.63.8": {
    "modules": {
      "core": {
        "pt": "`kasy upgrade` apaga lockfile obsoleto em `~/.kasy` e instala sem `package-lock.json`, evitando 404 em versões quebradas no npm.",
        "en": "`kasy upgrade` clears a stale lockfile under `~/.kasy` and installs without `package-lock.json`, avoiding 404s on broken npm tarballs.",
        "es": "`kasy upgrade` borra el lockfile obsoleto en `~/.kasy` e instala sin `package-lock.json`, evitando 404 en tarballs rotos en npm."
      }
    }
  },
  "1.63.7": {
    "modules": {
      "core": {
        "pt": "`kasy update core` substitui `package:kasy_kit` pelo nome do projeto, aplica patches de módulos opcionais (Drive, lembretes, feedback), inclui admin console e i18n, e roda `dart run slang`. Push do admin: mensagem clara sem permissão e teclado fecha ao enviar.",
        "en": "`kasy update core` replaces `package:kasy_kit` with the project package name, applies optional module patches (Drive, reminders, feedback), includes admin console and i18n, and runs `dart run slang`. Admin push: clear permission-denied message and keyboard dismisses on send.",
        "es": "`kasy update core` reemplaza `package:kasy_kit` por el nombre del paquete del proyecto, aplica parches de módulos opcionales (Drive, recordatorios, feedback), incluye admin console e i18n, y ejecuta `dart run slang`. Push del admin: mensaje claro sin permiso y el teclado se cierra al enviar."
      },
      "backend": {
        "pt": "Edge function `send-push-notification` valida a notificação no banco antes de enviar FCM (impede payload forjado). Rode `kasy update backend` e redeploy das edge functions.",
        "en": "Edge function `send-push-notification` validates the notification row in the database before sending FCM (blocks forged payloads). Run `kasy update backend` and redeploy edge functions.",
        "es": "Edge function `send-push-notification` valida la notificación en la base antes de enviar FCM (bloquea payloads falsos). Ejecuta `kasy update backend` y redeploy de edge functions."
      }
    }
  },
  "1.63.6": {
    "modules": {
      "core": {
        "pt": "`kasy update core` substitui `package:kasy_kit` pelo nome do projeto, aplica patches de módulos opcionais (Drive, lembretes, feedback), inclui admin console e i18n, e roda `dart run slang`. Push do admin: mensagem clara sem permissão e teclado fecha ao enviar.",
        "en": "`kasy update core` replaces `package:kasy_kit` with the project package name, applies optional module patches (Drive, reminders, feedback), includes admin console and i18n, and runs `dart run slang`. Admin push: clear permission-denied message and keyboard dismisses on send.",
        "es": "`kasy update core` reemplaza `package:kasy_kit` por el nombre del paquete del proyecto, aplica parches de módulos opcionales (Drive, recordatorios, feedback), incluye admin console e i18n, y ejecuta `dart run slang`. Push del admin: mensaje claro sin permiso y el teclado se cierra al enviar."
      },
      "backend": {
        "pt": "Edge function `send-push-notification` valida a notificação no banco antes de enviar FCM (impede payload forjado). Rode `kasy update backend` e redeploy das edge functions.",
        "en": "Edge function `send-push-notification` validates the notification row in the database before sending FCM (blocks forged payloads). Run `kasy update backend` and redeploy edge functions.",
        "es": "Edge function `send-push-notification` valida la notificación en la base antes de enviar FCM (bloquea payloads falsos). Ejecuta `kasy update backend` y redeploy de edge functions."
      }
    }
  },
  "1.63.5": {
    "modules": {
      "core": {
        "pt": "Push do admin console: só administradores podem enviar (RLS Supabase, Cloud Function Firebase, UI e notifier). Migration 026 remove INSERT próprio em notifications.",
        "en": "Admin console push: only administrators can send (Supabase RLS, Firebase Cloud Function, UI and notifier). Migration 026 removes self-INSERT on notifications.",
        "es": "Push del admin console: solo administradores pueden enviar (RLS Supabase, Cloud Function Firebase, UI y notifier). Migration 026 elimina INSERT propio en notifications."
      },
      "backend": {
        "pt": "Migration `20240101000026_notifications_insert_admin_only.sql`: INSERT em notifications só com `is_admin()`. Redeploy das Cloud Functions para checagem de role no `adminSendNotification`.",
        "en": "Migration `20240101000026_notifications_insert_admin_only.sql`: notifications INSERT requires `is_admin()`. Redeploy Cloud Functions for role check on `adminSendNotification`.",
        "es": "Migration `20240101000026_notifications_insert_admin_only.sql`: INSERT en notifications solo con `is_admin()`. Redeploy de Cloud Functions para chequeo de role en `adminSendNotification`."
      }
    }
  },
  "1.63.4": {
    "modules": {
      "core": {
        "pt": "`kasy mcp setup` grava o caminho absoluto do `kasy-mcp` no mcp.json (Cursor não herda o PATH do terminal). Doc de instalação deixa claro: feche o Cursor com Cmd+Q, confira Settings → MCP verde, e cole JSON manual se precisar.",
        "en": "`kasy mcp setup` writes the absolute `kasy-mcp` path in mcp.json (Cursor does not inherit the terminal PATH). Install docs now say: quit Cursor with Cmd+Q, confirm Settings → MCP is green, and paste JSON manually if needed.",
        "es": "`kasy mcp setup` escribe la ruta absoluta de `kasy-mcp` en mcp.json (Cursor no hereda el PATH del terminal). La doc de instalación aclara: cierra Cursor con Cmd+Q, confirma Settings → MCP en verde y pega JSON a mano si hace falta."
      }
    }
  },
  "1.63.3": {
    "modules": {
      "core": {
        "pt": "`kasy mcp setup` instala o kasy-mcp global e grava o mcp.json (Cursor, Claude Desktop). O instalador `curl kasy.dev/install` já roda isso no final. `kasy upgrade` atualiza CLI e MCP juntos.",
        "en": "`kasy mcp setup` installs global kasy-mcp and writes mcp.json (Cursor, Claude Desktop). The `curl kasy.dev/install` installer runs this at the end. `kasy upgrade` updates CLI and MCP together.",
        "es": "`kasy mcp setup` instala kasy-mcp global y escribe mcp.json (Cursor, Claude Desktop). El instalador `curl kasy.dev/install` ya lo ejecuta al final. `kasy upgrade` actualiza CLI y MCP juntos."
      }
    }
  },
  "1.63.2": {
    "modules": {
      "core": {
        "pt": "`kasy doctor --heal-mcp` limpa cache corrompido do npx que impede o kasy-mcp de subir (ENOTEMPTY). Doc de instalação do MCP recomenda install global estável.",
        "en": "`kasy doctor --heal-mcp` cleans corrupted npx cache that blocks kasy-mcp from starting (ENOTEMPTY). MCP install docs now recommend a stable global install.",
        "es": "`kasy doctor --heal-mcp` limpia la caché corrupta de npx que impide iniciar kasy-mcp (ENOTEMPTY). La doc de instalación del MCP recomienda install global estable."
      }
    }
  },
  "1.63.1": {
    "modules": {
      "backend": {
        "pt": "Corrigido `supabase db push` no modo Rápido: migration de votos do feedback agora roda depois das tabelas (antes quebrava na 000005 e o banco ficava pela metade). `kasy new` aborta se o push falhar. Modo Rápido usa região EUA por padrão (`us-east-1` + `us-central1` no FCM); `--region brazil|europe` alinha Supabase e Firebase. MCP `create_project` aceita `region`.",
        "en": "Fixed `supabase db push` in Quick mode: feedback vote triggers now run after the tables (previously failed at 000005 and left the DB half-applied). `kasy new` aborts when push fails. Quick mode defaults to US (`us-east-1` + `us-central1` for FCM); `--region brazil|europe` keeps Supabase and Firebase paired. MCP `create_project` accepts `region`.",
        "es": "Corregido `supabase db push` en modo Rápido: los triggers de votos del feedback ahora corren después de las tablas (antes fallaba en 000005 y la base quedaba a medias). `kasy new` aborta si el push falla. El modo Rápido usa región EE.UU. por defecto (`us-east-1` + `us-central1` en FCM); `--region brazil|europe` alinea Supabase y Firebase. MCP `create_project` acepta `region`."
      }
    }
  },
  "1.63.0": {
    "modules": {
      "backend": {
        "pt": "`kasy new` provisiona migrations, Edge Functions, Cloud Functions e firestore.rules só das features escolhidas (modo Rápido: tudo menos Drive; Facebook incluído). `kasy add` e `kasy update backend` respeitam o mesmo manifesto. Feedback ganhou migration própria (`feature_requests` / `feature_votes`).",
        "en": "`kasy new` ships migrations, Edge Functions, Cloud Functions, and firestore.rules only for selected features (Quick mode: everything except Drive; Facebook included). `kasy add` and `kasy update backend` use the same manifest. Feedback has its own migration (`feature_requests` / `feature_votes`).",
        "es": "`kasy new` provisiona migrations, Edge Functions, Cloud Functions y firestore.rules solo de las features elegidas (modo Rápido: todo menos Drive; Facebook incluido). `kasy add` y `kasy update backend` usan el mismo manifiesto. Feedback tiene migration propia (`feature_requests` / `feature_votes`)."
      }
    }
  },
  "1.62.5": {
    "modules": {
      "core": {
        "pt": "Corrigido `kasy add` em módulos com pasta resincronizável (kanban, widget, local_reminders, ads, ...): agora roda build_runner após restaurar os arquivos, evitando `flutter analyze` quebrado. `kasy reset --web` aceita `--web-port` e `--web-hostname` (paridade com clear-web e kasy run; usado pelo MCP reset_app).",
        "en": "Fixed `kasy add` for modules with a resyncable directory (kanban, widget, local_reminders, ads, ...): now runs build_runner after restoring files, so `flutter analyze` no longer breaks on stale `.g.dart`/`.freezed.dart`. `kasy reset --web` accepts `--web-port` and `--web-hostname` (parity with clear-web and kasy run; used by MCP reset_app).",
        "es": "Corregido `kasy add` en módulos con carpeta resincronizable (kanban, widget, local_reminders, ads, ...): ahora ejecuta build_runner tras restaurar los archivos, evitando `flutter analyze` roto. `kasy reset --web` acepta `--web-port` y `--web-hostname` (paridad con clear-web y kasy run; usado por MCP reset_app)."
      }
    }
  },
  "1.62.4": {
    "modules": {
      "core": {
        "pt": "Preview Device (web): guest anônimo real no Auth (Supabase/Firebase). Configurações mostra Sair para guest com sessão. `kasy run --web --open-browser`/`--fresh`: attach ao Flutter se a porta 5555 já estiver em uso (r/R/q no terminal).",
        "en": "Preview Device (web): real anonymous guest in Auth (Supabase/Firebase). Settings shows Sign out for guests with a session. `kasy run --web --open-browser`/`--fresh`: attaches to Flutter when port 5555 is already in use (r/R/q in the terminal).",
        "es": "Preview Device (web): guest anónimo real en Auth (Supabase/Firebase). Configuración muestra Cerrar sesión para guests con sesión. `kasy run --web --open-browser`/`--fresh`: attach al Flutter si el puerto 5555 ya está en uso (r/R/q en la terminal)."
      },
      "onboarding": {
        "pt": "Onboarding: não avança sem conta Auth real em erro (toast). `continueAsGuest` endurecido e guards duplicados removidos.",
        "en": "Onboarding: does not continue without a real Auth account on error (toast). Hardened `continueAsGuest` and removed duplicate guards.",
        "es": "Onboarding: no avanza sin cuenta Auth real en error (toast). `continueAsGuest` endurecido y guards duplicados eliminados."
      }
    }
  },
  "1.62.3": {
    "modules": {
      "core": {
        "pt": "Corrigido import duplicado de `supabase_flutter` e bloco `Supabase.initialize` no `main.dart` quando `writeMainDart` rodava mais de uma vez (ex.: `kasy remove` seguido de `kasy add`). Splice agora é idempotente.",
        "en": "Fixed duplicate `supabase_flutter` import and `Supabase.initialize` block in `main.dart` when `writeMainDart` ran more than once (e.g. `kasy remove` then `kasy add`). Splice is now idempotent.",
        "es": "Corregido import duplicado de `supabase_flutter` y bloque `Supabase.initialize` en `main.dart` cuando `writeMainDart` corría más de una vez (ej.: `kasy remove` seguido de `kasy add`). El splice ahora es idempotente."
      }
    }
  },
  "1.62.2": {
    "modules": {
      "core": {
        "pt": "Corrigido `kasy add kanban` e `kasy add feedback`: restauravam só 1-2 arquivos quando o stub NoOp já existia na pasta do módulo (agora sobrescreve tudo). Overlay Supabase/API do feedback usa o diretório real `feedbacks` (plural). `kasy update` de módulos com @freezed/@riverpod roda build_runner após resync.",
        "en": "Fixed `kasy add kanban` and `kasy add feedback`: only 1-2 files were restored when a NoOp stub already lived inside the module directory (now overwrites fully). Feedback Supabase/API overlay uses the real `feedbacks` directory (plural). `kasy update` for @freezed/@riverpod modules runs build_runner after resync.",
        "es": "Corregido `kasy add kanban` y `kasy add feedback`: solo restauraban 1-2 archivos cuando el stub NoOp ya existía en la carpeta del módulo (ahora sobrescribe todo). El overlay Supabase/API de feedback usa el directorio real `feedbacks` (plural). `kasy update` de módulos con @freezed/@riverpod ejecuta build_runner tras el resync."
      }
    }
  },
  "1.62.1": {
    "modules": {
      "core": {
        "pt": "`kasy update <feature>` ressincroniza diretórios de módulo (kanban, drive, ai_chat, etc.) do template e reaplica o patch do backend. `kasy add` e `kasy update` compartilham o mesmo helper de overlay Supabase/API.",
        "en": "`kasy update <feature>` resyncs module directories (kanban, drive, ai_chat, etc.) from the template and reapplies the backend patch. `kasy add` and `kasy update` share the same Supabase/API overlay helper.",
        "es": "`kasy update <feature>` resincroniza directorios de módulo (kanban, drive, ai_chat, etc.) desde la plantilla y reaplica el patch del backend. `kasy add` y `kasy update` comparten el mismo helper de overlay Supabase/API."
      }
    }
  },
  "1.62.0": {
    "modules": {
      "core": {
        "pt": "Supabase: login Google 100% Supabase Auth (web com signInWithOAuth, nativo com google_sign_in + signInWithIdToken). Removido firebase_auth do patch Supabase. CLI registra callback do Supabase no OAuth client e concatena Web + iOS Client ID no provedor. Docs auth-setup e kasy.dev atualizados.",
        "en": "Supabase: Google login is 100% Supabase Auth (web via signInWithOAuth, native via google_sign_in + signInWithIdToken). Removed firebase_auth from the Supabase patch. CLI registers the Supabase callback on the OAuth client and concatenates Web + iOS Client IDs on the provider. auth-setup and kasy.dev docs updated.",
        "es": "Supabase: login Google 100% Supabase Auth (web con signInWithOAuth, nativo con google_sign_in + signInWithIdToken). Eliminado firebase_auth del patch Supabase. La CLI registra el callback de Supabase en el OAuth client y concatena Web + iOS Client ID en el proveedor. Docs auth-setup y kasy.dev actualizados."
      },
      "backend": {
        "pt": "Novo `kasy update backend`: copia migrations e Edge Functions que faltam (Supabase) ou Cloud Functions novas + ressincroniza firestore.rules (Firebase), sem sobrescrever arquivos existentes. `kasy add` também backfill de infra ao adicionar feature.",
        "en": "New `kasy update backend`: copies missing migrations and Edge Functions (Supabase) or new Cloud Functions + resyncs firestore.rules (Firebase), without overwriting existing files. `kasy add` also backfills infra when adding a feature.",
        "es": "Nuevo `kasy update backend`: copia migrations y Edge Functions faltantes (Supabase) o Cloud Functions nuevas + resincroniza firestore.rules (Firebase), sin sobrescribir archivos existentes. `kasy add` también hace backfill de infra al agregar una feature."
      }
    }
  },
  "1.61.0": {
    "modules": {
      "core": {
        "pt": "Web dev: `kasy clear-web` limpa localStorage no navegador padrão (macOS, Windows, Linux). `kasy run --web --open-browser` abre no seu navegador (com conta Google); `--fresh` zera storage do localhost. `kasy reset --web` chama a limpeza de verdade. Preview iOS/Android/iPad no `kasy run --web` segue fluxo nativo (onboarding antes do sign-in). Docs kasy.dev atualizadas.",
        "en": "Web dev: `kasy clear-web` wipes localStorage in the default browser (macOS, Windows, Linux). `kasy run --web --open-browser` opens in your browser (with your Google account); `--fresh` clears localhost storage. `kasy reset --web` runs the wipe for real. iOS/Android/iPad preview in `kasy run --web` follows the native flow (onboarding before sign-in). kasy.dev docs updated.",
        "es": "Web dev: `kasy clear-web` limpia localStorage en el navegador predeterminado (macOS, Windows, Linux). `kasy run --web --open-browser` abre en tu navegador (con tu cuenta Google); `--fresh` borra el storage de localhost. `kasy reset --web` ejecuta la limpieza de verdad. El preview iOS/Android/iPad en `kasy run --web` sigue el flujo nativo (onboarding antes del sign-in). Docs kasy.dev actualizadas."
      }
    }
  },
  "1.60.0": {
    "modules": {
      "core": {
        "pt": "Login social na web: Apple Sign In aparece em qualquer navegador em dispositivo Apple (n\u00e3o s\u00f3 Safari). Facebook na web usa redirect em vez de popup (evita travar no mobile). Paridade Firebase e Supabase nos comandos `kasy apple-web` e `kasy facebook`. Supabase: migrations de admin, notifica\u00e7\u00f5es e avatar de perfil alinhadas; tipo de notifica\u00e7\u00e3o normalizado. Docs auth-setup (pt/en/es) e kasy.dev em publicar/web e troubleshooting atualizados.",
        "en": "Social login on web: Apple Sign In shows in any browser on Apple devices (not Safari only). Facebook on web uses redirect instead of popup (avoids mobile hangs). Firebase and Supabase parity in `kasy apple-web` and `kasy facebook`. Supabase: admin, notifications and profile avatar migrations aligned; notification type normalized. auth-setup docs (pt/en/es) and kasy.dev publish/web and troubleshooting updated.",
        "es": "Login social en web: Apple Sign In aparece en cualquier navegador en dispositivo Apple (no solo Safari). Facebook en web usa redirect en lugar de popup (evita bloqueos en m\u00f3vil). Paridad Firebase y Supabase en `kasy apple-web` y `kasy facebook`. Supabase: migraciones de admin, notificaciones y avatar de perfil alineadas; tipo de notificaci\u00f3n normalizado. Docs auth-setup (pt/en/es) y kasy.dev en publicar/web y troubleshooting actualizados."
      }
    }
  },
  "1.58.0": {
    "modules": {
      "core": {
        "pt": "Pen (pen.dev, antigo \"Pencil\") volta como segunda op\u00e7\u00e3o de ferramenta de design, ao lado do Figma \u2014 os dois entregam o mesmo design system e cada um tem seu pr\u00f3prio MCP. Projeto gerado inclui docs/pen-guia.md (passo a passo) e docs/pen-workflow.md (para IA); o MCP do Kasy j\u00e1 reconhece o arquivo automaticamente ao montar telas.",
        "en": "Pen (pen.dev, formerly \"Pencil\") is back as a second design tool option alongside Figma \u2014 both deliver the same design system, each with its own MCP. Generated projects ship docs/pen-guia.md (step-by-step) and docs/pen-workflow.md (for AI); the Kasy MCP already recognizes it automatically when building screens.",
        "es": "Pen (pen.dev, antes \"Pencil\") vuelve como segunda opci\u00f3n de herramienta de dise\u00f1o junto a Figma \u2014 las dos entregan el mismo design system, cada una con su propio MCP. El proyecto generado incluye docs/pen-guia.md (paso a paso) y docs/pen-workflow.md (para IA); el MCP de Kasy ya lo reconoce autom\u00e1ticamente al construir pantallas."
      }
    }
  },
  "1.55.4": {
    "modules": {
      "components": {
        "pt": "Corrigido: no navegador, clicar no X de um toast que sobrepunha outro controle (ex.: o bot\u00e3o de tema no app bar) fechava o toast E acionava o controle atr\u00e1s. Di\u00e1logo e Bottom Sheet: a\u00e7\u00f5es empilhadas verticalmente agora mostram a a\u00e7\u00e3o prim\u00e1ria/confirmar em cima e Cancelar embaixo. Chip, Selectable Chip, Radio, Checkbox, Tabs, Dropdown e Toggle Button: tocar num desses n\u00e3o deixa mais o foco preso num campo de texto anterior (o pr\u00f3ximo campo digitado silenciosamente n\u00e3o recebia o texto).",
        "en": "Fixed: in the browser, clicking a toast's close button when it overlapped another control (e.g. the theme toggle in the app bar) closed the toast AND triggered the control behind it. Dialog and Bottom Sheet: vertically stacked actions now show the primary/confirm action on top and Cancel below. Chip, Selectable Chip, Radio, Checkbox, Tabs, Dropdown and Toggle Button: tapping one no longer leaves focus stuck on a previous text field (the next field typed into would silently not receive the text).",
        "es": "Corregido: en el navegador, al hacer clic en la X de un toast que se superpon\u00eda a otro control (ej.: el bot\u00f3n de tema en el app bar) se cerraba el toast Y se activaba el control de atr\u00e1s. Di\u00e1logo y Bottom Sheet: las acciones apiladas verticalmente ahora muestran la acci\u00f3n primaria/confirmar arriba y Cancelar abajo. Chip, Selectable Chip, Radio, Checkbox, Tabs, Dropdown y Toggle Button: tocar uno de estos ya no deja el foco atascado en un campo de texto anterior (el siguiente campo escrito no recib\u00eda el texto en silencio)."
      },
      "core": {
        "pt": "Corrigido texto fixo \"Version $version\" na folha de atualiza\u00e7\u00e3o (agora traduzido em pt/en/es). Toast de erro n\u00e3o anexa mais um texto de motivo cru e sem tradu\u00e7\u00e3o depois da mensagem.",
        "en": "Fixed a hardcoded \"Version $version\" string in the update sheet (now translated in pt/en/es). Error toasts no longer append a raw, untranslated reason string after the message.",
        "es": "Corregido texto fijo \"Version $version\" en la hoja de actualizaci\u00f3n (ahora traducido en pt/en/es). El toast de error ya no agrega un texto de motivo crudo y sin traducir despu\u00e9s del mensaje."
      }
    }
  },
  "1.55.3": {
    "modules": {
      "core": {
        "pt": "Corrigido: `kasy add kanban`/`kasy add local_reminders` rodavam com sucesso mas nunca ligavam a flag de verdade em `features.dart` \u2014 a feature ficava instalada e invis\u00edvel. `kasy status` agora reconhece Widget corretamente (a flag antiga verificada nunca existiu de fato) e Local Reminders. `kasy update`/`kasy status` agora tamb\u00e9m avisam sobre melhorias do script de release iOS. `kasy facebook` n\u00e3o trava mais esperando resposta de terminal quando as credenciais j\u00e1 v\u00eam por flag (MCP).",
        "en": "Fixed: `kasy add kanban`/`kasy add local_reminders` ran successfully but never actually flipped the flag in `features.dart` \u2014 the feature installed but stayed invisible. `kasy status` now correctly recognizes Widget (the flag it checked for never actually existed) and Local Reminders. `kasy update`/`kasy status` now also warn about iOS release script improvements. `kasy facebook` no longer hangs waiting on terminal input when credentials already arrive as flags (MCP).",
        "es": "Corregido: `kasy add kanban`/`kasy add local_reminders` corr\u00edan con \u00e9xito pero nunca activaban la flag de verdad en `features.dart` \u2014 la feature quedaba instalada e invisible. `kasy status` ahora reconoce Widget correctamente (la flag que revisaba nunca existi\u00f3) y Local Reminders. `kasy update`/`kasy status` ahora tambi\u00e9n avisan sobre mejoras del script de release iOS. `kasy facebook` ya no se cuelga esperando respuesta de terminal cuando las credenciales ya llegan por flag (MCP)."
      }
    }
  },
  "1.55.2": {
    "modules": {
      "core": {
        "pt": "`kasy status` agora avisa quando h\u00e1 melhorias de kit dispon\u00edveis (antes s\u00f3 o `kasy run` avisava). Corrigido: Stripe e Local Reminders nunca eram reconhecidos como m\u00f3dulos ativos na checagem de atualiza\u00e7\u00e3o, ent\u00e3o melhorias desses dois nunca apareciam pra quem os usa.",
        "en": "`kasy status` now warns when kit improvements are available (previously only `kasy run` did). Fixed: Stripe and Local Reminders were never recognized as active modules by the update check, so improvements to either never surfaced for projects using them.",
        "es": "`kasy status` ahora avisa cuando hay mejoras del kit disponibles (antes solo `kasy run` avisaba). Corregido: Stripe y Local Reminders nunca se reconoc\u00edan como m\u00f3dulos activos en la revisi\u00f3n de actualizaciones, as\u00ed que las mejoras de ambos nunca aparec\u00edan para quien los usa."
      }
    }
  },
  "1.55.0": {
    "modules": {
      "core": {
        "pt": "Novas flags n\u00e3o-interativas pra MCP: `kasy apple-web`/`facebook`/`notifications text` j\u00e1 aceitavam (agora com tool dedicada); `kasy ios/android/codemagic configure` e `kasy configure --set KEY=VALUE` ganharam o mesmo caminho sem prompt.",
        "en": "New non-interactive flags for MCP: `kasy apple-web`/`facebook`/`notifications text` already accepted them (now with a dedicated tool); `kasy ios/android/codemagic configure` and `kasy configure --set KEY=VALUE` gained the same prompt-free path.",
        "es": "Nuevas flags no interactivas para MCP: `kasy apple-web`/`facebook`/`notifications text` ya las aceptaban (ahora con tool dedicada); `kasy ios/android/codemagic configure` y `kasy configure --set KEY=VALUE` ganaron el mismo camino sin prompt."
      }
    }
  },
  "1.54.0": {
    "modules": {
      "core": {
        "pt": "Android: `kasy android build-apk` (APK de debug, sem assinatura) e `kasy android build-apk-signed` (APK release assinado, pra sideload/lojas alternativas) \u2014 o antigo `kasy android build` virou `build-aab` pra diferenciar. Corrigido `--no-bump` (`kasy ios build/release`) e `--no-defines` (`kasy run`), que nunca funcionavam.",
        "en": "Android: `kasy android build-apk` (unsigned debug APK) and `kasy android build-apk-signed` (signed release APK, for sideloading/alternative stores) \u2014 the old `kasy android build` is now `build-aab` to disambiguate. Fixed `--no-bump` (`kasy ios build/release`) and `--no-defines` (`kasy run`), which never actually worked.",
        "es": "Android: `kasy android build-apk` (APK de debug, sin firma) y `kasy android build-apk-signed` (APK release firmado, para sideload/tiendas alternativas) \u2014 el antiguo `kasy android build` ahora es `build-aab` para diferenciar. Corregido `--no-bump` (`kasy ios build/release`) y `--no-defines` (`kasy run`), que nunca funcionaban de verdad."
      }
    }
  },
  "1.53.0": {
    "modules": {
      "core": {
        "pt": "Mapas Drive: carro fica acima dos pins, rota cola na guia (curb), linha some junto com o ve\u00edculo, c\u00e2mera recentraliza ap\u00f3s idle, e o bot\u00e3o de centralizar n\u00e3o fica sob o card. Upload da foto do ve\u00edculo alinhado ao avatar (Storage). CLI: `kasy reset --yes` pra uso sem terminal (MCP).",
        "en": "Drive maps: vehicle marker above stop pins, curb-snapped routes, polyline trims with the car, camera recenters after idle, and the locate button stays clear of the card. Vehicle photo upload aligned with avatar Storage. CLI: `kasy reset --yes` for non-interactive use (MCP).",
        "es": "Mapas Drive: el auto queda encima de los pines, la ruta se pega a la acera (curb), la l\u00ednea se recorta con el veh\u00edculo, la c\u00e1mara se recentra tras idle, y el bot\u00f3n de centrar no queda bajo la tarjeta. Subida de foto del veh\u00edculo alineada al avatar (Storage). CLI: `kasy reset --yes` para uso sin terminal (MCP)."
      }
    }
  },
  "1.52.1": {
    "modules": {
      "core": {
        "pt": "Corrigido `kasy new --yes` travando (ou saindo silenciosamente sem criar nada) quando rodado sem terminal interativo \u2014 descoberto testando o novo servidor MCP do kit: a confirma\u00e7\u00e3o de contas, a escolha de organiza\u00e7\u00e3o do GCP, a sele\u00e7\u00e3o de conta de faturamento e a URL base da API n\u00e3o respeitavam `--yes`. Agora usam o valor padr\u00e3o automaticamente, como o resto do modo R\u00e1pido j\u00e1 fazia.",
        "en": "Fixed `kasy new --yes` hanging (or silently exiting without creating anything) when run without an interactive terminal \u2014 found while testing the kit's new MCP server: the accounts confirmation, GCP organization choice, billing account selection and API base URL prompt were not honoring `--yes`. They now default automatically, like the rest of Quick mode already did.",
        "es": "Corregido `kasy new --yes` que se quedaba colgado (o sal\u00eda en silencio sin crear nada) al ejecutarse sin terminal interactiva \u2014 encontrado probando el nuevo servidor MCP del kit: la confirmaci\u00f3n de cuentas, la elecci\u00f3n de organizaci\u00f3n de GCP, la selecci\u00f3n de cuenta de facturaci\u00f3n y la URL base de la API no respetaban `--yes`. Ahora usan el valor predeterminado autom\u00e1ticamente, como ya hac\u00eda el resto del modo R\u00e1pido."
      }
    }
  },
  "1.52.0": {
    "modules": {
      "components": {
        "pt": "Acessibilidade e sem\u00e2ntica em todos os componentes Kasy: campos, bot\u00f5es, chips, tabs, sliders e pickers agora exp\u00f5em nome e papel corretos para leitores de tela e agentes de IA no navegador.",
        "en": "Accessibility and semantics across every Kasy component: fields, buttons, chips, tabs, sliders and pickers now expose the right name and role for screen readers and AI browser agents.",
        "es": "Accesibilidad y sem\u00e1ntica en todos los componentes Kasy: campos, botones, chips, tabs, sliders y pickers ahora exponen el nombre y rol correctos para lectores de pantalla y agentes de IA en el navegador."
      },
      "core": {
        "pt": "Ponte Browser QA (debug/profile): IAs no navegador (Claude, Cursor, Playwright) conseguem navegar, achar e preencher campos do app Flutter web com seguran\u00e7a. Localiza\u00e7\u00e3o: detec\u00e7\u00e3o de GPS desligado e permiss\u00e3o negada para sempre, com atalho para as configura\u00e7\u00f5es do sistema.",
        "en": "Browser QA bridge (debug/profile): browser AIs (Claude, Cursor, Playwright) can navigate, find and fill fields in the Flutter web app safely. Location: detects GPS off and permanently denied permission, with a shortcut to system settings.",
        "es": "Puente Browser QA (debug/profile): las IAs del navegador (Claude, Cursor, Playwright) pueden navegar, encontrar y rellenar campos de la app Flutter web con seguridad. Ubicaci\u00f3n: detecta GPS apagado y permiso denegado para siempre, con atajo a la configuraci\u00f3n del sistema."
      }
    }
  },
  "1.48.0": {
    "modules": {
      "components": {
        "pt": "KasyDialog: t\u00edtulo respeita o alinhamento (titleCentered) tamb\u00e9m quando h\u00e1 \u00edcone \u00e0 esquerda \u2014 t\u00edtulo e mensagem nunca ficam desalinhados entre si.",
        "en": "KasyDialog: the title honors titleCentered even with a leading icon \u2014 title and message never end up misaligned from each other.",
        "es": "KasyDialog: el t\u00edtulo respeta titleCentered incluso con icono a la izquierda \u2014 t\u00edtulo y mensaje nunca quedan desalineados entre s\u00ed."
      },
      "core": {
        "pt": "Funil de avalia\u00e7\u00e3o: resposta negativa abre a tela de Feedback sem desmontar o Admin nem a aba ativa (o voltar cai no lugar certo) e os di\u00e1logos seguem o design system. Navega\u00e7\u00e3o: voltar de sub-telas restaura corretamente rotas fora do shell (ex.: Admin).",
        "en": "Review funnel: a negative answer opens the Feedback screen without tearing down Admin or the active tab (back lands in the right place) and the dialogs follow the design system. Navigation: going back from sub-screens correctly restores routes outside the shell (e.g. Admin).",
        "es": "Embudo de rese\u00f1as: una respuesta negativa abre la pantalla de Feedback sin desmontar el Admin ni la pesta\u00f1a activa (volver cae en el lugar correcto) y los di\u00e1logos siguen el design system. Navegaci\u00f3n: volver desde subpantallas restaura correctamente rutas fuera del shell (p. ej. Admin)."
      }
    }
  },
  "1.47.0": {
    "modules": {
      "components": {
        "pt": "Novo KasyTimePicker (popover no desktop, bottom sheet no mobile, dialog opcional) com intervalo de minutos e preview na galeria. DatePicker refinado. Tokens de tema (cores, spacing, sombras, tipografia Inter + Nunito). Componentes alinhados aos tokens. KasySpinner respeita reduce motion (nao trava pumpAndSettle nos testes).",
        "en": "New KasyTimePicker (popover on desktop, bottom sheet on mobile, optional dialog) with minute intervals and gallery preview. Refined DatePicker. Theme tokens (colors, spacing, shadows, Inter + Nunito typography). Components aligned to tokens. KasySpinner respects reduce motion (no longer hangs pumpAndSettle in tests).",
        "es": "Nuevo KasyTimePicker (popover en escritorio, bottom sheet en m\u00f3vil, dialog opcional) con intervalo de minutos y preview en la galer\u00eda. DatePicker refinado. Tokens de tema (colores, spacing, sombras, tipograf\u00eda Inter + Nunito). Componentes alineados a los tokens. KasySpinner respeta reduce motion (ya no traba pumpAndSettle en los tests)."
      },
      "core": {
        "pt": "Branding unificado em assets/branding/ (\u00edcone, favicon, logos, splash). kasy icon/splash/favicon detectam o layout novo e mant\u00eam fallback legado. Guard de design tokens no CI (check_design_tokens.dart). Docs Figma e Admin Console polidos.",
        "en": "Unified branding under assets/branding/ (icon, favicon, logos, splash). kasy icon/splash/favicon detect the new layout and keep a legacy fallback. Design-token guard in CI (check_design_tokens.dart). Figma docs and Admin Console polish.",
        "es": "Branding unificado en assets/branding/ (icono, favicon, logos, splash). kasy icon/splash/favicon detectan el layout nuevo y mantienen fallback legado. Guard de design tokens en CI (check_design_tokens.dart). Docs Figma y Admin Console pulidos."
      },
      "ci": {
        "pt": "CI do app passa a rodar dart run scripts/check_design_tokens.dart antes dos testes (barra radius/spacing crus em lib/features).",
        "en": "App CI now runs dart run scripts/check_design_tokens.dart before tests (blocks raw radius/spacing in lib/features).",
        "es": "El CI de la app ahora ejecuta dart run scripts/check_design_tokens.dart antes de los tests (bloquea radius/spacing crudos en lib/features)."
      }
    }
  },
  "1.46.0": {
    "modules": {
      "core": {
        "pt": "Fluxo de design migrou do Pencil para o Figma: projeto gerado inclui docs/figma-guia.md (passo a passo), docs/figma-workflow.md (para IA) e plugin kasy-figma-generator em tools/. O .pen e os guias Pencil sa\u00edram. Guard docs-links no npm test valida URLs kasy.dev/docs no publish.",
        "en": "Design workflow migrated from Pencil to Figma: generated projects ship docs/figma-guia.md (step-by-step), docs/figma-workflow.md (for AI) and the kasy-figma-generator plugin in tools/. The .pen file and Pencil guides are gone. docs-links guard in npm test validates kasy.dev/docs URLs on publish.",
        "es": "El flujo de dise\u00f1o migr\u00f3 de Pencil a Figma: los proyectos generados incluyen docs/figma-guia.md (paso a paso), docs/figma-workflow.md (para IA) y el plugin kasy-figma-generator en tools/. El .pen y las gu\u00edas Pencil desaparecieron. El guard docs-links en npm test valida URLs kasy.dev/docs en el publish."
      },
      "components": {
        "pt": "Tela Design System atualizada para o fluxo Figma: preview de tokens, cores e componentes alinhados ao arquivo master da comunidade.",
        "en": "Design System page updated for the Figma workflow: token, color and component previews aligned with the community master file.",
        "es": "Pantalla Design System actualizada para el flujo Figma: vista previa de tokens, colores y componentes alineados con el archivo master de la comunidad."
      }
    }
  },
  "1.45.0": {
    "modules": {
      "core": {
        "pt": "Admin Console: aba Usu\u00e1rios reformulada com busca, pagina\u00e7\u00e3o, ordena\u00e7\u00e3o e filtro de assinantes (paridade nos 3 backends). Supabase: edge function admin-list-users reescrita. CLI: validate:backends passa a rodar deno check nas edge functions; novo npm run edge:check.",
        "en": "Admin Console: Users tab redesigned with search, pagination, sorting and subscriber filter (parity across all 3 backends). Supabase: admin-list-users edge function rewritten. CLI: validate:backends now runs deno check on edge functions; new npm run edge:check.",
        "es": "Admin Console: pesta\u00f1a Usuarios reformulada con b\u00fasqueda, paginaci\u00f3n, ordenaci\u00f3n y filtro de suscriptores (paridad en los 3 backends). Supabase: edge function admin-list-users reescrita. CLI: validate:backends ahora ejecuta deno check en edge functions; nuevo npm run edge:check."
      }
    }
  },
  "1.44.1": {
    "modules": {
      "core": {
        "pt": "Guia Pencil refinado: layout do canvas (zonas esquerda/direita), ordem de cores igual ao Design System do app, tabela de sombras (card, chrome, orb, nav) e mapeamento completo de tokens para colors.dart.",
        "en": "Refined Pencil guide: canvas layout (left/right zones), color order matching the in-app Design System, shadow table (card, chrome, orb, nav) and full token mapping to colors.dart.",
        "es": "Gu\u00eda Pencil refinada: layout del canvas (zonas izquierda/derecha), orden de colores igual al Design System de la app, tabla de sombras (card, chrome, orb, nav) y mapeo completo de tokens a colors.dart."
      }
    }
  },
  "1.44.0": {
    "modules": {
      "core": {
        "pt": "Novo fluxo Pencil: projeto gerado inclui design/Kasy-Design-System.pen, docs/pencil-guia.md (guia passo a passo) e docs/pencil-workflow.md (para IA). Rebrand no Pencil e sync em theme/.",
        "en": "New Pencil workflow: generated projects ship design/Kasy-Design-System.pen, docs/pencil-guia.md (step-by-step guide) and docs/pencil-workflow.md (for AI). Rebrand in Pencil, sync to theme/.",
        "es": "Nuevo flujo Pencil: proyectos generados incluyen design/Kasy-Design-System.pen, docs/pencil-guia.md (gu\u00eda paso a paso) y docs/pencil-workflow.md (para IA). Rebrand en Pencil y sync en theme/."
      }
    }
  },
  "1.41.0": {
    "modules": {
      "core": {
        "pt": "Preview device na web ganhou hot reload (r) e hot restart (R) direto na toolbar \u2014 sem voltar ao terminal. Bolinha de status mostra se o c\u00f3digo est\u00e1 ok (verde) ou com erro real de compila\u00e7\u00e3o (vermelho), inclusive ao salvar arquivos. Requer kasy run --web com a CLI atualizada; o terminal precisa ficar aberto.",
        "en": "Web device preview now has hot reload (r) and hot restart (R) in the toolbar \u2014 no need to switch back to the terminal. Status dot shows whether the code is clear (green) or has a real compile error (red), including when you save files. Requires kasy run --web with an updated CLI; keep that terminal open.",
        "es": "El preview device en web ahora tiene hot reload (r) y hot restart (R) en la barra \u2014 sin volver al terminal. El punto de estado muestra si el c\u00f3digo est\u00e1 bien (verde) o tiene un error real de compilaci\u00f3n (rojo), tambi\u00e9n al guardar archivos. Requiere kasy run --web con la CLI actualizada; mant\u00e9n ese terminal abierto."
      }
    }
  },
  "1.40.1": {
    "modules": {
      "components": {
        "pt": "Refino do submenu do Kasy Menu em telas estreitas: o submenu agora abre como sanfona embaixo do pr\u00f3prio item (expande inline), em vez de empilhar uma nova folha por cima. Menos custo de intera\u00e7\u00e3o e sem te jogar numa segunda tela; no desktop ele continua cascateando ao lado (flyout). J\u00e1 vale na demo web e no app gerado.",
        "en": "Kasy Menu submenu refinement on narrow screens: the submenu now opens as an accordion right beneath its own item (expands inline) instead of stacking a new sheet on top. Lower interaction cost and no jump to a second surface; on desktop it still cascades to the side (flyout). Live in the web demo and the generated app.",
        "es": "Refinamiento del submen\u00fa del Kasy Menu en pantallas estrechas: el submen\u00fa ahora abre como acorde\u00f3n justo debajo de su propio \u00edtem (se expande inline), en vez de apilar una nueva hoja encima. Menor costo de interacci\u00f3n y sin saltar a una segunda superficie; en escritorio sigue despleg\u00e1ndose al costado (flyout). Disponible en la demo web y en la app generada."
      }
    }
  },
  "1.40.0": {
    "modules": {
      "components": {
        "pt": "Novo componente Kasy Menu (menu de a\u00e7\u00f5es) + Popover. \u00c9 aquele menu suspenso de a\u00e7\u00f5es que se adapta sozinho \u00e0 plataforma: no desktop abre como um bal\u00e3o ancorado no bot\u00e3o (popover), no celular vira bottom sheet. Cada item pode ter \u00edcone, descri\u00e7\u00e3o, atalho de teclado e submenu; d\u00e1 pra agrupar em se\u00e7\u00f5es (inclusive uma 'zona de perigo' para a\u00e7\u00f5es destrutivas, em vermelho) e usar sele\u00e7\u00e3o \u00fanica ou m\u00faltipla. Apresente com showKasyMenu (adapta autom\u00e1tico, mas d\u00e1 pra for\u00e7ar popover ou sheet). J\u00e1 est\u00e1 registrado na tela de Componentes com preview.",
        "en": "New Kasy Menu (action menu) + Popover component. It is the dropdown action menu that adapts to the platform on its own: on desktop it opens as a balloon anchored to the button (popover), on mobile it becomes a bottom sheet. Each item can have an icon, description, keyboard shortcut and submenu; you can group items into sections (including a red 'Danger zone' for destructive actions) and use single or multiple selection. Present it with showKasyMenu (adapts automatically, but you can force popover or sheet). Already registered on the Components screen with a preview.",
        "es": "Nuevo componente Kasy Menu (men\u00fa de acciones) + Popover. Es ese men\u00fa desplegable de acciones que se adapta solo a la plataforma: en escritorio abre como un globo anclado al bot\u00f3n (popover), en el m\u00f3vil se vuelve bottom sheet. Cada \u00edtem puede tener icono, descripci\u00f3n, atajo de teclado y submen\u00fa; puedes agrupar \u00edtems en secciones (incluida una 'zona de peligro' en rojo para acciones destructivas) y usar selecci\u00f3n \u00fanica o m\u00faltiple. Pres\u00e9ntalo con showKasyMenu (se adapta autom\u00e1ticamente, pero puedes forzar popover o sheet). Ya est\u00e1 registrado en la pantalla de Componentes con vista previa."
      },
      "core": {
        "pt": "Navega\u00e7\u00e3o ganhou um observador de rotas compartilhado (KasyRouteObserver) no navigator raiz: as telas conseguem reagir quando voltam a aparecer depois que algo aberto por cima delas \u00e9 fechado (via didPopNext). \u00c9 a base que mant\u00e9m o novo Kasy Menu se comportando direito ao abrir/fechar; j\u00e1 vem ligado no router.",
        "en": "Navigation got a shared route observer (KasyRouteObserver) on the root navigator: screens can react when they are revealed again after something opened on top of them is dismissed (via didPopNext). It is the foundation that keeps the new Kasy Menu behaving correctly as it opens/closes; it comes wired into the router.",
        "es": "La navegaci\u00f3n gan\u00f3 un observador de rutas compartido (KasyRouteObserver) en el navigator ra\u00edz: las pantallas pueden reaccionar cuando vuelven a aparecer luego de que algo abierto encima de ellas se cierra (v\u00eda didPopNext). Es la base que mantiene el nuevo Kasy Menu comport\u00e1ndose bien al abrir/cerrar; ya viene conectado en el router."
      }
    }
  },
  "1.39.1": {
    "modules": {
      "core": {
        "pt": "Ajuste fino da propor\u00e7\u00e3o da web: a escala passou de 0.95 para 0.93 (a interface fica um pouco menor, mais perto do tamanho do app nativo). \u00c9 s\u00f3 calibragem do mesmo knob \u00fanico (kWebViewportScale) em todos os breakpoints; o nativo continua em 1.0 e d\u00e1 pra desligar tudo numa linha (kWebViewportScaleEnabled).",
        "en": "Fine-tuned the web proportion: the scale went from 0.95 to 0.93 (the interface is a touch smaller, closer to the native app size). It is just calibration of the same single knob (kWebViewportScale) across every breakpoint; native stays at 1.0 and the whole thing can be turned off in one line (kWebViewportScaleEnabled).",
        "es": "Ajuste fino de la proporci\u00f3n web: la escala pas\u00f3 de 0.95 a 0.93 (la interfaz queda un poco m\u00e1s peque\u00f1a, m\u00e1s cerca del tama\u00f1o del app nativo). Es solo calibraci\u00f3n del mismo knob \u00fanico (kWebViewportScale) en todos los breakpoints; el nativo se mantiene en 1.0 y todo se puede apagar en una l\u00ednea (kWebViewportScaleEnabled)."
      }
    }
  },
  "1.39.0": {
    "modules": {
      "core": {
        "pt": "Propor\u00e7\u00e3o da interface na web virou um ajuste \u00fanico e documentado: a web renderiza ~5% menor que o nativo (escala 0.95) em todos os tamanhos de tela, deixando a propor\u00e7\u00e3o mais pr\u00f3xima do app nativo. O nativo fica intacto (1.0) e respeitando a fonte do sistema, e d\u00e1 pra desligar tudo numa linha (kWebViewportScaleEnabled). \u00c9 uma camada de densidade por cima do design system responsivo, n\u00e3o substitui breakpoints/tipografia.",
        "en": "The web interface proportion is now a single, documented knob: web renders ~5% smaller than native (0.95 scale) at every screen size, bringing it closer to the native app. Native stays untouched (1.0) and respects the system font size, and the whole thing can be turned off in one line (kWebViewportScaleEnabled). It is a density layer on top of the responsive design system, not a replacement for breakpoints/typography.",
        "es": "La proporci\u00f3n de la interfaz en web ahora es un ajuste \u00fanico y documentado: la web se renderiza ~5% m\u00e1s peque\u00f1a que el nativo (escala 0.95) en todos los tama\u00f1os de pantalla, acerc\u00e1ndola al app nativo. El nativo queda intacto (1.0) y respeta el tama\u00f1o de fuente del sistema, y todo se puede apagar en una l\u00ednea (kWebViewportScaleEnabled). Es una capa de densidad sobre el design system responsivo, no reemplaza breakpoints/tipograf\u00eda."
      },
      "components": {
        "pt": "Campo de texto com altura id\u00eantica em qualquer renderizador e breakpoint (a linha \u00e9 travada via strut, ent\u00e3o web CanvasKit e nativo batem certinho, sem variar ~1px); e card clic\u00e1vel agora tem destaque ao passar o cursor na web, parecendo um controle interativo de verdade.",
        "en": "Text field with identical height across every renderer and breakpoint (the line is locked via strut, so web CanvasKit and native match exactly, with no ~1px drift); and a tappable card now has a hover highlight on web, feeling like a real interactive control.",
        "es": "Campo de texto con altura id\u00e9ntica en cualquier renderizador y breakpoint (la l\u00ednea se fija con strut, as\u00ed web CanvasKit y nativo coinciden exactamente, sin variar ~1px); y una tarjeta clicable ahora tiene resaltado al pasar el cursor en web, sinti\u00e9ndose como un control interactivo real."
      }
    }
  },
  "1.38.0": {
    "modules": {
      "components": {
        "pt": "Sidebar agora suporta submenus expans\u00edveis (grupos com sub-itens, como o menu suspenso de Configura\u00e7\u00f5es na Home): clicar no grupo abre/fecha os filhos, o item ativo do submenu fica em negrito forte (sem p\u00edlula) e o submenu fecha sozinho ao navegar para outra tela.",
        "en": "Sidebar now supports expandable submenus (groups with sub-items, like the Settings dropdown on Home): tapping the group opens/closes its children, the active sub-item shows in strong bold (no pill) and the submenu closes on its own when you navigate to another screen.",
        "es": "La sidebar ahora admite submen\u00fas expansibles (grupos con sub\u00edtems, como el men\u00fa desplegable de Ajustes en la Home): tocar el grupo abre/cierra sus hijos, el \u00edtem activo del submen\u00fa se muestra en negrita fuerte (sin p\u00edldora) y el submen\u00fa se cierra solo al navegar a otra pantalla."
      }
    }
  },
  "1.37.0": {
    "modules": {
      "components": {
        "pt": "Sidebar e abas mais responsivas: a sidebar ganhou um modo de colapso mais consistente (vira rail fino conforme a largura) e teve a busca n\u00e3o usada removida pra ficar mais enxuta; as abas (KasyTabs) agora se medem e se adaptam melhor em telas estreitas, sem cortar nem espremer.",
        "en": "More responsive sidebar and tabs: the sidebar got a more consistent collapse mode (turns into a thin rail by width) and had its unused search removed for a leaner component; tabs (KasyTabs) now measure and adapt better on narrow screens, without clipping or squeezing.",
        "es": "Sidebar y pesta\u00f1as m\u00e1s responsivas: la sidebar tiene un modo de colapso m\u00e1s consistente (se vuelve un rail fino seg\u00fan el ancho) y se le quit\u00f3 la b\u00fasqueda sin uso para un componente m\u00e1s limpio; las pesta\u00f1as (KasyTabs) ahora se miden y adaptan mejor en pantallas estrechas, sin recortar ni apretar."
      },
      "web": {
        "pt": "Web mais redonda: login social na web agora trata o fluxo por redirecionamento (redirect), \u00fatil quando o popup \u00e9 bloqueado pelo navegador; e o Firebase Hosting foi ajustado pra publicar o build/web sem descartar arquivos ocultos necess\u00e1rios, deixando o deploy do site mais previs\u00edvel.",
        "en": "Smoother web: social login on web now handles the redirect flow, useful when the browser blocks the popup; and Firebase Hosting was tuned to publish build/web without dropping needed hidden files, making the site deploy more predictable.",
        "es": "Web m\u00e1s pulida: el inicio de sesi\u00f3n social en web ahora maneja el flujo por redirecci\u00f3n (redirect), \u00fatil cuando el navegador bloquea el popup; y Firebase Hosting se ajust\u00f3 para publicar build/web sin descartar archivos ocultos necesarios, dejando el deploy del sitio m\u00e1s predecible."
      }
    }
  },
  "1.36.1": {
    "modules": {
      "onboarding": {
        "pt": "Onboarding mais resistente a falhas: se a escrita no backend falhar (por exemplo, o documento do usu\u00e1rio ainda n\u00e3o foi criado logo ap\u00f3s o cadastro), o loader n\u00e3o trava mais. O onboarding sempre conclui e o estado fica salvo localmente, e uma resposta que n\u00e3o salvou \u00e9 registrada no log sem interromper a experi\u00eancia.",
        "en": "More resilient onboarding: if a backend write fails (e.g. the user document isn't created yet right after sign-up), the loader no longer gets stuck. Onboarding always completes with the state saved locally, and an answer that failed to save is logged without interrupting the flow.",
        "es": "Onboarding m\u00e1s resistente a fallos: si una escritura en el backend falla (por ejemplo, el documento del usuario a\u00fan no se cre\u00f3 justo tras el registro), el loader ya no se queda atascado. El onboarding siempre concluye con el estado guardado localmente, y una respuesta que no se guard\u00f3 se registra en el log sin interrumpir la experiencia."
      },
      "components": {
        "pt": "Sidebar: a variante \"collapsed rail\" agora fica fina de verdade em tela estreita (mobile) no showcase, em vez de abrir larga. S\u00f3 a gaveta expl\u00edcita (isDrawer) for\u00e7a a abertura larga. O app real n\u00e3o muda (a sidebar s\u00f3 aparece de tablet pra cima).",
        "en": "Sidebar: the \"collapsed rail\" variant now actually stays thin on narrow (mobile) widths in the showcase, instead of opening wide. Only the explicit drawer (isDrawer) forces the wide open. The real app is unchanged (the sidebar only shows from tablet up).",
        "es": "Sidebar: la variante \"collapsed rail\" ahora se mantiene fina de verdad en anchos estrechos (m\u00f3vil) en el showcase, en vez de abrirse ancha. Solo el caj\u00f3n expl\u00edcito (isDrawer) fuerza la apertura ancha. La app real no cambia (la sidebar solo aparece de tablet en adelante)."
      }
    }
  },
  "1.36.0": {
    "modules": {
      "components": {
        "pt": "Sidebar melhorada: nova linha de busca opcional acima do rodap\u00e9 (showSearch), variante de gaveta (isDrawer) e modo de demonstra\u00e7\u00e3o (showcase) pra mais flexibilidade de navega\u00e7\u00e3o. As abas internas agora usam o componente compartilhado KasyTabs, deixando o visual mais consistente e o c\u00f3digo mais enxuto.",
        "en": "Improved sidebar: new optional search row above the footer (showSearch), a drawer variant (isDrawer) and a showcase mode for more navigation flexibility. The internal tabs now use the shared KasyTabs component, making the look more consistent and the code leaner.",
        "es": "Sidebar mejorada: nueva fila de b\u00fasqueda opcional sobre el pie (showSearch), variante de caj\u00f3n (isDrawer) y modo de demostraci\u00f3n (showcase) para m\u00e1s flexibilidad de navegaci\u00f3n. Las pesta\u00f1as internas ahora usan el componente compartido KasyTabs, dejando el aspecto m\u00e1s consistente y el c\u00f3digo m\u00e1s limpio."
      }
    }
  },
  "1.35.0": {
    "modules": {
      "core": {
        "pt": "Confian\u00e7a pra escalar: (1) trava anti-patch-desatualizado no publish \u2014 se um arquivo do kit muda mas o patch Supabase/API n\u00e3o acompanha, o `npm publish` falha apontando o que revisar (nunca mais release com backend regredido em sil\u00eancio). (2) Atualizar projeto existente ficou claro: depois de `kasy update core/components/<feature>`, a CLI mostra quais arquivos mudaram e como juntar suas customiza\u00e7\u00f5es com o novo (inclusive um prompt pronto pra IA); o passo a passo tamb\u00e9m fica no AGENTS.md do projeto. (3) Login Google na web (Supabase): a CLI agora autoriza o localhost no Firebase depois do deploy e com novas tentativas, ent\u00e3o o popup do Google na web para de falhar com \"unauthorized-domain\" em projetos rec\u00e9m-criados. (4) Login com Google na web (Supabase): corrigido o erro \"missing sub claim\" que impedia o login Google no navegador. Na web n\u00e3o existe usu\u00e1rio an\u00f4nimo, ent\u00e3o o app agora cria a conta direto em vez de tentar vincular a um an\u00f4nimo inexistente (mesmo comportamento defensivo do Firebase). (5) Propor\u00e7\u00e3o da web refinada: a escala 0.95 vale s\u00f3 no desktop (tablet, mobile e nativo ficam no tamanho real, igual ao device preview), e a compensa\u00e7\u00e3o de escala alta do sistema agora olha o tamanho da TELA, n\u00e3o da janela, ent\u00e3o s\u00f3 estreitar o navegador n\u00e3o encolhe mais a interface.",
        "en": "Confidence to scale: (1) stale-patch tripwire at publish \u2014 if a kit file changes but the Supabase/API patch doesn't follow, `npm publish` fails pointing to what to review (no more silently regressed backends in a release). (2) Updating an existing project is now clear: after `kasy update core/components/<feature>`, the CLI shows which files changed and how to merge your customizations with the new version (including a ready AI prompt); the step-by-step also lives in the project AGENTS.md. (3) Google web login (Supabase): the CLI now authorizes localhost on Firebase after the deploy and with retries, so the web Google popup stops failing with \"unauthorized-domain\" on freshly created projects. (4) Google web login (Supabase): fixed the \"missing sub claim\" error that blocked Google login in the browser. On web there is no anonymous user, so the app now creates the account directly instead of trying to link to a non-existent anonymous one (matching the Firebase backend's defensive behavior). (5) Web proportion refined: the 0.95 scale applies on desktop only (tablet, mobile and native render at real size, matching the device preview), and the high-OS-scale compensation now keys off the SCREEN size, not the window, so merely narrowing the browser no longer shrinks the UI.",
        "es": "Confianza para escalar: (1) tripwire de patch desactualizado en el publish \u2014 si un archivo del kit cambia pero el patch Supabase/API no lo sigue, `npm publish` falla indicando qu\u00e9 revisar (nunca m\u00e1s un backend regresado en silencio). (2) Actualizar un proyecto existente qued\u00f3 claro: tras `kasy update core/components/<feature>`, la CLI muestra qu\u00e9 archivos cambiaron y c\u00f3mo combinar tus personalizaciones con lo nuevo (incluido un prompt listo para IA); el paso a paso tambi\u00e9n est\u00e1 en el AGENTS.md del proyecto. (3) Inicio de sesi\u00f3n Google en web (Supabase): la CLI ahora autoriza localhost en Firebase despu\u00e9s del deploy y con reintentos, as\u00ed el popup de Google en web deja de fallar con \"unauthorized-domain\" en proyectos reci\u00e9n creados. (4) Inicio de sesi\u00f3n Google en web (Supabase): corregido el error \"missing sub claim\" que bloqueaba el login con Google en el navegador. En web no hay usuario an\u00f3nimo, as\u00ed que la app ahora crea la cuenta directamente en vez de intentar vincular a un an\u00f3nimo inexistente (igual que el comportamiento defensivo del backend Firebase). (5) Proporci\u00f3n web refinada: la escala 0.95 aplica solo en desktop (tablet, m\u00f3vil y nativo se ven a tama\u00f1o real, igual que el device preview), y la compensaci\u00f3n de escala alta del sistema ahora usa el tama\u00f1o de la PANTALLA, no de la ventana, as\u00ed que solo estrechar el navegador ya no encoge la interfaz."
      }
    }
  },
  "1.34.0": {
    "modules": {
      "core": {
        "pt": "Login com Facebook automatizado + Facebook na web (Firebase): novo comando `kasy facebook` guia os passos na Meta (abre o link), grava App ID + Client Token no iOS/Android e habilita o provedor no Firebase (Identity Toolkit) ou Supabase. No Firebase, o Facebook passa a funcionar na WEB (signInWithPopup) e o bot\u00e3o s\u00f3 aparece quando configurado (flag withFacebookWebSignin). Apple/Facebook na web no Supabase ficam como native-only (roadmap). Corrigido: o `kasy apple-web` agora liga o Apple web s\u00f3 no Firebase (n\u00e3o cria mais bot\u00e3o morto no Supabase). Credenciais ficam salvas e o `kasy new` aplica sozinho.",
        "en": "Facebook Login automated + Facebook on web (Firebase): new `kasy facebook` command guides the Meta steps (opens the link), writes App ID + Client Token into iOS/Android and enables the provider on Firebase (Identity Toolkit) or Supabase. On Firebase, Facebook now works on the WEB (signInWithPopup) and the button only shows once configured (withFacebookWebSignin flag). Apple/Facebook on web for Supabase stay native-only (roadmap). Fixed: `kasy apple-web` now enables Apple web on Firebase only (no more dead button on Supabase). Credentials are cached and `kasy new` applies them automatically.",
        "es": "Inicio de sesi\u00f3n con Facebook automatizado + Facebook en la web (Firebase): nuevo comando `kasy facebook` gu\u00eda los pasos en Meta (abre el enlace), escribe App ID + Client Token en iOS/Android y habilita el proveedor en Firebase (Identity Toolkit) o Supabase. En Firebase, Facebook ahora funciona en la WEB (signInWithPopup) y el bot\u00f3n solo aparece cuando est\u00e1 configurado (flag withFacebookWebSignin). Apple/Facebook en la web para Supabase quedan como native-only (roadmap). Corregido: `kasy apple-web` ahora activa Apple web solo en Firebase (sin bot\u00f3n muerto en Supabase). Las credenciales se guardan y `kasy new` las aplica autom\u00e1ticamente."
      }
    }
  },
  "1.33.0": {
    "modules": {
      "core": {
        "pt": "Login com Apple na WEB agora \u00e9 automatiz\u00e1vel (backend Firebase): novo comando `kasy apple-web` grava o codeFlowConfig (Service ID + Team ID + Key ID + .p8) no provedor Apple do Firebase, que re-assina o secret sozinho (n\u00e3o expira), reaproveitando suas credenciais salvas. Projetos Firebase novos j\u00e1 nascem com Apple web se voc\u00ea j\u00e1 configurou antes. O bot\u00e3o Apple na web s\u00f3 aparece quando funciona de verdade (sem bot\u00e3o morto); `kasy doctor` mostra se falta configurar. No Supabase, Apple na web \u00e9 roadmap.",
        "en": "Apple Sign-In on the WEB is now automatable (Firebase backend): new `kasy apple-web` command writes the codeFlowConfig (Service ID + Team ID + Key ID + .p8) into the Firebase Apple provider, which re-signs the secret itself (never expires), reusing your saved credentials. New Firebase projects ship web Apple ready if you configured it before. The web Apple button only shows when it actually works (no dead button); `kasy doctor` reports if it's pending. On Supabase, Apple on web is roadmap.",
        "es": "El inicio de sesi\u00f3n con Apple en la WEB ahora es automatizable (backend Firebase): nuevo comando `kasy apple-web` escribe el codeFlowConfig (Service ID + Team ID + Key ID + .p8) en el proveedor Apple de Firebase, que vuelve a firmar el secret solo (no expira), reutilizando tus credenciales guardadas. Los proyectos Firebase nuevos vienen con Apple web listo si ya lo configuraste antes. El bot\u00f3n de Apple en la web solo aparece cuando funciona de verdad (sin bot\u00f3n muerto); `kasy doctor` indica si falta configurar. En Supabase, Apple en la web es roadmap."
      }
    }
  },
  "1.32.0": {
    "modules": {
      "core": {
        "pt": "Propor\u00e7\u00e3o da web agora se adapta \u00e0 largura real da janela: telas com escala alta do sistema (Windows em 125/150/175%) n\u00e3o ficam mais cortadas (sidebar/header), e o Mac continua igual. Ajuste s\u00f3 na web, nativo intocado.",
        "en": "Web proportion now adapts to the real window width: high system-scale displays (Windows at 125/150/175%) no longer look cropped (sidebar/header), and Mac stays the same. Web-only, native untouched.",
        "es": "La proporci\u00f3n en web ahora se adapta al ancho real de la ventana: pantallas con escala alta del sistema (Windows al 125/150/175%) ya no se ven recortadas (sidebar/header), y Mac queda igual. Solo en web, nativo intacto."
      }
    }
  },
  "1.31.12": {
    "modules": {
      "core": {
        "pt": "Preview de dispositivo na web n\u00e3o lan\u00e7a mais erros no console (\"Not initialized\" / provider n\u00e3o encontrado) durante a inicializa\u00e7\u00e3o \u2014 agora espera o DevicePreview montar antes de sincronizar a orienta\u00e7\u00e3o.",
        "en": "Web device preview no longer throws console errors (\"Not initialized\" / provider not found) during startup \u2014 it now waits for DevicePreview to mount before syncing orientation.",
        "es": "La vista previa de dispositivo en web ya no lanza errores en consola (\"Not initialized\" / provider no encontrado) durante el arranque \u2014 ahora espera a que DevicePreview se monte antes de sincronizar la orientaci\u00f3n."
      }
    }
  },
  "1.31.10": {
    "modules": {
      "core": {
        "pt": "Web preview de dispositivo n\u00e3o lan\u00e7a mais o erro \"Not initialized\" no primeiro frame: ele espera o DevicePreview terminar de inicializar antes de ajustar a orienta\u00e7\u00e3o.",
        "en": "Device preview on web no longer throws \"Not initialized\" on the first frame: it waits for DevicePreview to finish initializing before syncing orientation.",
        "es": "La vista previa de dispositivo en web ya no lanza \"Not initialized\" en el primer frame: espera a que DevicePreview termine de inicializar antes de ajustar la orientaci\u00f3n."
      }
    }
  },
  "1.22.0": {
    "modules": {
      "components": {
        "pt": "Navega\u00e7\u00e3o repaginada para desktop/web: novo KasyWebHeader, KasySidebar e KasyBottomBar mais limpos e consistentes, com KasyAppBar se adaptando ao desktop.",
        "en": "Revamped desktop/web navigation: new KasyWebHeader, cleaner and more consistent KasySidebar and KasyBottomBar, with KasyAppBar adapting to desktop.",
        "es": "Navegaci\u00f3n renovada para escritorio/web: nuevo KasyWebHeader, KasySidebar y KasyBottomBar m\u00e1s limpios y consistentes, con KasyAppBar adapt\u00e1ndose al escritorio."
      },
      "core": {
        "pt": "Cor do texto sobre o accent (accentForeground) agora \u00e9 autom\u00e1tica: ela se ajusta sozinha pela lumin\u00e2ncia do accent (clara em accents escuros, escura em claros), ent\u00e3o trocar a cor da marca continua leg\u00edvel em ambos os temas.",
        "en": "Text color on top of the accent (accentForeground) is now automatic: it adapts to the accent's luminance (light on dark accents, dark on light ones), so changing the brand color stays legible in both themes.",
        "es": "El color del texto sobre el accent (accentForeground) ahora es autom\u00e1tico: se ajusta solo seg\u00fan la luminancia del accent (claro en accents oscuros, oscuro en claros), as\u00ed cambiar el color de marca sigue siendo legible en ambos temas."
      }
    }
  },
  "1.21.0": {
    "modules": {
      "components": {
        "pt": "KasySidebarPro com renderiza\u00e7\u00e3o mais leve: removidos c\u00e1lculos de borda redundantes, deixando a sidebar mais simples e perform\u00e1tica.",
        "en": "Lighter KasySidebarPro rendering: removed redundant border-radius calculations, making the sidebar simpler and more performant.",
        "es": "Renderizado m\u00e1s ligero de KasySidebarPro: se quitaron c\u00e1lculos de borde redundantes, dejando la barra lateral m\u00e1s simple y eficiente."
      },
      "core": {
        "pt": "KasyHover agora aceita hoverEnabled: permite desligar o realce ao passar o mouse em listas simples (como a tela de Configura\u00e7\u00f5es), mantendo o cursor de clique e o feedback de toque.",
        "en": "KasyHover now accepts hoverEnabled: lets you turn off the hover highlight on plain list rows (like the Settings screen) while keeping the click cursor and press feedback.",
        "es": "KasyHover ahora acepta hoverEnabled: permite desactivar el resaltado al pasar el cursor en listas simples (como la pantalla de Ajustes), manteniendo el cursor de clic y el feedback al pulsar."
      }
    }
  },
  "1.18.0": {
    "modules": {
      "components": {
        "pt": "Novo KasyDatePicker (sele\u00e7\u00e3o de data com modo intervalo). KasyTabs redesenhado seguindo o Figma \u2014 espa\u00e7amento corrigido, transi\u00e7\u00e3o suave (fade + slide) ao trocar de aba. KasyAvatar refatorado com gradientes estruturados (mais f\u00e1cil de customizar).",
        "en": "New KasyDatePicker (date selection with range mode). KasyTabs redesigned to match Figma \u2014 fixed spacing, smooth fade + slide transition when switching tabs. KasyAvatar refactored with structured gradients (easier to customize).",
        "es": "Nuevo KasyDatePicker (selecci\u00f3n de fecha con modo rango). KasyTabs redise\u00f1ado siguiendo el Figma \u2014 espaciado corregido, transici\u00f3n suave (fade + slide) al cambiar de pesta\u00f1a. KasyAvatar refactorizado con gradientes estructurados (m\u00e1s f\u00e1cil de personalizar)."
      },
      "widget": {
        "pt": "Autor da cita\u00e7\u00e3o agora aparece junto da quote no widget. Locale carregado sincronamente \u2014 corrige caso em que o widget abria em ingl\u00eas mesmo com o app em pt/es por causa de race condition. Cores do widget Android passaram a vir de res/values/colors.xml (branding consistente, f\u00e1cil de trocar). Layout do widget responde ao tamanho real (pequeno/m\u00e9dio/grande) sem cortar conte\u00fado.",
        "en": "Quote author now appears alongside the quote in the widget. Locale loaded synchronously \u2014 fixes case where the widget opened in English even with the app in pt/es due to a race condition. Android widget colors now come from res/values/colors.xml (consistent branding, easy to swap). Widget layout responds to actual size (small/medium/large) without clipping content.",
        "es": "El autor de la cita ahora aparece junto a la quote en el widget. Locale cargado sincr\u00f3nicamente \u2014 corrige el caso en que el widget abr\u00eda en ingl\u00e9s aunque la app estuviera en pt/es por una race condition. Los colores del widget Android ahora vienen de res/values/colors.xml (branding consistente, f\u00e1cil de cambiar). El layout del widget responde al tama\u00f1o real (peque\u00f1o/mediano/grande) sin cortar contenido."
      }
    }
  },
  "1.17.0": {
    "modules": {
      "revenuecat": {
        "pt": "kasy run agora detecta se voc\u00ea est\u00e1 rodando em simulador/emulador ou dispositivo f\u00edsico e injeta a chave certa automaticamente. Tr\u00eas chaves no .env: RC_TEST_KEY (test_, simulador), RC_IOS_PROD_KEY (appl_, iPhone f\u00edsico), RC_ANDROID_PROD_KEY (goog_, Android f\u00edsico). Projetos antigos continuam funcionando \u2014 pra ganhar a separa\u00e7\u00e3o, basta adicionar as 3 chaves no .env. For\u00e7ar manualmente: kasy run --rc=test ou --rc=prod.",
        "en": "kasy run now detects whether you're on a simulator/emulator or a physical device and injects the right key automatically. Three keys in .env: RC_TEST_KEY (test_, simulator), RC_IOS_PROD_KEY (appl_, physical iPhone), RC_ANDROID_PROD_KEY (goog_, physical Android). Old projects keep working \u2014 to get the split, just add the 3 keys to .env. Force manually: kasy run --rc=test or --rc=prod.",
        "es": "kasy run ahora detecta si est\u00e1s corriendo en simulador/emulador o dispositivo f\u00edsico e inyecta la clave correcta autom\u00e1ticamente. Tres claves en .env: RC_TEST_KEY (test_, simulador), RC_IOS_PROD_KEY (appl_, iPhone f\u00edsico), RC_ANDROID_PROD_KEY (goog_, Android f\u00edsico). Los proyectos antiguos siguen funcionando \u2014 para obtener el split, basta con agregar las 3 claves en .env. Forzar manualmente: kasy run --rc=test o --rc=prod."
      }
    }
  },
  "1.13.0": {
    "modules": {
      "onboarding": {
        "pt": "Bot\u00e3o \"J\u00e1 tem conta? Entrar\" na primeira tela do onboarding \u2014 quem j\u00e1 tem conta entra direto sem passar pelo fluxo todo, sem precisar criar usu\u00e1rio an\u00f4nimo antes",
        "en": "\"Already have an account? Log in\" button on the first onboarding screen \u2014 returning users go straight to sign-in instead of going through the full flow as an anonymous user first",
        "es": "Bot\u00f3n \"\u00bfYa tienes cuenta? Iniciar sesi\u00f3n\" en la primera pantalla del onboarding \u2014 quien ya tiene cuenta entra directo sin pasar por todo el flujo como usuario an\u00f3nimo"
      }
    }
  },
  "1.10.0": {
    "modules": {
      "widget": {
        "pt": "Widget agora funciona ponta a ponta: idioma do app (pt/en/es), sauda\u00e7\u00e3o correta pelo hor\u00e1rio, nome real do usu\u00e1rio, status PRO/Free em tempo real (com fallback do RevenueCat quando o webhook atrasa), auto-refresh quando o estado do usu\u00e1rio muda \u2014 sem esperar o background task de 15 min. App Group iOS corrigido em Runner.entitlements (sem isso a escrita ia pro vazio). Textos hardcoded em Swift/Kotlin removidos \u2014 o nativo s\u00f3 renderiza o que o Dart manda.",
        "en": "Widget now works end-to-end: app language (pt/en/es), correct greeting for time of day, real user name, real-time PRO/Free status (with RevenueCat fallback when the webhook is delayed), auto-refresh when user state changes \u2014 no need to wait for the 15-min background task. iOS App Group fixed in Runner.entitlements (without it, writes went to nowhere). Hardcoded strings removed from Swift/Kotlin \u2014 native side only renders what Dart sends.",
        "es": "El widget ahora funciona de punta a punta: idioma de la app (pt/en/es), saludo correcto seg\u00fan el horario, nombre real del usuario, estado PRO/Free en tiempo real (con fallback de RevenueCat cuando el webhook se atrasa), auto-refresh cuando el estado del usuario cambia \u2014 sin esperar la background task de 15 min. App Group iOS corregido en Runner.entitlements (sin esto las escrituras iban al vac\u00edo). Textos hardcoded en Swift/Kotlin eliminados \u2014 el c\u00f3digo nativo solo renderiza lo que Dart env\u00eda."
      }
    }
  },
  "1.8.0": {
    "modules": {
      "components": {
        "pt": "Novo componente KasySwipeAction (arrastar para excluir/arquivar) + tela de notifica\u00e7\u00f5es com excluir tudo e swipe-to-delete",
        "en": "New KasySwipeAction component (swipe to delete/archive) + notifications screen with delete-all and swipe-to-delete",
        "es": "Nuevo componente KasySwipeAction (deslizar para eliminar/archivar) + pantalla de notificaciones con eliminar todo y swipe-to-delete"
      }
    }
  },
  "1.5.0": {
    "modules": {
      "widget": {
        "pt": "Widget redesenhado: sauda\u00e7\u00e3o por hor\u00e1rio no idioma do usu\u00e1rio (pt/en/es), nome real e status do plano",
        "en": "Redesigned widget: time-of-day greeting in the user's language (pt/en/es), real name and plan status",
        "es": "Widget redise\u00f1ado: saludo seg\u00fan el horario en el idioma del usuario (pt/en/es), nombre real y estado del plan"
      }
    }
  }
}
