Les notes créées avant la migration 0061 ont urls=NULL en base. Le défaut
NoteResponse.urls=[] ne s'applique qu'à un attribut absent, pas à None, d'où
ResponseValidationError "Input should be a valid list" → GET /api/notes 500
→ "Erreur de chargement" côté UI.
Ajoute un field_validator(mode='before') qui coerce None → [].
Nettoie aussi l'import HttpUrl inutilisé.
v0.5.16
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Backend :
- Migration 007 : list_type VARCHAR(20) sur shopping.lists (weekly/project),
url/description/image_url sur shopping.list_items
- Modèle ShoppingList : champ list_type
- Modèle ListItem : champs url, description, image_url
- Schémas : list_type sur Create/Response, nouveaux champs sur ItemCreate/Update/Response
- _unique_week_label() : évite les doublons S22 2026 → S22 2026 (2)
- finish_shopping : carry-over uniquement pour list_type='weekly'
Frontend :
- api/shopping.ts : list_type, champs enrichis item, createProjectList()
- ProjectItemCard.tsx : carte avec image, description, URL, boutique, cochage
- ShoppingPage :
· Séparation weekly / project dans la sélection de liste active
· Section "Listes projet" sur l'écran vide avec navigation
· Badge PROJET dans l'en-tête
· Bouton "Clôturer la semaine" et badge "semaine dépassée" masqués sur projet
· Bouton "+ Ajouter" (mobile + laptop) sur les listes projet
· Vue grille ProjectItemCard pour les listes projet
· Modale création liste projet (nom + boutique)
· Modale ajout/édition item projet (nom, description, URL, image URL)
v0.5.14
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remplace fa-house par fa-circle-nodes dans la TopBar pour aligner
le logo affiché dans l'app avec la nouvelle icône PWA/favicon hub.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remplace la maison par un graphe central orange (accent) avec 3 nœuds
satellites crème (d5c4a1) sur fond sombre Gruvbox. Décliné en
favicon.svg, icon-192.png et icon-512.png (PWA shortcut smartphone).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Contient les tokens, composants et exemples adaptés au mobile,
à utiliser comme référence lors du développement des vues smartphone.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Ajoute mcp_server.py avec get_todos, create_todo, update_todo, postpone_todo, delete_todo.
Ajoute test_mcp.py (7 tests). Corrige conftest pour injecter NullPool dans AsyncSessionLocal des outils MCP (évite les conflits d'event loop entre tests).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Fixes deux vulnérabilités critiques en sécurité:
1. **Timing attack** — remplace la comparaison naïve `!=` par
`hmac.compare_digest()` pour éviter les attaques temporelles
(constant-time comparison).
2. **Clé vide acceptée** — ajoute le check `not settings.mcp_api_key`
pour rejeter (401) TOUS les requêtes `/mcp` si MCP_API_KEY n'est
pas configurée, empêchant l'accès unauthenticated silencieux.
Bonus: ajoute l'en-tête `www-authenticate: Bearer` (RFC 9110).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Admin stats : ajout video (count + size_bytes) dans /api/admin/stats.
ConfigPage : grille médias 3 colonnes (Photos / Audio / Vidéos).
docker-compose : backend et backend-worker tournent en user 1000:1000
pour que les fichiers écrits dans ./data/ appartiennent à l'utilisateur
hôte et non à root.
v0.5.6
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Decimal Python → string JSON causait TypeError: z.toFixed is not a function
dans NoteCard (title attribute de l'icône GPS). Tous les champs gps_lat/gps_lon
passent maintenant en float | None dans les schémas Pydantic.
v0.5.3
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ImportError au démarrage du backend : ALLOWED_AUDIO_TYPES avait été renommé
en ALLOWED_AUDIO_PREFIXES dans services/media.py mais l'import dans api/media.py
n'avait pas été mis à jour.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sans cet attribut, iOS affiche le menu natif (Prendre une photo / Bibliothèque /
Fichiers) et Android propose un sélecteur de source.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
navigator.geolocation est undefined sur HTTP hors localhost (contexte non sécurisé).
- Message d'erreur visible selon le cas (permission, HTTPS, timeout)
- Fallback : deux champs lat/lon s'affichent automatiquement
- TodoForm : bouton GPS toujours actif (plus disabled sur navigator.geolocation)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- TopBar enrichi : icône maison + nom + version (gauche), thème + compte (droite)
- Bouton compte désactivé (placeholder pour future auth multi-utilisateurs)
- Suppression de la carte HomeHub redondante sur la page d'accueil
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
BottomSheet.tsx
- visualViewport API : calcule la hauteur du clavier en temps réel
- bottom: keyboardOffset → le sheet monte exactement au-dessus du clavier
- maxHeight s'adapte à l'espace visible restant
- border-radius passe à 16px partout quand le clavier est ouvert
- Transition douce 0.15s sur bottom/maxHeight/border-radius
ShoppingPage.tsx
- type="search" sur le champ de recherche → supprime la suggestion URL iOS
dans la barre QuickType du clavier
- autoFocus → clavier s'ouvre automatiquement à l'ouverture du sheet
v0.5.1
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>