SPB Git forge

spb/auto-ka

Public
61commits 1branches 0releases
14.4 MBsize
maindefault branch
12 days agolast push
Python 61.6% TypeScript 20.9% CSS 11.4% JavaScript 5.1% HTML 1.1%

docs: README v2 — galerie multi-pages, style du site, documentation, contact

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

1 changed file +83 −15

modified README.md +83 −15
@@ -1,8 +1,16 @@
1 −# Auto·Ka
1 +<p align="center">
2 + <a href="https://www.auto-ka.com"><img src="https://www.auto-ka.com/og.png" width="760" alt="Auto·Ka — Les voitures usagées du Québec"></a>
3 +</p>
4 +
5 +<h1 align="center">Auto·Ka</h1>
2 6
3 −**Toutes les voitures, motos et scooters usagés à vendre au Québec — agrégés à la source, un seul endroit.**
7 +<p align="center"><b>Les voitures usagées du Québec</b></p>
4 8
5 −[![Site](https://img.shields.io/website?url=https%3A%2F%2Fwww.auto-ka.com&style=flat-square&label=www.auto-ka.com)](https://www.auto-ka.com)
9 +<div align="center">
10 +
11 +[![Site](https://img.shields.io/website?url=https%3A%2F%2Fwww.auto-ka.com&style=flat-square&label=www.auto-ka.com&up_color=ff5a2a)](https://www.auto-ka.com)
12 +[![Documentation](https://img.shields.io/badge/📖_documentation-%2Fdoc-ff5a2a?style=flat-square)](https://www.auto-ka.com/doc/)
13 +[![PDF](https://img.shields.io/badge/guide-PDF-ff5a2a?style=flat-square)](https://www.auto-ka.com/doc/auto-ka-documentation.pdf)
6 14 ![Nœud](https://img.shields.io/badge/n%C5%93ud-M4M64b-1f6feb?style=flat-square)
7 15 ![Port](https://img.shields.io/badge/port-8095-555?style=flat-square)
8 16 ![PM2](https://img.shields.io/badge/process-PM2-2b037a?style=flat-square)
@@ -12,16 +20,28 @@
12 20 ![SQLite](https://img.shields.io/badge/SQLite-diff%20engine-003b57?style=flat-square&logo=sqlite&logoColor=white)
13 21 ![Groupe KA](https://img.shields.io/badge/Groupe-KA-b7f000?style=flat-square)
14 22
23 +</div>
24 +
15 25 **Auto-Ka** est un agrégateur indépendant de véhicules usagés couvrant la province de Québec. Chercher une auto usagée, c'est normalement ouvrir des dizaines de sites de concessionnaires — chacun avec sa navigation, ses filtres, son format. Auto-Ka retourne le problème : un **connecteur dédié par commerce** visite chaque site **à la source** (aucune plateforme d'annonces revendue), **normalise** chaque véhicule vers un schéma unique et **détecte les changements en continu**.
16 26
17 27 Les sites de concessionnaires n'offrent pas de webhooks ; Auto-Ka en reproduit l'équivalent : synchronisation périodique + hash de contenu → **arrivages**, **baisses de prix** et **ventes** détectés automatiquement. Un véhicule qui disparaît du site source est marqué vendu — et sa page renvoie alors un vrai `410 Gone` aux moteurs de recherche. En date du 2026-08-24, le parc compte **48 456 véhicules** provenant de **138 concessionnaires** (129 sources actives) répartis dans les **18 régions** du Québec, avec **16 969 rappels** de sécurité croisés et **9 889 doublons VIN** masqués.
18 28
19 −## Captures d'écran
20 −
21 −<p align="center">
22 − <img src="docs/screenshots/auto-ka-desktop.png" width="640" alt="Accueil — desktop">
23 − <img src="docs/screenshots/auto-ka-mobile.png" width="200" alt="Accueil — mobile">
24 −</p>
29 +## Visite guidée
30 +
31 +<table>
32 + <tr>
33 + <td align="center"><img src="frontend/public/doc/img/etape1.png" width="420"><br><sub><b>Accueil — le marché de l'occasion en un coup d'œil (tuiles, arrivages, baisses de prix)</b></sub></td>
34 + <td align="center"><img src="frontend/public/doc/img/etape2.png" width="420"><br><sub><b>Recherche filtrée — Toyota à 30 000 $ et moins, facettes dynamiques et tris</b></sub></td>
35 + </tr>
36 + <tr>
37 + <td align="center"><img src="frontend/public/doc/img/etape3.png" width="420"><br><sub><b>Fiche véhicule — Honda Civic : galerie, VIN, équipements, lien vers l'annonce originale</b></sub></td>
38 + <td align="center"><img src="frontend/public/doc/img/etape4.png" width="420"><br><sub><b>Historique de prix — chaque variation détectée par le diff engine, horodatée</b></sub></td>
39 + </tr>
40 + <tr>
41 + <td align="center"><img src="docs/screenshots/auto-ka-desktop.png" width="420"><br><sub><b>Accueil desktop — design « éditorial sharp », accent orange racing</b></sub></td>
42 + <td align="center"><img src="docs/screenshots/auto-ka-mobile.png" width="230"><br><sub><b>Accueil mobile — la même expérience, mobile-first</b></sub></td>
43 + </tr>
44 +</table>
25 45
26 46 ## Fonctionnalités
27 47
@@ -47,13 +67,50 @@ Les sites de concessionnaires n'offrent pas de webhooks ; Auto-Ka en reproduit l
47 67 | Frontend | React 18 · Vite · TypeScript | Design « éditorial sharp », accent orange racing — filtres, fiches, stats (build → `frontend/dist/`) |
48 68 | PDF | reportlab · fpdf2 | Rapports « Le marché de l'occasion » personnalisables |
49 69
50 −Trois processus PM2 assurent la production :
70 +### Processus PM2
51 71
52 72 | Processus | Commande | Rôle |
53 73 |---|---|---|
54 −| `auto-ka-web` | `.venv/bin/python run.py serve 8095` | API + frontend + SSR SEO |
55 −| `auto-ka-sync` | `.venv/bin/python run.py watch 120` | Resynchronisation périodique des sources (cycle 2 h) |
56 −| `auto-ka-ngrok` | `ngrok http --url=www.auto-ka.com 8095` | Tunnel public vers le domaine |
74 +| `auto-ka-web` | `.venv/bin/python run.py serve 8095` | Sert l'API `/api/*`, le frontend buildé et le rendu serveur SEO — le seul processus exposé (via ngrok) |
75 +| `auto-ka-sync` | `.venv/bin/python run.py watch 120` | Watcher de resynchronisation : reparcourt les 129 sources actives en boucle, **cycle complet ≈ 2 h**, alimente le diff engine |
76 +| `auto-ka-ngrok` | `ngrok http --url=www.auto-ka.com 8095` | Tunnel public vers le domaine www.auto-ka.com |
77 +
78 +### API principale
79 +
80 +| Méthode | Endpoint | Rôle |
81 +|---|---|---|
82 +| GET | `/api/vehicles` | Recherche paginée : filtres marque/modèle/année/prix/km/carburant/motricité/carrosserie/région/ville/concessionnaire + tris |
83 +| GET | `/api/vehicles/{uid}` | Fiche complète d'un véhicule (photos, VIN, équipements, historique de prix, similaires) |
84 +| GET | `/api/vehicles/{uid}/recalls` | Rappels de sécurité croisés pour ce véhicule |
85 +| GET | `/api/facets` | Facettes dynamiques (compteurs par marque, région, carrosserie…) pour les filtres |
86 +| GET | `/api/dealers` · `/api/sources` | Registre des concessionnaires / état des sources |
87 +| GET | `/api/stats` · `/api/stats/dashboard` · `/api/stats/detailed` | Statistiques du marché (tuiles, distributions, répartitions) |
88 +| GET | `/api/stats/catalog` · `/api/stats/report` · `/api/stats/rapport.pdf` | Catalogue stats v3 + rapports PDF |
89 +| POST | `/api/stats/report/custom` | Rapport PDF personnalisé (ReportBuilder) |
90 +| POST | `/api/sync` | Déclencher une synchronisation |
91 +| GET | `/ka/login` · `/ka/callback` · `/me` · POST `/logout` | SSO KA ID (hub groupe-ka.com) |
92 +
93 +S'y ajoutent les routes SSR SEO (`/vehicule/{uid}/{slug}`, `/usagees/{marque}[/{modèle}]`, `/region/…`, `/ville/…`, `/carrosserie/…`, `/motos/…`, `/scooters/…`, sitemaps, `robots.txt`) et les pages `/stats`, `/sources`, `/doc`, `/contact`, `/profil`.
94 +
95 +### Connecteurs et sources
96 +
97 +**30 modules** dans `autoka/connectors/` couvrent **138 concessionnaires** (129 sources actives), recensés dans `data/sources.json`. Un module = soit un commerce, soit une **famille de plateforme** dont chaque concessionnaire est une sous-classe (~6 lignes).
98 +
99 +| Type | Modules (exemples) |
100 +|---|---|
101 +| Familles multi-concessionnaires | `d2c_dealers` (D2C Media), `sm360_dealers` (SM360), `convertus_fc` (Convertus), `gatsby_dealers`, `magnetis_dealers`, `vvu_dealers`, `central_dealers`, `moto_dealers` (motos/scooters) |
102 +| Regroupements & bannières | `autousagee` (AMVOQ/AutoUsagée), `hgregoire`, `automobileendirect`, `leprixdugros`, `megacentre`, `clubautozone` |
103 +| Portails & inventaires | `autotrader`, `cargurus`, `kijiji`, `otogo`, `okaze`, `classeauto`, `ototr` |
104 +| Commerces individuels | `desmeules`, `dupontford`, `stefoychrysler`, `montjolichrysler`, `albioccasion`, `occasionbeaucage`, `occasioncharlevoix`, `jlkauto`, `yannicklaberge`, `autodurocher`… |
105 +
106 +Infrastructure commune : `base.py` (classe `BaseConnector`, normalisation, politesse de crawl) et `_resilient.py` (retries/backoff, escalade anti-bot). La documentation générée des connecteurs vit dans `docs/` (`scripts/gen_connector_docs.py`).
107 +
108 +### Diff engine & déduplication VIN
109 +
110 +1. Chaque annonce normalisée reçoit un **hash de contenu** ; l'upsert dans SQLite classe le véhicule **nouveau / modifié / inchangé**.
111 +2. Tout changement de prix est **journalisé** → l'historique de prix affiché sur la fiche.
112 +3. Une annonce absente du site source est marquée **vendue** après un **délai de grâce** (tolère les ratés de crawl), avec **détection de dérive** pour éviter les faux positifs quand une source change de structure ; sa page publique renvoie alors `410 Gone`.
113 +4. La **déduplication par VIN** (`autoka/dedup.py`) détecte le même véhicule annoncé sur plusieurs sites et masque les doublons (9 889 masqués) — le VIN sert aussi au croisement des **rappels** (`autoka/recalls.py`).
57 114
58 115 ## Structure du repo
59 116
@@ -62,11 +119,17 @@ Trois processus PM2 assurent la production :
62 119 | `run.py` | Point d'entrée CLI : `sync` · `watch` · `serve` |
63 120 | `requirements.txt` | Dépendances backend (FastAPI, uvicorn, requests, bs4, reportlab, fpdf2, pillow) |
64 121 | `autoka/` | Backend Python : schéma, normalisation, ingestion, db, web, seo, auth KA ID, favoris, stats, PDF, rappels, dédup + `connectors/` |
65 −| `frontend/` | SPA React 18 + Vite + TypeScript (build servi par FastAPI) |
122 +| `frontend/` | SPA React 18 + Vite + TypeScript (build servi par FastAPI) — inclut la page `/doc` (`frontend/public/doc/`) |
66 123 | `data/` | `autoka.db` (SQLite), `sources.json` (registre des concessionnaires), `villes_gps.json` |
67 124 | `docs/` | Captures d'écran + documentation générée des connecteurs |
68 125 | `scripts/` | Outillage (`gen_connector_docs.py`) |
69 126
127 +## Documentation
128 +
129 +- **Guide d'utilisation en ligne** : [www.auto-ka.com/doc](https://www.auto-ka.com/doc/) — visite guidée pas à pas (accueil, recherche, fiche, historique de prix) avec captures d'écran.
130 +- **Guide PDF téléchargeable** : [auto-ka-documentation.pdf](https://www.auto-ka.com/doc/auto-ka-documentation.pdf).
131 +- Le guide est aussi lié depuis le pied de page du site ; ses captures vivent dans `frontend/public/doc/img/`.
132 +
70 133 ## Développement (remote-first)
71 134
72 135 La **source de vérité est le repo git sur le nœud M4M64b** (`~/auto-ka`) — **il n'existe aucune copie laptop**. Toute modification se fait sur le nœud via SSH ; le remote `origin` = **spbgit** (git perso [https://git.spboucher.ai](https://git.spboucher.ai)), via l'alias SSH `gitsrv` configuré sur le nœud → `gitsrv:srv/git/auto-ka.git` (bare repos hébergés sur M3U96a). Pas GitHub.
@@ -94,7 +157,7 @@ git add <fichiers> && git commit -m "..." && git push origin main
94 157
95 158 - **Nœud** : M4M64b (Mac Studio, cluster MacLustr) — répertoire `~/auto-ka`
96 159 - **Port local** : 8095
97 −- **Processus PM2** : `auto-ka-web` (API + frontend + SSR), `auto-ka-sync` (watcher de synchronisation), `auto-ka-ngrok` (tunnel)
160 +- **Processus PM2** : `auto-ka-web` (API + frontend + SSR), `auto-ka-sync` (watcher de synchronisation, cycle ≈ 2 h), `auto-ka-ngrok` (tunnel)
98 161 - **Exposition publique** : tunnel ngrok → [https://www.auto-ka.com](https://www.auto-ka.com)
99 162
100 163 Philosophie d'exploitation : on ne pousse que le code — le serveur maintient ses données lui-même.
@@ -117,6 +180,11 @@ Philosophie d'exploitation : on ne pousse que le code — le serveur maintient s
117 180 | [trouve-ka.com](https://www.trouve-ka.com) | Petites annonces |
118 181 | [api-ka.com](https://www.api-ka.com) | API de données |
119 182
183 +## Contact
184 +
185 +**Simon-Pierre Boucher** — fondateur, Groupe KA
186 +📧 [contact@spboucher.ai](mailto:contact@spboucher.ai)
187 +
120 188 ---
121 189
122 190 © Groupe KA — Simon-Pierre Boucher · [contact@spboucher.ai](mailto:contact@spboucher.ai)
123 191