SPB Git forge

spb/toveli

Public
14commits 1branches 0releases
1.1 MBsize
maindefault branch
1 h agolast push
TypeScript 50.6% JavaScript 46.1% SQL 2.1% Shell 0.6% CSS 0.5%
3.3 KB

# 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 <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.

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 <courriel> 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.