docs: README v2 — galerie multi-pages, style du site, documentation, contact
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 | −[](https://www.auto-ka.com) | |
| 9 | +<div align="center"> | |
| 10 | + | |
| 11 | +[](https://www.auto-ka.com) | |
| 12 | +[](https://www.auto-ka.com/doc/) | |
| 13 | +[](https://www.auto-ka.com/doc/auto-ka-documentation.pdf) | |
| 6 | 14 |  |
| 7 | 15 |  |
| 8 | 16 |  |
@@ -12,16 +20,28 @@ | ||
| 12 | 20 |  |
| 13 | 21 |  |
| 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 | |