Volver al blog
notionhermesohanasmartrunningtelegramlong-polling
·5 min de lectura

Kanban Notion + coach conversacional

El 15 de abril hice dos cosas que parecen no tener nada que ver: monté un tablero Kanban en Notion para los leads de OhanaSmart, y le puse listener conversacional al bot de running @harvieRun_bot.

Mirándolas juntas, sí la tienen: las dos son el mismo paso. Dejar de pelearme con datos y agentes escondidos, y atarlos a una interfaz que ya uso todo el día.

Problema 1: los leads viven en 17 sitios

El pipeline de OhanaSmart tiene leads en:

  • JSON files en ~/.hermes/workspace/projects/ohanasmart/leads/
  • IMAP del buzón de Diana
  • Drafts en Gmail
  • Mensajes en Telegram del cronjob de prospección
  • Mi cabeza

Eso funciona para ~5 leads. Para ~130 es un desastre. Cada mañana me preguntaba "¿a quién tengo que follow-uppear hoy?" y la respuesta era "abre 4 pestañas y recuérdalo".

No es un problema de agente. Es un problema de superficie humana: necesito una vista única donde me coloque los leads en columnas y los mueva. Eso es un Kanban. Y yo ya uso Notion todos los días.

Lo que monté

Paso 1 — integración:

  1. notion.so/my-integrations → New integration "Harvie"
  2. Token ntn_4733... guardado en ~/.hermes/.env
  3. Creé una página "OhanaSmart — Pipeline" y la conecté con la integration
  4. Harvie pobló el Kanban automáticamente

Paso 2 — schema:

  • Status: Nuevo / Investigado / Activo / Respondido / Cerrado
  • Sector: Coworking / Hotel / Residencia / Universidad / Restaurante
  • Responsable, fecha último contacto, email, notas

Paso 3 — datos reales:

  • 4 leads activos: DiR, CASA SEAT, Sant Antoni, Nobu
  • 16 leads de batch 2 como "Investigado": UB, Resa, Glovo, Wallapop, etc.

Desde ayer abro Notion, miro la columna "Activo", y sé exactamente qué hacer. Sin preguntarme nada.

Lo que no hice (a propósito)

  • No escribí un CRM propio
  • No monté Airtable
  • No pagué HubSpot
  • No metí un dashboard web en Hermes

El agente escribe en Notion. Notion es la UI. Yo muevo las cards a mano cuando cambia un estado. Si quiero que Harvie mueva automáticamente, lo haré cuando me duela — no antes.

Regla de oro: la UI está resuelta (Notion). No reinventes lo que funciona.

Problema 2: el coach de running no hablaba

Mi agente de running (~/.hermes/agents/running-coach/) tenía dos cronjobs:

  • daily_check.py — 06:00 UTC, push a Telegram con plan del día
  • weekly_check.py — domingo 10:19 UTC, push con revisión semanal

Push only. Zero input mío.

Si quería decirle "hoy no puedo, pasa el entreno a mañana", tenía que ir al JSON a mano. Si quería preguntarle "¿cuánto llevo esta semana?", no podía.

Un coach que no escucha no es un coach.

Lo que monté — chat_listener.py

Long-polling contra la API de Telegram para el bot @harvieRun_bot (8617451500:...). 8.7K de Python. Lo esencial:

  • Filtro por user_id — solo respondo a Johnny (406057010). Si alguien más encuentra el bot, silencio.
  • Historial rotativo de 20 mensajes — contexto suficiente para que el coach recuerde la conversación sin explotar el prompt.
  • Proxy two-phase (:18792) con fallback al simple (:18791). Si uno se cae, responde igual.
  • Modelo Haiku 4.5 — estable, barato, suficiente para un coach. Opus es demasiado para esto.
  • Prompt prompts/chat.md — tono consultivo, estilo coach mano dura, conoce mi plan de Maratón Barcelona 2027.
  • PID vivo + crontab keepalive cada 30 min — si se muere, arranca solo.

Resultado

Anoche le escribí "Hoy ya no sera preparamelo para mañana..." y "Hola". Los dos llegaron al listener, se parsearon, se metieron en el historial, y el modelo respondió. El proxy tardó un par de veces y cayó al fallback — anotado para revisar, pero el chat funcionaba.

Por primera vez puedo tener conversación con el coach que me acompaña al maratón. No solo recibir órdenes a las 6 de la mañana.

La regla común

Los dos cambios son lo mismo:

  1. Los datos existen (leads en JSONs, plan de running en profile.json) pero no tengo dónde verlos/tocarlos cómodamente.
  2. El agente ya está (Harvie, running-coach) pero solo me habla, no me escucha.

La solución en ambos casos es la misma: darle al agente una superficie donde yo ya vivo — Notion para el pipeline, Telegram para el coach. No construir una UI propia. No esperar a "cuando tenga tiempo". Atar las dos puntas y deshacer el desorden.

Esto no es arquitectura sofisticada. Es lo mínimo que un builder independiente tiene que hacer para que el sistema deje de ser un montón de scripts y pase a ser una herramienta.

Stack usado (otra vez todo local)

  • Hermes agent framework (~/.hermes/)
  • Notion API (integración propia, no MCP)
  • Telegram Bot API (long-polling, no webhook)
  • Proxy two-phase local (:18792) con Haiku 4.5
  • Python 3.11

Cero dependencias externas de pago. Cero vendor lock-in.

Qué aprendí

  1. La UI siempre es el cuello de botella. No el modelo, no la arquitectura, no los prompts. La UI. Si no puedo ver ni tocar mis datos cómodamente, el sistema no me sirve aunque sea técnicamente brillante.

  2. Usa lo que ya usas. Yo uso Notion, uso Telegram. Meter mis agentes ahí vale más que montar un dashboard propio que luego no voy a abrir.

  3. Long-polling está infravalorado. Todo el mundo monta webhooks con ngrok o Cloudflare Tunnel. Long-polling desde un script Python contra la API de Telegram son 150 líneas y cero infra. Para un bot personal con tráfico de una conversación, sobra.

  4. El coste real del "modelo pequeño". Haiku 4.5 por el proxy responde a las preguntas del running en unos segundos, y una conversación completa cuesta céntimos. Opus ahí es gasto puro. Cada decisión de modelo la tomo caso por caso.

Qué viene

  • El Kanban se va a llenar de respuestas de batch 2 en los próximos días
  • El chat listener necesita subir el timeout del cliente Anthropic (el proxy está en la cola)
  • Próximo paso: que Harvie actualice el Kanban automáticamente cuando Diana recibe una respuesta por IMAP (watcher ya existe, falta el webhook a Notion)

Pequeño, aburrido, útil. Así se construyen las cosas que duran.


— yo, Johnny — agente configurado: Harvie. La UI es lo único que importa.