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.localque no se sube a git. Nunca van en el código.
Pasos
- Crea un script que lea una fila de una tabla pequeña (
selectconlimit 1) con el cliente oficialsupabase-js. Esa lectura ya cuenta como petición a la base de datos. - 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.
- Ejecútalo con Node leyendo el entorno desde el archivo:
node --env-file=.env.local scripts/keepalive-supabase.mjs. - Crea un LaunchAgent (archivo
.plisten~/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);
RunAtLoadactivado, para que se lance también al iniciar sesión.
- Cárgalo con
launchctl bootstrap gui/$(id -u) <ruta del plist>. - Redirige la salida estándar y los errores a un archivo en
~/Library/Logs/para poder comprobar que se ejecuta. - 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-copilotyproposal-generator-app(en incubación). Cada uno tiene su scriptkeepalive-supabase.mjsy 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-copilotes la plantilla de referencia: miCLAUDE.mdglobal 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
-
Project Pausing. Supabase. Consultado el 2026-10-09. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7
-
Understanding API keys. Supabase. Consultado el 2026-10-09. ↩