rentoo

Architecture

Pour le développeur qui reprend le projet. Tout ce qui suit vient du code du dépôt au 13/10/2026.

Pile technique

Couche Outil Où le voir
Application Expo SDK 57, React Native 0.86, React 19.2, TypeScript 6 package.json
Navigation Expo Router (un fichier = une page) src/app/
Web React Native Web, export en une page ("output": "single") app.json
État zustand 5, persistance par AsyncStorage src/data/store.ts, src/data/prefs.ts
Serveur Supabase : Postgres avec RLS, Storage, Auth, fonctions Edge (Deno) supabase/
IA API Anthropic, appelée seulement depuis la fonction copilot supabase/functions/copilot
Paiement Stripe (Checkout, portail client, webhook), depuis la fonction billing supabase/functions/billing
E-mails SMTP (Brevo conseillé) ou Resend, module commun supabase/functions/_shared/mail.ts
Notifications téléphone expo-notifications et Expo Push src/lib/push.ts, fonction location
Compilation et mises à jour EAS Build, EAS Update (canaux preview et production), EAS Hosting pour le web eas.json, app.json
Tests vitest (unitaires), Playwright (parcours) tests/, e2e/

Options notables de app.json : runtimeVersion.policy = "appVersion", mises à jour vérifiées au lancement (checkAutomatically: "ON_LOAD"), React Compiler activé (experiments.reactCompiler), identifiant fr.rentoo.app, schéma de liens rentoo.

Variables de l’application (fichier .env, noms seulement) : EXPO_PUBLIC_SUPABASE_URL, EXPO_PUBLIC_SUPABASE_KEY (clé publishable, publique par nature), EXPO_PUBLIC_WEB_URL, et en option EXPO_PUBLIC_SUPPORT_EMAIL, EXPO_PUBLIC_APP_STORE_URL, EXPO_PUBLIC_PLAY_STORE_URL. Sans les deux premières, src/lib/supabase.ts arrête l’application avec un message.

Arborescence commentée

src/
  app/                Écrans (Expo Router). Un dossier par rubrique, avec _layout.tsx, index.tsx, [id].tsx…
    index.tsx         Accueil du bailleur
    biens/ locataires/ finances/ location/ travaux/ assurances/ documents/ calendrier/ fiscalite/
    copilote/         Page de Roo
    plus/             Profil et réglages (abonnement, notifications, données, journal de Roo…)
  components/
    ui/               Briques de base : AppText, Button, Card, ListRow, Segmented, TextField, DatePicker…
    sheet/            Grammaire commune : InkStrip, TodoBlock et blocs de fiche
    public/           Pages sans compte : annonce, candidat, signature, devis, « Mon logement », espace locataire
    tenant/           Application du locataire connecté (TenantApp.tsx)
    roo/              Écran et cartes de Roo
    finances/ fiscalite/ calendar/ home/ charges/ travaux/   Composants propres à une rubrique
    AppShell.tsx      Cadre : barre du bas (téléphone) ou panneau flottant (ordinateur), bulle de Roo, recherche, bouton « + »
    nav.ts            Liste des rubriques
  data/
    store.ts          Store principal : état, chargement depuis Supabase, actions d'écriture
    prefs.ts          Préférences propres à l'appareil
    mappers.ts        Conversions lignes Supabase <-> objets de l'application
    writeQueue.ts     File des écritures en arrière-plan
    types.ts          Types du domaine
    ui.ts             État d'interface (messages éphémères, panneaux ouverts)
    rooChat.ts        Conversation avec Roo (flux, documents joints)
    seed.ts           Données d'exemple (identité fictive)
  hooks/              Calculs reliés au store (usePortfolio, useTodo, usePlan, usePropertyScope…)
  lib/                Logique pure, testée : finances, fiscalité, baux, IRL, zones, dates, alertes, Roo…
  theme/              Couleurs, espacements, typographie, clair et sombre (tokens.ts, useTheme.ts)
supabase/
  migrations/         Scripts SQL numérotés 001 à 047
  functions/          Fonctions Edge : billing, copilot, location, send-receipt, veille, et _shared/
  templates/          Modèles d'e-mails d'authentification (code à 6 chiffres)
tests/                Tests unitaires vitest
e2e/                  Tests de parcours, de fonctions et de sécurité (Playwright, Supabase local)
scripts/              deployer.ps1, zones-data.py, tax-tests.ts
public/               Fichiers copiés tels quels dans la version web (site vitrine, pages légales `confidentialite.html` et `mentions-legales.html`, icônes, manifeste)
assets/               Images, icônes, polices

Les écrans restent minces quand c’est possible : un calcul pur va dans src/lib/ avec son test dans tests/. Exemples : listingFlow.ts, insuranceCoverage.ts, documentsOverview.ts, calendarStrip.ts, taxStrip.ts, tenantList.ts, propertyScope.ts.

Les données

Le store principal (src/data/store.ts)

Les préférences de l’appareil (src/data/prefs.ts)

Les conversions (src/data/mappers.ts)

La file des écritures (src/data/writeQueue.ts)

Le store crée une file unique : export const writes = createWriteQueue().

La sécurité de la base (RLS)

Les fonctions Supabase

Toutes se déploient avec --no-verify-jwt : chacune vérifie elle-même son appelant (session de l’utilisateur, signature Stripe, jeton public ou secret). Aucune n’utilise la clé service_role. Le dossier _shared/ est envoyé avec chaque fonction.

Dossier Rôle Actions principales
billing Abonnement Stripe checkout, portal, sync ; webhook Stripe (checkout.session.completed, customer.subscription.*) qui écrit par la fonction SQL billing_apply
copilot Roo status, lecture (document), diagnostic (avarie), quote_message (demande de devis), week_summary, analyse (patrimoine), question (avec flux stream), letter (courrier)
location Mise en location, espace locataire, e-mails, notifications candidate_mail, send, signature_invite, seal, portal_* (message, déclaration, document, préavis, signalement…), tenant_invite, invite_member, quote_send, quote_reply, quote_award, recap_send, weekly_send, push_dispatch, export, test_mail ; en GET, flux iCal (?ics=)
send-receipt Quittances et courriers quittance ou reçu partiel (par défaut), reminder (relance), letter, mail_batch, status
veille Données de référence irl (indices Insee), zones (fichier « Zonage TLV » de data.gouv.fr) ; appelée par pg_cron avec l’en-tête x-veille-secret
_shared Modules communs mail.ts, sender.ts, landlord.ts, appFigures.ts, bankDetails.ts, rooDocs.ts, rooMemory.ts, rooFeedback.ts, rooTone.ts, rooSources.ts, veille.ts

Les noms des secrets sont listés dans deploiement.md.

Les migrations

Le journal des erreurs (src/lib/errors.ts)

Les dates (src/lib/dates.ts)

Les conventions

Fichiers trop gros, à découper plus tard

Fichier Lignes Piste
src/data/store.ts 2 838 Découper par domaine (biens, loyers, location, documents, Roo), une fois la vérification GitHub en place. La logique pure en a déjà été sortie (chantier T08).
src/components/property/PropertyDetail.tsx 1 550 Fiche du bien (UX5, routes src/app/biens/[id]/). Sortir chaque rubrique dans son propre fichier.

Autres fichiers volumineux : src/components/public/TenantPortalPage.tsx (1 192 lignes), src/data/mappers.ts (1 106), src/app/locataires/[id].tsx (972), src/app/finances/facture.tsx (947). Côté serveur, supabase/functions/location/index.ts (1 309 lignes) et copilot/index.ts (922).