Comme d’habitude, voici les conclusions pour ceux qui n’ont pas le temps de toute lire 🚀

Quand choisir Firebase ?
  • Tu dĂ©marres dans le dev mobile et tu veux du plug-and-play
  • Ton app a des besoins simples en base de donnĂ©es
  • Le temps rĂ©el est critique pour ton app
  • Tu veux un Ă©cosystĂšme tout intĂ©grĂ©
  • Tu as un budget trĂšs limitĂ© au dĂ©but
  • Tu dĂ©veloppes pour Google Home, Android Auto ou l'Ă©cosystĂšme Google
Quand choisir Supabase ?
  • Tu viens du monde backend/web et tu connais SQL
  • Ton app a des besoins complexes en donnĂ©es
  • Tu veux un pricing prĂ©visible
  • L'open-source et la portabilitĂ© comptent pour toi
  • Tu veux des features modernes (transformations d'images, etc)
  • Tu anticipes une croissance rapide
  • Tu veux avoir le contrĂŽle total

Si tu as plus de temps, je t’invite bien Ă©videmment Ă  tout lire, oĂč Ă  te rendre directement Ă  la partie conclusion pour un peu plus de dĂ©tails.

Introduction

Avant de comparer Firebase et Supabase, posons les bases. Parce que si tu dĂ©butes dans le dĂ©veloppement mobile, il y a de fortes chances pour que tu te demandes: c’est quoi, exactement, un backend ?

Un backend, c'est quoi ?

Imagine ton application mobile comme un restaurant. Ce que l’utilisateur voit, c’est la salle du restaurant : jolie, accueillante, oĂč tout se passe. C’est ce qu’on appelle le frontend.

Mais derriĂšre, il y a la cuisine : lĂ  oĂč on prĂ©pare les plats, oĂč on stocke les ingrĂ©dients, oĂč on gĂšre les commandes. C’est le backend. L’utilisateur ne le voit jamais, mais sans lui, le restaurant ne peut pas fonctionner.

ConcrĂštement, le backend gĂšre :

  • Le stockage des donnĂ©es: tous les profils utilisateurs, les contenus, les paramĂštres de ton app
  • L'authentification: vĂ©rifier qui se connecte, gĂ©rer les mots de passe, les sessions
  • La logique mĂ©tier: calculer des stats, traiter des paiements, envoyer des notifications
  • La synchronisation: faire en sorte que tes donnĂ©es soient Ă  jour sur tous les appareils

Traditionnellement, crĂ©er un backend, c’était monter un serveur : louer une machine, installer une base de donnĂ©es, coder des APIs, gĂ©rer la sĂ©curitĂ©, s’occuper des backups, surveiller les performances
 Bref, un boulot Ă  temps plein.

BaaS: Backend-as-a-Service

C’est lĂ  qu’interviennent les BaaS (Backend-as-a-Service) comme Firebase et Supabase. L’idĂ©e ? Quelqu’un d’autre gĂšre toute la complexitĂ© du backend pour toi.

Tu n’as pas besoin de :

  • Configurer et maintenir des serveurs
  • GĂ©rer la scalabilitĂ© (si demain tu passes de 100 Ă  10 000 utilisateurs)
  • Coder des systĂšmes d'authentification from scratch
  • Te prĂ©occuper de la sĂ©curitĂ© des donnĂ©es et des backups
  • Surveiller les performances et gĂ©rer les pannes

À la place, tu utilises des SDKs (des librairies de code) qui te permettent d’accĂ©der Ă  toutes ces fonctionnalitĂ©s en quelques lignes. C’est plug-and-play.

Pourquoi je me pose la question Firebase vs Supabase

Quand j’ai dĂ©marrĂ© mes projets (Organizer et Habit Saga), j’ai, je l’avoue, foncĂ© un peu tĂȘte baissĂ©e vers la premiĂšre solution que j’ai trouvĂ©e. Et Firebase a rĂ©pondu parfaitement Ă  mes attentes: relativement facile Ă  prendre en main, la rĂ©fĂ©rence utilisĂ©e partout, beaucoup de docs et de tutos.

Mais au fil des mois, j’ai commencĂ© Ă  me poser des questions.

Les requĂȘtes complexes dans Firestore deviennent vite un casse-tĂȘte. Le pricing basĂ© sur l’usage me rend pas mal nerveuse. Et je me demande si je ne suis pas entrain de m’enfermer dans l’écosystĂšme Google sans vraie porte de sortie.

Supabase, de son cÎté, promet du SQL classique (ce que je connais déjà, ça a un cÎté rassurant), des prix plus prévisibles, et la possibilité de self-host si besoin.

Mais est-ce vraiment mieux ? Est-ce que ça vaut le coup de migrer ? C’est ce qu’on va dĂ©cortiquer ensemble.

Tour d'horizon des deux solutions

Firebase: le vétéran de Google

Firebase, c’est le mastodonte du backend-as-a-service. LancĂ© en 2011 puis rachetĂ© par Google en 2014, c’est devenu LA rĂ©fĂ©rence pour les dĂ©veloppeurs mobile qui ne veulent pas se prendre la tĂȘte avec un backend.

L’idĂ©e de Firebase, c’est simple : tu te concentres sur ton app, et Google gĂšre toute l’infrastructure. Authentification, base de donnĂ©es temps rĂ©el, storage de fichiers, notifications push, analytics, crash reporting
 bref, c’est une suite complĂšte d’outils intĂ©grĂ©s.

Le gros avantage, c’est que tout est pensĂ© pour fonctionner ensemble. Tu configures l’auth Firebase, et automatiquement ta base de donnĂ©es Firestore peut utiliser ces infos d’authentification pour gĂ©rer les permissions. Tu intĂšgres Firebase Analytics, et hop, tu peux cibler tes notifications push selon le comportement utilisateur. C’est un Ă©cosystĂšme cohĂ©rent et mature.

CÎté technologie, Firebase repose sur des bases de données NoSQL : Firestore pour les données structurées et Realtime Database pour le temps réel old school. Si tu viens du monde SQL avec tes belles tables et tes jointures, prépare-toi à un changement de paradigme.

Supabase: le challenger open-source

Supabase, c’est le petit nouveau qui fait du bruit. LancĂ© en 2020, il se positionne clairement comme l’alternative open-source Ă  Firebase. D’ailleurs, il ne s’en cachent absolument pas, comme le dĂ©montre leur tagline: “The open source Firebase alternative”.

La philosophie de Supabase est diffĂ©rente : plutĂŽt que de rĂ©inventer la roue, ils utilisent des technologies Ă©prouvĂ©es et les assemblent intelligemment. Au cƓur de Supabase, il y a PostgreSQL - une vraie base de donnĂ©es relationnelle que tu peux interroger en SQL. Pour l’auth, ils utilisent GoTrue. Pour le storage, ils ont leur propre solution built on top de S3.

Le truc cool avec Supabase, c’est que c’est open-source. Si demain tu n’es pas content de leur hĂ©bergement, tu peux self-host l’intĂ©gralitĂ© de ta stack. Avec Firebase, tu es mariĂ© avec Google pour le meilleur et pour le pire.

Différence fondamentale d'approche

La vraie diffĂ©rence entre les deux, c’est la philosophie de la base de donnĂ©es.

Firebase, c’est du NoSQL. Tes donnĂ©es sont organisĂ©es en collections et documents, un peu comme du JSON. C’est flexible, c’est rapide pour certaines opĂ©rations, mais dĂšs que tu veux faire des requĂȘtes complexes avec des relations entre plusieurs collections, ça devient vite le bordel. Et les jointures ? Oublie. Tu dois soit dĂ©normaliser tes donnĂ©es (dupliquer l’info Ă  plusieurs endroits), soit faire plusieurs requĂȘtes et joindre cĂŽtĂ© client.

Supabase, c’est du SQL classique avec PostgreSQL. Tables, relations, contraintes d’intĂ©gritĂ©, transactions, jointures
 tout ce que tu connais dĂ©jĂ  si tu as fait du dev backend. C’est plus rigide au dĂ©part, mais pour des structures de donnĂ©es complexes avec plein de relations, c’est infiniment plus puissant.

Set up initial et prise en main

Bon, assez de thĂ©orie. Mettons les mains dans le cambouis et voyons ce que ça donne concrĂštement de dĂ©marrer un projet avec Firebase puis avec Supabase. Parce que la facilitĂ© de setup, c’est quand mĂȘme un critĂšre important quand tu veux avancer vite et/ou que tu n’as pas beaucoup de temps.

Configuration du projet Firebase

Firebase, c’est pensĂ© pour que tu sois opĂ©rationnel rapidement. Le setup se fait en plusieurs Ă©tapes, mais Google a bien balisĂ© le chemin.

Étape 1 : CrĂ©er le projet dans la console Firebase

Tu vas sur console.firebase.google.com, tu cliques sur “Ajouter un projet”, tu choisis un nom. Firebase te demande si tu veux activer Google Analytics (dis-oui, c’est gratuit et utile). Quelques clics, et ton projet existe.

Étape 2 : Ajouter ton app Flutter

Dans la console Firebase, tu ajoutes une app (iOS et/ou Android). Firebase te génÚre des fichiers de configuration :

  • google-services.json pour Android
  • GoogleService-Info.plist pour iOS

Tu tĂ©lĂ©charges ces fichiers et tu les colles dans ton projet Flutteraux bons endroits (on part toujours du principe que tu codes comme moi en Flutter, mais sinon c’est certainement trĂšs similaire), respectivement dans android/app/ et ios/Runner/.

Étape 3 : Installer les packages Flutter

Dans ton pubspec.yaml, tu ajoutes les packages Firebase dont tu as besoin, un petit flutter pub get, et c’est installĂ©.

Étape 4 : Initialiser Firebase dans ton app

Dans ton main.dart, tu initialises Firebase avant de lancer l’app :

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

Et voilĂ , techniquement, tu es prĂȘt. Tu peux commencer Ă  utiliser Firebase Auth, Firestore, etc. Le petit piĂšge iOS : Sur iOS, il faut aussi configurer les capabilities dans Xcode (Push Notifications, Background Modes, etc.) et parfois jouer avec les certificates Apple.

Configuration du projet Supabase

Supabase, c’est un setup diffĂ©rent, plus orientĂ© backend traditionnel. Mais eux aussi ont fait des efforts pour simplifier le process.

Étape 1 : CrĂ©er le projet sur Supabase

Tu vas sur supabase.com, tu créés un compte (ou tu te connectes avec GitHub), et tu crées un nouveau projet. Tu choisis un nom, un mot de passe pour ta base de données, et une région (prends celle la plus proche de tes utilisateurs).

Supabase met environ 2 minutes Ă  provisionner ton projet. Pendant ce temps, il crĂ©e ta base PostgreSQL, configure l’auth, le storage, gĂ©nĂšre les APIs


Étape 2 : RĂ©cupĂ©rer tes credentials

Une fois le projet créé, tu vas dans Settings > API. Tu y trouves deux infos cruciales :

  • L'URL du projet (genre https://xxxxx.supabase.co)
  • La clĂ© API anonyme (anon key) pour accĂ©der aux APIs depuis ton app

Tu notes ça précieusement (ou mieux, tu les mets dans un fichier .env que tu ne commit surtout pas).

Étape 3 : Installer le package Flutter

Dans ton pubspec.yaml, tu rajoutes le package supabase_flutter. Un seul package pour tout (auth, database, storage, realtime). C’est plus simple que Firebase qui a un package par fonctionnalitĂ©.

Étape 4 : Initialiser Supabase dans ton app

Dans ton main.dart :

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  await Supabase.initialize(
    url: 'https://ton-projet.supabase.co',
    anonKey: 'ta-cle-anon-super-longue',
  );
  
  runApp(MyApp());
}

Et c’est tout. Pas de fichiers de config Ă  tĂ©lĂ©charger, pas de diffĂ©rence iOS/Android. Juste ton URL et ta clĂ©.

Premier contact : ce qui change

Firebase te force Ă  penser “mobile first”. Tout est pensĂ© pour des apps mobiles qui appellent directement la base de donnĂ©es. C’est intuitif si tu viens de ce monde-lĂ .

Supabase te met dans une logique plus “web/backend”. Tu as une vraie base de donnĂ©es PostgreSQL que tu peux interroger en SQL directement depuis l’interface. C’est plus flexible, mais ça demande de connaĂźtre un minimum SQL.

Authentification

L’authentification, c’est la porte d’entrĂ©e de ton app. Si ça bug, tes utilisateurs ne vont mĂȘme pas passer la premiĂšre Ă©tape. Alors voyons comment Firebase et Supabase gĂšrent ça en pratique.

Firebase authentification

Firebase Auth, c’est vraiment son point fort. C’est simple, c’est robuste, et ça marche du premier coup (ou presque).

Les points forts

  • Les erreurs sont bien gĂ©rĂ©es et documentĂ©es
  • La vĂ©rification d'email est intĂ©grĂ©e
  • Tu peux forcer la mise Ă  jour du mot de passe
  • La gestion des sessions est automatique (tokens refresh, etc.)
  • IntĂ©gration parfaite avec Firestore pour les rĂšgles de sĂ©curitĂ©

Les points faibles

  • La personnalisation des emails est limitĂ©s via des templates prĂ©-dĂ©finis
  • Pas de contrĂŽle sur les rĂšgles de validation du mot de passe (Firebase impose son minimum)
  • Si tu veux ajouter des donnĂ©es custom au profil utilisateur, tu dois les stocker dans Firestore Ă  cĂŽtĂ©

Supabase authentification

CĂŽtĂ© Supabase, l’authentification est basĂ©e sur GoTrue (un systĂšme d’auth open-source). C’est trĂšs bien fait, et Ă©tonnamment similaire Ă  Firebase dans l’utilisation.

Les points forts

  • Customisation complĂšte des emails (templates HTML)
  • RĂšgles de mot de passe configurables dans les settings
  • Tu peux stocker des mĂ©tadonnĂ©es custom directement dans le profil auth, pas besoin d'une table sĂ©parĂ©e
  • L'auth est automatiquement liĂ©e Ă  PostgreSQL via Row Level Security

Les points faibles

  • Les messages d'erreur sont moins structurĂ©s que Firebase
  • Moins de ressources communautaires si tu bloques

Providers disponibles

Bon soyons francs, personne n’a encore envie de crĂ©er un Ă©niĂšme compte avec mot de passe. Donc vraiment, ajouter la possibilitĂ© de te connecter Ă  ton app via des providers externes, c’est une nĂ©cessitĂ©.

Les plus connus, Ă  savoir Google, Apple, et Facebook, sont tous supportĂ©s par Firebase et Supabase. Et tu as encore d’autres options si tu le souhaites.

Mention spĂ©ciale: tu es obligĂ© d’ajouter le sign-in with Apple du moment oĂč tu ajoutes un quelconque provider externe. C’est pas une obligation technique, mais juste une rĂšgle de l’App Store.

Si ça t’intĂ©resse, je pourrai te faire un tuto complet sur la mise en place du provider Google, qui nĂ©cessite de configurer un OAuth dans la Google Cloud Console. J’ai franchement galĂ©rĂ© la premiĂšre fois
 Et pourquoi pas Ă©galement sur la mise en place du provider Apple, qui lui nĂ©cessite de crĂ©er un ServiceID dans le portail dĂ©veloppeur Apple. NĂ©anmoins, ces deux passages obligatoires n’ont rien Ă  voir avec le backend et sont nĂ©cessaires si tu implĂ©mentes le provider Google/Apple sur Firebase comme sur Supabase, donc passons.

Base de donneés

Bon, on arrive au cƓur du sujet : la base de donnĂ©es. C’est lĂ  que Firebase et Supabase divergent vraiment, et c’est aussi lĂ  que ton choix va avoir le plus d’impact sur ton quotidien de dev.

Firestore vs PostgreSQL : philosophies opposées

Firestore, c’est du NoSQL. Tes donnĂ©es sont organisĂ©es en collections (comme des dossiers) contenant des documents (comme des fichiers JSON). Pas de schĂ©ma fixe, pas de relations explicites, juste des objets imbriquĂ©s.

Exemple : tu peux créer une collection users avec des documents qui ressemblent à ça :

{
  "uid": "abc123",
  "name": "Lydia",
  "email": "lydia@example.com",
  "premium": true
}

Maintenant allons plus loin. Prends mon app Organizer. Chaque utilisateur peut crĂ©er des tĂąches. Alors, deux options: soit je les imbriques directement dans le document user (mais ça devient vite le bordel), soit je crĂ©e une collection sĂ©parĂ©e tasks avec un champ userId pour faire le lien (c’est ce que j’ai fait).

PostgreSQL avec Supabase, c’est du SQL classique. Tes donnĂ©es sont organisĂ©es en tables avec des colonnes typĂ©es et des relations explicites.

Reprenons le mĂȘme exemple, d’abord pour l’utilisateur. On crĂ©e une table users :

CREATE TABLE users (
  id UUID PRIMARY KEY,
  name TEXT NOT NULL,
  email TEXT UNIQUE NOT NULL,
  premium BOOLEAN DEFAULT false
);

Et une table tasks reliée :

CREATE TABLE tasks (
  id UUID PRIMARY KEY,
  user_id UUID REFERENCES users(id),
  title TEXT NOT NULL,
  completed BOOLEAN DEFAULT false
);

La relation entre tasks et users est explicite via la foreign key UUID de l’user_id.

RequĂȘtes simples : lecture/Ă©criture

Je trouve que regarder directement quelques requĂȘtes aide Ă  avoir une vue un peu plus directe et “intuitive” de ce qui nous attend. Alors voici quelques exemples.

Firestore

Créer un document :

await FirebaseFirestore.instance.collection('tasks').add({
  'userId': currentUser.uid,
  'title': 'Acheter du lait',
  'completed': false,
  'createdAt': FieldValue.serverTimestamp(),
});

Lire des documents :

final snapshot = await FirebaseFirestore.instance
    .collection('tasks')
    .where('userId', isEqualTo: currentUser.uid)
    .get();

final tasks = snapshot.docs.map((doc) => doc.data()).toList();

Mettre Ă  jour :

await FirebaseFirestore.instance
    .collection('tasks')
    .doc(taskId)
    .update({'completed': true});

C’est intuitif, ça ressemble Ă  manipuler des objets JSON. Par contre, chaque opĂ©ration (read, write) te coĂ»te de l’argent. On y reviendra dans le pricing.

Supabase

Créer une ligne :

await Supabase.instance.client.from('tasks').insert({
  'user_id': currentUser.id,
  'title': 'Acheter du lait',
  'completed': false,
});

Lire des lignes :

final response = await Supabase.instance.client
    .from('tasks')
    .select()
    .eq('user_id', currentUser.id);
final tasks = response as List<dynamic>;

Mettre Ă  jour :

await Supabase.instance.client
    .from('tasks')
    .update({'completed': true})
    .eq('id', taskId);

C’est aussi simple que Firestore, mais avec une syntaxe qui rappelle SQL (.select(), .eq(), .update()). Si tu connais SQL, tu te sens tout de suite à l’aise.

Bon honnĂȘtement, les deux restent clairement accessibles.

RequĂȘtes complexes : filtres, jointures, agrĂ©gations

Augmentons la complexité, histoire de voir une différence.

Firestore

Imaginons que tu veux rĂ©cupĂ©rer toutes les tĂąches d’un utilisateur qui sont non complĂ©tĂ©es et créées aprĂšs une certaine date.

final snapshot = await FirebaseFirestore.instance
    .collection('tasks')
    .where('userId', isEqualTo: currentUser.uid)
    .where('completed', isEqualTo: false)
    .where('createdAt', isGreaterThan: lastWeek)
    .get();

Ça marche
 mais seulement si tu as créé un index composite dans la console Firebase. Sinon, erreur. Et ces index, tu dois les crĂ©er manuellement pour chaque combinaison de filtres que tu veux utiliser.

Maintenant, imagine que tu veux faire une jointure. Genre rĂ©cupĂ©rer toutes les tĂąches avec les infos de l’utilisateur qui les a créées. Impossible en une requĂȘte. Tu dois faire :

// 1. Récupérer les tùches
final tasksSnapshot = await FirebaseFirestore.instance
    .collection('tasks')
    .get();

// 2. Pour chaque tùche, récupérer l'utilisateur
for (var taskDoc in tasksSnapshot.docs) {
  final userId = taskDoc.data()['userId'];
  final userDoc = await FirebaseFirestore.instance
      .collection('users')
      .doc(userId)
      .get();
  // Joindre manuellement cÎté client
}

C’est lent, c’est moche, et ça te coĂ»te plein de lectures. La solution ? DĂ©normaliser : dupliquer les infos de l’utilisateur directement dans chaque document task. Mais maintenant, si l’utilisateur change de nom, tu dois mettre Ă  jour toutes ses tĂąches
 Et puis la dĂ©normalisation, on essaie d’éviter, ou a minima de limiter.

Et les agrĂ©gations (compter, faire des sommes, des moyennes) ? Firestore n’en a presque pas. Tu dois tout ramener cĂŽtĂ© client et calculer toi-mĂȘme. Si tu as 10 000 tĂąches, tu tĂ©lĂ©charges les 10 000 juste pour en compter quelques-unes.

Supabase

Avec PostgreSQL, tout devient simple. Jointure ? Facile :

final response = await Supabase.instance.client
    .from('tasks')
    .select('*, users(*)')  // RécupÚre la task ET l'utilisateur
    .eq('user_id', currentUser.id);

Agrégation ? No problem :

final response = await Supabase.instance.client
    .from('tasks')
    .select('id', const FetchOptions(count: CountOption.exact))
    .eq('completed', false);

final count = response.count;  // Nombre de tùches non complétées

Tu peux mĂȘme faire des requĂȘtes SQL complexes directement :

final response = await Supabase.instance.client.rpc('get_user_stats', 
  params: {'user_id': currentUser.id}
);

OĂč get_user_stats est une fonction SQL que tu crĂ©es dans Supabase :

CREATE FUNCTION get_user_stats(user_id UUID)
RETURNS TABLE(total_tasks INT, completed_tasks INT, completion_rate FLOAT)
AS $$
  SELECT 
    COUNT(*) as total_tasks,
    SUM(CASE WHEN completed THEN 1 ELSE 0 END) as completed_tasks,
    AVG(CASE WHEN completed THEN 1.0 ELSE 0.0 END) as completion_rate
  FROM tasks
  WHERE tasks.user_id = $1;
$$ LANGUAGE SQL;

Enfaite le terrain de jeu est beaucoup plus vaste.

Verdict sur les requĂȘtes complexes : Supabase gagne haut la main. Si ton app a des besoins simples (CRUD basique), Firestore fait le job. Mais dĂšs que tu veux des relations, des jointures, des stats
 PostgreSQL n’a pas de concurrence.

Temps réel et synchronisation

Le temps rĂ©el, c’est quand ta base de donnĂ©es te notifie instantanĂ©ment dĂšs qu’une donnĂ©e change. Super pratique pour des apps collaboratives, des chats, ou juste pour rafraĂźchir l’UI sans recharger.

Firestore

Le temps rĂ©el, c’est dans son ADN. C’était mĂȘme sa feature principale Ă  la base.

FirebaseFirestore.instance
    .collection('tasks')
    .where('userId', isEqualTo: currentUser.uid)
    .snapshots()
    .listen((snapshot) {
      // Cette fonction est appelée à chaque changement
      final tasks = snapshot.docs.map((doc) => doc.data()).toList();
      updateUI(tasks);
    });

C’est fluide, c’est instantanĂ©, ça marche impeccablement. Par contre, attention : chaque fois que tu Ă©coutes un snapshot, tu paies pour chaque document lu, mĂȘme si c’est juste une mise Ă  jour. Si tu as 100 tĂąches et qu’une seule change, tu paies quand mĂȘme pour 100 lectures.

Supabase

Supabase a ajoutĂ© le temps rĂ©el avec PostgreSQL (via des extensions comme pg_notify). C’est plus rĂ©cent, mais ça marche bien.

final subscription = Supabase.instance.client
    .from('tasks')
    .stream(primaryKey: ['id'])
    .eq('user_id', currentUser.id)
    .listen((data) {
      // Appelé à chaque changement
      updateUI(data);
    });

Le truc cool : Supabase te dit quel type de changement a eu lieu (INSERT, UPDATE, DELETE). Avec Firestore, tu dois dĂ©duire ça toi-mĂȘme en comparant les snapshots.

Par contre, le temps rĂ©el de Supabase est encore un peu moins mature que Firestore. Parfois il y a des petits dĂ©lais, et la reconnexion aprĂšs une perte de rĂ©seau n’est pas toujours aussi smooth.

Stockage de fichiers

Au-delà des données structurées, tu as souvent besoin de stocker des fichiers : photos de profil, documents, images uploadées par les utilisateurs. Les deux plateformes proposent une solution de storage, mais avec des approches différentes.

Firebase Storage

Firebase Storage, c’est du stockage de fichiers basĂ© sur Google Cloud Storage. C’est robuste, c’est rapide, et ça s’intĂšgre parfaitement avec le reste de l’écosystĂšme Firebase.

Le truc, c’est que Firebase Storage est assez basique. Tu peux upload, download, delete, et c’est à peu prùs tout.

Pas de redimensionnement automatique d’images. Si un utilisateur upload une photo de 10 MB, elle reste Ă  10 MB. Tu dois gĂ©rer ça cĂŽtĂ© client ou utiliser Firebase Cloud Functions (qui coĂ»tent plus cher).

Pas de transformation d’images Ă  la volĂ©e. Tu veux des thumbnails ? Tu dois les crĂ©er et les stocker manuellement. Tu veux servir l’image en webp plutĂŽt qu’en jpg ? Pareil, Ă  faire toi-mĂȘme.

La gestion des mĂ©tadonnĂ©es est limitĂ©e. Tu peux dĂ©finir le content-type, des custom metadata, mais c’est assez basique. Et niveau pricing, Firebase Storage te facture pour :

  • Le stockage (Go/mois)
  • Le bandwidth de download (Go tĂ©lĂ©chargĂ©s)
  • Les opĂ©rations (nombre d'uploads, downloads, deletes)

Si ton app devient populaire et que les users tĂ©lĂ©chargent beaucoup d’images, la facture peut grimper vite.

Supabase Storage

Supabase Storage est built on top de S3-compatible storage, mais avec des features modernes en plus. C’est assez similaire Ă  Firebase. La syntaxe change un peu, mais le concept est le mĂȘme.

Par contre tu peux cette fois faire des transformation d’images Ă  la volĂ©e. Supabase gĂ©nĂšre automatiquement le thumbnail et le met en cache. Pas besoin de stocker plusieurs versions de l’image, c’est gĂ©rĂ© pour toi.

Avec Firebase, tout est dans un seul grand bucket. Avec Supabase, tu crĂ©es des buckets sĂ©parĂ©s (avatars, documents, images_posts, etc.). C’est plus organisĂ© et tu peux dĂ©finir des rĂšgles de sĂ©curitĂ© diffĂ©rentes par bucket.

Par contre, c’est plus rĂ©cent que Firebase Storage, donc l’écosystĂšme est moins mature. Moins de tutos, moins de retours d’expĂ©rience.

Gestion des permissions

La sĂ©curitĂ© du storage, c’est critique. Tu ne veux pas que n’importe qui puisse tĂ©lĂ©charger les photos privĂ©es de tes utilisateurs.

Firebase Storage Security Rules

Avec Firebase, tu dĂ©finis des rĂšgles de sĂ©curitĂ© basĂ©es sur l’authentification. C’est plutĂŽt robuste. Tu peux vĂ©rifier l’auth, la taille du fichier, le content-type, et mĂȘme faire des requĂȘtes Ă  Firestore pour vĂ©rifier des permissions complexes.

Par contre, debugger ces rĂšgles, c’est parfois un enfer. Firebase a un simulateur dans la console, mais c’est pas toujours Ă©vident de comprendre pourquoi une rĂšgle bloque.

Supabase Storage Policies (RLS)

Supabase utilise les Row Level Security policies de PostgreSQL, mais appliquées au storage.

C’est du SQL, donc si tu es Ă  l’aise avec, c’est trĂšs clair. Et tu as accĂšs Ă  toute la puissance de PostgreSQL pour dĂ©finir des rĂšgles complexes basĂ©es sur des donnĂ©es dans d’autres tables.

L’avantage de Supabase, c’est que les permissions du storage et de la database utilisent le mĂȘme systĂšme (RLS). Une fois que tu as compris, tu appliques la mĂȘme logique partout.

En résumé sur le storage

Firebase Storage fait le job pour du stockage basique, mais manque de features modernes (ça peut quand mĂȘme largement suffir suivant le type d’applications que tu construis). Supabase Storage est plus moderne avec les transformations Ă  la volĂ©e et une meilleure organisation (buckets), mais c’est plus rĂ©cent donc moins de retours d’expĂ©rience. Pour les permissions, les deux sont puissants, juste avec des approches diffĂ©rentes.

Pricing : le nerf de la guerre

Bon, on arrive au sujet qui personnellement, m’aide souvent à faire mon choix: le princing.

Tarifs Firebase

Firebase fonctionne sur un modĂšle pay-as-you-go : tu paies ce que tu consommes. Ça semble fair au dĂ©but, mais ça peut vite devenir stressant parce que tu ne sais jamais exactement combien tu vas payer.

Avec le plan gratuit (Spark), tu as:

  • Firestore : 50 000 lectures/jour, 20 000 Ă©critures/jour, 1 GB de stockage
  • Firebase Auth : IllimitĂ© (c'est gratuit !)
  • Storage : 5 GB de stockage, 1 GB/jour de download
  • Cloud Functions : Pas disponible sur le plan gratuit
C'est parfait pour démarrer ou pour un side project avec peu d'utilisateurs. Mais dÚs que tu dépasses ces quotas, tu passes automatiquement au plan payant.

Avec le plan payant (Blaze), les tarifs deviennent:

    Firestore:
    • Lectures : 0,036 $ / 100 000 lectures
    • Écritures : 0,108 $ / 100 000 Ă©critures
    • Suppressions : 0,012 $ / 100 000 suppressions
    • Stockage : 0,18 $ / GB / mois
    Firebase Storage :
    • Stockage : 0,026 $ / GB / mois
    • Download : 0,12 $ / GB
    • Upload : gratuit
    Cloud Functions :
    • 2 millions d'invocations gratuites, puis 0,40 $ / million
    • Temps de calcul facturĂ© selon les ressources utilisĂ©es

Le piĂšge, c’est que chaque opĂ©ration compte. Tu Ă©coutes un snapshot Firestore en temps rĂ©el avec 100 documents ? Chaque fois qu’un document change, Firebase te facture 100 lectures (tous les documents, pas juste celui qui a changĂ©).

Tarifs Supabase

Supabase fonctionne sur un modĂšle Ă  paliers fixes avec des quotas. C’est plus prĂ©visible, mais moins flexible. Avec le plan gratuit (Free), tu as accĂšs Ă :

  • 500 MB de database
  • 1 GB de file storage
  • 2 GB de bandwidth / mois
  • 50 000 monthly active users
  • Projets mis en pause aprĂšs 7 jours d'inactivitĂ© (relancĂ©s automatiquement Ă  l'utilisation)

C’est gĂ©nĂ©reux pour dĂ©marrer. Le truc des projets mis en pause peut ĂȘtre vraiment pĂ©nible pour une app en prod, mais pour tester ou un petit side project, c’est top.

Avec le plan Pro (25 $ / mois), tu as accĂšs Ă :

  • 8 GB de database
  • 100 GB de file storage
  • 250 GB de bandwidth / mois
  • 100 000 monthly active users
  • Pas de mise en pause
  • Support email
  • Daily backups (7 jours de rĂ©tention)

Et au-delĂ , tu paies des add-ons :

  • Database : 0,125 $ / GB supplĂ©mentaire / mois
  • Storage : 0,021 $ / GB supplĂ©mentaire / mois
  • Bandwidth : 0,09 $ / GB supplĂ©mentaire

Et sinon tu as encore le plan Team (599 $ / mois) pour les grosses apps qui ont besoin de plus de ressources, de meilleurs SLAs, et de support prioritaire (on se souhaite d’arriver un jour à ça n’est-ce pas !).

OĂč ça peut exploser

Firebase : les piÚges à éviter

Tu l’as compris, avec Firebase, tu paies selon l’utilisation. Imagine toujours tes deux collections users et tasks. PiĂšge numĂ©ro 1: les snapshots en temps rĂ©el mal optimisĂ©s

// DANGEREUX : écoute toutes les tùches en temps réel
FirebaseFirestore.instance
    .collection('tasks')
    .snapshots()
    .listen((snapshot) {
      // Tu paies pour TOUTES les tĂąches Ă  CHAQUE changement
    });

// BON : limite et filtre
FirebaseFirestore.instance
    .collection('tasks')
    .where('userId', isEqualTo: currentUser.uid)
    .where('completed', isEqualTo: false)
    .limit(50)
    .snapshots()
    .listen((snapshot) {
      // Tu paies seulement pour 50 documents max
    });

PiĂšge numĂ©ro 2: les downloads d’images non optimisĂ©es. Si tu ne redimensionnes pas les images, un user qui upload une photo de 10 MB et 1 000 personnes qui la voient = 10 GB de bandwidth = ~1,20 $. Multiplie ça par des milliers d’images, et bonjour la facture. Solution : utilise Firebase Extensions (Image Resizing) ou redimensionne cĂŽtĂ© client avant l’upload.

PiĂšge numĂ©ro 3: les requĂȘtes inutiles. Enfaite il faut un peu switcher de point de vue, laisser un peu son cĂŽtĂ© purement dev et basculer du cĂŽtĂ© entrepreneur: on Ă©pure, on simplifie lĂ  oĂč c’est possible, et on ne lance pas des requĂȘtes Ă  tout va juste parce que c’est possible technologiquement.

Supabase : les piÚges à éviter

Bon cĂŽtĂ© Supabase, le pricing est beaucoup plus prĂ©visible, mais voici quand mĂȘme quelques piĂšges Ă  Ă©viter.

D’abord, Le bandwidth qui explose Si ton app sert beaucoup d’images ou de vidĂ©os, ça peut aller trĂšs vite. 250 GB inclus dans le plan Pro, ça peut s’envoler comme de rien. Solution : utilise un CDN devant Supabase Storage, ou compress tes images avec les transformations Supabase.

PiÚge numéro 2: la database qui grossit trop vite. 8 GB de database dans le plan Pro, ça semble beaucoup, mais si tu stockes des logs, des analytics, ou des données non nettoyées, ça se remplit vite. Solution : mets en place des politiques de rétention (supprimer les vieux logs automatiquement avec des CRON jobs Postgres).

Et pour finir: oublier de passer au plan Pro en prod. Le plan gratuit met ton projet en pause aprĂšs 7 jours d’inactivitĂ©. Imagine que ton app soit down parce que le projet Supabase s’est mis en pause
 Pas ouf pour ta rĂ©putation. Solution : passe au plan Pro dĂšs que tu lances en prod, mĂȘme avec peu d’users. 25 $/mois, c’est le prix de la tranquillitĂ©.

Mon verdict pricing

  • Pour dĂ©marrer (< 1K users) : Firebase est moins cher si tu optimises bien, mais Supabase est plus prĂ©visible.
  • Pour scaler (10K - 100K users) : Supabase devient nettement moins cher.
  • Pour les grosses apps (> 100K users) : ça dĂ©pend vraiment de ton usage (lectures/Ă©critures, storage, bandwidth), mais gĂ©nĂ©ralement Supabase reste plus avantageux.

Le vrai avantage de Firebase : tu paies vraiment ce que tu utilises, donc si ton app a peu de trafic, c’est quasi gratuit.

Le vrai avantage de Supabase : le prix est prévisible, tu peux budgéter sans stress.

Conclusion : lequel choisir en 2026 ?

Alors, aprĂšs ce tour d’horizon complet, Firebase ou Supabase ? Bon comme souvent, il n’y a pas de rĂ©ponse universelle. Ça dĂ©pend vraiment de ton contexte, de tes compĂ©tences, et de ce que tu veux construire.

Quand choisir Firebase

Tu dĂ©marres dans le dev mobile et tu veux du plug-and-play. Firebase, c’est la solution “ça marche out of the box”. La doc est partout, les tutos YouTube foisonnent, et si tu bloques, il y a 99% de chances que quelqu’un ait dĂ©jĂ  eu ton problĂšme sur Stack Overflow. Pour un premier projet, cette tranquillitĂ© d’esprit vaut de l’or.

Ton app a des besoins simples en base de donnĂ©es. Si tu fais du CRUD basique (crĂ©er, lire, modifier, supprimer) sans relations complexes entre tes donnĂ©es, Firestore est parfait. Une app de notes, un tracker d’habitudes, une todo list
 Firebase fait ça les yeux fermĂ©s.

Le temps rĂ©el est critique pour ton app. Si tu dĂ©veloppes un chat, une app collaborative en temps rĂ©el, ou n’importe quoi oĂč la synchronisation instantanĂ©e est essentielle, Firebase est clairement plus mature sur cet aspect. Firestore snapshots, c’est du bĂ©ton.

Tu veux un Ă©cosystĂšme tout intĂ©grĂ©. Firebase, c’est pas juste une base de donnĂ©es. C’est aussi Analytics, Crashlytics, Performance Monitoring, A/B Testing, Remote Config, Cloud Messaging
 Tout est pensĂ© pour fonctionner ensemble. Si tu veux une suite complĂšte sans rĂ©flĂ©chir, Firebase est ton ami.

Tu as un budget trĂšs limitĂ© au dĂ©but. Avec Firebase, tant que tu as peu d’utilisateurs, tu paies presque rien (voire rien si tu restes dans les quotas gratuits). C’est parfait pour valider une idĂ©e sans investir. Par contre, attention Ă  bien optimiser pour Ă©viter que la facture explose si tu dĂ©collĂ©s.

Tu dĂ©veloppes pour Google Home, Android Auto, ou l’écosystĂšme Google. Si ton app s’intĂšgre profondĂ©ment avec les services Google, Firebase est le choix Ă©vident. L’intĂ©gration est native et tout fonctionne en harmonie.

Quand choisir Supabase

Tu viens du monde backend/web et tu connais SQL. Si tu as dĂ©jĂ  fait du PostgreSQL, du MySQL, ou n’importe quelle base relationnelle, Supabase sera immĂ©diatement familier. Tu retrouves tes jointures, tes transactions, tes triggers
 Pas besoin de rĂ©apprendre un nouveau paradigme NoSQL.

Ton app a des besoins complexes en donnĂ©es. DĂšs que tu as des relations entre entitĂ©s (users ↔ posts ↔ comments ↔ likes), des agrĂ©gations (stats, dashboards), ou des requĂȘtes complexes, PostgreSQL explose Firestore. Tu peux faire en une seule requĂȘte SQL ce qui demanderait 10 requĂȘtes et du code client avec Firestore.

Tu veux un pricing prĂ©visible. 25 $/mois avec Supabase, tu sais exactement ce que tu paies. Pas de surprise en fin de mois. Pour quelqu’un qui lance un business, cette prĂ©visibilitĂ© est rassurante. Tu peux budgĂ©ter sereinement.

L’open-source et la portabilitĂ© comptent pour toi. Avec Supabase, tu n’es pas enfermĂ©. Si demain tu veux self-host, tu peux. Si tu veux migrer vers un autre provider PostgreSQL, c’est possible. Avec Firebase, tu es mariĂ© Ă  Google pour le meilleur et pour le pire.

Tu veux des features modernes (transformation d’images, etc.). Les transformations d’images Ă  la volĂ©e, les upload resumables, les buckets organisĂ©s
 Supabase Storage est plus moderne que Firebase Storage. Si ton app manipule beaucoup de mĂ©dias, c’est un vrai plus.

Tu anticipes une croissance rapide. Si tu vises 10K+ utilisateurs rapidement, Supabase sera probablement moins cher Ă  terme. Le pricing fixe avec add-ons devient vite plus avantageux que le pay-per-operation de Firebase.

Tu veux avoir le contrĂŽle total. Avec Supabase, tu peux Ă©crire du SQL brut, crĂ©er des fonctions, des triggers, des vues
 Tu as accĂšs Ă  toute la puissance de PostgreSQL. C’est plus de responsabilitĂ©, mais aussi plus de flexibilitĂ©.

Mon choix personnel

Bon, et moi, concrùtement, qu’est-ce que je fais ?

Quand je dĂ©marrerai un nouveau projet une fois qu’Organizer sera lancĂ©, je choisirai probablement Supabase. Pourquoi ? Parce que je connais dĂ©jĂ  SQL, que le pricing prĂ©visible me rassure, et que j’aime l’idĂ©e d’ĂȘtre sur une stack open-source. Il y aussi un peu de curiositĂ© de ma part, j’aime bien dĂ©couvrir de nouvelle chose et tester concrĂštement par moi-mĂȘme pour me faire une idĂ©e.

Mais est-ce que je migrerais Organizer et Habit Saga de Firebase vers Supabase ? HonnĂȘtement, non. Pas pour l’instant. Pourquoi ?

Parce que mes apps tournent bien sur Firebase. Elles ont des besoins simples (pas de requĂȘtes complexes) et le temps rĂ©el fonctionne parfaitement (important avec la fonctionnalitĂ© famille dans Organizer). Migrer prendrait du temps (plusieurs jours de dev minimum), avec des risques de bugs, de perte de donnĂ©es, de downtime
 ça me semble cher payer.

Bon bien sĂ»r, si ma facture Firebase commençait Ă  monter (> 100 $/mois), je reconsidĂ©rerais sĂ©rieusement la migration. Et tu sais quoi ? C’est tout ce que je me souhaite, ça voudrait dire que mes apps attirent beaucoup d’utilisateurs !

Le mot de la fin : Firebase et Supabase sont tous les deux excellents. Ton choix doit dépendre de :

  • Ton niveau de confort avec SQL vs NoSQL
  • La complexitĂ© de tes besoins en donnĂ©es
  • Ton budget et ta prĂ©fĂ©rence pour du pricing fixe ou variable
  • Ton attachement (ou pas) Ă  l'open-source

Et surtout, rappelle-toi : le meilleur backend, c’est celui qui te permet de shipper vite et de te concentrer sur ton produit, pas sur l’infrastructure. Alors choisis, lance-toi, et arrĂȘte de procrastiner en comparant des technologies (je sais, c’est tentant, mais faut se bouger 😉).

VoilĂ , j’espĂšre que ça t’aide Ă  y voir plus clair. N’hĂ©site pas Ă  m’écrire si tu n’es pas d’accord sur un point ou si tu veux simplement discuter.

À la prochaine !

Commentaires