FairCount est une application web de partage de frais équitable. Contrairement aux applications traditionnelles qui divisent les dépenses de manière égalitaire, FairCount permet à chaque personne de contribuer proportionnellement à ses revenus.
- Couples avec des revenus différents
- Foyers et familles
- Groupes d'ami·e·s
- Colocations
- Tout groupe souhaitant un partage plus juste des dépenses communes
"Chacun·e contribue selon ses moyens"
L'équité n'est pas l'égalité. Une personne gagnant 4000€ et une autre gagnant 2000€ ne devraient pas payer la même somme pour des dépenses communes. FairCount calcule automatiquement la contribution de chaque personne en fonction de son coefficient de revenus.
Pour garantir un vocabulaire inclusif et accessible :
| Terme | Définition |
|---|---|
| Personne membre | Une personne faisant partie d'un groupe |
| Groupe | Un ensemble de personnes partageant des frais |
| Dépense | Un achat ou paiement effectué pour le groupe |
| Coefficient | Le ratio déterminant la part de contribution (basé sur les revenus) |
| Solde | La différence entre ce qu'une personne a payé et ce qu'elle devrait |
| Remboursement | Un transfert d'argent entre personnes pour équilibrer les soldes |
| Part équitable | Le montant que chaque personne devrait payer selon son coefficient |
- Connexion par magic link (lien envoyé par email)
- Pas de mot de passe à retenir
- Session persistante
- Création de groupes avec nom et description
- Invitation de personnes par email
- Gestion des personnes membres
- Archivage de groupes
- Ajout de personnes au groupe
- Définition des revenus (transparence totale)
- Coefficients calculés automatiquement
- Personnes invitées ou non-inscrites
- Ajout de dépenses avec montant, description, date
- Qui a payé
- Pour qui (tout le groupe ou personnes spécifiques)
- Vue en temps réel des soldes de chaque personne
- Historique des contributions
- Graphiques de répartition
- Suggestions de remboursements optimisés
- Modèle séparé des dépenses (garantit qu'un remboursement = une seule personne destinataire)
- Pas de confirmation nécessaire (confiance présumée)
- Notifications push dans le navigateur
- Alertes pour nouvelles dépenses
- Rappels de remboursements
| Technologie | Usage |
|---|---|
| React 18+ | Framework UI |
| TypeScript | Typage statique |
| Tailwind CSS | Styling utility-first |
| Ark UI | Composants accessibles |
| Biome | Linting et formatting |
| Technologie | Usage |
|---|---|
| Cloudflare Workers | Runtime serverless |
| Cloudflare Pages | Hébergement frontend |
| Cloudflare D1 | Base de données SQLite |
| Cloudflare R2 | Stockage de fichiers (avatars, exports) |
| Drizzle ORM | Gestion de la base de données |
| better-auth | Authentification magic link |
| Proton Mail SMTP | Envoi d'emails |
| Outil | Usage |
|---|---|
| pnpm | Gestionnaire de paquets |
| Wrangler | CLI Cloudflare |
| Vite | Build tool |
src/
├── features/
│ ├── auth/
│ │ ├── FEATURE.md
│ │ ├── components/
│ │ ├── hooks/
│ │ ├── api/
│ │ └── types.ts
│ ├── groups/
│ │ ├── FEATURE.md
│ │ ├── components/
│ │ ├── hooks/
│ │ ├── api/
│ │ └── types.ts
│ ├── members/
│ │ ├── FEATURE.md
│ │ ├── components/
│ │ ├── hooks/
│ │ ├── api/
│ │ └── types.ts
│ ├── expenses/
│ │ ├── FEATURE.md
│ │ ├── components/
│ │ ├── hooks/
│ │ ├── api/
│ │ └── types.ts
│ ├── balances/
│ │ ├── FEATURE.md
│ │ ├── components/
│ │ ├── hooks/
│ │ ├── api/
│ │ └── types.ts
│ ├── settlements/
│ │ ├── FEATURE.md
│ │ ├── components/
│ │ ├── hooks/
│ │ ├── api/
│ │ └── types.ts
│ └── notifications/
│ ├── FEATURE.md
│ ├── components/
│ ├── hooks/
│ ├── api/
│ └── types.ts
├── shared/
│ ├── components/
│ ├── hooks/
│ ├── utils/
│ └── types/
├── db/
│ ├── schema/
│ └── migrations/
└── workers/
└── api/
users
├── id (uuid)
├── email (unique)
├── name
├── created_at
└── updated_at
groups
├── id (uuid)
├── name
├── description
├── currency (default: EUR)
├── created_by (fk: users)
├── created_at
└── archived_at
group_members
├── id (uuid)
├── group_id (fk: groups)
├── user_id (fk: users, nullable)
├── name (pour personnes non inscrites)
├── email
├── income (visible par tous)
├── coefficient (calculé automatiquement)
├── joined_at
└── left_at
expenses
├── id (uuid)
├── group_id (fk: groups)
├── paid_by (fk: group_members)
├── amount (positif = dépense, négatif = remboursement)
├── description
├── date
├── created_at
├── updated_at
└── deleted_at (soft delete)
expense_participants
├── id (uuid)
├── expense_id (fk: expenses)
├── member_id (fk: group_members)
└── custom_amount (nullable, pour exceptions)
settlements
├── id (uuid)
├── group_id (fk: groups)
├── from_member (fk: group_members)
├── to_member (fk: group_members) -- toujours une seule personne
├── amount (toujours positif)
├── date
└── created_at
Coefficient d'une personne = Revenu de la personne / Somme des revenus du groupe
Part équitable = Montant total × Coefficient
Un groupe de 3 personnes :
- Alex : 3000€/mois → coefficient = 3000/6000 = 0.5 (50%)
- Sam : 2000€/mois → coefficient = 2000/6000 = 0.33 (33%)
- Charlie : 1000€/mois → coefficient = 1000/6000 = 0.17 (17%)
Pour une dépense de 120€ :
- Alex devrait payer : 60€
- Sam devrait payer : 40€
- Charlie devrait payer : 20€
Tous les revenus sont visibles par les membres du groupe. Les coefficients sont calculés automatiquement. Cette transparence est essentielle pour garantir l'équité et la confiance.
L'application est conçue pour une utilisation principalement sur mobile :
- Navigation par onglets en bas d'écran
- Formulaires optimisés pour le tactile
- Mode sombre supporté
- Installation en PWA
| Breakpoint | Largeur | Usage |
|---|---|---|
sm |
640px | Téléphones |
md |
768px | Tablettes |
lg |
1024px | Desktop |
- Les revenus sont chiffrés en base de données
- Option de n'afficher que les coefficients (sans les montants)
- Authentification sans mot de passe (magic link)
- Sessions sécurisées avec expiration
- HTTPS obligatoire
- Conformité RGPD
L'application respecte les standards WCAG 2.1 niveau AA :
- Navigation au clavier complète
- Composants Ark UI accessibles par défaut
- Contrastes suffisants
- Labels explicites sur tous les champs
- Messages d'erreur descriptifs
- Support des lecteurs d'écran
Phase initiale : Français uniquement
Préparation pour :
- Anglais
- Formats de devises locaux
- Formats de dates locaux
- Authentification magic link
- Création et gestion de groupes (horizontalité, pas d'admin)
- Ajout de personnes membres avec revenus (transparence)
- Ajout de dépenses
- Calcul des soldes (recalcul automatique)
- Remboursements (modèle dédié)
- Notifications push
- Export des données
- Dépenses récurrentes
- Budgets par catégorie
- Statistiques et graphiques
- Multi-devises