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:
notion.so/my-integrations→ New integration "Harvie"- Token
ntn_4733...saved in~/.hermes/.env - Created "OhanaSmart — Pipeline" page and connected it to the integration
- 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 planweekly_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:
- The data exists (leads in JSONs, running plan in
profile.json) but I have nowhere comfortable to see/touch it. - 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
-
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.
-
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.
-
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.
-
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.