Changelog
Toutes les modifications notables de ClearProp sont documentees ici.
Format base sur Keep a Changelog.
[Unreleased]
Fixed
- Faux positifs de changelog
ccar_changessurmtowKg(#123) — postgres pad les valeursnumeric(12,3)à 3 décimales sur SELECT tandis que le CSV de Transport Canada utilise des formats mixtes (0, 1 ou 2 décimales, jamais 3). La comparaison string dansdiffFieldsproduisait un faux positif sur ~97 % des diffsmtowKg. Fix : comparaison par valeur numérique pour les champs déclarés numériques, fallback string sinon. Cleanup one-shot des phantoms existants en prod.
[1.11.0] - 2026-04-09
Added
- Système de signature électronique réutilisable (#107)
- 4 tables DB :
external_signers,signatures,signature_events,signature_requests - Architecture polymorphique (
signableType+signableId) pour signer n'importe quelle entité - 3 niveaux de vérification : externe (email + licence), authentifié, cryptographique (JWS)
- Service signature avec TDD (21 tests) : hash SHA-256, création, requête, révocation
- Support futur pour signataires externes (instructeurs sans compte) avec licence obligatoire
- 4 tables DB :
- Composants UI de signature
SignaturePad— capture canvas avecsignature_pad, export SVG, retina-readySignatureBadge— affichage compact avec niveau de vérification, date et hash au survolSignatureBlock— bloc signature pour impression/PDF du carnet officiel
- Signature des pages du carnet de vol (#104)
- Bouton "Signer cette page" dans le bloc certification du carnet officiel
- Dialog de confirmation avant signature avec nombre de vols et avertissement
- Avertissement spécifique si la dernière page est incomplète (< 13 vols)
- Hash SHA-256 du contenu complet des entrées pour intégrité
- Affichage du badge de signature avec date sur les pages signées
- Signature visible à l'impression dans le bloc certification
- Verrouillage souple des entrées signées (#106, #112, #113)
- Cadenas vert + date de signature sur chaque vol signé dans la liste compacte
- Modification possible avec avertissement : "La signature sera invalidée"
- Dialog de confirmation "Je comprends, modifier" avant déverrouillage
- Vérification d'intégrité automatique (#113)
- Hash re-vérifié à chaque chargement du carnet
- Signature révoquée automatiquement si le contenu a changé (ajout, modification, suppression de vol)
- Badge amber "Signature invalidée — contenu modifié" avec bouton "Re-signer"
- Piste d'audit : événement "revoked" avec raison "contenu modifié"
- Numéro de licence requis pour signer (#109, #110)
- Dialog inline avec double saisie du numéro de licence
- Sauvegarde dans le profil, puis enchaîne directement sur la signature
- Numéro de licence verrouillé dans le profil après saisie
- Documentation du module signature (
/docs/signatures)- Cadre réglementaire (CARs 401.08, AC 571-006, EASA, FAA)
- Guide utilisateur, garanties techniques, niveaux de vérification, conformité
Fixed
- Onboarding bloqué en boucle après inscription (#108) — cache Next.js invalidé après completion
- Colonnes Day/Night du carnet affichaient T/O + Ldg combinés au lieu des atterrissages seuls (#114)
- Accents manquants dans l'interface française (Prénom, Téléphone, Aéroport, Sélectionnez, Élève, etc.)
- IP, user-agent et metadata manquants dans les signatures
- Hash de signature couvrait uniquement les IDs au lieu du contenu complet des entrées
Technical
- Conforme aux exigences Transport Canada AC 571-006 (audit trail, horodatage, identification)
- Design doc :
docs/plans/2026-04-09-signature-system-design.md - Migration
0020_minor_corsair.sql— 4 nouvelles tables, aucune modification destructive
[1.10.0] - 2026-04-07
Added
- Fiche avion pilote
/aircraft/[registration]avec toutes les donnees CCAR (#54, #98)- Identification (constructeur, modele, S/N, annee, categorie, pays)
- Technique (moteur, nb moteurs, MTOW kg/lbs, sieges, certificat de type, ICAO hex)
- Enregistrement (statut, usage, autorite de vol, date certificat, base)
- Proprietaire(s) (nom, ville, type)
- Photo Planespotters + stats pilote personnelles
- Lien vers le registre CCAR de Transport Canada
- Cartes avion avec flip sur
/aircraft— clic sur i pour voir les infos CCAR au dos- Batch query unique pour la perf (1 seul SELECT pour tous les avions)
- Lien "Fiche complete" vers la page detail
- Section CCAR dans l'onglet General de
/fleet/[id](contexte club)
[1.9.0] - 2026-04-07
Added
- Import complet du registre CCAR (Transport Canada) en base PostgreSQL (#90)
- 34 936 aeronefs + 38 607 proprietaires importes depuis le ZIP officiel
- 3 tables :
ccar_aircraft,ccar_owners,ccar_changes(changelog) - Parser complet des 47 colonnes CCAR avec conversion Mode S → hex ICAO
- Script d'import initial (
pnpm db:import-ccar) avec batch insert - Script de sync nightly (
pnpm db:sync-ccar) avec detection de changements par hash SHA-256 - Changelog automatique des modifications (changement de proprietaire, re-immatriculation, etc.)
- 13 index pour les requetes analytiques (province, modele, aeroport, type moteur, etc.)
- Lookup local CCAR pour l'enrichissement des avions canadiens (<1ms au lieu de 5-10s)
- Fallback automatique vers le ZIP si la table locale est vide
- Stage Docker
scriptspour executer les scripts DB en prod (profiltools) - Cron nightly 4h UTC sur le VPS pour la sync CCAR (
~/logs/ccar-sync.log) - Licence ouverte du Gouvernement du Canada — usage commercial autorise avec attribution
Changed
- L'orchestrateur d'enrichissement utilise la table locale pour les C-xxxx au lieu de telecharger le ZIP a chaque lookup
[1.8.0] - 2026-04-05
Added
- Enrichissement automatique des types d'avion via la base Mictronics — 619k avions (#69)
- Module lookup local : CSV.gz en memoire, zero API call, zero latence
- Integration dans l'orchestrateur d'enrichissement (parallele avec CCAR/Planespotters)
- Preview interactive a l'import : diff inline avec toggle accept/reject par type enrichi
- Banniere contextuelle "X types enrichis via Mictronics" dans l'ecran d'import
- Issue #70 creee pour le script de mise a jour periodique du CSV
[1.7.0] - 2026-04-05
Added
- Nouveau formulaire de saisie de vol en sections accordeon — flow carnet papier canadien (#66)
- 9 sections : Date, Aeronef, Equipage, Temps de vol, Instrument, T/O & Ldg, Route, Exercices, Remarques
- Intelligence contextuelle : autocomplete immat/aeroports/instructeurs depuis historique + club
- Pre-remplissage type/categorie/moteur depuis l'immatriculation
- Temps total calcule automatiquement (jour + nuit)
- Seule la date est obligatoire — le pilote complete quand il veut
- Page edition de vol /logbook/[id]/edit avec le meme formulaire
- Query getEntryFormContext pour l'intelligence contextuelle du formulaire
- Vue liste carnet enrichie (#67) : type avion, emoji jour/nuit, badge PIC/DUAL/CO-PIL, T&L, route
Changed
- /logbook/new utilise le nouveau formulaire (ancien quick-entry supprime)
- Clic sur un vol dans la liste ouvre directement l'edition
- T&L affiche le nombre seulement si > 1 (1 c'est implicite)
- Position equipage default PIC si non renseignee
Removed
- Ancien formulaire quick-entry-form.tsx
- Validation aircraftRegistration obligatoire (accepte les entrees partielles)
[1.6.1] - 2026-04-04
Changed
- Dashboard solo refondé : carte "Dernier vol" proéminente + stats compactes en pills + récence complète avec cartes CARs (#58 #59 #60)
- Logbook refondé : accordéon par année/mois, suppression des stats (déplacées sur le dashboard) (#62)
- Retrait du stepper de progression (barres dorées) et de la checklist "Premiers pas" du dashboard solo
Fixed
- Selects du formulaire de vol affichent les labels humains au lieu des codes internes (#63)
- Accents manquants dans le formulaire de saisie (Aéronef, Catégorie, Départ, etc.)
[1.6.0] - 2026-04-03
Added
- Bouton feedback flottant sur toutes les pages app → crée une issue GitHub automatiquement (#55)
- Route API POST /api/feedback avec validation Zod et rate limiting
- Header responsive avec menu hamburger sur mobile
- Variante bouton CTA (terracotta, arrondi) pour les actions principales
Changed
- Design system unifié entre landing et app : Figtree (titres) + Source Sans 3 (corps) partout
- Palette couleurs alignée : primary teal #0A3242, CTA terracotta #B75739, fond warm #F5F5F0
- Header app en teal foncé (aligné sur la nav landing)
- Cartes : bordure subtile + ombre au lieu de ring
- Boutons agrandis (h-8 → h-9, lg h-9 → h-10)
- Polish typographique et espacement sur les 6 écrans du parcours critique : inscription, onboarding, dashboard, logbook, profil
- État vide du logbook amélioré avec messaging clair et CTAs proéminents
Fixed
- Accents français corrigés sur toutes les chaînes utilisateur (Créer, réessayer, Déconnexion, etc.)
- Tests E2E mis à jour pour les textes corrigés
[1.5.1] - 2026-04-03
Fixed
- Normalisation des immatriculations canadiennes a l'import ForeFlight : 3 patterns corriges
- "GAGN" (4 chars sans prefixe) → "C-GAGN"
- "CGAGN" (5 chars sans tiret) → "C-GAGN"
- Trim + uppercase sur tous les points d'entree (UI, script CLI, server action)
- Correction retroactive des donnees existantes en local et prod (50 entrees)
[1.5.0] - 2026-04-02
Added
- Dashboard pilote solo avec stats (heures totales, recence, heures par type, derniers vols)
- Page /aircraft : les avions sur lesquels vous avez vole, avec photos Planespotters
- Vignettes compactes groupees par type d'avion sur /aircraft
- Queries DB : getPilotAircraftStats, getHoursByAircraftType
- Navigation adaptative : solo (Dashboard/Avions/Logbook/Profile) vs club (Dashboard/Flotte/Planning/Logbook/Profile)
Changed
- Onboarding simplifie : profil → bienvenue (plus de selection d'intent, default solo)
- Dashboard solo : stats pilote au lieu de l'empty state "Rejoindre un aeroclub"
- Tests E2E adaptes au nouveau parcours solo-first
- Suites E2E gestionnaire et rejoindre-club marquees skip (flows desactives)
[1.4.0] - 2026-04-01
Added
- Nouvelle landing page immersive orientee pilotes solo (hero plein ecran, 4 features, section contribution)
- Internationalisation (i18n) avec next-intl : francais quebecois (FR-CA), francais international (FR), anglais (EN)
- Selecteur de langue sur la landing page
- Polices landing : Figtree (titres) + Source Sans 3 (corps) — identite visuelle clearprop.shop
- Tokens couleur landing : bleu profond, terracotta, creme
- Composant LogoClearProp (texte Figtree bold)
Changed
- Landing page reecrite : messaging "pilote solo" au lieu de "aeroclub"
- Architecture route groups :
(landing)/et(app)/separent la landing de l'application - Header et ActiveFlightBanner deplacees dans
(app)/layout.tsx(plus dans le root layout) - Routing i18n integre dans proxy.ts (Next.js 16)
[1.3.0] - 2026-03-30
Added
- Onboarding a 3 parcours : pilote solo, membre de club, gestionnaire
- Systeme de galons (epaulettes) comme indicateur de progression
- Codes d'invitation pour rejoindre un aeroclub
- Checklist "Premiers pas" sur le dashboard
- Composants EmptyState, IntentCard, InviteCodeInput, OnboardingStepper, GettingStarted
Changed
- Palette de couleurs : cobalt + ambre/or + neutres chauds (remplace le gris achromatic)
- Typographie : Plus Jakarta Sans + JetBrains Mono (remplace Geist)
- Layout d'onboarding : split panel (panel sombre + formulaire) au lieu de card centree
- Dashboard : sections avec separateurs au lieu de grille de cards
Fixed
- Middleware d'onboarding utilise onboardingCompleted au lieu de la presence d'un club
[1.2.0] - 2026-03-29
Quoi de neuf
- Domaine Flight : enregistrement des vols, cloture avec calcul automatique du temps (3 formats tach : min, dix, cen)
- Equipage multi-membres : table flight_crew avec roles (PIC, instructeur, eleve, copilote, passager) — support du partage de frais
- Carnet de vol avion : 5e onglet dans la fiche aeronef, detection des incoherences tach
- Page "Mes vols" (/logbook) : historique personnel du pilote avec lien dans la navigation
- Saisie mobile cockpit : ecrans depart/arrivee optimises mobile (gros inputs, photo horametre via camera)
- Banniere vol en cours : notification sticky sur toutes les pages quand un vol est open
- Photos horametre : upload depuis le cockpit, stockage MinIO
- Page detail vol : edition, gestion equipage, visualisation photos
- Sentry : monitoring d'erreurs en production, capture automatique sur toutes les routes API
Notes techniques
- 3 nouvelles tables : flights, flight_crew, flight_photos
- Migration 0008 (auto-deploy)
- 141 tests unitaires (14 fichiers)
- 7 routes API flights (CRUD, close, crew, photos)
- Sentry SDK Next.js avec captureException + flush sur toutes les routes
[1.1.0] - 2026-03-29
Quoi de neuf
- Wizard d'ajout d'avion : 3 etapes — immatriculation + lookup CCAR/Planespotters, verification des donnees (champs read-only avec bouton "Corriger"), selection photo en grille
- Enrichissement pre-creation : les donnees CCAR et photos sont recuperees AVANT la creation de l'avion
- Route API lookup : POST /api/aircraft/lookup pour preview sans persistance
- ADs en background : les Airworthiness Directives FAA sont recherchees automatiquement apres creation si les donnees CCAR existent
Notes techniques
- Nouveau composant AircraftWizard remplace NewAircraftForm
- Nouvelle fonction fetchAllPhotos (retourne toutes les photos Planespotters)
- Nouvelle fonction lookupAircraftData (orchestrateur sans DB)
- createAircraft elargi pour accepter les champs enrichis
- Tests E2E mis a jour pour le wizard flow
[1.0.0] - 2026-03-27
Quoi de neuf
- Authentification : connexion par email/mot de passe (NextAuth v5), inscription avec creation de compte
- Onboarding : wizard 3 etapes — profil, creation de club, confirmation
- Dashboard : vue d'accueil avec resume de la flotte et prochaines reservations
- Gestion de flotte : ajout, modification, suppression d'aeronefs avec statut operationnel (disponible, en maintenance, indisponible)
- Calendrier de reservation : vue semaine/jour (FullCalendar), reservation en un clic, detection de conflits, couleurs par avion
- Page d'accueil : landing page aviation-themed avec presentation des fonctionnalites
- Navigation : header adaptatif (connecte/non connecte), liens Dashboard, Flotte, Planning
- Seed de demo : utilisateur demo@clearprop.app, 4 avions, 3 reservations pre-remplies
Notes techniques
- NextAuth v5 avec Credentials provider et adaptateur Drizzle (JWT strategy)
- Composants shadcn/ui (Tailwind v4, style base-nova)
- FullCalendar React avec import dynamique (SSR-safe)
- 41 tests unitaires couvrant clubs, onboarding, aircraft CRUD, bookings avec detection de conflits
- Routes protegees via proxy.ts (Next.js 16)
- Helpers serveur : requireAuth(), requireOnboarding(), getUserClub()
- Schema DB : users, accounts, sessions, verification_tokens, club_members, aircraft, bookings
[0.2.0] - 2026-03-26
Quoi de neuf
- Documentation : pages /docs avec guide de demarrage et documentation par role (pilote, instructeur, gestionnaire)
- Changelog : page /changelog avec historique complet des versions
- Navigation : header global ClearProp avec liens vers Clubs, Documentation, Changelog
- Guide "Creer un club" : documentation pas-a-pas avec les codes OACI courants
Notes techniques
- Contenu MDX versionne dans le code source (apps/web/src/content/docs/)
- Rendu MDX via next-mdx-remote (React Server Components)
- CHANGELOG.md parse et rendu dans l'app via react-markdown
- Tailwind Typography (@tailwindcss/typography) pour la mise en forme prose
- Structure de doc extensible par role avec badges "Bientot disponible"
[0.1.0] - 2026-03-26
Quoi de neuf
- Creation de club : un responsable commercial peut creer un nouveau club avec son nom et son code OACI
- Liste des clubs : visualisation de tous les clubs enregistres sur la plateforme
- Validation : le code OACI doit etre exactement 4 lettres majuscules, le nom doit etre unique
Notes techniques
- Setup monorepo Turborepo (Next.js 16 + Drizzle ORM + PostgreSQL)
- Architecture Modular Monolith avec package @aero/db
- 6 tests unitaires (Vitest) couvrant les regles metier de creation de club
- API REST : POST/GET /api/clubs
- Docker multi-stage build + deploiement OVH avec Traefik