Duo
Application mobile de budget à deux
Projet personnel en cours de développement : une application mobile où un couple ou un foyer tient son budget ensemble, comme un jeu coopératif. Conception du produit, application Expo et backend Supabase.
- Rôle
- Conception et développement - Projet personnel
- Période
- Septembre 2026 – Aujourd'hui
- React Native
- Expo
- TypeScript
- Reanimated
- Skia
- TanStack Query
- Supabase
- PostgreSQL

Contexte
Duo est un projet personnel : une application mobile pour tenir un budget à deux. Chaque dépense notée fait avancer le foyer, avec une série partagée, des quêtes et une créature qui grandit. La saisie est manuelle et rapide, sans lien bancaire, pour convenir aussi bien au cash et au mobile money qu’aux cartes.
État du projet. L’application est en cours de développement et n’est pas encore publiée sur les stores. Le nom est provisoire.
Mon rôle
Je conçois et développe l’ensemble : le document produit, l’application mobile et le backend.
Ce qui est construit
- Application mobile avec Expo et Expo Router : parcours d’accueil, connexion, création du foyer, saisie rapide, historique, quêtes, statistiques et réglages, en français et en anglais.
- Backend Supabase : 8 migrations SQL, la sécurité au niveau des lignes sur toutes les tables, et 5 fonctions Edge (invitations, notifications, abonnement, suppression de compte).
- Invitation par QR code pour lier deux comptes dans un même foyer.
- Tests : 19 fichiers de tests unitaires côté application et 199 assertions pgTAP côté base, pour les règles d’accès et les règles du jeu.
Pour aller plus loin
J’ai détaillé le parcours d’une saisie, du doigt jusqu’au serveur, dans un article accompagné d’une figure interactive : Le trajet d’un tap dans une app React Native.
Décisions et arbitrages
- Calculer le jeu côté serveur, jamais dans l'app
- Série, expérience et quêtes sont calculées par des fonctions Postgres. L'app envoie une dépense et reçoit une récompense. Cela demande des fonctions SQL à tester, mais un client ne peut pas s'attribuer de points, et la série dépend de ce que fait l'autre membre du foyer, que le téléphone ne connaît pas de façon fiable.
- Stocker l'argent en entiers, avec la devise du foyer
- Les montants sont des entiers en plus petite unité (centimes, ou francs CFA sans décimale). Aucun flottant, ni à l'écran, ni sur le réseau, ni en base. La saisie s'adapte : sans décimales, la touche virgule devient une touche « 000 ».
- Générer l'identifiant de chaque dépense sur l'appareil
- Sur mobile, une requête peut échouer après avoir réussi. Chaque saisie porte un identifiant unique créé avant tout appel réseau : un renvoi ne crée jamais de doublon.
- Animer sur le thread UI
- Les retours tactiles et les animations passent par Reanimated et Skia, sans rendu React par image. Une touche réagit même quand le thread JavaScript est occupé. En contrepartie, ce code s'écrit autrement et doit rester petit.
- Coopératif, jamais compétitif
- Pas de classement entre les membres d'un foyer, pas de message qui désigne qui a trop dépensé. Le jeu récompense la régularité de la saisie, jamais le montant. C'est une règle de produit, et elle est écrite dans les consignes du dépôt au même titre que les règles techniques.