# Changelog

All notable changes to rebreak-native will be documented in this file.
Format: [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
Versioning: `version` follows SemVer, `versionCode` is monotonically increasing.

---

## [Unreleased]

---

## [0.1.0] — versionCode 7 — 2026-05-15

### Added
- feat(native): device-info API headers — model, name, osVersion sent on every request via lib/api.ts
- feat(native): DeviceLimitSheet visual differentiation — „Dieses Gerät"-Pill distinguishes current device from others in the list

### Changed
- refactor(native): profile-page i18n keys — full sweep of 24 leftover Vue-i18n `{var}` patterns replaced with `%{var}` (vue-i18n-style removed, expo-localization pattern applied consistently)
- chore(native): Google-OAuth always shows account-picker — `prompt=select_account` added to OAuth request, prevents silent re-auth with wrong account
- refactor(native): feed page uses `groupedBg` for card contrast instead of flat background

### Fixed
- fix(native): mail-account-edit modal-conflict + double-click bug — modal coordination corrected, prevents overlapping sheet opens
- fix(native): sign-out now calls `WebBrowser.coolDownAsync` to clear OAuth cookies — prevents stale Google session on next login
- fix(backend): Test-User `charioanouar@gmail.com` correctly identified as MrLonely (device-info schema + merge heuristic + test-user detection, auto-deployed via pipeline)

---

## [0.1.0] — versionCode 6 — 2026-05-15

### Added
- feat(i18n): French as 3rd app language (`fr`) for test customers — full locale file, settings picker, device-locale auto-detect (a981deb-fix)
- feat(native): Lyra voice picker for legend tier — 3 ElevenLabs voices (Default / Voice 1 / Voice 2), backed by PATCH /api/profile/me/lyra-voice (d9bb7ef)
- feat(native): realtime debug page (DEV-only) — connection-state, reconnect-counter, token-expiry countdown, channel list, rolling event-log (a0d67f3)
- feat(backend): Lyra voice TTS-routing — userLyraVoiceId takes priority over default (legend-gated) (76f8595)

### Changed
- refactor(mail): removed Groq LLM borderline layer — deterministic Score+Layer2.5 pipeline only. Resolves DSGVO-P0 items (no third-country data transfer). Layer 2.5 (Brand+Random) continues to catch Apple Hide-My-Email pattern (f2e3c00)

### Fixed
- fix(native): `protectedDevices.filter is not a function` — Array.isArray guard on API response (a0d67f3)

---

## [0.1.0] — versionCode 5 — 2026-05-14

### Added
- feat(mail): multi-layer email classifier — Brand+Random detection, Relay-Decoder (Apple Hide-My-Email), Score-based routing, Groq borderline-review, ML-Sampling pipeline (b2f0471)

### Fixed
- fix(mail): reactive Mail page — stats + connection status refresh on scan/connect (4580a19)
- fix(mail): donut card layout rebuilt from scratch — centered, breathing room, no truncation (2ea0cfe)
- fix(mail): donut card layout justify-start instead of center (aac6c00)
- fix(mail): legend rows justify-between + per-connection bar-chart sparse-data zoom (b47ac24)
- fix(mail): legend takes natural width inside card + bar-chart always trims to hit-range (55cba9a)
- fix(mail): legend vertically centered against donut center number (778d3b6)
- fix(mail): revert marginBottom hack — layout was breaking out of card (1d93ada)
- fix(mail): legend bottom-aligned with donut baseline for visual centering (c218287)
- fix(mail): DSGVO Art. 17 — manual sample cleanup on account delete (be4e163)

---

## [0.1.0] — versionCode 4 — 2026-05-07

### Added
- feat(mail): Outlook OAuth scan + daemon initial-sweep + page polish v4 (8075c8e)

### Fixed
- fix(idle-daemon): sync MS_OAUTH_SCOPES with backend — drop User.Read, add email (fd1cb91)

---
