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>
ThemeContext
- ThemeMode dark/light/system persisté en localStorage
- fontScale 0.8–1.4 appliqué via CSS zoom sur <html>
- Écoute prefers-color-scheme pour le mode système
index.html
- Script anti-flash : applique thème et zoom synchrone avant le premier rendu
Layout
- TopBar fixe 44px : bouton icône qui cycle dark→light→system→dark
- Contenu décalé de 44px vers le bas
ConfigPage (/config)
- Sélecteur de thème (3 boutons avec icônes)
- Slider taille de texte avec aperçu temps réel
- Bouton Réinitialiser
HomePage
- Tuile Paramètres (fa-sliders) → /config
TodoForm
- Paste Ctrl+V pour ajouter une photo (même mécanique que CatalogueModal)
- Indice visuel "ou Ctrl+V"
v0.5.0
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Cochée par défaut à la création (aucune date soumise).
Décochée si la tâche éditée a déjà une date (champ date pré-rempli).
Décocher affiche le sélecteur de date ; cocher le masque et efface la date.
v0.4.14
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Écoute l'événement paste sur window quand le formulaire est ouvert.
Si le presse-papier contient une image, déclenche le même upload
que le bouton fichier. Indice visuel "ou Ctrl+V" affiché sous le bouton.
Les deux méthodes (fichier + coller) coexistent.
v0.4.13
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
La règle ~* \.(webp|...) prenait priorité sur /media/ et servait
les images uploadées depuis le HTML statique au lieu de les proxifier
vers le backend — causant un 404 sur toutes les photos d'articles.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Migration 006 : colonne tags TEXT[] sur shopping.products
- Modèle SQLAlchemy + schémas Pydantic mis à jour (ProductCreate/Update/Response)
- Interface TypeScript Product/ProductCreate/ProductUpdate avec tags?: string[]
- CatalogueModal : chip input (Entrée/virgule pour ajouter, clic pour supprimer, Backspace pour retirer le dernier)
- Recherche dans le catalogue et le bottom sheet étendue aux tags (insensible aux accents)
- Tags affichés en pills dans la liste du catalogue
v0.4.12
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Le backend utilisait ILIKE (insensible à la casse uniquement) — "iles" ne
trouvait pas "Îles flottantes". Passage au filtrage client avec matchesSearch
(normalize NFD) identique au bottom sheet. Charge tous les produits une fois
puis filtre sur name, brand et category sans aller-retour serveur.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>