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
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 buildDonné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 <dir> 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.
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 <courriel> ADMIN # rôle serveur ; TOTP exigé ensuite sur /adminGarde-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.