# Toveli — plateforme immobilière québécoise unifiée (www.toveli.ca) « Trouver. Comprendre. Décider. » Annonces à vendre et à louer, carte, estimation de valeur avec fourchette et confiance, comparables, marché, financement, assistant IA ancré dans les données. ## Stack Next.js 16 (App Router, TypeScript strict, Tailwind v4), better-sqlite3 (base canonique `data/toveli.db`, lecture seule au runtime), MapLibre GL + OpenFreeMap (sans clé), Recharts, Anthropic SDK (assistant, clé serveur), Vitest. ## Lancer en local ```bash pnpm install cp .env.example .env.local # ANTHROPIC_API_KEY pour l'assistant (facultatif) TOVELI_SSH_KEY="" TOVELI_VP_SSH=M3U96a TOVELI_LK_SSH=M4M64a NO_RESTART=1 pnpm sync # ~3 min, construit data/toveli.db (2,4 Go) pnpm dev # http://localhost:3000 pnpm test && pnpm typecheck && pnpm lint && pnpm build ``` ## Données (scripts/sync.ts, chaque nuit à 04:30 sur le nœud) Extraits minces en lecture seule (`sqlite3 ATTACH` sur le nœud source, rsync LAN) → normalisation → rapprochement annonce → propriété (rôle ≤ 40 m > adresse normalisée > cellule de coordonnées, confiance affichée) → valuations, scores de quartier, transactions, rôle MAMH, indices → métriques de marché → FTS → bascule atomique + `pm2 restart toveli`. Schéma : `scripts/schema.sql`. Aucune écriture vers les sources. Voir `docs/source-audit/`. ## Déploiement (MacLustr, remote-first) Manifeste `M1M32:~/dispatch/apps/toveli.json` (nœud épinglé M3U96b, port 8460, route MacLustr Tunnel https://www.toveli.ca). Création : `mld stage toveli && mld deploy toveli && mld adopt toveli`, puis première synchro `ssh M3U96b 'cd ~/apps/toveli && pnpm sync'`. Ensuite, toute modification se fait dans `M3U96b:~/apps/toveli` (dépôt git, origin spbgit `toveli.git`). ## Comptes, publications directes, échanges (extension 2026-10-17) PostgreSQL 17 local (compte `toveli_app`, port non exposé) + Drizzle (`src/db/schema.ts`, migrations `drizzle/`). Connexion sans mot de passe par code courriel (Resend ; transport simulé sans clé), sessions révocables, wizard de publication (location/vente, photos traitées par sharp, attestation, modération), messagerie et visites, favoris et alertes serveur, console admin protégée par TOTP. Détails : `docs/architecture/account-and-listings.md`. ```bash createdb toveli && createuser toveli_app # ou docker compose up postgres DATABASE_URL=postgresql://toveli_app:…@127.0.0.1:5432/toveli pnpm db:migrate pnpm test # unitaires + intégration PostgreSQL (toveli_test) pnpm start & scripts/smoke.sh http://127.0.0.1:8460 toveli # parcours API bout en bout (courriels dans data/outbox) pnpm jobs # alertes, expirations, purge (PM2 cron horaire en prod) pnpm tsx scripts/grant-role.ts ADMIN # rôle serveur ; TOTP exigé ensuite sur /admin ``` ## Garde-fous produit Pas de « bonne affaire » : écart estimation / prix demandé avec confiance ; estimation ≠ évaluation agréée (OEAQ) ; photos hotlinkées avec crédit source ; chaque fiche renvoie à l'annonce d'origine ; favoris/comparateur/recherches en local (aucun compte) ; clés API uniquement côté serveur.