SPB Git forge

spb/vrai-prix

Public

Vrai-Prix — l'évaluation du vrai prix des propriétés résidentielles au Québec.

60commits 1branches 0releases
12.3 MBsize
maindefault branch
17 days agolast push
TypeScript 90.2% JavaScript 3.5% Python 3.4% CSS 1.9% HTML 0.6%

docs: refonte du README (pastilles + captures d écran à jour)

Simon-Pierre Boucher committed 1 mo ago (Aug 24, 2026) parent e924bf0

3 changed files +90 −249

modified README.md +90 −249
@@ -1,291 +1,132 @@
1 −<div align="center">
2 −
3 1 # Vrai-Prix
4 2
5 −**La vraie valeur de votre propriété, sans boîte noire.**
6 −
7 −Moteur d'évaluation immobilière **transparent** pour le Québec — **3 747 008 propriétés**,
8 −**745 119 ventes réelles (2021-2026)**, chaque calcul montré en entier.
3 +**La vraie valeur de votre propriété, sans boîte noire — estimation immobilière transparente pour tout le Québec.**
9 4
10 −![Propriétés](https://img.shields.io/badge/propri%C3%A9t%C3%A9s-3%C2%A0747%C2%A0008-ff5148?style=flat-square)
11 −![Ventes](https://img.shields.io/badge/ventes_r%C3%A9elles-745%C2%A0119-ff5148?style=flat-square)
12 −![Municipalités](https://img.shields.io/badge/municipalit%C3%A9s-1%C2%A0097-ff5148?style=flat-square)
13 −![MdAPE](https://img.shields.io/badge/MdAPE-11,0%25-9e2a25?style=flat-square)
14 −![Ratio médian](https://img.shields.io/badge/ratio_m%C3%A9dian-0,995-9e2a25?style=flat-square)
15 −![Appariement](https://img.shields.io/badge/fusion_spatiale-99,88%25-9e2a25?style=flat-square)
16 −![URLs indexables](https://img.shields.io/badge/URLs_indexables-3,76_M-9e2a25?style=flat-square)
17 −![Tests](https://img.shields.io/badge/tests-15%2F15-141814?style=flat-square)
5 +[![Site](https://img.shields.io/website?url=https%3A%2F%2Fwww.vrai-prix.com&style=flat-square&label=www.vrai-prix.com)](https://www.vrai-prix.com)
6 +![Nœud](https://img.shields.io/badge/n%C5%93ud-M3U96a-1f6feb?style=flat-square)
7 +![Port](https://img.shields.io/badge/port-8090-ff5148?style=flat-square)
8 +![PM2](https://img.shields.io/badge/process-PM2-2b037a?style=flat-square)
18 9 ![Next.js](https://img.shields.io/badge/Next.js-16-141814?style=flat-square&logo=nextdotjs)
19 10 ![TypeScript](https://img.shields.io/badge/TypeScript-strict-141814?style=flat-square&logo=typescript)
20 −![Tailwind](https://img.shields.io/badge/Tailwind-4-141814?style=flat-square&logo=tailwindcss)
21 11 ![SQLite](https://img.shields.io/badge/SQLite-FTS5-141814?style=flat-square&logo=sqlite)
22 −![iOS](https://img.shields.io/badge/iOS-SwiftUI-141814?style=flat-square&logo=apple)
23 −
24 −**En production : [www.vrai-prix.com](https://www.vrai-prix.com)**
25 −
26 −</div>
27 −
28 −![Aperçu de Vrai-Prix](docs/screenshot.png)
29 −
30 −---
31 −
32 −## Sommaire
12 +![Tailwind](https://img.shields.io/badge/Tailwind-4-141814?style=flat-square&logo=tailwindcss)
13 +![Groupe KA](https://img.shields.io/badge/Groupe-KA-b7f000?style=flat-square)
33 14
34 −- [Ce que fait Vrai-Prix](#ce-que-fait-vrai-prix)
35 −- [Fonctionnalités](#fonctionnalités)
36 −- [Visite guidée](#visite-guidée)
37 −- [Les chiffres qui comptent](#les-chiffres-qui-comptent)
38 −- [Architecture](#architecture)
39 −- [Le moteur d'estimation](#le-moteur-destimation-srclibenginets)
40 −- [Ka — l'agent IA](#ka--lagent-ia)
41 −- [SEO programmatique](#seo-programmatique--376-m-durls-indexables)
42 −- [Structure du projet](#structure-du-projet)
43 −- [Endpoints](#endpoints)
44 −- [Démarrage local](#démarrage-local)
45 −- [Déploiement](#déploiement)
46 −- [Développement remote-first](#développement-remote-first)
47 −- [Design](#design)
48 −- [Auteur](#auteur)
15 +Vrai-Prix estime la valeur marchande de **n'importe quelle propriété du Québec** — unifamiliale, plex, condo, chalet, terrain — et montre *pourquoi* : chaque comparable, chaque ajustement en dollars, la pondération du modèle, la fourchette (P10–P90) et l'indice de confiance (A–D). Le différenciateur est la **transparence totale** : pas de score magique, pas de boîte noire. La méthodologie complète (normes **IAAO**) est publiée intégralement sur le site.
49 16
50 −## Ce que fait Vrai-Prix
17 +Sous le capot : les **6 millésimes (2021-2026)** des rôles d'évaluation foncière géoréférencés du Québec (**MAMH**, données ouvertes) — **3 747 008 propriétés**, soit **22 150 285 observations** — fusionnés spatialement avec **745 119 transactions réelles** (99,88 % d'appariement, distance médiane 0,6 m), alimentant un **modèle hédonique LightGBM** (MdAPE 11,0 %, ratio médian 0,995 en holdout) et un **moteur de comparables ajustés**. Pour qui ? Propriétaires, acheteurs, courtiers et curieux qui veulent une estimation honnête et vérifiable, gratuite, sur les **1 097 municipalités** de la province.
51 18
52 −Vrai-Prix estime la valeur marchande de **n'importe quelle propriété du Québec** (unifamiliale, plex, condo, chalet, terrain) et montre *pourquoi* — **chaque comparable, chaque ajustement en dollars**, la pondération du modèle, la fourchette et l'indice de confiance. Le différenciateur est la **transparence totale** : pas de score magique, **pas de boîte noire**. La méthodologie complète (normes **IAAO**) est publiée intégralement sur le site.
19 +## Captures d'écran
53 20
54 −Sous le capot : les **6 millésimes (2021-2026)** des rôles d'évaluation foncière géoréférencés du Québec (**MAMH**, données ouvertes) — soit **22 150 285 observations** — fusionnés spatialement avec **745 119 transactions réelles** (**99,88 %** d'appariement, distance médiane **0,6 m**), alimentant un **modèle hédonique LightGBM** et un **moteur de comparables ajustés**.
21 +<p align="center">
22 + <img src="docs/screenshots/vrai-prix-desktop.png" width="640" alt="Accueil — desktop">
23 + <img src="docs/screenshots/vrai-prix-mobile.png" width="200" alt="Accueil — mobile">
24 +</p>
55 25
56 26 ## Fonctionnalités
57 27
58 −| Fonctionnalité | Description |
59 −|---|---|
60 −| 🔎 **Estimation par adresse** | Recherche plein-texte (**FTS5**) parmi **3 747 008 unités d'évaluation**, tolérante aux fautes |
61 −| 🧮 **Plan B sans adresse** | **Estimation manuelle** (municipalité + caractéristiques) quand la propriété n'est pas au registre |
62 −| 💰 **Estimation hybride** | **65 % modèle hédonique + 35 % comparables ajustés** |
63 −| 📊 **Fourchette + confiance** | **P10–P90** par régression quantile, indice **A–D** obligatoire |
64 −| 🏠 Portrait de la propriété | Façade SVG dessinée par les données du registre, terrain à l'échelle, composition de la valeur |
65 −| 🗺️ **Vrai-Prix Maps** | Recherche par **carte 3D** (Mapbox GL via le framework partagé **Ka Maps**) — grappes de valeurs estimées pilotées par le viewport |
66 −| 📐 Plan des comparables | Carte « plan d'arpenteur » maison (SVG pur, zéro tuile) — azimut et distance réels |
67 −| 📈 Historique 2021→2026 | **Six millésimes** d'estimations par propriété, badges YoY |
68 −| 🤖 **Ka · agent IA** | Agent conversationnel (**Claude**) branché sur **12 outils serveur** : évaluation, comparables, stats, dossier d'expert |
69 −| 🏢 Parc immobilier | Évaluation multi-adresses agrégée (jusqu'à **40 propriétés**) + rapport consolidé |
70 −| 📄 Rapports PDF | Standard (3 p.), professionnel bancaire (6 p.), parc (n+1 p.), statistique provincial — **100 % vectoriels** |
71 −| 📉 **Statistiques** | Valeur totale de la province (**2,01 billions $**), palmarès des **200** municipalités |
72 −| 🏙️ Pages municipalités | **1 097** pages programmatiques (médiane, croissance, médianes par type) + **~5 900** pages municipalité × type |
73 −| 🔑 KA ID | Connexion unique du **Groupe KA** (SSO signé via le hub groupe-ka.com, session sans base d'utilisateurs) |
74 −| 🌐 Bilingue | **FR** (défaut) / **EN**, bascule instantanée côté client |
75 −| 📱 App iOS | Compagnon natif **SwiftUI** (onglet carte MapKit) — dépôt séparé |
76 −| ⚖️ **Méthodologie transparente** | Loi 25, sélecteur de témoins, méthodologie publique intégrale (7 sections, normes **IAAO**) |
77 −
78 −## Visite guidée
79 −
80 −| | |
81 −|---|---|
82 −| **Fiche d'estimation** — valeur, fourchette honnête, écart vs rôle, indice de confiance | **Portrait de la propriété** — bâtiment, terrain à l'échelle et valeurs dessinés par les données |
83 −| <img src="docs/screenshots/fiche-estimation.png" alt="Fiche d'estimation" width="460"> | <img src="docs/screenshots/fiche-portrait.png" alt="Portrait de la propriété" width="460"> |
84 −| **Vrai-Prix Maps** — votre quartier, estimé (grappes de valeurs 2026) | **Ka · agent IA** — évaluation en conversant, calcul montré |
85 −| <img src="docs/screenshots/carte.png" alt="Recherche par carte" width="460"> | <img src="docs/screenshots/ka-agent.png" alt="Agent IA Ka" width="460"> |
86 −| **Statistiques provinciales** — 2,01 billions $, palmarès des municipalités | **Pages municipalités** — 1 097 pages programmatiques indexables |
87 −| <img src="docs/screenshots/stats.png" alt="Statistiques provinciales" width="460"> | <img src="docs/screenshots/municipalite.png" alt="Page municipalité Gatineau" width="460"> |
88 −| **Méthodologie publique** — 7 sections, normes IAAO, rien de caché | **Mobile** — même expérience, menu plein écran pur CSS |
89 −| <img src="docs/screenshots/methodologie.png" alt="Méthodologie" width="460"> | <img src="docs/screenshots/accueil-mobile.png" alt="Accueil mobile" width="230"> <img src="docs/screenshots/fiche-mobile.png" alt="Fiche mobile" width="230"> |
90 −
91 −## Les chiffres qui comptent
92 −
93 −Validation sur **102 943 ventes jamais vues** du modèle (holdout aléatoire) et **test temporel strict** (entraîné sans 2026, testé sur **68 364 ventes de 2026**), selon la **norme IAAO sur études de ratios** :
94 −
95 −| Métrique | Holdout | Test temporel 2026 | Cible IAAO |
96 −|---|---|---|---|
97 −| Erreur médiane (MdAPE) | **11,0 %** | 14,0 % | — |
98 −| À ±20 % du prix réel | **72,1 %** | 66,7 % | — |
99 −| Ratio médian | **0,995** | 0,961 | 0,90–1,10 ✅ |
100 −| COD | 22,7 (condos : **11,9** ✅) | 23,7 | ≤ 15–20 |
101 −| PRD | 1,092 | 1,075 | 0,98–1,03 |
102 −| R² (log) | **0,789** | 0,743 | — |
28 +- **Estimation par adresse** — recherche plein-texte (SQLite FTS5) parmi 3 747 008 unités d'évaluation, tolérante aux fautes ; **plan B sans adresse** : estimation manuelle par municipalité + caractéristiques.
29 +- **Estimation hybride** — 65 % modèle hédonique LightGBM + 35 % comparables ajustés (marché, superficie, âge), fourchette P10–P90 par régression quantile, indice de confiance A–D obligatoire.
30 +- **Portrait de la propriété** — façade SVG dessinée par les données du registre, terrain à l'échelle, composition de la valeur ; historique 2021→2026 (six millésimes, badges YoY).
31 +- **Vrai-Prix Maps** — recherche par carte 3D (Mapbox GL via le framework partagé `@groupe-ka/ka-maps`), grappes de valeurs estimées pilotées par le viewport ; plan des comparables « arpenteur » en SVG pur.
32 +- **Ka · agent IA** — agent conversationnel (Claude, SDK Anthropic, streaming SSE) branché sur **12 outils serveur** : évaluation, comparables, stats, dossier d'expert, parc immobilier.
33 +- **Rapports PDF 100 % vectoriels** (pdfkit) — standard (3 p.), professionnel bancaire (6 p.), parc consolidé, statistique provincial.
34 +- **Parc immobilier** — évaluation multi-adresses agrégée (jusqu'à 40 propriétés).
35 +- **Statistiques provinciales** — valeur totale du parc (2,01 billions $), palmarès des 200 municipalités, tableau de bord `/stats` + rapports PDF v3.
36 +- **SEO programmatique — 3,76 M d'URLs indexables** : 1 097 pages municipalités + ~5 900 pages municipalité × type + 3,75 M fiches d'estimation SSR avec métadonnées uniques, JSON-LD, sitemaps générés à la volée.
37 +- **KA ID** — connexion unique du Groupe KA (SSO signé via le hub groupe-ka.com, sans base d'utilisateurs) + favoris « Mon univers Ka ».
38 +- **Bilingue FR/EN**, méthodologie publique (7 sections, IAAO), conformité Loi 25, app compagnon iOS SwiftUI (dépôt séparé).
103 39
104 40 ## Architecture
105 41
106 42 ```
107 −┌─ Données ouvertes MAMH ──────────────────────────────────────────┐
108 −│ Rôles d'évaluation foncière géoréférencés 2021-2026 │
109 −│ 6 millésimes × ~3,7 M unités = 22 150 285 observations │
110 −└──────────────┬───────────────────────────────────────────────────┘
111 − │ fusion spatiale XY (EPSG:32198)
112 − │ kNN k=25 ≤200 m + jointure par valeur ≤500 m
113 − │ → 99,88 % appariées, distance médiane 0,6 m
114 −┌──────────────▼───────────────┐ ┌──────────────────────────────┐
115 −│ 745 119 transactions │ │ Modèle hédonique LightGBM │
116 −│ enrichies du rôle ├──▶│ log(prix), 18 variables │
117 −└──────────────────────────────┘ │ + quantiles P10/P90 │
118 − │ → 22 M d'estimations │
119 − └──────────────┬───────────────┘
120 −┌─ Application Next.js 16 ─────────────────────────▼───────────────┐
121 −│ SQLite (units + FTS5 + transactions + indice de marché) │
122 −│ Moteur comparables (ajust. marché/superficie/âge, médiane │
123 −│ pondérée) · Ka Maps (Mapbox GL) · agent Ka (Claude + 12 outils) │
124 −│ RadarMap SVG · MetricViz · rapports pdfkit · SSO KA ID │
125 −│ SEO programmatique (1 097 municipalités · sitemaps 3,76 M URLs) │
126 −└──────────────────────────────────────────────────────────────────┘
43 +Rôles d'évaluation MAMH 2021-2026 (6 millésimes × ~3,7 M unités)
44 + │ fusion spatiale XY (EPSG:32198) — kNN k=25 ≤200 m
45 + ▼
46 +745 119 transactions enrichies ──▶ modèle hédonique LightGBM (log-prix,
47 + 18 variables + quantiles P10/P90)
48 + ▼
49 +Application Next.js 16 (App Router) — SQLite better-sqlite3 (units + FTS5
50 ++ transactions + indice de marché) · moteur de comparables (src/lib/engine.ts)
51 +· Ka Maps (Mapbox GL) · agent Ka (Claude + 12 outils) · rapports pdfkit
52 +· SSO KA ID · SEO programmatique
127 53 ```
128 54
129 −### Stack
130 −
131 −- **Frontend / API** : **Next.js 16** (App Router), **TypeScript strict**, **Tailwind CSS 4**
132 −- **Base** : **SQLite** (better-sqlite3) — **3,75 M unités**, **FTS5**, index spatiaux *(non incluse dans ce dépôt)*
133 −- **Cartes** : **`@groupe-ka/ka-maps`** (framework carto partagé du Groupe KA, moteur **Mapbox GL**, style Standard 3D)
134 −- **Agent IA** : **SDK Anthropic** (Claude Haiku 4.5, streaming SSE, boucle agentique manuelle, prompt caching)
135 −- **Rapports** : **pdfkit**, 100 % vectoriels, polices embarquées (Space Grotesk / Inter / JetBrains Mono)
136 −- **Modèle** (pipeline externe) : **LightGBM**, scikit-learn, pandas, pyogrio/GDAL
137 −- **Tests** : **Vitest** (moteur d'estimation) + **Playwright** (mobile, captures d'écran)
138 −- **Prod** : **PM2** + **ngrok** sur le nœud **M3U96a** du cluster MacLustr
139 −
140 −## Le moteur d'estimation (`src/lib/engine.ts`)
141 −
142 −1. **Comparables** : ventes candidates dans un rayon adaptatif (**2,2 → 28 km**), filtrées par type et superficie (±20 → ±40 %) ;
143 −2. **Ajustements affichés en dollars** : conditions de marché (indice mensuel $/m² lissé 3 mois), superficie (50 % du $/m² du comparable, plafonné ±25 %), âge (0,5 %/an, plafonné ±10 %) ;
144 −3. **Pondération gaussienne** : distance (σ 1 500 m), récence (σ 24 mois), similarité de superficie (σ 25 %) ;
145 −4. **Fusion** : **65 % modèle hédonique** pré-calculé + **35 % médiane pondérée des comparables** ;
146 −5. **Confiance** : nombre de comparables, dispersion, largeur de fourchette → **A/B/C/D**.
147 −
148 −Chaque fiche montre le calcul **en entier** : les comparables retenus, chaque ajustement, les poids, la réconciliation. Le rapport PDF « professionnel » reprend la grille d'ajustement au format des évaluateurs (avec les encadrés « ceci n'est pas un rapport OEAQ »).
149 −
150 −## Ka — l'agent IA
151 −
152 −Page [`/ka`](https://www.vrai-prix.com/ka) : un agent conversationnel branché **en direct** sur le registre et le moteur. Boucle agentique manuelle (**12 tours max**) avec **12 outils serveur** : `chercher_propriete` (FTS avec relaxation progressive), `evaluer_propriete`, `dossier_complet` (évaluation + marché + tendance + comparables + synthèse en un appel), `comparables_detailles`, `indice_marche`, `stats_municipalite`, `stats_provinciales`, `evaluer_parc`, `comparer_proprietes`, `estimation_manuelle`, `chercher_proprietes_secteur`, `liens_rapports` (réfs persistantes anti-hallucination pour les PDF). **Streaming SSE**, tableaux HTML dans le fil, clarification quand l'adresse est ambiguë.
153 −
154 −## SEO programmatique — 3,76 M d'URLs indexables
155 −
156 −Tout le contenu est servi **en HTML complet dès la première requête** (SSR), avec un maillage interne crawlable :
157 −
158 −- **`/municipalites`** → index A-Z des **1 097 municipalités** ;
159 −- **`/municipalite/[slug]`** (**1 097 pages**) → médiane 2026, valeur totale, croissance 2021→2026, médianes par type, 24 fiches liées, municipalités voisines ;
160 −- **`/municipalite/[slug]/[type]`** (**~5 900 pages**) → `maison`, `plex`, `chalet`, `condo`, `terrain`, `maison-mobile`, `autre` ;
161 −- **`/estimation/[id]`** (**3,75 M fiches**) → title et meta description **uniques par fiche** (adresse + estimation), canonical, JSON-LD `SingleFamilyResidence`/`Residence`/`Place` + `BreadcrumbList` ;
162 −- **Sitemaps** : `/sitemap-index.xml` → `/sitemap.xml` (7 043 pages) + `/estimation/sitemap/0-83.xml` (45 000 fiches chacun, générés à la volée depuis SQLite par plages de rowid) ;
163 −- JSON-LD `Organization` + `WebSite` global, `robots.txt` propre, `noindex` sur les pages privées/paramétriques.
164 −
165 −Les agrégats par municipalité (`src/lib/municipalites.ts`) sont calculés en SQL et mis en cache mémoire par processus — première visite ~1 s (Montréal), ensuite ~30 ms.
55 +- **Frontend / API** : Next.js 16, TypeScript strict, Tailwind CSS 4 — tout est servi par une seule app (pages SSR + routes `/api/*` : `search`, `estimate`, `nearby`, `ka`, `portfolio`, `report*`, `stats`, `auth`).
56 +- **Base de données** : SQLite (`data/vraiprix.db`, ~1,5 Go, non versionnée) — 3,75 M unités, FTS5, index spatiaux, mode WAL.
57 +- **Modèle** : pipeline externe LightGBM / scikit-learn (réentraînement : `scripts/hedonic-retrain.py`), estimations pré-calculées injectées dans la base.
58 +- **Tests** : Vitest (moteur d'estimation) + Playwright (captures : `scripts/screenshots.mjs`).
59 +- **Processus PM2** :
60 + - **`vrai-prix`** — l'app Next.js (`next start -H 0.0.0.0 -p 8090`) ;
61 + - **`vrai-prix-ngrok`** — tunnel ngrok vers www.vrai-prix.com.
166 62
167 −## Structure du projet
63 +## Structure du repo
168 64
169 −```
170 −src/
171 −├─ app/
172 −│ ├─ page.tsx / HomeClient.tsx # accueil (recherche + estimation manuelle)
173 −│ ├─ estimation/[id]/ # fiche (SSR + generateMetadata + JSON-LD)
174 −│ ├─ estimation/manuelle/ # estimation sans adresse (noindex)
175 −│ ├─ municipalites/ # index A-Z (programmatique)
176 −│ ├─ municipalite/[slug]/[type]/ # 1 097 + ~5 900 pages programmatiques
177 −│ ├─ carte/ # Vrai-Prix Maps (Ka Maps / Mapbox GL)
178 −│ ├─ ka/ # agent IA (streaming SSE)
179 −│ ├─ parc/ # parc immobilier multi-adresses
180 −│ ├─ stats/ # statistiques provinciales
181 −│ ├─ compte/ # carte de membre Groupe KA (SSO)
182 −│ ├─ methodologie|conditions|confidentialite/
183 −│ ├─ sitemap.ts · estimation/sitemap.ts · sitemap-index.xml/ · robots.ts
184 −│ └─ api/ # endpoints (voir tableau)
185 −├─ components/ # SearchBox, ResultView, MetricViz, RadarMap,
186 −│ # KaCarte, KaChat, StatsView, LangContext…
187 −├─ lib/
188 −│ ├─ engine.ts # moteur comparables (testé Vitest)
189 −│ ├─ estimator.ts # service DB ↔ moteur
190 −│ ├─ db.ts # SQLite (better-sqlite3, WAL)
191 −│ ├─ municipalites.ts # agrégats programmatiques (cache mémoire)
192 −│ ├─ seo.ts # slugs, libellés, constantes SEO
193 −│ ├─ ka/ # agent IA (outils serveur, prompt)
194 −│ ├─ ka-auth.ts · hub-profile.ts # SSO KA ID (JWT HS256, node:crypto pur)
195 −│ └─ report*.ts # 4 générateurs PDF (pdfkit)
196 −└─ data/stats.json # agrégats provinciaux précalculés
197 −```
65 +| Répertoire | Rôle |
66 +|---|---|
67 +| `src/app/` | pages App Router (accueil, `estimation/[id]`, `municipalite/[slug]/[type]`, `carte`, `ka`, `parc`, `stats`, `favoris`, sitemaps/robots) + routes `/api/*` |
68 +| `src/components/` | SearchBox, ResultView, MetricViz, RadarMap, KaCarte, KaChat, StatsView… |
69 +| `src/lib/` | moteur de comparables (`engine.ts`), accès DB, agrégats municipalités, agent Ka, SSO KA ID, générateurs PDF |
70 +| `data/` | base SQLite `vraiprix.db` (non versionnée) |
71 +| `scripts/` | réentraînement hédonique, build des stats, ingestion, captures Playwright |
72 +| `docs/` | pipeline de données, notes Ka Maps, captures d'écran |
73 +| `public/` | assets statiques (favicons, OG, polices) |
74 +| `ios/` | ressources de l'app compagnon iOS (SwiftUI) |
75 +| `assets/` | matériel graphique du projet |
198 76
199 −## Endpoints
77 +## Développement (remote-first)
200 78
201 −| Route | Description |
202 −|---|---|
203 −| `GET /api/search?q=` | Autocomplétion d'adresses (FTS5) |
204 −| `GET /api/estimate?id=` | Estimation complète d'une unité |
205 −| `POST /api/estimate` | Estimation manuelle (municipalité + caractéristiques) |
206 −| `GET /api/nearby?lat&lng&halfLat&halfLng` | Unités dans une boîte englobante (carte) |
207 −| `POST /api/ka` | Agent IA (streaming SSE, boucle d'outils) |
208 −| `POST /api/portfolio` | Agrégation d'un parc (jusqu'à 40 ids) |
209 −| `GET /api/report?id=` | Rapport PDF standard (3 pages) |
210 −| `GET /api/report/pro?id=` | Rapport détaillé format professionnel (6 pages) |
211 −| `GET /api/report/portfolio?ids=` | Rapport de parc consolidé |
212 −| `GET /api/report/stats` | Rapport statistique provincial |
213 −| `GET /api/stats` · `/api/stats/dashboard` | Agrégats provinciaux (métriques live du hub Groupe KA) |
214 −| `GET /api/auth/ka/login` · `/callback` | SSO KA ID (hub groupe-ka.com) |
215 −| `GET /api/auth/me` · `POST /api/auth/logout` | Session (cookie signé, sans table users) |
79 +⚠️ **La source de vérité est le repo git sur le nœud M3U96a** (`~/apps/vrai-prix`) — on n'édite **jamais** les copies laptop. Toute modification se fait sur le nœud via SSH : édition, build, redémarrage, puis commit + push **depuis le nœud**.
216 80
217 −## Démarrage local
81 +- Remote **`origin` = spbgit** (git perso, https://git.spboucher.ai) — sur M3U96a, l'origin est le chemin local **`/Users/simon-pierreboucher/srv/git/vrai-prix.git`** (bare repo) ;
82 +- remote secondaire `github` → github.com/spboucher-ai/vrai-prix.
218 83
219 84 ```bash
220 −npm install
221 −# placer la base de données dans data/vraiprix.db (non versionnée)
222 −npm run dev # développement
223 −npm run test # tests du moteur (Vitest)
224 −npm run build && npm run start
85 +ssh M3U96a
86 +cd ~/apps/vrai-prix
87 +npm install # au besoin
88 +npm run test # Vitest — moteur d'estimation
89 +npm run dev # développement
90 +npm run build # build de production
91 +pm2 restart vrai-prix # après changement
92 +git add <fichiers> && git commit -m "…" && git push origin main
225 93 ```
226 94
227 −### Variables d'environnement
228 −
229 −| Variable | Rôle |
230 −|---|---|
231 −| `VRAIPRIX_DB` | Chemin de la base SQLite (défaut : `data/vraiprix.db`) |
232 −| `NEXT_PUBLIC_SITE_URL` | URL canonique (défaut : `https://www.vrai-prix.com`) |
233 −| `ANTHROPIC_API_KEY` | Agent IA Ka (page `/ka`) |
234 −| `NEXT_PUBLIC_MAPBOX_TOKEN` | Vrai-Prix Maps (page `/carte`) |
235 −| `KA_SSO_SECRET` · `KA_AUTH_SECRET` · `KA_HUB_URL` · `KA_BASE_URL` | SSO KA ID |
236 −
237 −> **Note données** : la base SQLite (1,5 Go) et les pipelines d'entraînement ne sont pas versionnés. Données sources : [rôles d'évaluation foncière du Québec](https://www.donneesquebec.ca/recherche/dataset/roles-d-evaluation-fonciere-du-quebec) (MAMH, licence ouverte). Les renseignements des propriétaires sont caviardés à la source.
238 −
239 −> **Captures d'écran** : `node scripts/screenshots.mjs` les régénère depuis la prod (Playwright).
95 +Variables d'environnement clés : `VRAIPRIX_DB`, `NEXT_PUBLIC_SITE_URL`, `ANTHROPIC_API_KEY` (agent Ka), `NEXT_PUBLIC_MAPBOX_TOKEN` (carte), `KA_SSO_SECRET`/`KA_AUTH_SECRET`/`KA_HUB_URL`/`KA_BASE_URL` (SSO).
240 96
241 97 ## Déploiement
242 98
243 −L'app tourne en production sur le cluster **MacLustr** :
244 −
245 99 | | |
246 100 |---|---|
247 −| **Nœud** | **M3U96a** (Mac Studio M3 Ultra, 32 cœurs / 96 Go) — `~/apps/vrai-prix` |
248 −| **Port** | **8090** (`next start -H 0.0.0.0 -p 8090`) |
249 −| **Domaine** | **[www.vrai-prix.com](https://www.vrai-prix.com)** (tunnel ngrok) |
250 −| **Processus PM2** | **`vrai-prix`** (app Next.js) + **`vrai-prix-ngrok`** (tunnel) |
101 +| **Nœud** | **M3U96a** (Mac Studio M3 Ultra, cluster MacLustr) — `~/apps/vrai-prix` |
102 +| **Port** | **8090** |
103 +| **Processus PM2** | `vrai-prix` (Next.js) + `vrai-prix-ngrok` (tunnel) |
104 +| **Domaine** | [www.vrai-prix.com](https://www.vrai-prix.com) via tunnel ngrok |
251 105
252 106 ```bash
253 107 # sur M3U96a, après un changement :
254 −cd ~/apps/vrai-prix
255 −npm run build
256 −pm2 restart vrai-prix
257 −pm2 logs vrai-prix --lines 30 # vérifier le démarrage
108 +cd ~/apps/vrai-prix && npm run build && pm2 restart vrai-prix
109 +pm2 logs vrai-prix --lines 30
258 110 ```
259 111
260 −## Développement remote-first
261 −
262 −⚠️ **La source de vérité est le repo git sur le nœud M3U96a** (`~/apps/vrai-prix`), **pas** une copie laptop. Toute modification se fait sur le nœud via SSH : édition, `npm run build`, `pm2 restart vrai-prix`, puis commit + push **sur le nœud**.
263 −
264 −- Remote **`origin` = spbgit** (git perso, git.spboucher.ai) — sur **M3U96a** le remote pointe directement sur le chemin local **`/Users/simon-pierreboucher/srv/git/vrai-prix.git`** (bare repo) ;
265 −- Remote secondaire `github` → `github.com/spboucher-ai/vrai-prix` ;
266 −- Référence complète du workflow : `~/Desktop/cluster-skill/KA-REMOTE-DEV.md`.
267 −
268 −```bash
269 −ssh M3U96a
270 −cd ~/apps/vrai-prix
271 −# … modifier, builder, redémarrer …
272 −git add <fichiers> && git commit -m "…" && git push origin main
273 −```
274 −
275 −## Design
276 −
277 −Identité « éditorial sharp » : papier grainé `#f5f3ee`, encre `#141814`, **accent rouge vif `#ff5148`**, bordeaux `#9e2a25` — bordures encre 1,5 px, ombres décalées, display uppercase (Space Grotesk), micro-étiquettes mono (JetBrains Mono), ticker marquee, visualisations SVG data-driven (façade du bâtiment, terrain à l'échelle, jauge de confiance, sparklines) — **zéro image bitmap dans l'app**.
278 −
279 −## Auteur
280 −
281 −**Simon-Pierre Boucher** — [contact@spboucher.ai](mailto:contact@spboucher.ai)
282 −
283 −*Estimations statistiques à titre indicatif — ne remplacent pas une évaluation par un évaluateur agréé (OEAQ). Voir [conditions](https://www.vrai-prix.com/conditions) et [méthodologie complète](https://www.vrai-prix.com/methodologie).*
112 +## Écosystème Groupe KA
113 +
114 +- [groupe-ka.com](https://www.groupe-ka.com) — portail
115 +- [lou-ka.com](https://www.lou-ka.com) — logements à louer
116 +- [immo-ka.com](https://www.immo-ka.com) — propriétés à vendre
117 +- [vrai-prix.com](https://www.vrai-prix.com) — estimation immobilière
118 +- [auto-ka.com](https://www.auto-ka.com) — véhicules
119 +- [fabri-ka.com](https://www.fabri-ka.com) — produits québécois
120 +- [food-ka.com](https://www.food-ka.com) — épicerie / alimentation
121 +- [resto-ka.com](https://www.resto-ka.com) — restaurants
122 +- [sorti-ka.com](https://www.sorti-ka.com) — sorties et événements
123 +- [job-ka.com](https://www.job-ka.com) — emplois
124 +- [crea-ka.com](https://www.crea-ka.com) — créateurs
125 +- [trouve-ka.com](https://www.trouve-ka.com) — petites annonces
126 +- [api-ka.com](https://www.api-ka.com) — API de données
284 127
285 128 ---
286 129
287 −<div align="center">
288 −
289 −Un service **Groupe Ka**
130 +© Groupe KA — Simon-Pierre Boucher · [contact@spboucher.ai](mailto:contact@spboucher.ai)
290 131
291 −</div>
132 +*Ce dépôt vit sur **spbgit** (git perso — https://git.spboucher.ai). Estimations statistiques à titre indicatif — elles ne remplacent pas une évaluation par un évaluateur agréé (OEAQ).*
added docs/screenshots/vrai-prix-desktop.png +0 −0

Binary file not shown.

added docs/screenshots/vrai-prix-mobile.png +0 −0

Binary file not shown.