Retour aux projets
Active

CashMoneyApp

Application web locale de gestion financière personnelle avec import CSV bancaire, catégorisation intelligente, suivi multi-comptes et tableaux de bord interactifs.

décembre 2025
PythonFlaskJavaScriptTailwind CSSChart.jsDockerJSON

Contexte

À l'origine, CashMoneyApp naît d'une frustration très concrète avec l'application de ma banque.

L'outil bancaire manquait de visualisations utiles : pas de graphiques détaillés, pas de vue synthétique sur mes habitudes de dépenses. Et avec le temps, la situation s'est encore dégradée : certaines fonctionnalités ont été retirées ou déplacées au fil des mises à jour, rendant le suivi encore plus fastidieux.

CashMoneyApp est la réponse à ça. Un outil que je contrôle, avec une catégorisation automatique qui apprend, des graphiques pensés pour être lisibles, et une interface qui donne envie de l'ouvrir.

Le projet a ensuite évolué bien au-delà d'un simple tableau de dépenses : aujourd'hui, c'est une application web locale orientée "personal finance dashboard", avec import multi-sources, catégorisation hybride, suivi par compte, budgets, statistiques et mécanismes de sécurité sur les données.

Le problème

A chaque relevé, il fallait reprendre manuellement toutes les transactions non catégorisées pour les ranger dans la bonne catégorie. Une tâche répétitive qui va pourtant à l'encontre même de l'utilité de ce genre d'application, à savoir permettre de voir rapidement où part son argent, sans effort.

Découragé par cette friction, je ne consultais plus le détail de mes dépenses. Le suivi financier était devenu une corvée plutôt qu'une aide.

En plus de ça, en général, les outils bancaires natifs sont souvent limités :

  • Peu de personnalisation des catégories
  • Peu intuitif
  • Logique d'apprentissage très faible quand on corrige manuellement les transactions
  • Très peu de contrôle sur l'historique et la traçabilité

De mon côté, je voulais quelque chose de plus flexible, capable de s'adapter à ma façon réelle de classer mes dépenses.

La solution

J'ai construit CashMoneyApp comme une application web, servie localement, avec une interface simple et moderne.

Le principe est simple :

  1. j'importe un export CSV bancaire
  2. l'application détecte automatiquement son format
  3. les transactions sont parsées
  4. une première catégorisation par règles est appliquée
  5. un moteur intéligent complète ensuite les catégories et les notes à partir de l'historique existant
  6. je peux visualiser et corriger manuellement depuis l'interface, et ces corrections servent ensuite à améliorer les suggestions futures

Résultat : un outil personnel qui reste simple dans son architecture, mais qui complète mes attentes.

Fonctionnalités

  • 📥 Import CSV bancaire avec détection automatique du format
  • 🧹 Détection de doublons à l'import
  • 🏦 Support multi-sources : Crédit Agricole, PayPal, Revolut, Crédit Mutuel, etc.
  • 👤 Gestion multi-comptes pour gerer chaque sources distinctivement
  • 🧠 Catégorisation hybride : règles par mots-clés + apprentissage automatique à partir de l'historique
  • 🛠️ Éditeur de catégories directement dans l'interface
  • 💸 Budgets par catégorie et sous-catégorie avec alertes visuelles de dépassement
  • 📝 Suggestion de notes basée sur les descriptions déjà rencontrées
  • 📊 Dashboard global et mensuel avec graphiques interactifs
  • 📚 Journal d'audit pour tracer chaques modifications
  • 💾 Sauvegarde / restauration intégrées pour sécuriser les données
  • 🐳 Exécution locale via Docker

Architecture du projet

Le projet est organisé autour de quelques briques simples :

  • un backend Flask minimal
  • un frontend full HTML/CSS/JS
  • une persistance locale simple en JSON

Pas de base de données complexe, pas de framework front lourd, mais une architecture suffisamment propre.

Pipeline d'import bancaire

Une partie importante du projet est le pipeline d'import, pensé pour absorber de vrais exports CSV bancaires.

Détection automatique du format

L'application ne dépend pas d'un seul format figé. Un registre de parsers essaie d'identifier automatiquement le bon importeur selon le contenu du fichier :

  • détection par marqueurs du document et entêtes attendues
  • détection par colonnes clés du CSV
  • encodages différents (utf-8, iso-8859-1, cp1252)
  • récupération du solde d'ouverture lorsqu'il est disponible

Cela permet d'avoir un point d'entrée unique côté UI : l'utilisateur dépose simplement un fichier CSV, et l'application se charge du reste.

Déduplication

Chaque transaction reçoit un identifiant déterministe construit à partir des données importées. Lorsqu'un CSV déjà importé est réinjecté, l'application évite de recréer les mêmes lignes.

Cette logique permet d'importer plusieurs exports successifs sans polluer l'historique.

Système de catégorisation : règles + apprentissage

La partie la plus intéressante du projet est probablement le système de catégorisation, qui combine deux approches complémentaires.

1. Catégorisation par règles

Un moteur de règles classe les opérations selon :

  • des catégories principales
  • des sous-catégories
  • des mots-clés associés
  • un type (dépense ou revenu)
  • un budget optionnel
  • une icône utilisée dans l'interface

L'utilisateur peut modifier ces règles directement depuis l'interface, sans toucher au code.

2. Catégorisation intelligente

Quand les règles strictes ne suffisent pas, un second moteur prend le relais.

Ce composant n'est pas un modèle de machine learning externe : c'est un moteur heuristique léger, entraîné à partir de l'historique utilisateur.

Il apprend notamment :

  • quels mots apparaissent souvent avec quelles catégories
  • quelles notes utilisateur reviennent sur certaines descriptions

Ensuite, il peut :

  • proposer une catégorie lorsqu'une transaction reste Indéfini
  • marquer la transaction comme suggestion automatique
  • préremplir une note si une description connue a déjà été annotée dans le passé

Et surtout : quand je corrige une catégorie ou une note à la main, l'application réapprend à partir de cette correction.

Import CSV
  ↓
Parser détecté automatiquement
  ↓
Transaction normalisée
  ↓
Règles de catégorisation
  ↓
Si échec → moteur smart basé sur l'historique
  ↓
Correction manuelle possible dans l'UI
  ↓
La correction nourrit les prochaines prédictions

Cette boucle rend l'outil progressivement plus pertinent sans complexifier l'architecture.

Expérience utilisateur

L'interface a été pensée comme un vrai tableau de bord personnel.

Vue globale

La vue principale affiche des informations comme :

  • dépenses totales
  • revenus totaux
  • bilan global
  • nombre de transactions
  • évolution du solde dans le temps
  • filtre et trie des transactions

Chaque transaction peut être modifiée directement depuis l'interface :

  • changement de catégorie via menu contextuel
  • ajout ou édition de note
  • visualisation des suggestions automatiques

Vue mensuelle

Une vue mensuelle permet de naviguer mois par mois avec :

  • résumé du mois
  • répartition des dépenses en graph camembert
  • Filtrage sur une catégorie en cliquant le graphique
  • tableau détaillé des transactions du mois

Statistiques avancées

Une vue séparée calcule aussi :

  • les dépenses par catégorie
  • les habitudes par jour de semaine
  • les périodes du mois les plus coûteuses
  • les commerçants les plus impactants
  • les catégories les plus fréquentes
  • etc.

Persistance locale et sécurité des données

Un point important du projet est le choix d'une architecture locale et explicite.

Les données de transaction, de comptes et les catégories sont stockées dans des fichiers JSON.

Ce choix a plusieurs avantages dans ce contexte :

  • simplicité de déploiement
  • facilité de backup

Déploiement

Même si le projet est pensé pour un usage local, il a été préparé pour être facilement relancé ailleurs. Le dépôt inclut un Dockerfile, un docker-compose.yml, un script de démarrage et un entrypoint Docker.

L'objectif est de garder une expérience simple : pouvoir lancer l'outil soit en Python local, soit dans un conteneur prêt à l'emploi.

Ce que ce projet m'a apporté

Ce projet a été construit en grande partie avec l'aide de l'IA. Étant un projet purement personnel, l'objectif était avant tout de déployer rapidement un outil fonctionnel qui réponde à mon besoin réel.

L'IA m'a permis d'aller vite sur les parties les plus mécaniques : structure Flask, parsers CSV, logique de déduplication, interface Tailwind. Ce qui m'importait, c'était de passer du temps sur la conception produit, définir ce que l'outil devait vraiment faire, comment les données devaient être organisées, et ce que je voulais voir dans l'interface au quotidien.

Prochaines étapes

  • ajouter de nouveaux parsers bancaires (Revolut, Crédit Mutuel, etc.)
  • améliorer les prédictions du modèle d'apprentissage
  • enrichir les vues de comparaison mensuelle et annuelle