Accès protégé
3 décembre 2025 à 12:45
Votre navigateur ne supporte pas impress.js, veuillez utiliser un navigateur moderne.
Plateforme moderne • Modulaire • Multi-tenant
Expérience autonome en moins de 10 minutes
De la connexion QuickBooks à des insights exploitables
Un clic, autorisation QuickBooks, c'est fait
36 mois d'historique importés automatiquement
RFM, Momentum, recommandations prêtes à utiliser
Interface intuitive, données présentées selon mon intention
Pas juste des tables, mais des insights exploitables et actionnables
Notre frontend transforme les données brutes en informations exploitables, présentées selon l'intention utilisateur plutôt que sous forme de tables techniques
Zéro configuration • Zéro attente • Zéro intervention humaine
cldObd modifié
FastAPI + JWT
Python + Prefect
React + MUI
grabb_etl + grabb_app
Orchestration
Infrastructure
Qualité de code
8 modules indépendants mais orchestrés ensemble
cldObd modifié pour notre usage
Gère l'OAuth2 QuickBooks Online
Récupère refresh_token + realmId
Envoie événement au backend:
/webhook/qbo-connected
Écrit en Rust, UV est 10-100x plus rapide que pip pour l'installation et la résolution de dépendances
Résout les conflits de dépendances de manière déterministe, évite les problèmes de compatibilité
Gère les environnements virtuels, les dépendances, et les lock files (pyproject.toml + uv.lock)
Compatible avec pip, pip-tools, poetry. Utilise les mêmes formats standards (pyproject.toml)
Pourquoi UV ? Accélère le développement avec des installations instantanées et une meilleure gestion des dépendances pour un projet Python moderne.
worker/
main.py
flows/
backfill_qbo.py
sync_daily_qbo.py
adapters/
qbo_adapter.py
engine/
normalize.py
enrich.py
insights.py
Écriture dans: grabb_etl (raw) + grabb_app (canonique)
Raw + ETL Admin
Structure flexible, JSON brut, ingestion rapide
Canonique + Analytics
Tables propres, normalisées, partitionnées par org_id
Chaque table importante contient org_id
Filtre TOUJOURS par org_id dans toutes les requêtes
Écrivent toujours avec org_id + datasource_id
Isolation complète entre organisations
Pipeline complet de données brutes vers insights exploitables
Chaque feature (onboarding, insights, clients) contient ses propres composants, hooks et logique métier
Quand plusieurs features ont besoin du même composant, on
le place dans components/shared/ pour la
réutilisation
Avantage: Isolation des features, réutilisabilité des composants communs, maintenance facilitée
Un seul point de vérité : Les schémas DB définissent les types pour tout le stack
Schémas DB définis
customer_id UUIDorg_id UUIDcreated_at TIMESTAMP
Modèles Python
customer_id: UUIDorg_id: UUIDcreated_at: datetime
Schémas API
customer_id: UUIDorg_id: UUIDcreated_at: datetime
Types TypeScript
customerId: stringorgId: stringcreatedAt: Date
Types toujours à jour entre DB et Frontend
Validation automatique à chaque niveau
Autocomplétion et type-safety partout
Validation des données à l'entrée API
Qualité de code et cohérence : Règles et outils pour maintenir un code propre et standardisé
Linting et détection d'erreurs
Formatage automatique du code
Vérification stricte des types
anyValidation automatique avant commit
any : Typage
explicite obligatoire
_ ou suppression
ESLint + Prettier + TypeScript vérifiés automatiquement
any, texte en dur, variables non
utilisées
i18n pour tous les textes utilisateur
Formatage et corrections sur commit
Linting et formatage Python
Validation automatique avant commit
typing.List
→ list)
Un seul outil pour linting + formatage
Ruff check + format automatiquement
Modernisation et corrections automatiques
100 caractères max, doubles quotes, PEP 8
Standards PostgreSQL
snake_case pluriel (ex:
app_users)
snake_case (ex:
org_id, created_at)
Structure et intégrité
TIMESTAMPTZ)
org_id pour multi-tenantGestion des versions de schéma
org_id
created_at et updated_at partout
snake_case pour tables et colonnes
org_id + index sur toutes les tables importantes
created_at et updated_at standardisés
Alembic pour versionner les changements
Résultat : Code cohérent, maintenable et de qualité professionnelle
Planification automatique des jobs ETL (sync quotidiens, tâches récurrentes) sans avoir besoin de cron
Déclenchement de flows depuis le backend via API/webhooks. Le backend peut lancer des backfills à la demande
Interface web pour visualiser l'état des flows, les logs, les erreurs et l'historique d'exécution
Retry automatique, gestion des échecs, notifications et observabilité complète des workflows
Définition des workflows en Python natif, pas de YAML complexe. Intégration naturelle avec notre stack Python
Solution open-source, extensible et prête pour la production. Support de multiples workers et environnements
Héberge tous les composants de l'application
PostgreSQL local pour grabb_etl et grabb_app
Exécution des jobs Prefect et traitement des données
Prefect Server pour gérer les workflows ETL
Application React servie via Nginx
FastAPI avec gestion des processus via systemd
Deux bases: grabb_etl et grabb_app
UI et API pour orchestration des workflows
Exécution des flows ETL (backfill, sync)
Reverse proxy, SSL/TLS, routing
Table core.datasource (9 colonnes):
datasource_id
org_id
source_type
(qbo, woo, amz, etc.)
status
display_name
external_ref
config_json
(tokens + settings)
created_at
updated_at
Modèle scalable → possibilité d'extraire vers tables spécifiques plus tard
Schéma billing avec 4 tables:
Définition des fonctionnalités disponibles
Plans disponibles (free, pro, premium, etc.)
Relation entre plans et fonctionnalités
Abonnements actifs des organisations
10 minutes de connexion QuickBooks à des insights exploitables
Données présentées selon l'intention utilisateur, pas juste des tables brutes
Objectif : Construire une plateforme moderne, scalable et maintenable, prête pour la production et l'expansion future
Fait par Félix...
OK non...
Pensé par Félix, fait par Cursor