Tag: Supabase

  • Implementación de @supabase/server para Edge Functions Seguras

    Implementación de @supabase/server para Edge Functions Seguras

    npm install @supabase/server@latest npx skills add supabase/server — Cambia cómo piensas la seguridad y la infraestructura de tus Edge Functions

    Tiempo estimado de lectura: 4 min

    • Reduce boilerplate: @supabase/server entrega SupabaseContext por petición y primitives para evitar repetir validación de JWT, clientes anon/admin y CORS.
    • Seguridad declarativa: auth modes visibles por ruta ({ auth: ‘user’ }, ‘secret’, ‘none’, etc.) que simplifican auditorías.
    • Automatización para equipos: npx skills add supabase/server añade conocimiento a agentes para migraciones y scaffolds fiables.

    Hoy no es sobre instalar una dependencia. Es sobre cambiar cómo piensas la seguridad y la infraestructura de tus Edge Functions. Si ejecutas npm install @supabase/server@latest y luego npx skills add supabase/server, obtienes dos cosas: una librería que elimina el boilerplate y una “skill” para agentes de código que conoce la API, los patrones y las rutas de migración. Esto no es marketing; es ingeniería que reduce errores y acelera migraciones.

    Resumen rápido (lectores con prisa)

    Qué es: Un paquete que entrega SupabaseContext preconfigurado por petición y una skill para agentes.

    Cuándo usarlo: Al migrar o crear Edge Functions que requieran autenticación, roles o admin operations.

    Por qué importa: Reduce código repetido y errores; hace la seguridad declarativa.

    Cómo funciona: Wrapper middleware (withSupabase) o primitivas (createSupabaseContext) que validan auth y exponen clientes y claims.

    Qué hace la instalación (breve)

    npm install @supabase/server@latest

    Instala el paquete que crea un SupabaseContext preconfigurado por petición.

    npx skills add supabase/server

    Entrega ese contexto a agentes como Claude Code o Codex, para que puedan generar migraciones y scaffolds fiables.

    Fuentes y documentación

    Qué obtienes realmente: contextos y patrones repetibles

    Instalar @supabase/server no es solo añadir un helper: introduces un patrón consistente. El núcleo es el SupabaseContext que te dan los wrappers como withSupabase:

    • ctx.supabase: cliente con scope de usuario (respeta RLS)
    • ctx.supabaseAdmin: cliente con service role (operaciones privilegiadas)
    • userClaims / jwtClaims: identidad verificada
    • authMode: cómo se autenticó la petición

    Ejemplo mínimo (edge handler compatible con cualquier runtime)

    import { withSupabase } from 'npm:@supabase/server'
    
    export default {
      fetch: withSupabase({ auth: 'user' }, async (req, ctx) => {
        const { data } = await ctx.supabase.from('todos').select()
        return Response.json(data)
      }),
    }
    

    Eso es todo. Declaras auth y recibes contexto. Si la petición no tiene token válido, el middleware corta la ejecución antes de tocar tu lógica.

    Modos de autenticación: explícitos y visibles

    La seguridad deja de ser código disperso y pasa a ser una declaración:

    • { auth: 'user' } — solo usuarios con JWT válido
    • { auth: 'none' } — webhooks y health checks
    • { auth: 'secret' } — server-to-server con clave secreta
    • { auth: 'publishable' } — publishable key
    • { auth: ['user', 'secret'] } — acepta JWT o secret key

    Ventaja práctica: el modelo de seguridad de una función es legible en una línea. Auditar políticas, cumplir requisitos de cumplimiento o revisar riesgo queda mucho más simple.

    Migrar a JWT asimétricos sin dolor

    Antes de @supabase/server, migrar a las nuevas claves asimétricas significaba instalar jose, montar JWKS, exponer nuevos secretos y actualizar función por función. Con este paquete la validación asimétrica y la resolución de JWKS se gestionan internamente. Resultado: menos oportunidades de equivocarte y menos código repetido.

    Cuando necesitas control fino: createSupabaseContext y las primitivas

    No todo el mundo usa el wrapper. Si necesitas flujo imperativo o respuestas personalizadas, existe createSupabaseContext:

    import { createSupabaseContext } from 'npm:@supabase/server'
    
    export default {
      fetch: async (req) => {
        const { data: ctx, error } = await createSupabaseContext(req, { auth: 'user' })
        if (error) return Response.json({ error: error.message }, { status: error.status })
    
        const { data } = await ctx.supabase.from('todos').select()
        return Response.json(data)
      },
    }
    

    Y si tu arquitectura es aún más compleja (MCP servers, adaptadores personalizados) las primitivas core están disponibles: createAdminClient, createContextClient, resolveEnv, verifyAuth — las mismas funciones que alimentan los adaptadores oficiales.

    Hono y adaptadores: patrón simple para frameworks

    Hono fue el primer adaptador oficial. Un ejemplo con Hono muestra lo limpio que queda:

    import { withSupabase } from '@supabase/server/adapters/hono'
    import { Hono } from 'hono'
    
    const app = new Hono()
    app.get('/todos', withSupabase({ auth: 'user' }), async (c) => {
      const { supabase } = c.var.supabaseContext
      const { data } = await supabase.from('todos').select()
      return c.json(data)
    })
    export default { fetch: app.fetch }
    

    El adaptador inyecta supabaseContext en c.var y lista. Si necesitas otro framework, busca un adaptador o usa las primitivas core.

    Agentes y automatización: por qué añadir la “skill” es útil

    npx skills add supabase/server le da a un agente el conocimiento de la API y patterns. Eso permite prompts robustos:

    • “Analyze all Edge Functions and plan a migration to @supabase/server”
    • “Scaffold a Hono REST API with per-route auth for todos”
    • “Create an admin Edge Function that accepts user or secret auth and logs audits”

    Si tu equipo usa agentes para refactorizaciones o scaffolding, esta skill reduce la tasa de alucinaciones y acelera entregas.

    Criterio práctico para equipos técnicos

    • Empieza migrando endpoints críticos: aquellos con manipulación de roles o auditoría.
    • Sustituye shared utilities por withSupabase o createSupabaseContext: menos código repetido, menos errores.
    • Usa modes combinados (['user','secret']) para endpoints mixtos (frontend + cron jobs).
    • Revisa variables de entorno: SUPABASE_PUBLISHABLE_KEYS y SUPABASE_SECRET_KEYS en lugar de keys singulares.
    • Prueba con agentes para migraciones masivas, pero añade revisión humana.

    Conclusión

    npm install @supabase/server@latest y npx skills add supabase/server no son trucos de productividad; son una inversión en consistencia y seguridad. Si gestionas Edge Functions, adoptar este patrón reduce la superficie de error, acelera auditorías y libera tiempo para construir la lógica que realmente importa. Revisa la documentación en Documentación general y el repositorio en Repositorio Supabase para empezar.

    Dominicode Labs

    Para equipos que automatizan migraciones y workflows con agentes, una referencia práctica y recursos adicionales están disponibles en Dominicode Labs. Integrar estas prácticas con pipelines de automatización puede acelerar adopciones y reducir errores humanos.

    FAQ

    ¿Qué hace exactamente @supabase/server?

    Entrega un SupabaseContext preconfigurado por petición que incluye clientes (usuario y admin), claims y el modo de autenticación. También ofrece primitivas para escenarios imperativos o adaptadores de framework.

    ¿Necesito cambiar todas mis funciones para usarlo?

    No necesariamente. Puedes migrar endpoints críticos primero y sustituir utilidades compartidas por los wrappers o primitivias según prioridades del equipo.

    ¿Cómo maneja la validación de JWT asimétricos?

    La validación asimétrica y la resolución de JWKS se gestionan internamente por el paquete, evitando tener que instalar y montar jose y JWKS manualmente en cada función.

    ¿Qué diferencia hay entre withSupabase y createSupabaseContext?

    withSupabase es un wrapper middleware que inyecta contexto automáticamente y corta ejecución si la auth falla. createSupabaseContext es una primitiva imperativa útil cuando necesitas control fino sobre la respuesta o flujo.

    ¿La skill para agentes reemplaza la revisión humana?

    No. La skill reduce la tasa de alucinaciones y acelera la generación de migraciones y scaffolds, pero se recomienda revisión humana antes de despliegues críticos.

    ¿Dónde encuentro más documentación y ejemplos?

    Consulta la Documentación general y el Repositorio Supabase para ejemplos, adaptadores y guías de migración.

  • Guía para migrar funciones Edge y simplificar autenticación en Supabase

    Guía para migrar funciones Edge y simplificar autenticación en Supabase

    npm install @supabase/server@latest y npx skills add supabase/server: guía práctica para migrar Edge Functions, Hono y agentes IA

    Tiempo estimado de lectura: 4 min

    • Reduce boilerplate de autenticación gracias a un modelo declarativo y SupabaseContext por petición.
    • Automatiza migraciones con agentes usando npx skills add supabase/server para dar contexto y patrones a agentes de código.
    • Flujo incremental y seguro: withSupabase para la mayoría de endpoints; primitives o createSupabaseContext para casos complejos.
    • Soporta rotación de claves y despliegues controlados con variables plurales y canary deploys.

    Introducción

    npm install @supabase/server@latest y npx skills add supabase/server son las dos acciones que debes ejecutar si quieres adoptar el nuevo flujo de trabajo de Supabase: un paquete que elimina el boilerplate de autenticación y un “skill” que da contexto a agentes de código. En las primeras líneas: estos comandos son el punto de partida para migrar funciones Edge, automatizar refactors con agentes y levantar APIs Hono seguras en minutos.

    Resumen rápido (lectores con prisa)

    Instala @supabase/server para obtener contexto de autenticación y clientes por petición. Añade el skill supabase/server para que agentes de código puedan identificar y actualizar inicializaciones antiguas. Usa withSupabase para la mayoría de endpoints; recurre a primitives o createSupabaseContext para casos compuestos.

    npm install @supabase/server@latest — qué instala y qué te da

    Instalar @supabase/server provoca algo más que añadir una dependencia: introduce un modelo declarativo para control de acceso y un SupabaseContext listo para usar. Tras la instalación obtienes primitives y wrappers que:

    • Verifican JWT asimétricos sin jose/JWKS manual.
    • Inicializan dos clientes por petición: ctx.supabase (usuario, respeta RLS) y ctx.supabaseAdmin (service role).
    • Inyectan userClaims, jwtClaims y authMode en el contexto.
    • Ofrecen withSupabase (wrapper), createSupabaseContext (imperativo) y primitives en @supabase/server/core.

    Documentación oficial: Documentación oficial y repo: Repositorio en GitHub

    npx skills add supabase/server — por qué lo necesitas si usas agentes

    npx skills add supabase/server alimenta a herramientas como Claude Code, Codex o Cursor con la superficie de la API, patrones de adaptadores y rutas de migración. Resultado práctico: un agente puede escanear tu repo, identificar inicializaciones antiguas, reemplazarlas por withSupabase y migrar claves a las nuevas variables sin equivocarse.

    Prompts útiles (ejemplos que puedes dar al agente):

    • “Analyze all Edge Functions and plan a full migration to use the new API keys with @supabase/server”
    • “Scaffold a Hono REST API with CRUD for todos using per-route auth”
    • “Create an Edge Function that accepts user or secret auth, reads profile with RLS and writes audit logs with admin client”

    Plan de migración: pasos prácticos y ordenados

    1. Auditoría rápida

    Busca patrones repetidos (creación de clientes, verificación JWT, _shared/*.ts).

    2. Añade la dependencia e instala el skill

    Ejecuta los comandos:

    npm install @supabase/server@latest
    npx skills add supabase/server

    3. Sustitución incremental

    • Reemplaza inicializaciones manuales por withSupabase({ auth }) en funciones individuales.
    • Para funciones multifunción, usa createSupabaseContext o primitives (verifyAuth, createContextClient).

    4. Variables de entorno

    Cambia a formas plurales si es necesario: SUPABASE_PUBLISHABLE_KEYS y SUPABASE_SECRET_KEYS (soporta rotación). Valida inyección en plataformas (Supabase CLI, Vercel, Cloudflare).

    5. Test y rollout

    • Tests unitarios sobre handlers con contexto mockeado.
    • Canary deploy para funciones críticas.

    6. Limpieza

    • Elimina utilidades compartidas de verificación JWT (ya no necesarias).
    • Actualiza docs internas y runbooks.

    Ejemplo rápido: Hono + withSupabase (CRUD /todos)

    El adaptador Hono inyecta el contexto en c.var.supabaseContext:

    import { withSupabase } from '@supabase/server/adapters/hono'
    import { Hono } from 'hono'
    
    const app = new Hono()
    
    app.get('/todos', withSupabase({ auth: 'user' }), async (c) => {
      const { supabase } = c.var.supabaseContext
      const { data } = await supabase.from('todos').select()
      return c.json(data)
    })
    
    export default { fetch: app.fetch }

    Per-route auth es explícito y visible en la firma: mantenimiento y auditoría mucho más sencillos.

    Edge Function protegida con operaciones admin (patrón recomendado)

    Cuando necesitas dual-mode auth (usuario o secret) y escribir logs de auditoría:

    • Declara auth: ['user','secret'].
    • Usa ctx.supabase para lecturas que respetan RLS.
    • Usa ctx.supabaseAdmin para escribir auditoría o tareas privilegiadas.

    Si necesitas control imperativo sobre errores, usa createSupabaseContext:

    import { createSupabaseContext } from 'npm:@supabase/server'
    
    const { data: ctx, error } = await createSupabaseContext(req, { auth: ['user','secret'] })
    if (error) return Response.json({ error: error.message }, { status: error.status })

    Recomendaciones prácticas y criterios técnicos

    • Prioriza withSupabase para la mayoría de endpoints: claridad y seguridad por defecto.
    • Usa primitives solo cuando debas combinar múltiples auth en una función o manipular headers de forma estricta.
    • Aprovecha npx skills para automatizar auditoría y migración; reduce errores humanos en refactors masivos.
    • Mantén tests que mockeen SupabaseContext para evitar dependencia de la red en unit tests.
    • Revisa el repo y docs oficiales para edge-cases y actualizaciones: Repositorio en GitHub y Documentación oficial

    Conclusión

    Instalar @supabase/server y añadir el skill cambia la ergonomía del backend: elimina la repetición, reduce superficie de ataque y hace tus funciones Edge predecibles para humanos y agentes por igual. Empieza migrando funciones críticas con canary deploys, automatiza el resto con el skill y conserva primitives para los casos realmente especiales. El resultado: menos fontanería, más foco en la lógica que aporta valor.

    Mención: Dominicode Labs

    Si estás planificando automatizaciones o migraciones con agentes, puede resultar útil ver recursos y experimentos aplicados a workflows y agentes. Más información y proyectos relacionados en Dominicode Labs.

    FAQ

    Respuesta: Instalar @supabase/server introduce un modelo declarativo de control de acceso y un SupabaseContext por petición, con clientes ctx.supabase y ctx.supabaseAdmin, verificación de JWT asimétrica y utilidades como withSupabase y createSupabaseContext.

    Respuesta: npx skills add supabase/server aporta la superficie de la API y patrones a agentes de código, permitiendo que escaneen repos, identifiquen inicializaciones antiguas y automaticen refactors de forma segura.

    Respuesta: Cambia a variables plurales como SUPABASE_PUBLISHABLE_KEYS y SUPABASE_SECRET_KEYS para soportar rotación. Valida la inyección en plataformas como Supabase CLI, Vercel o Cloudflare antes del despliegue.

    Respuesta: Usa withSupabase por defecto para claridad y seguridad. Emplea createSupabaseContext o primitives cuando necesites combinar múltiples modos de auth en una sola función o manipular headers de forma estricta.

    Respuesta: Escribe tests unitarios que mockeen el SupabaseContext para evitar llamadas de red. Realiza canary deploys para funciones críticas antes del rollout completo.

    Respuesta: Sí: una vez migradas las funciones a @supabase/server, las utilidades compartidas de verificación JWT que replican lógica ya gestionada por el paquete dejan de ser necesarias y pueden eliminarse tras validar el comportamiento.

  • Supabase vs Firebase: Eligiendo el BaaS adecuado para tu proyecto

    Supabase vs Firebase: Eligiendo el BaaS adecuado para tu proyecto

    Supabase vs. Firebase: ¿Cuál elegir para tu backend as a service?

    Tiempo estimado de lectura: 3 min

    • Idea clave: Elige según el modelo de datos: SQL (Supabase) para relaciones y garantías; NoSQL (Firestore) para prototipado móvil rápido.
    • Idea clave: Seguridad y control de acceso difieren: RLS en la base de datos (Supabase) vs Security Rules (Firebase).
    • Idea clave: Costes y facturación: Firebase cobra por operación; Supabase por recursos.
    • Idea clave: Integración con IA y automatizaciones favorece a Supabase (pgvector, n8n).

    Tabla de contenidos

    Resumen rápido (lectores con prisa)

    Supabase es una capa sobre PostgreSQL: relaciones nativas, transacciones ACID y RLS, ideal para SaaS y pipelines de IA. Firebase (Firestore) es NoSQL documental: esquema flexible, sync offline y prototipado móvil rápido. Elige por modelo de datos, seguridad y previsibilidad de costes.

    Supabase vs. Firebase: núcleo técnico (aplica esto primero)

    La decisión parte del tipo de datos y consultas que necesitas.

    PostgreSQL (Supabase): relaciones y garantías

    Supabase es una capa sobre PostgreSQL. Eso significa:

    • Relaciones nativas, transacciones ACID y JOINs eficientes.
    • Extensiones útiles: pgvector para embeddings, PostGIS para geo.
    • Seguridad posible a nivel de fila (RLS).

    Ejemplo real:

    SELECT o.id, p.name
    FROM orders o
    JOIN products p ON o.product_id = p.id
    WHERE o.user_id = auth.uid();
    

    Docs: Docs

    Ventaja práctica: modelas un SaaS con integridad (facturas, permisos, inventario) sin duplicar datos.

    Firestore (Firebase): documentos y prototipado rápido

    Firestore es NoSQL documental:

    • Esquema flexible, sincronización realtime y offline excelente para móviles.
    • Consultas simples y rápidas sobre documentos planos.
    • Para relaciones complejas, debes desnormalizar (duplicar), lo que complica actualizaciones.

    Docs: Docs

    Ventaja práctica: lanzar un MVP móvil con colaboración offline y sync en minutos.

    Seguridad y control de acceso: RLS vs Security Rules

    La seguridad no es “activar un switch”; es dónde y cómo se evalúa.

    Supabase: Row Level Security (RLS)

    Supabase: Row Level Security (RLS) en la base de datos. Políticas SQL que se ejecutan en la DB, auditable y portable.

    Ejemplo:

    CREATE POLICY "users_can_view_their_rows"
      ON profiles
      FOR SELECT
      USING (auth.uid()::uuid = user_id);
    

    Docs: Docs

    Conclusión: RLS es más robusto y seguro en aplicaciones con requisitos estrictos de control de acceso.

    Firebase: Security Rules

    Firebase: Security Rules, DSL propietario que controla acceso desde Firestore. Funciona, pero es menos estándar y puede volverse difícil de testear en reglas complejas.

    Docs: Docs

    Costes y riesgo de facturas inesperadas

    Modelo de facturación es crítico para startups.

    Firebase (Firestore)

    Cobro por operación (lecturas/escrituras/eliminaciones). El free tier es generoso, pero una consulta ineficiente puede disparar costes.

    Pricing: Pricing

    Supabase

    Modelo por recursos (CPU/RAM/storage). Más predecible; puedes poner límites de gasto y escalar infra.

    Pricing: Pricing

    Regla práctica: si esperas picos de lectura o patrones impredecibles, Supabase suele ser más manejable económicamente; Firebase favorece cargas constantes y apps móviles con lecturas optimizadas.

    Integraciones con automatización e IA (importante para Dominicode)

    Supabase

    Se integra directamente con herramientas como n8n (nodo Postgres) y soporta pgvector para almacenar embeddings y hacer búsquedas vectoriales. Ideal para pipelines de IA y agentes que necesitan acceso rápido a vectores.

    Firebase

    Requiere usar SDK/Admin o REST; funciona, pero añade capa extra en automatizaciones low-code.

    Si vas a construir agentes que consulten memoria vectorial o pipelines de automatización, Supabase acelera la implementación.

    Experiencia de desarrollo y time-to-market

    Firebase: SDKs maduros para iOS/Android/Web, documentación amplia y ejemplos para prototipado rápido.

    Supabase: dashboard claro, APIs auto-generadas y funciones edge (Deno). Mejor para equipos que prefieren SQL y TypeScript.

    Ambos son productivos; la diferencia es la calidad de la arquitectura que quieres conservar cuando el proyecto crezca.

    Decisión práctica: checklist para elegir

    Elige Supabase si

    • Tu dominio tiene relaciones complejas y necesitas integridad de datos.
    • Quieres evitar vendor lock-in y mantener portabilidad.
    • Planeas integrar IA (embeddings) o automatizaciones con n8n.
    • Necesitas costes predecibles al escalar.

    Elige Firebase si

    • Vas a lanzar un MVP móvil con sincronización offline/realtime.
    • Necesitas iterar esquema sin migraciones durante fases tempranas.
    • Prioriza velocidad de prototipo sobre la portabilidad a largo plazo.

    Conclusión

    No hay “mejor” universal: hay mejor para tu dominio. Si tu app es un SaaS, panel administrativo o parte de un stack de automatización/IA, empieza por Supabase. Si necesitas lanzar rápido una app móvil con syncing offline y no te preocupa el vendor lock-in, Firebase acelera el camino.

    Ambas plataformas son sólidas; decide por el modelo de datos y la previsibilidad de costes, no por la moda.

    Para proyectos que combinan automatización, agentes y pipelines de IA, considera herramientas y recursos adicionales en Dominicode Labs como continuación lógica de la integración entre infraestructuras y workflows.

    FAQ

    ¿Por qué elegir Supabase si necesito integridad de datos?

    Porque Supabase se basa en PostgreSQL, que ofrece relaciones nativas, transacciones ACID y JOINs eficientes, lo que facilita modelar dominios con integridad (facturas, permisos, inventario) sin duplicar datos.

    ¿Cuándo es mejor Firebase para un MVP móvil?

    Cuando necesitas sincronización offline/realtime y velocidad de prototipo: Firestore proporciona SDKs maduros y sync offline que permiten lanzar rápidamente con colaboración en tiempo real.

    ¿Cómo afectan los modelos de facturación a startups?

    Firebase cobra por operaciones (lecturas/escrituras/eliminaciones), lo que puede generar facturas inesperadas con consultas ineficientes. Supabase factura por recursos (CPU/RAM/storage), ofreciendo previsibilidad y control de costes al escalar.

    ¿Puedo usar embeddings con Supabase?

    Sí. Supabase soporta extensiones como pgvector para almacenar embeddings y realizar búsquedas vectoriales, lo que facilita pipelines de IA y agentes que requieren memoria vectorial.

    ¿Es RLS realmente más seguro que Security Rules?

    RLS se ejecuta en la base de datos, es auditable y portable, lo que lo hace más robusto para requisitos estrictos de control de acceso en comparación con Security Rules, que es un DSL propietario aplicado en Firestore.

    ¿Cómo afecta la desnormalización en Firestore al mantenimiento?

    La desnormalización requiere duplicar datos para modelar relaciones complejas, lo que complica actualizaciones y mantenimiento a medida que la aplicación crece.