Une app à ajouter à l'écran d'accueil de vos iPhone, sans App Store ni Xcode. Le budget est enregistré en ligne (Supabase) et se met à jour en direct sur les deux téléphones. Elle fonctionne aussi hors ligne : ce que vous saisissez part dès que le réseau revient.
Ce qu'elle fait
- Accueil : suit le filtre par compte (Tous / Joint / prénoms, partagé avec Dépenses et Analyse) ; pour le mois choisi, l'épargne possible, ce qu'il faut mettre de côté sur les livrets et ce qu'il reste à dépenser dans les enveloppes. L'épargne possible retire aussi les dépenses hors enveloppe (lignes du relevé rangées dans aucune enveloppe, ou d'une enveloppe supprimée) : dont n € hors enveloppe ouvre leur liste, pour les ranger d'un toucher ou supprimer ce qui n'est pas une dépense (virement vers un livret ou entre vos comptes).
- Bouton + : saisir une dépense en 3 secondes (montant → enveloppe → Ajouter). La catégorie suit l'enveloppe (ou la note, si ce nom a déjà été rangé : voir Catégories automatiques), et se change d'un toucher. Payé par indique le compte : compte joint ou compte perso de l'un ou l'autre (le dernier choix est repris à la saisie suivante, et se change en modifiant la dépense).
- Paiement d'une charge : une dépense peut être reliée à une charge mensuelle (fiche de la dépense → Charge mensuelle, ou fiche de la charge → Saisir le paiement du mois). Elle en est le paiement réel : ce mois-là, son montant remplace le montant prévu de la charge (rien n'est compté deux fois, dans Accueil comme dans Analyse) et elle n'entre dans aucune enveloppe. La fiche de la charge liste ses paiements de l'année ; dans le rapport d'import PDF, une opération repérée comme une charge se relie d'un toucher (Relier à la charge). Supprimer la charge détache ses paiements, qui redeviennent des dépenses.
- Versement d'un revenu mensuel : de la même façon, un revenu ponctuel (par ex. le salaire importé du relevé) peut être relié à un revenu mensuel (fiche du revenu → Versement d'un revenu mensuel) : ce mois-là, son montant remplace le montant prévu. La fiche du revenu mensuel liste ses versements de l'année ; dans le rapport d'import PDF, un crédit repéré comme un revenu mensuel se relie d'un toucher (Relier au revenu).
- Page « À catégoriser » (raccourci sur Accueil et Dépenses, ou Analyse → À catégoriser) : toutes les dépenses, revenus et charges de l'année encore sans catégorie, du plus récent au plus ancien. Chaque ligne propose la catégorie devinée (en couleur) et les plus utilisées (Autre… pour toutes) : un toucher la range, et les lignes du même commerçant suivent. Ranger n lignes d'après l'historique range d'un coup ce qui peut l'être ; Rangées à l'instant permet de corriger ou d'annuler.
- Page « Pointage » (raccourci sur Accueil, Analyse → Récurrences, ou Trouver la transaction dans la fiche d'une charge ou d'un revenu mensuel) : pour le mois choisi, chaque revenu mensuel, charge mensuelle et dépense annuelle, « À pointer » ou pointé. Pour ce qui reste à pointer, l'app propose les transactions qui y ressemblent (même mois ou mois voisin, montant proche, libellé proche, même commerçant que les mois précédents, même compte) : Relier en fait le versement ou le paiement du mois (son montant réel remplace le prévu), Délier défait le lien. Sans transaction : Saisir le paiement / Ajouter le versement.
- Dépense annuelle payée : une provision peut être pointée « Payée » (fiche de la dépense annuelle → Pointage, bouton Payée des échéances de l'Accueil, page Pointage, ou Marquer payée dans le rapport d'import PDF), avec le mois et le montant réellement payés. Le montant payé est réparti sur les mois de janvier jusqu'au paiement (inclus) ; il sort du livret ce mois-là et la dépense ne compte plus dans la mise de côté des mois suivants (Accueil, Analyse, Livrets). Le pointage vaut pour l'année du budget ; une échéance passée et non pointée est marquée « à pointer ».
- Dépenses : l'état de chaque enveloppe et la liste des saisies du mois, avec le compte de chacune (pastille « Compte joint » ou prénom). Les boutons Tous / Joint / prénoms filtrent les saisies par compte (avec leur total) ; les cartes Dépensé et Reste et le détail Par enveloppe suivent le filtre (toucher une enveloppe ajoute alors une dépense sur ce compte) ; le filtre est partagé avec l'onglet Analyse, qui ne montre alors que les dépenses de ce compte, ses charges, les revenus de sa personne (« Commun » pour le joint) et, pour le joint, les provisions. Les virements mensuels vers le compte joint (calculés comme dans Livrets) y apparaissent en « Virements internes » : en entrée du compte joint, en sortie (budgétée) des comptes perso ; ils n'apparaissent pas avec « Tous », où ils s'annulent. Le budget des enveloppes est financé par le compte joint : vu d'un compte perso, l'épargne possible vaut revenus − virement vers le joint − charges perso − dépenses de ce compte (dépenses des enveloppes de ce compte, face au budget des enveloppes, commun à tous les comptes).
- Recherche : la loupe en haut de Accueil et de Dépenses ouvre une recherche sur toutes les saisies, revenus et charges. Tapez plusieurs mots (ils doivent tous correspondre) : un libellé, une enveloppe, une catégorie, une personne, un montant (
45,45,50,>100,<20,50..120) ou une date (mars,2026,12/03/2026,03/2026,>=01/03/2026,01/03..15/03). Touchez un résultat pour le modifier. Elle porte toujours sur tout le foyer, sans suivre le filtre par compte ; pour chercher dans un compte, tapez « joint » ou le prénom. - Analyse : suit le même filtre par compte que Dépenses (Tous / Joint / prénoms) ; pour le mois (ou toute l'année), la balance entrées / sorties, un anneau des dépenses (ou des revenus) par catégorie, le budget consommé, les récurrences. Touchez une catégorie pour voir ses lignes.
- Budget : revenus, charges mensuelles, dépenses annuelles à provisionner, enveloppes, et Catégories (créer, renommer, choisir icône et couleur, supprimer). Comme Livrets, cet onglet montre toujours tout le foyer : il ne suit pas le filtre par compte.
- Apparence (Réglages, propre à chaque téléphone) : trois styles aérés inspirés d'Apple, Santé (titres de carte en couleur, grands chiffres, par défaut), Réglages (listes groupées sur fond gris) et Épuré (fond blanc sans cartes, séparateurs fins), ou Classique (cartes pastel d'origine). Clair et sombre suivent l'iPhone.
- Livrets : solde projeté de chaque livret mois par mois. Un livret ne passe jamais en négatif : si une dépense annuelle arrive avant d'avoir été épargnée, ce qui manque est mis de côté en plus (rattrapage), réparti de janvier jusqu'au mois du manque, et compté dans « De côté » (Accueil, Analyse), virements de chacun vers le compte joint recalculés pour le mois choisi d'après la réalité (charges à leur montant payé, revenus mensuels à leur montant reçu, mise de côté sans les dépenses annuelles déjà payées, rattrapage compris ; « Année » montre le mois en cours), mois type. Cet onglet montre toujours tout le foyer : il ne suit pas le filtre par compte.
Installation : environ 20 minutes, une seule fois.
- Créez un compte sur https://supabase.com, puis New project (région : West EU (Paris)). Notez le mot de passe de la base (il ne vous sera pas redemandé ici).
- Une fois le projet prêt : SQL Editor → New query → collez tout le contenu de
supabase/schema.sql→ Run. Le message « Success. No rows returned » est normal.
L'app se connecte avec un e-mail et un mot de passe : aucun e-mail n'est envoyé, donc pas de limite d'envoi ni de SMTP à configurer.
- Authentication → Sign In / Providers → Email : laissez Enable Email provider activé et désactivez « Confirm email » → Save. (Si « Confirm email » reste activé, Supabase attend un e-mail de confirmation et la création de compte échoue.)
- Authentication → URL Configuration : Site URL = l'adresse GitHub Pages de l'étape 5 (par ex.
https://VOTRE-PSEUDO.github.io/flouz/).
Un compte a déjà été créé sans mot de passe ? Si vous avez essayé l'ancienne connexion par e-mail, l'adresse existe peut-être déjà dans Authentication → Users. Supprimez-la (menu ⋯ → Delete user), puis créez le compte depuis l'app.
Project Settings → API (ou Data API) : copiez
- la Project URL (
https://xxxx.supabase.co) - la clé publique anon / publishable.
window.BUDGET_CONFIG = {
supabaseUrl: "https://xxxx.supabase.co",
supabaseAnonKey: "eyJ...ou sb_publishable_..."
};Cette clé est faite pour être publique : sans connexion, elle ne donne accès à rien. Les règles de sécurité de schema.sql réservent chaque budget aux membres de son foyer.
Ne mettez jamais la clé service_role / secret dans ce fichier.
- Sur GitHub : New repository (par ex.
budget-familial), public (GitHub Pages est gratuit pour les dépôts publics ; seul le code est visible, pas vos données). - Add file → Upload files : glissez tout le contenu de ce dossier (y compris
.nojekyll,icons/,vendor/,supabase/) → Commit. - Settings → Pages → Source : Deploy from a branch, branche
main, dossier/ (root)→ Save. - Après 1 à 2 minutes, l'adresse s'affiche :
https://VOTRE-PSEUDO.github.io/budget-familial/. Reportez-la dans Site URL (étape 2).
Sur chaque iPhone :
- Ouvrez l'adresse dans Safari → bouton Partager → Sur l'écran d'accueil → Ajouter.
- Ouvrez l'app depuis l'icône (pas depuis Safari : les deux ne partagent pas la connexion).
- Première fois : Se connecter → Première fois ? Créer un compte (e-mail + mot de passe de 8 caractères minimum). Le second téléphone crée aussi son propre compte, avec son e-mail.
Premier téléphone : Créer un foyer (avec ou sans montants d'exemple). Allez ensuite dans Réglages (roue dentée) → Partager le code. Second téléphone : Rejoindre un foyer avec ce code.
- Bloquer les nouvelles inscriptions : Authentication → Sign In / Providers → décochez Allow new users to sign up → Save. Vos deux comptes continuent de fonctionner ; plus personne ne peut créer de compte ni de foyer sur votre projet. Pour ajouter quelqu'un plus tard, recochez la case le temps de sa première connexion.
- Mot de passe : dans Authentication → Sign In / Providers → Email, fixez Minimum password length à 8 ou plus.
Rappel : seule la clé anon / publishable va dans config.js. La clé service_role / secret ne doit jamais apparaître dans l'app ni sur GitHub.
Dans la version web (artifact Claude) : Réglages → Exporter (JSON). Dans l'app : Réglages → Importer… et choisissez le fichier (depuis Fichiers / iCloud Drive). L'import remplace le contenu du budget.
Si votre base Supabase existe déjà, relancez supabase/schema.sql (SQL Editor → New query → coller → Run) : il autorise le nouveau type de ligne « categorie ». Tant que ce n'est pas fait, l'app fonctionne mais affiche « Mettez à jour le SQL » et garde les catégories sur le téléphone sans les envoyer.
Les 17 catégories de départ (12 de dépenses, 5 de revenus) sont créées au premier lancement ; modifiez-les dans Budget → Catégories. Les anciennes saisies reprennent la catégorie de leur enveloppe (devinée d'après son nom, modifiable dans l'enveloppe) ; le reste apparaît dans « À catégoriser ».
Réglages → Importer… accepte aussi un fichier releve-bancaire (le dossier releves/ est ignoré par git : vos relevés restent chez vous, ils ne sont jamais publiés avec le code). Contrairement à la sauvegarde JSON, il ajoute sans rien remplacer :
- un débit devient une dépense (dans l'enveloppe devinée, sinon sous « Relevé bancaire ») et un crédit un revenu ponctuel du mois ;
- chaque opération porte une
ref: réimporter le même fichier n'ajoute aucun doublon ; - les catégories sont celles proposées dans le fichier ; ce qui n'a pas pu être deviné reste dans « À catégoriser » (Analyse), à ranger d'un toucher ;
- seules les opérations de l'année du budget sont importées.
personneetpar(facultatifs, au niveau du fichier) fixent à qui sont attribués les revenus et les dépenses (ex."personne": "Compte joint", "par": "Compte joint"pour le compte joint ; « Commun » et « Compte commun » sont acceptés et désignent le même compte joint) ; sinon, c'est la personne qui importe.
Format : {"format":"releve-bancaire","operations":[{"ref":"…","date":"2026-09-08","libelle":"…","montant":-12.0,"categorie":"c-alim"}]} (montant négatif = débit ; ids de catégories : c-alim, c-auto, r-salaire…).
Réglages → Importer un relevé PDF… (ou le bouton en bas de Dépenses) : choisissez le relevé PDF de la banque.
- L'app lit le tableau dont l'en-tête comporte les colonnes DATE, LIBELLE, VALEUR, DEBIT, CREDIT (sur une ou plusieurs pages). Les libellés sur plusieurs lignes sont recollés ; les lignes de solde et de total sont ignorées.
- Un débit devient une dépense (catégorie et enveloppe devinées d'après le libellé : voir Catégories automatiques), un crédit un revenu ponctuel du mois. Seules les opérations de l'année du budget sont importées.
- Après la lecture, l'app demande sur quel compte ajouter le relevé : compte joint ou compte perso de l'un ou l'autre (le dernier choix est proposé en premier). Les dépenses sont rattachées à ce compte (« par » = Compte joint ou le prénom) et les revenus à la personne (ou au compte joint). Seules les charges mensuelles de ce compte servent à repérer ce qui est déjà saisi. Le compte se change ensuite dans le rapport (toutes les lignes ajoutées suivent) ou ligne par ligne dans la fiche d'une dépense.
- Ce qui est déjà saisi n'est pas ajouté : une dépense du même montant saisie à quelques jours près (ou dans le même mois), une charge mensuelle ou une dépense annuelle du même montant, un revenu du même montant, ou une opération d'un relevé déjà importé. Une opération repérée comme une charge mensuelle peut être ajoutée comme paiement de cette charge (Relier à la charge), et un crédit repéré comme un revenu mensuel comme son versement (Relier au revenu) : elle remplace alors le montant prévu du mois. Une opération repérée comme une dépense annuelle peut la pointer payée (Marquer payée).
- À la fin, une page Relevé importé liste les lignes ajoutées et celles repérées comme déjà saisies (avec la ligne du budget correspondante). On peut y modifier une ligne (toucher), la supprimer (corbeille, puis Rétablir si besoin), ajouter quand même une ligne repérée, ou ajouter une dépense à la main.
Données sensibles : le PDF est lu dans le téléphone (bibliothèque vendor/pdfjs/, sans connexion). Il n'est ni envoyé, ni conservé : ni le fichier, ni le relevé complet (solde, numéro de compte, adresse…) ne sont enregistrés, et le rapport disparaît en touchant Terminé. Seules les lignes ajoutées sont enregistrées dans le budget, comme une saisie normale (date, montant, libellé sans les numéros de carte). Les fichiers *.pdf sont ignorés par git.
L'app apprend de ce que vous avez déjà rangé : aucun réglage, rien n'est envoyé ailleurs.
- D'où elle apprend : les dépenses avec une note, les charges et les revenus dont la catégorie a été choisie ou vérifiée. Une catégorie devinée ne sert d'exemple qu'une fois la ligne ouverte et enregistrée.
- Comment elle devine : d'abord le commerçant (« CB CARREFOUR CITY 03/10 X1234 » et « Carrefour City » donnent « carrefour city » : sans CB, PRLV SEPA, dates ni numéros de carte), s'il a été rangé au même endroit au moins 6 fois sur 10 ; sinon les mots les plus parlants du libellé ; sinon les enseignes connues (Carrefour → Alimentation, EDF → Logement…). Ce que vous avez rangé passe avant les enseignes connues, sauf un mot vu une seule fois (« Pharmacie du centre » reste en Santé même si « Centre aéré » est en Enfants).
- Imports (relevé PDF ou JSON) : chaque ligne reçoit la catégorie devinée ; ce qui reste inconnu va dans « À catégoriser ».
- Enveloppe des dépenses importées : celle où vous avez rangé ce commerçant, sinon la seule enveloppe de la catégorie devinée (Lidl → Alimentation → « Courses »), sinon aucune (« Relevé bancaire »). Une dépense rangée dans une enveloppe compte dans son suivi ; touchez de nouveau l'enveloppe choisie pour l'enlever. Pour les dépenses déjà importées : Dépenses → Ranger n dépenses du relevé dans les enveloppes.
- Saisie et modification : en tapant la note d'une dépense (ou le libellé d'un revenu ou d'une charge), la catégorie se met à jour, tant que vous ne l'avez pas choisie vous-même.
- Corriger une fois suffit : changez la catégorie ou l'enveloppe d'une ligne, et les lignes du même commerçant encore devinées (ou pas encore rangées) suivent ; un message indique combien.
- Ranger le reste : ouvrez la page À catégoriser (raccourci sur Accueil et Dépenses) et touchez Ranger n lignes d'après l'historique, ou une catégorie par ligne.
- Pas de réinstallation : rien n'expire. Quand vous modifiez le code sur GitHub, l'app se met à jour à la prochaine ouverture (pensez à changer
VERSIONdanssw.js). - Pause Supabase : l'offre gratuite met en pause un projet resté 7 jours sans aucune activité. Avec un usage normal, ça n'arrive pas ; sinon, un clic sur Restore dans la console Supabase.
- Modifications en même temps : chaque ligne (une dépense, une charge…) est synchronisée séparément. Deux personnes peuvent saisir en même temps sans rien perdre ; si les deux modifient exactement la même ligne, la dernière modification gagne.
- Hors ligne : les saisies restent sur le téléphone (« Hors ligne · n en attente ») et partent automatiquement au retour du réseau.
- Sauvegarde : Réglages → Exporter, de temps en temps (Réglages affiche la date du dernier export de ce téléphone). Importer une sauvegarde demande confirmation, puis remplace le budget en gardant tous les champs (compte, pointages, lignes de relevé…).
- Nouvelle année : Réglages → Passer à 2027… (proposé aussi sur l'Accueil dès janvier). L'assistant propose d'exporter une sauvegarde, reprend pour chaque livret son solde projeté au 31 décembre (modifiable) comme solde au 1er janvier, puis passe le budget à l'année suivante. Revenus et charges mensuels, enveloppes, dépenses annuelles et catégories sont repris ; dépenses, revenus ponctuels, paiements reliés et pointages restent rattachés à leur année (remettez l'ancienne année dans Réglages pour les revoir).
- Badge de synchro : en haut à droite. Sur iPhone, seule la pastille s'affiche quand tout est envoyé ; sinon un texte court (« Hors ligne · 2 », « Erreur »). Touchez-le pour relancer l'envoi et relire tout le foyer. Cette relecture complète se fait aussi seule une fois par jour : elle rattrape une modification de l'autre téléphone qui aurait échappé au temps réel.
- Mode démo : sans configuration, l'écran d'accueil propose d'essayer l'app avec l'exemple, données gardées sur le téléphone uniquement.
| Fichier | Rôle |
|---|---|
index.html, styles.css, app.js |
L'application |
config.js |
Adresse et clé Supabase (à remplir) |
example.js |
Montants d'exemple proposés à la création du foyer |
manifest.webmanifest, icons/ |
Installation sur l'écran d'accueil |
sw.js |
Fonctionnement hors ligne et mises à jour |
vendor/supabase.js |
Bibliothèque Supabase (v2.117.3) |
releve-pdf.js, vendor/pdfjs/ |
Lecture des relevés PDF (pdf.js v4.10.38, licence Apache 2.0), chargée seulement à l'import |
supabase/schema.sql |
Tables, règles de sécurité, invitations, temps réel |