Revisada el 2026-10-09 · vigente hasta 2027-01-07

Un proyecto de Supabase gratuito no se pausa si recibe actividad a diario: basta un script programado que lea una fila de la base de datos.

Supabase pausa los proyectos gratuitos con poca actividad durante 7 días, para ahorrar recursos.1 La receta no es una función oficial de Supabase sino un patrón propio: un script y un programador de tareas (en macOS, un LaunchAgent) que lanzan esa lectura dos veces al día.

Por qué se pausa

  • Los proyectos del plan gratuito se comprueban en una ventana de 7 días. Según la documentación, unas pocas peticiones al día a la base de datos durante la semana anterior suelen bastar para evitar la pausa.1
  • Cuenta como actividad entrar en el panel de Supabase y las llamadas a la API, incluidas las de una aplicación conectada.1
  • Los proyectos de pago no se pausan por inactividad.1
  • El propietario recibe un correo de aviso una semana antes y otro de confirmación al pausarse.1
  • Un proyecto pausado se restaura desde el panel con «Resume project». Hay un año de margen para hacerlo; pasado ese plazo ya no se garantiza.1

Requisitos

  • Un proyecto de Supabase en plan gratuito con una tabla pequeña que se pueda leer.
  • Un equipo que esté siempre encendido (en mi caso, un Mac mini) con Node.js.
  • La URL del proyecto y una clave guardadas en un archivo .env.local que no se sube a git. Nunca van en el código.

Pasos

  1. Crea un script que lea una fila de una tabla pequeña (select con limit 1) con el cliente oficial supabase-js. Esa lectura ya cuenta como petición a la base de datos.
  2. Haz que el script avise si falla. En el ejemplo propio usa una notificación de macOS y escribe el error en el log. Si la lectura falla por red o por DNS, lo más probable es que el proyecto ya esté pausado y el aviso lo dice.
  3. Ejecútalo con Node leyendo el entorno desde el archivo: node --env-file=.env.local scripts/keepalive-supabase.mjs.
  4. Crea un LaunchAgent (archivo .plist en ~/Library/LaunchAgents/) con tres piezas:
    • el comando del paso 3 y el directorio de trabajo del proyecto;
    • una programación diaria (dos horas fijas, por ejemplo 09:00 y 21:00);
    • RunAtLoad activado, para que se lance también al iniciar sesión.
  5. Cárgalo con launchctl bootstrap gui/$(id -u) <ruta del plist>.
  6. Redirige la salida estándar y los errores a un archivo en ~/Library/Logs/ para poder comprobar que se ejecuta.
  7. Pruébalo a mano una vez antes de fiarte de la programación.

Errores frecuentes

  • Usar la clave secreta (antes service_role) en un script que solo lee: se salta todas las políticas de seguridad por filas (RLS). Para una lectura mínima basta la clave publicable, sujeta a RLS, con una política que permita leer esa tabla.2
  • Programarlo en un portátil que se apaga: si el equipo está dormido toda la semana, el proyecto se pausa igual.
  • Olvidar que el archivo de entorno está en el directorio de trabajo: el LaunchAgent debe fijarlo.
  • Dar por hecho que esto es oficial: es una solución propia a una regla del plan gratuito, que puede cambiar.1

Cómo lo uso

  • Lo tengo montado en dos proyectos: portfolio-copilot y proposal-generator-app (en incubación). Cada uno tiene su script keepalive-supabase.mjs y su LaunchAgent, que lo lanza a las 09:00 y a las 21:00 en el Mac mini y deja un log por proyecto en ~/Library/Logs/. Comprobado el 2026-10-09: los dos registran «OK» en cada ejecución.
  • portfolio-copilot es la plantilla de referencia: mi CLAUDE.md global pide que cada proyecto nuevo con Supabase lleve la suya (script más LaunchAgent con nombre propio).
  • El script avisa con una notificación de macOS si el proyecto no responde.

Véase también

  • Vercel, para el despliegue de otras partes del mismo tipo de proyectos.

Referencias

Footnotes

  1. Project Pausing. Supabase. Consultado el 2026-10-09. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7

  2. Understanding API keys. Supabase. Consultado el 2026-10-09. ↩