Cockpit budgétaire personnel — Belgique · RGPD · hébergé UE
Ton ancrage financier. Lisse tes charges annuelles sur 12 mois, anticipe chaque facture et sais exactement combien virer vers l'épargne chaque mois.
Fonctionnalités · Démarrage · Architecture · Sécurité · FAQ
Ankora est une application web progressive (PWA) de gestion budgétaire personnelle, conçue pour les particuliers belges qui veulent reprendre le contrôle de leurs finances sans confier leurs données à un agrégateur bancaire.
Contrairement aux applications de type YNAB ou Bankin' qui se connectent à tes comptes via PSD2, Ankora fonctionne en saisie manuelle : tu restes propriétaire de tes données, rien n'est partagé avec une banque, un courtier ou un service de scoring. L'app est hébergée en Union européenne (Supabase région EU-west) et conforme RGPD (art. 15, 17, 20, 25, 32).
Ankora se positionne comme un outil d'éducation budgétaire et d'organisation — il ne délivre pas de conseil en placement, en investissement ou en crédit (contrainte réglementaire FSMA en Belgique).
Pour qui ? Salariés, indépendants, ménages qui veulent lisser les grosses factures (mutuelle annuelle, taxe de circulation, assurances trimestrielles) pour ne plus jamais se faire surprendre.
- Fonctionnalités
- Principes de conception
- Stack technique
- Démarrage rapide
- Structure du projet
- Scripts disponibles
- Qualité & sécurité
- Conformité RGPD
- FAQ
- Feuille de route
- Contribuer
- Licence
| Fonctionnalité | Description |
|---|---|
| Lissage annuel | Toute charge trimestrielle, semestrielle ou annuelle est ventilée en provision mensuelle. Plus jamais de facture surprise. |
| Assistant virements | Calcule automatiquement combien virer vers l'épargne ce mois-ci (provisions − factures dues). |
| Santé des provisions | Compare la cible théorique à ton solde réel et propose un plan de rattrapage lissé sur 3 mois en cas de déficit. |
| Simulateur what-if | Estime l'impact d'une résiliation, d'une renégociation ou d'une augmentation sur ta capacité d'épargne mensuelle. |
| PWA installable | Fonctionne hors-ligne partiellement, installable sur iOS / Android / desktop. |
| Multi-workspace | Gère tes comptes perso + couple + maison séparément, chacun avec ses propres membres et rôles. |
| Export RGPD | Export JSON complet de tes données en un clic (art. 20 RGPD). |
| Suppression 30 j | Droit à l'oubli avec période de grâce de 30 jours et annulation possible (art. 17 RGPD). |
| MFA TOTP | Double authentification via Google Authenticator / 1Password / Authy. |
- Souveraineté des données : hébergement UE, Row Level Security (RLS) stricte, aucun partage entre utilisateurs par défaut.
- Privacy by default (RGPD art. 25) : analytics désactivées tant que l'utilisateur n'a pas consenti, pas de PII dans les logs, purge automatique.
- Sécurité par défaut : CSP avec nonce par requête,
strict-dynamic, HSTS preload, COOP/CORP same-origin, rate-limit multi-couche Upstash. - Accessibilité : mobile-first, WCAG 2.2 AA, navigation clavier complète,
prefers-reduced-motionrespecté. - Pureté du domaine financier :
src/lib/domain/utilise Decimal.js avec arrondi banquier (ROUND_HALF_EVEN, précision 20). Aucunnumbernatif pour les montants. - Validation iso client/server : schémas Zod partagés, parsing avant toute logique, toujours re-validés côté serveur.
- FSMA-aware : aucune formulation suggérant un conseil en placement, nulle part dans l'UI ni dans les contenus.
| Couche | Technologie |
|---|---|
| Framework | Next.js 16 (App Router, Server Components, Server Actions, typed routes) |
| UI | React 19, Tailwind CSS 4 (@theme inline), shadcn/ui |
| Langage | TypeScript strict (strict + noUncheckedIndexedAccess + noImplicitOverride) |
| Backend | Supabase (Postgres 15, RLS, Auth, Storage, Edge Functions — région EU) |
| Validation | Zod v4 (iso client/server) |
| Rate limiting | Upstash Redis + @upstash/ratelimit |
| Calculs financiers | Decimal.js (ROUND_HALF_EVEN, précision 20) |
| Tests | Vitest 4, Playwright, Lighthouse CI |
| Hooks | Husky + lint-staged |
| Hébergement | Vercel + middleware Fluid Compute |
| Observabilité | Vercel Analytics (opt-in RGPD) |
- Node.js 24 LTS — version pinned via
.nvmrc. Si tu utilisesnvmoufnm, lancenvm use(oufnm use) à la racine du projet pour t'aligner automatiquement. - npm — version pinned via le champ
packageManagerdupackage.json(npm@11.x). Si tu as Corepack activé (corepack enable), npm utilisera automatiquement la version pinned. Sinon,npm installfonctionnera quand même mais lepackage-lock.jsonpeut diverger légèrement. - Supabase CLI (pour les migrations locales)
- Un compte Supabase (projet EU)
- Un compte Upstash (pour le rate-limit Redis)
git clone https://github.com/thierryvm/ankora.git
cd ankora
nvm use # aligne sur Node 24 LTS via .nvmrc (optionnel mais recommandé)
corepack enable # active la version npm pinned (optionnel mais recommandé)
npm install
cp .env.example .env.local
# Remplir les variables d'environnement (voir .env.example)
npm run devOuvre http://localhost:3000.
npx supabase link --project-ref <ton-project-ref>
npx supabase db push
npm run supabase:types # regénère src/lib/supabase/types.tsankora/
├── .github/ # workflows CI, issue/PR templates, dependabot
├── .claude/agents/ # 7 agents QA Claude Code (security, RLS, RGPD, UI…)
├── docs/ # ARCHITECTURE, CONVENTIONS, ROADMAP
├── e2e/ # suites Playwright
├── public/ # assets statiques, sw.js, llms.txt, icônes PWA
├── scripts/ # génération d'icônes, helpers dev
├── src/
│ ├── app/ # App Router
│ │ ├── (marketing)/ # landing, pricing, FAQ, légal
│ │ ├── (auth)/ # signup, login, forgot-password, reset-password
│ │ ├── app/ # dashboard privé (middleware-protected)
│ │ └── onboarding/ # wizard 3 étapes
│ ├── components/ # brand, ui (shadcn), features, layout, pwa, seo
│ └── lib/
│ ├── domain/ # logique financière pure (Decimal.js, 0 dépendance DB)
│ ├── schemas/ # Zod iso client/server
│ ├── supabase/ # clients browser/server/admin/middleware
│ ├── security/ # rate-limit, audit-log
│ ├── gdpr/ # consent, export, deletion
│ ├── actions/ # Server Actions (auth, settings, charges, etc.)
│ └── env.ts # parse Zod des variables d'environnement
├── supabase/migrations/ # schéma + RLS + triggers
└── tests/ # Vitest (schemas, domain)
npm run dev # dev server (Turbopack)
npm run build # build production
npm run start # serveur production local
npm run lint # ESLint (0 erreur requis avant merge)
npm run typecheck # tsc --noEmit (0 erreur requis)
npm run test # Vitest (unit + schemas)
npm run test:coverage # Vitest + rapport de couverture
npm run e2e # Playwright (parcours critiques)
npm run lhci # Lighthouse CI (≥ 95 perf, 100 a11y/BP/SEO)
npm run icons # régénère PNG PWA depuis SVG
npm run security:audit # npm audit --audit-level=high
npm run supabase:types # régénère src/lib/supabase/types.tsnpm run lint→ 0 erreurnpm run typecheck→ 0 erreurnpm run test→ 100 % passnpm run e2e→ 100 % pass sur parcours critiques- Lighthouse → ≥ 95 performance, 100 a11y / best-practices / SEO
- Aucun warning console en dev
Ce dépôt embarque 12 agents Claude Code spécialisés dans .claude/agents/ :
| Agent | Déclencheur |
|---|---|
security-auditor |
Avant merge de toute PR touchant auth, middleware, RLS, headers |
rls-flow-tester |
Après toute migration ou changement de policy RLS |
financial-formula-validator |
Après tout changement dans src/lib/domain/ |
ui-auditor |
Après toute modification UI (mobile-first WCAG 2.2 AA, viewport Chromium) |
mobile-ios-auditor |
Layout/nav/forms/dashboard mobile — Safari iOS WebKit (safe-area, ITP, focus rings) |
dashboard-ux-auditor |
User dashboard src/app/[locale]/app/** |
admin-dashboard-auditor |
Admin panel src/app/[locale]/admin/** |
i18n-auditor |
messages/*.json, src/i18n/, Server/Client Components avec useTranslations |
lighthouse-auditor |
Avant release candidate |
seo-geo-auditor |
Après ajout/renommage de pages publiques |
gdpr-compliance-auditor |
Dès qu'on touche à PII, cookies, export, deletion |
test-runner |
Après toute modification de code |
Voir docs/ARCHITECTURE.md pour les détails d'invocation.
Voir SECURITY.md. Email dédié : security@ankora.be.
| Article RGPD | Implémentation |
|---|---|
| Art. 6 (base légale) | Documentée par traitement dans /legal/privacy |
| Art. 7 (consentement) | Deux cases distinctes (CGU + privacy), aucun pré-coché, rejet aussi simple qu'accept |
| Art. 13 (information) | Privacy policy dédiée + liens contextuels |
| Art. 15 / 20 (accès & portabilité) | Export JSON complet depuis Settings (schéma versionné) |
| Art. 17 (droit à l'oubli) | Deletion flow avec grâce 30 j + annulation, pseudonymisation des logs d'audit |
| Art. 25 (privacy by design) | RLS partout, analytics opt-in, pas de PII en logs |
| Art. 32 (sécurité) | MFA TOTP, CSP nonce, rate-limit, audit log append-only |
Supabase région EU-west (Irlande) pour les données applicatives. Vercel Edge régionalisé EU pour le rendu. Aucune sortie de données hors UE.
Non. Ankora ne se connecte pas à tes comptes bancaires (pas de PSD2, pas d'agrégation). Tu saisis toi-même tes charges et tes soldes. L'app te donne une vision long-terme (provisions, lissage) que ton app bancaire ne fournit pas.
Non, jamais. Ankora est un outil d'éducation budgétaire et d'organisation. Toute recommandation d'investissement nécessiterait un agrément FSMA que nous n'avons pas. Ankora t'aide à savoir combien virer vers ton épargne — pas où placer cet argent.
Oui. Elles sont hébergées en Union européenne (Supabase Irlande), isolées par utilisateur via Row Level Security Postgres, chiffrées en transit (TLS 1.3) et au repos. Aucun tiers n'y a accès. Tu peux les exporter ou les supprimer à tout moment depuis tes paramètres.
Non. Le compte est nécessaire pour sauvegarder tes données en sécurité et activer la 2FA. Nous n'exigeons que ton email — pas de nom, de téléphone ou de date de naissance.
Le code source est visible (licence propriétaire), mais pas réutilisable pour un usage commercial. Nous accueillons les signalements de bugs et les suggestions via GitHub Issues.
MVP en phase bêta privée. La tarification définitive sera publiée sur /pricing au lancement public.
L'app est utilisable depuis toute l'UE. Les avertissements réglementaires sont orientés Belgique (FSMA).
Locales V1.0 : fr-BE (français de Belgique, locale principale) et en (anglais international). Les locales nl-BE, de-DE et es-ES sont annoncées sur /roadmap et seront livrées post-launch en V1.1.
Voir docs/ROADMAP.md pour la roadmap détaillée.
Statut actuel : design Ankora V1.0 entièrement figé (sessions Claude Design #1 à #5 livrées 2026-05-09). Intégration React/Tailwind en cours via PR-D4 PHASE 2 (atomic design 11 atoms + cockpit + admin RBAC).
Trois jalons V1.0 publique :
| Jalon | Horizon | Contenu |
|---|---|---|
| Alpha | mai 2026 (~4 sem) | Thierry + 2-3 proches, FR-BE seul, auth + onboarding 3 étapes + cockpit + simulateur + MFA |
| Beta | début juin 2026 (~8 sem) | 5-10 testeurs, CGU/Privacy UE+BE, GDPR export/delete, bug reporting live, Klaro! cookie consent TCF v2.2 |
| V1.0 | fin juin 2026 (~12 sem) | Signups ouverts ankora.be, FR + EN, AEO complet, Lighthouse 100, /roadmap publique, admin panel V1 live data |
Prochaines évolutions post-V1.0 :
- V1.1 : NL-BE + DE-DE + ES-ES (locales annoncées), logos fournisseurs réels via Logo.dev API opt-in
- V1.2 : analytics opt-in détaillés, notifications mensuelles, partage famille (read-only)
- V1.3 : imports CSV multi-sources (Coda/Notion/Excel/Sheets/Airtable), catégorisation assistée par IA (BYOK utilisateur)
- V2.0 : multi-devise (EUR + CHF + GBP), exports PDF annuels
Lis CONTRIBUTING.md avant toute PR.
En résumé :
- Ouvre une issue pour discuter du changement (sauf typo évidente)
- Fork → branche
feature/xxx→ PR versdevelop - Les portes de qualité doivent toutes passer
- Les messages UI sont en français, code/commits/commentaires en anglais
Format Conventional Commits :
feat(auth): add MFA TOTP enrollment
fix(budget): clamp simulation delta to 2 decimals
chore(deps): bump zod to 4.2.1
docs(readme): update roadmap
Propriétaire. © 2026 Thierry Vanmeeteren. Tous droits réservés.
- Ankora™ est une marque déposée de Thierry Vanmeeteren
- Le code source est fourni à titre consultatif (transparence, audit de sécurité)
- Toute utilisation, copie, modification ou distribution requiert une autorisation écrite
Voir LICENSE pour les conditions détaillées, ou NOTICE pour l'inventaire des dépendances tierces.
Made with care in Belgium 🇧🇪