Código abierto · Apache-2.0 · corre en tu computadora

Agentes siempre activos
en los que puedes confiar.

Cualquier modelo. Cualquier herramienta MCP. Cada acción pasa por una política que escribiste tú — permitir, preguntar o bloquear — registrada, con tope de costo y aislada. Garu es systemd para tus agentes.

Pruébalo en cinco minutos Dale una estrella en GitHub
$ git clone https://github.com/humbertovillanueva/garu && cd garu && npm install && npm run build

El video de lanzamiento de 45 segundos (aquí sin sonido). Tomay prepara tu día; Bea clasifica tu correo y redacta respuestas que esperan un toque, y no puede enviar. Las pantallas de la sala de control se reconstruyeron para el video; las reuniones y los correos son ejemplos.

Por qué

Los agentes que trabajan mientras duermes solo sirven si puedes dejarlos.

Dots de OpenAI y Muse de Meta corren todo el día y actúan por ti: cerrados, de un solo proveedor, no disponibles en buena parte del mundo. Garu es la versión abierta, construida alrededor de la parte que ellos tratan como un detalle: el control.

allow

Un núcleo de política delante de cada herramienta

Reglas por nombre de herramienta y por argumento: deja que un agente clasifique correo pero pregunte antes de cada borrador, que escriba solo en briefs/2026-*.md, y bloquea todo lo demás. Las herramientas que nunca podrían pasar la política nunca se le muestran al modelo.

ask

Una bandeja, no una avalancha

Cuando una regla dice preguntar, la ejecución se pausa. Ves el correo como un correo, el archivo como un archivo, el borrador como un borrador. Aprueba una vez, aprueba por 24 horas o rechaza. El silencio es un no.

block

Una política que aprende, contigo al mando

Aprueba lo mismo tres veces y Garu propone la regla más estrecha que cubre exactamente lo que aprobaste, y la escribe en tu archivo cuando tú lo digas. Los comentarios se conservan.

caja negra

Una caja negra

Cada turno del modelo, cada llamada a una herramienta, cada decisión y cada aprobación en un registro al que solo se agrega, un archivo por ejecución. Repasa cualquier ejecución como una línea de tiempo, en el navegador o con garu log.

$ tope

Un presupuesto en cada ejecución

El costo se estima a partir de los tokens reales a precio de lista. Una ejecución se detiene en el momento en que cruzaría maxCostUsd. Los modelos locales cobran $0 y aun así muestran lo que habría costado.

aislado

Cualquier modelo, en una caja

Gemini en el nivel gratuito, Claude, u Ollama en tu laptop: una línea para cambiar. Cada servidor de herramientas puede correr en su propio contenedor de Docker: sin red, raíz de solo lectura, solo la carpeta de trabajo del agente montada.

Cómo funciona

Un bucle, una puerta, un registro.

Un agente solo toca el mundo a través del Model Context Protocol. El núcleo de política se sienta entre el modelo y cada servidor MCP. La caja negra ve todo lo que ve el núcleo. La sala de control es una vista sobre esos archivos. No hay base de datos.

tú sala de control · CLI bucle del agente modelo política caja negra · .garu/runs/*.jsonl permitir → servidor MCP (Docker opcional) preguntar → bandeja → tú · web · teléfono bloquear → nunca se ejecuta, nunca se ofrece Gemini · Claude · Ollama
El Garufile

Un agente es un archivo YAML pequeño. La política es la parte interesante.

Esta es Bea, uno de los agentes de este repositorio: a las 7:15 entre semana clasifica el correo del día en cuatro etiquetas y redacta las respuestas. Leer y clasificar están permitidos, cada borrador te pregunta, y su servidor de Gmail no tiene ninguna herramienta para enviar.

name: bea
persona: { kind: bee, tagline: "Sorts the inbox so you don't have to." }
model: gemini/gemini-3.5-flash-lite
triggers:
  - cron: "15 7 * * 1-5"
budget: { maxCostUsd: 0.05 }

tools:
  - name: gmail                 # el servidor de Gmail de Garu
    command: node
    args: ["packages/mcp-google/dist/index.js", "gmail"]
    auth: oauth                   # inicia sesión una vez: garu auth
    oauth:
      issuer: https://accounts.google.com
      clientId: ${GOOGLE_CLIENT_ID}
      clientSecret: ${GOOGLE_CLIENT_SECRET}
      scopes: [https://www.googleapis.com/auth/gmail.modify]

policy:
  - tool: "gmail.search_threads"  # leer: siempre está bien
    action: allow
  - tool: "gmail.get_thread"
    action: allow
  - tool: "gmail.label_thread"    # una etiqueta se quita con un clic
    action: allow
  - tool: "gmail.create_draft"    # palabras en tu nombre: ves cada una
    action: ask
  - tool: "*"
    action: block

prompt: |
  You are Bea. Sort Humberto's inbox from the last day…

Gana la primera coincidencia

Las reglas se leen de arriba abajo. Si ninguna coincide, es ask: nunca un permiso silencioso.

Las reglas ven los argumentos

Los predicados when (eq, matches con ignoreCase, gt, in, …) permiten una herramienta para un solo host o una sola ruta y la bloquean en todo lo demás.

Bloqueado es invisible

Una herramienta que ninguna regla podría permitir no se le ofrece al modelo, así que nunca gasta un turno intentándolo.

Los secretos se quedan fuera del archivo

${VAR} se lee de .env al ejecutarse. El modelo nunca ve tus claves, y un servidor que inicia sesión recibe solo un token de una hora, nunca el secreto del cliente.

garu validate lo revisa

Reglas inalcanzables, patrones mal escritos, una clave que falta: se detectan antes de que el agente corra.

En tu teléfono

Aprueba desde la cama. O desde el autobús.

La sala de control se instala en tu pantalla de inicio. Habla con el mismo garu ui de tu computadora por Tailscale: HTTPS, solo tus dispositivos, nada expuesto a internet. Con ntfy configurado, llega un aviso push cuando un agente se pausa; un toque te deja en la tarjeta de revisión.

tailscale serve --bg 4000
# → https://your-mac.tail1234.ts.net
# Safari → Share → Add to Home Screen

Lee la guía del teléfono →

La sala de control en un teléfono: el borrador de respuesta de Bea para Lena mostrado como un correo, con Para, Asunto y el texto, y los botones Aprobar, Aprobar por 24 h y Rechazar sobre una barra de cuatro pestañas.
Inicio rápido

Cinco minutos, gratis.

Node 22+ y una clave gratuita de Gemini de aistudio.google.com (sin tarjeta). O sáltate la clave y corre un modelo local con Ollama por $0.

git clone https://github.com/humbertovillanueva/garu && cd garu
npm install && npm run build
printf 'GEMINI_API_KEY=your-key\nGARU_USER=YourName\n' > .env

npm run garu -- ui --up --as YourName       # control room at http://localhost:4000

Haz clic en pip en la barra lateral y pulsa Ejecutar ahora. Lee un archivo de notas, se pausa para preguntar antes de escribir un resumen, y tú apruebas desde el navegador. Luego escríbele un mensaje.

Los agentes de verdad, Tomay (tu día, a partir de tu agenda y tu correo) y Bea (tu bandeja, ordenada, con las respuestas redactadas), necesitan un proyecto gratuito de Google Cloud una sola vez: la guía de Google toma unos quince minutos.

npm run garu -- run examples/nook/Garufile.yaml      # fully local with Ollama, $0
npm run garu -- run examples/vault/Garufile.yaml  # tools in Docker, network off
npm run garu -- log pip                                   # replay the flight recorder