SPB Git forge

spb/toveli

Public
14commits 1branches 0releases
1.1 MBsize
maindefault branch
40 min agolast push
TypeScript 50.6% JavaScript 46.1% SQL 2.1% Shell 0.6% CSS 0.5%
ZIP tar.gz
NameLast commitUpdated
docs docs : architecture comptes/annonces, README ; smoke.sh paramétrable... 53 min ago
drizzle fix: brancher Tailwind v4 sur Turbopack (classes utilitaires... 1 h ago
public carte : worker MapLibre auto-hébergé (tuiles vides en prod),... 43 min ago
scripts docs : architecture comptes/annonces, README ; smoke.sh paramétrable... 53 min ago
src cartes : ne pas répéter la région quand elle égale la ville (Laval,... 40 min ago
tests Identité unique (OTP courriel Resend/mock, sessions), publications... 1 h ago
.gitignore Toveli v0.1 : plateforme immobilière unifiée (annonces, carte,... 1 h ago
AGENTS.md Initial commit from Create Next App 2 h ago
docker-compose.yml Identité unique (OTP courriel Resend/mock, sessions), publications... 1 h ago
Dockerfile Identité unique (OTP courriel Resend/mock, sessions), publications... 1 h ago
drizzle.config.ts fix: brancher Tailwind v4 sur Turbopack (classes utilitaires... 1 h ago
eslint.config.mjs Toveli v0.1 : plateforme immobilière unifiée (annonces, carte,... 1 h ago
next.config.ts fix: brancher Tailwind v4 sur Turbopack (classes utilitaires... 1 h ago
package.json carte : worker MapLibre auto-hébergé (tuiles vides en prod),... 43 min ago
pnpm-lock.yaml Identité unique (OTP courriel Resend/mock, sessions), publications... 1 h ago
pnpm-workspace.yaml pnpm 11 : allowBuilds pour better-sqlite3/esbuild/sharp 1 h ago
README.md docs : architecture comptes/annonces, README ; smoke.sh paramétrable... 53 min ago
tsconfig.json Initial commit from Create Next App 2 h ago
vitest.config.ts Identité unique (OTP courriel Resend/mock, sessions), publications... 1 h ago
README.md source

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