Supabase no es Firebase open source. Es PostgreSQL que viene con un REST API de regalo — y eso cambia todo
Cada tutorial que leas dice lo mismo. "Supabase, la alternativa open source a Firebase." Y están equivocados.
*Supabase no es una plataforma de base de datos. Es una instancia de PostgreSQL que resulta que trae REST API, auth y realtime atornillados. *
El día que lo entiendes, la plataforma se vuelve invisible. Y tu proyecto deja de ser "una app de Supabase" para convertirse en lo que siempre debió ser: una app de Postgres.
El problema real nunca fue el vendor lock-in. Tu dato en Supabase es un dump estándar de PostgreSQL que puedes volcar con pg_dump y apuntar a cualquier host. El problema es otro, y es más incómodo.
El impuesto oculto fue Firestore. Firebase te dejó una década sin escribir SQL. Supabase te obliga a modelar datos relacionales, escribir políticas de Row Level Security en SQL y pensar en índices.
Eso es más difícil. Y es exactamente la habilidad que te va a durar.
---
Firebase te prometió "sin esquemas, sin servidores, sin migraciones". Te mintió 6 meses después
Empecemos con la promesa que todos hemos escuchado.
❌ Firebase: "Empieza en minutos. Sin esquemas. Sin migraciones. Sin servidores."
✅ La realidad: suena genial hasta que necesitas un JOIN.
Ahí empieza la pesadilla del NoSQL. Desnormalizas datos porque Firestore no hace joins. Escribes funciones de agregación que se rompen cuando tu app crece. Acabas con un cocktail de Firestore + una base relacional escondida en la nube + un job que sincroniza ambas cosas.
Y el peor de todos: Firestore no te deja salir. El formato de colecciones, los listeners en tiempo real, las reglas de seguridad con su sintaxis propia — todo es propietario. Migrar de Firestore a otra cosa es un proyecto, no un plan.
Ahora mira Supabase. La arquitectura es radicalmente distinta:
- PostgREST convierte cada tabla de PostgreSQL en un endpoint REST automáticamente. No hay motor de base de datos separado.
- Realtime funciona sobre replicación lógica de Postgres (WAL), no sobre un servicio propietario de streaming.
- Auth y storage viven en el mismo schema de Postgres, no en servicios aislados.
- Row Level Security hace que las políticas en SQL decidan qué filas puede leer un usuario.
En resumen: *todo lo que Firebase te esconde detrás de APIs propietarias, Supabase te lo devuelve como SQL estándar. *
No es que Supabase sea más barato o más "open source". Es que te devuelve la propiedad de tu tecnología.
---
El 90% del trabajo de migración no existe: el único riesgo real es tu RLS
Aquí va la parte que nadie te cuenta en los tutoriales de "Firebase vs Supabase".
Como Supabase auto-genera el REST API desde tu esquema vía PostgREST, cada tabla, vista y función que creas es consultable al instante. Esto invierte el flujo habitual del BaaS:
Tú diseñas la base de datos, y el API es un efecto secundario. No un producto que configuras.
La implicación es brutal: tu diseño de esquema SQL ES tu diseño de API. Si tu esquema es pobre, tu API es pobre. Si tu esquema es bueno, consigues abstracciones que harían llorar de envidia al backend que escribiste a mano.
Por eso el riesgo real de Supabase nunca fue el lock-in. El riesgo es que por fin tengas que aprender tu base de datos.
Y dentro de tu base de datos, la pieza que más exige es el Row Level Security.
RLS: el impuesto que te expondrá en el momento menos pensado
Todo el modelo de seguridad de Supabase se apoya en una idea sencilla: el propio PostgreSQL se niega a devolver filas que no te pertenecen.
Fíjate en lo que ha pasado aquí. La seguridad vive en la base de datos, no en tu capa de backend. No hay middleware que compruebe permisos: PostgreSQL filtra las filas antes de que lleguen a tu código.
Esto es lo que hace seguro enviar la anon key al navegador. El cliente puede pedir lo que quiera; la base de datos solo devuelve lo que el auth.uid() tiene derecho a ver.
Pero escucha la parte incómoda:
❌ El mindset equivocado: "Confío en RLS, el backend ya me protege."
✅ El mindset correcto: "RLS está desactivado por defecto en cada tabla hasta que yo lo active. Una tabla sin RLS es una fuga de datos activa."
La política anterior es el happy path. La realidad es que RLS tiene esquinas afiladas: filtraciones de datos por JOINs mal construidos, funciones con SECURITY DEFINER que bypassan políticas, y una pérdida brutal de rendimiento cuando acumulas demasiadas políticas en una tabla.
Probarlo con impersonación de auth.uid() antes de hacer deploy no es opcional. Es la única forma de saber que tu política hace lo que crees.
Que nadie te engañe: RLS es un filo legítimo, no marketing.
---
Client en el frontend, lógica en Postgres: el patrón completo que funciona en producción
La combinación ganadora es simple: supabase-js con la anon key en el frontend, y la lógica de negocio compleja empujada hacia Postgres.
*Ni una sola línea de la API es propietaria. * El REST API sale de tu esquema. El realtime sale de la replicación de Postgres. El auth vive en tablas de tu propia base de datos.
Ahora empuja la lógica pesada a Postgres con funciones y RPC:
La búsqueda, la agregación, la validación compleja — todo vive en un solo sitio. Tu app deja de duplicar lógica y tu SQL tiene un único lugar donde evolucionar.
---
## El Modelo Postgres-Primero para Salir del Lock-In de BaaS
Aquí tienes el framework que aplico en cada proyecto nuevo. Cinco pasos, en orden, sin saltarte ninguno:
Paso 1: Modela tus datos como tablas PostgreSQL primero.
Relaciones, tipos, constraints. Nada de diseñar documentos JSON por comodidad. Recuerda que el REST API se genera desde tu esquema: la calidad de tu esquema ES la calidad de tu API.
Paso 2: Activa RLS en cada tabla y escribe las políticas basadas en `auth.uid()` ANTES de construir una sola pantalla.
Trata "tabla sin RLS" como un bloqueador de deploy. Si no hay política, no hay código frontend para esa tabla.
Paso 3: Usa supabase-js con la anon key en el frontend y jamás la service-role key en el cliente.
Deja que RLS sea tu frontera de autorización. Cualquier lógica de permisos en el app layer es una duplicación frágil.
Paso 4: Empuja la lógica de negocio compleja a funciones, triggers y columnas generadas de Postgres.
Exponlas con supabase.rpc() en lugar de duplicar la lógica en el frontend. Si ves la misma regla en dos sitios, huele mal.
Paso 5: Adopta extensiones nativas de Postgres temprano.
pgvector para embeddings, pgcrypto para cifrado. Y planifica la portabilidad: todo en SQL estándar, con dumps regulares de pg_dump.
---
La ola de IA te llega como un `CREATE EXTENSION`, no como un servicio nuevo
Aquí viene el momento donde Supabase gana la partida de 2026.
Las features de IA — embeddings, búsqueda semántica, similitud vectorial — son extensiones de PostgreSQL. Y como tu base ya es PostgreSQL, "añadir IA" se convierte en una migración SQL:
*El "AI backend" no requiere una base de datos nueva. Requiere una buena extensión de la que ya usas. * No es que Supabase sea "el backend de IA del futuro" — es que la IA necesita datos relacionales bien modelados, y tú ya los tienes.
Ese es el argumento más fuerte a favor de relacional frente a NoSQL conforme las features de IA se extienden. Firestore te da colecciones. PostgreSQL te da embeddings + joins + RLS + SQL en el mismo sitio.
---
Decisión en 2026: no eliges entre dos BaaS. Eliges entre aprender SQL o no aprenderlo
Vamos a responder a las objeciones que te ronda la cabeza.
"Yo no quiero escribir SQL. Por eso elegí un BaaS." El momento en que necesitas queries reales, joins flexibles o control de acceso custom, el BaaS NoSQL se estrella contra un muro. El requisito de SQL de Supabase es un coste a corto plazo para una habilidad que perdura. Y para el CRUD estándar, el REST API auto-generado significa cero queries escritas a mano.
"Self-hostear Supabase es pesado y me da miedo la complejidad de ops." Tienes razón: montar todo el stack (Kong, GoTrue, Realtime, storage) es genuinamente no trivial. Pero no lo necesitas. Mantén tu esquema en PostgreSQL estándar, haz dumps regulares y la puerta de salida está siempre abierta. La migración es un plan, no un proyecto.
"RLS suena peligroso. Una política mala y he expuesto todos mis datos." Sí. Y esa es la objeción más fuerte. Por eso el framework empieza por el paso 2: default-denied en cada tabla, test de impersonación con `auth.uid()` antes de desplegar. RLS no es marketing; es un filo que se respeta.
---
La conclusión incómoda
Supabase no es Firebase con otra etiqueta. Es la demostración de que PostgreSQL se está comiendo el mundo de las bases de datos y que el único camino de salida del lock-in es volver al SQL estándar.
La habilidad que te va a durar no es la API de Supabase — es PostgreSQL. Supabase es simplemente el on-ramp más amable que existe.
Firestore era un desvío de diez años. En 2026, la cordura tiene nombre de base de datos relacional, políticas de RLS y dumps con pg_dump.
*El día que tu proyecto se convierte en una app de Postgres, dejas de depender de Supabase. Y ese es exactamente el motivo por el que deberías empezar con él. *
Artículos relacionados
- Supabase vs Firebase 2026: Por Qué Tu Elección de Backend Define si tu App Escala o se Rompe
- Supabase vs Firebase 2026: Deja de Llamarlo "Firebase para PostgreSQL" — Es una Trampa para Frontend Developers
- Supabase vs Firebase 2026: El NoSQL fue un Desvío de 10 Años y Supabase es la Vuelta a la Cordura
- Supabase vs Firebase 2026: El NoSQL fue un Desvío de 10 Años y Supabase es la Vuelta a la Cordura
- Supabase vs Firebase 2026: El NoSQL fue un Desvío de 10 Años y Supabase es la Vuelta a la Cordura
---
¿Quieres recibir contenido como este cada semana? Suscríbete a mi newsletter

