
Sesenta contenedores en un servidor
Un servidor bare-metal ejecuta decenas a cientos de contenedores Hoody. KSM y dedup BTRFS hacen que el costo marginal sea casi cero.
Cada noche a la 1 AM, una entrada de cron hace curl a una URL exec. El script ejecuta tu SQL de rollup sobre la URL de sqlite y escribe la tabla diaria de vuelta. Sin Postgres de Airflow, sin archivo DAG, sin dashboard de scheduler con 14 widgets, sin guardia para el orquestador en sí.
SELECT date_trunc('day', created_at) AS d,
count(*) AS n
FROM events
WHERE created_at >= 'today'
GROUP BY 1 -- the whole pipelineEL DASHBOARD ES EL ORQUESTADOR. UNA URL. UN HORARIO.
Toda la pipeline es una entrada de cron apuntando a una URL exec. La entrada de cron es un POST a /users/root/entries. La URL exec es un script pequeño que abre la URL de sqlite, ejecuta el SQL del rollup y devuelve las nuevas filas. Ese es todo el DAG.
// cada noche a las 01:00 UTC
POST /users/root/entries
{
"schedule": "0 1 * * *",
"command": "curl -fsS https://exec.containers.hoody.com/scripts/rollup/run"
}// el cuerpo entero de la pipeline
import { Database } from "bun:sqlite";
const db = new Database("events.db");
db.run(`INSERT INTO rollup_daily
SELECT date_trunc('day', created_at), count(*)
FROM events GROUP BY 1;`);
return { ok: true, rows: db.query("SELECT * FROM rollup_daily").all() };Si el rollup falla, los logs de cron lo dicen. Si necesitas hacer backfill de ayer, haces curl a la URL exec a mano con un parámetro de fecha. No hay un segundo sistema que aprender, ni base de datos del scheduler que mantener viva, ni archivo DAG que commitear. El orquestador es una entrada de cron apuntando a una URL.
El Hoody Kit envía el scheduler, el runtime y el almacenamiento como servicios HTTP corrientes. La pipeline es la llamada curl entre ellos — nada más.
hoody-cron almacena los horarios como recursos en /users/root/entries. Sin DB de metadatos en Postgres que respaldar, sin contenedor del scheduler que mantener sano, sin repositorio de DAGs que desplegar. Haces POST a una fila y el run dispara.
hoody-exec ejecuta el script del rollup bajo demanda en exec.containers.hoody.com/scripts/rollup/run. cron le hace curl, recibe un 200, registra la respuesta. Sin cola de workers, sin broker, sin grafo de tareas pickleado.
Cada llamada a exec devuelve las nuevas filas como JSON y queda registrada por cron con estado, timestamp y stdout. Backfills, fallos y reruns viven en las mismas dos URLs — nada extra que enviar a un agregador de logs.
La pipeline son dos URLs y un parámetro de fecha. Reejecutar lo de ayer tiene la misma forma que la ejecución nocturna, solo que con ?date=2026-04-30 en la URL exec. Sin UI de replay, sin manías del scheduler.
Si la ejecución de la 1 AM devolvió un no-2xx, el registro de last-run de la entrada en hoody-cron muestra el exit code y el cuerpo de la respuesta capturado. Sin servicio de alertas separado que cablear — haces GET a la entrada y lo lees.
El script acepta un parámetro de fecha. Pasa la fecha de ayer y recalcula la fila del rollup de ese día, reemplazando la rota con un INSERT OR REPLACE. Un comando, sin UI de re-trigger de DAG.
exec devuelve la fila del rollup recién escrita como JSON. Compárala con lo que esperabas, y a otra cosa. Nada más que comprobar — la URL del dashboard sirve la misma tabla que acabas de escribir.
Tres números describen el sistema entero. Compáralos con cómo se ve un despliegue de Airflow en tu repo hoy.
minuto, hora, día del mes, mes, día de la semana. Esa es toda la superficie de configuración para cuándo dispara una ejecución.
un POST para registrar el horario, un GET que ejecuta el script. Esa es toda la pipeline desplegable.
sin proceso scheduler que mantener vivo, sin base de datos de metadatos, sin pool de workers. Hoody Kit guarda los horarios y ejecuta el script.
Los números describen el modelo cron + exec sobre Hoody Kit. Tu pipeline existente probablemente tiene más piezas en movimiento; ese es el punto de la comparación.
El orquestador es una entrada de cron apuntando a una URL.
La capa de orquestación se colapsa en una línea de cron. El DAG vive en tu script.
Deja de operar un orquestador. Opera una entrada de cron.