Technique

Muse Otter — Documentation Technique

Muse Otter Team 9 février 2026

Muse Otter — Documentation Technique

RevenueCat Shipyard Creator Contest 2026


Stack Technique

Chaque brique choisie pour une seule raison : livrer vite, scaler après, sans compromis.

CoucheTechnologiePourquoi
FrontendFlutter 3.24+Un codebase → iOS, Android, Web, macOS
StateRiverpod 2.6+Type-safe, testable, code-generated
BackendCloud Functions v2Auto-scaling, pay-per-use
DatabaseCloud FirestoreListeners temps réel, offline support
AuthFirebase AuthAnonyme → account linking
IAGenkit 1.27+Framework d’orchestration IA de Google
ModèleGemini 2.0 FlashRapide, économique, adapté au coaching
PaiementsRevenueCat 9.10+Abos cross-platform en heures
VoixVapi SDKAppels vocaux temps réel

Architecture

┌─────────────────────────────────────────────────────┐
│                  APPLICATION FLUTTER                 │
│              (Clean Architecture)                    │
│                                                      │
│    Présentation  →  Domaine  →  Données              │
│    (UI/Riverpod)   (Entités)   (Firebase)            │
└────────────────────────┬────────────────────────────┘


┌─────────────────────────────────────────────────────┐
│                  BACKEND FIREBASE                    │
│                                                      │
│   Auth  │  Firestore  │  Cloud Functions v2          │
│         │             │  • Réponses IA chat          │
│         │             │  • Extraction de contexte    │
│         │             │  • Webhooks                  │
└────────────────────────┬────────────────────────────┘

          ┌──────────────┼──────────────┐
          ▼              ▼              ▼
    ┌──────────┐  ┌──────────┐  ┌──────────┐
    │RevenueCat│  │  Genkit  │  │   Vapi   │
    │   Abos   │  │ +Gemini  │  │   Voix   │
    └──────────┘  └──────────┘  └──────────┘

Clean Architecture — Feature-First

Chaque feature suit la même structure :

lib/features/{feature}/
├── data/           ← Intégration Firebase
├── domain/         ← Logique métier (entités, use cases)
└── presentation/   ← UI (screens, widgets, providers)

Règles : Les entités sont immutables (freezed). Les Use Cases retournent Either<Exception, T>. Les Repositories sont abstraits dans domain/, implémentés dans data/.


Pipeline IA

Comment chaque interaction IA fonctionne :

  1. L’utilisateur envoie un message → Écriture Firestore avec status: pending
  2. Cloud Function se déclenche (onChatMessageCreate)
  3. La fonction charge : prompt système du coach + contexte utilisateur + 20 derniers messages
  4. Genkit appelle Gemini 2.0 Flash
  5. Réponse écrite dans Firestore → L’app se met à jour via listener temps réel

L’injection de contexte fait que le même modèle donne l’impression d’être un coach différent pour chaque utilisateur :

Structure du prompt système :
├── Personnalité & méthodologie du coach
├── Contexte personnel utilisateur (projet, valeurs, objectifs)
├── Entrées Foundation récentes
└── Directive de langue (en/fr)

Implémentation RevenueCat

Produits

Product IDPrixPériode
monthly_109,99$Mensuel
yearly_8079,99$Annuel (économie 33%)

Entitlement : Muse Otter Pro

Architecture

┌─────────────┐    Achat     ┌─────────────┐
│ App Flutter │──────────────►│  RevenueCat │
│             │               │             │
│ purchases_  │   Entitle-    │ (App Store/ │
│ flutter SDK │◄──────────────│ Play Store) │
└──────┬──────┘    ments      └──────┬──────┘
       │                             │
       │ Lecture status              │ Événements webhook
       │ (stream)                    │ (server-to-server)
       ▼                             ▼
┌─────────────────────────────────────────────┐
│                 FIRESTORE                    │
│                                              │
│  users/{userId}                              │
│  ├── subscriptionStatus: free|pro|lifetime   │
│  └── subscriptionUpdatedAt: timestamp        │
│                                              │
│  ══ Source de vérité unique ══               │
└─────────────────────────────────────────────┘

Événements Webhook

Événement RevenueCatActionNouveau Status
INITIAL_PURCHASEAccorder Propro
RENEWALGarder Propro
EXPIRATIONRévoquer Profree
CANCELLATIONPas de changement— (garde Pro jusqu’à expiration)

Statuts protégés : donation et lifetime ne sont jamais modifiés par les webhooks — attribution manuelle pour testeurs et supporters.


Résumé

  • Stack : Flutter + Firebase + Genkit/Gemini — un seul codebase, multi-plateforme
  • Architecture : Clean Architecture avec Riverpod, organisation feature-first
  • IA : Pattern document-status avec injection de contexte pour un coaching personnalisé
  • RevenueCat : Webhooks serveur synchronisés vers Firestore comme source de vérité unique

Construit seul en 3 semaines. Conçu pour scaler.

Commencez à réfléchir. L'Otter s'occupe du reste.

30 secondes pour capturer. 7 minutes pour revoir. Des patterns à découvrir pour toute une vie.

Aussi sur iPad avec Apple Pencil

Gratuit pour commencer. Sans carte bancaire.