Back to blog
notionhermesohanasmartrunningtelegramlong-polling
·5 min read

Kanban Notion + Conversational Coach

On April 15th I did two things that seemed unrelated: built a Kanban board in Notion for OhanaSmart's leads, and added a conversational listener to my running bot @harvieRun_bot.

Together, they are the same step: Stop fighting with hidden data and agents, tie them to an interface I already use every day.

Problem 1: Leads Live in 17 Places

The OhanaSmart pipeline has leads in:

  • JSON files in ~/.hermes/workspace/projects/ohanasmart/leads/
  • Diana's mailbox IMAP
  • Gmail drafts
  • Telegram messages from the prospection cron
  • My head

That works for ~5 leads. For ~130 it's a disaster. Every morning I asked myself "Who do I need to follow up with today?" and the answer was "Open 4 tabs and remember".

It's not an agent problem. It's a human surface problem: I need a single view where I place leads in columns and move them. That's a Kanban. And I already use Notion every day.

What I Built

Step 1 — integration:

  1. notion.so/my-integrations → New integration "Harvie"
  2. Token ntn_4733... saved in ~/.hermes/.env
  3. Created "OhanaSmart — Pipeline" page and connected it to the integration
  4. Harvie auto-populated the Kanban

Step 2 — schema:

  • Status: New / Researched / Active / Responded / Closed
  • Sector: Coworking / Hotel / Residence / University / Restaurant
  • Owner, last contact date, email, notes

Step 3 — real data:

  • 4 active leads: DiR, CASA SEAT, Sant Antoni, Nobu
  • 16 batch 2 leads as "Researched": UB, Resa, Glovo, Wallapop, etc.

Since yesterday I open Notion, look at the "Active" column, and know exactly what to do. No questions.

What I Didn't Do (on Purpose)

  • Didn't write my own CRM
  • Didn't set up Airtable
  • Didn't pay for HubSpot
  • Didn't put a web dashboard in Hermes

The agent writes to Notion. Notion is the UI. I move cards by hand when status changes. If I want Harvie to move automatically, I'll do it when it hurts — not before.

Golden rule: The UI is solved (Notion). Don't reinvent what works.

Problem 2: Running Coach Didn't Listen

My running agent (~/.hermes/agents/running-coach/) had two cronjobs:

  • daily_check.py — 06:00 UTC, push to Telegram with day's plan
  • weekly_check.py — Sunday 10:19 UTC, push with weekly review

Push only. Zero input from me.

If I wanted to tell it "I can't today, push the workout to tomorrow", I had to edit JSON by hand. If I wanted to ask "How much have I done this week?", I couldn't.

A coach that doesn't listen is no coach.

What I Built — chat_listener.py

Long-polling against Telegram API for bot @harvieRun_bot (8617451500:...). 8.7K of Python. The essentials:

  • Filter by user_id — only respond to Johnny (406057010). If anyone else finds the bot, silence.
  • Rotating 20-message history — enough context for the coach to remember the conversation without exploding the prompt.
  • Two-phase proxy (:18792) with fallback to simple (:18791). If one goes down, respond anyway.
  • Haiku 4.5 model — stable, cheap, enough for a coach. Opus is overkill here.
  • Prompt prompts/chat.md — consultative tone, tough-love coach style, knows my Barcelona Marathon 2027 plan.
  • Live PID + crontab keepalive every 30 min — if it dies, it starts again.

Result

Last night I wrote "Today won't work, move it to tomorrow..." and "Hi". Both reached the listener, got parsed, went into history, and the model responded. The proxy timed out a couple times and fell back to simple — noted for review, but the chat worked.

For the first time I can have a conversation with the coach that's with me at the marathon. Not just receive orders at 6 in the morning.

The Common Rule

Both changes are the same:

  1. The data exists (leads in JSONs, running plan in profile.json) but I have nowhere comfortable to see/touch it.
  2. The agent already exists (Harvie, running-coach) but it only talks to me, doesn't listen.

The solution in both cases is the same: give the agent a surface where I already live — Notion for the pipeline, Telegram for the coach. No custom UI. No waiting for "when I have time". Tie the two ends and undo the mess.

This isn't sophisticated architecture. It's the minimum an independent builder has to do to turn a pile of scripts into a tool.

Stack Used (All Local Again)

  • Hermes agent framework (~/.hermes/)
  • Notion API (custom integration, not MCP)
  • Telegram Bot API (long-polling, no webhooks)
  • Local two-phase proxy (:18792) with Haiku 4.5
  • Python 3.11

Zero paid external dependencies. Zero vendor lock-in.

What I Learned

  1. UI is always the bottleneck. Not the model, not the architecture, not the prompts. The UI. If I can't see and touch my data comfortably, the system doesn't serve me even if it's technically brilliant.

  2. Use what you already use. I use Notion, I use Telegram. Putting my agents there is worth more than building a dashboard I'll never open.

  3. Long-polling is underrated. Everyone sets up webhooks with ngrok or Cloudflare Tunnel. Long-polling from a Python script against Telegram API is 150 lines and zero infra. For a personal bot with one conversation's traffic, it's overkill.

  4. The real cost of "small models". Haiku 4.5 through the proxy answers running questions in seconds, and a full conversation costs cents. Opus there is pure waste. I make each model decision case by case.

What's Next

  • Kanban fills with batch 2 responses in coming days
  • Chat listener needs higher Anthropic client timeout (proxy in queue)
  • Next: Harvie auto-updates Kanban when Diana gets an IMAP response (watcher exists, missing webhook to Notion)

Small, boring, useful. That's how things that last get built.


— I, Johnny — configured agent: Harvie. The UI is all that matters.


— I, Johnny — configured agent: Harvie. The UI is all that matters.