eddo 0.9.0 and 0.10.0: telegram bot and timezone improvements
/ 3 min read
Table of Contents
Eddo, my open source agentic GTD side project, shipped 0.9.0 last week and 0.10.0 today. It’s been a while since the last releases!
0.9.0: Telegram assistant improvements
I created eddo’s first Telegram integration back in June 2025, feels like ages ago! Inspired by val.town’s butler-like agentic chat bot it was the first agent I build. It was super brittle but did it’s job for quite a while. It basically exposed the MCP features as tools for chat and can do todo CRUD and produce daily briefings (like an early concept of an agentic cron job!).
But while the bot was agentic in the sense that it could react to inputs and call tools to fulfill requests, it never supported an actual persisted chat history! Every user input just triggered another agent run to fulfill the task. So you couldn’t reference anything from ealier in the conversation, the agent wouldn’t know!
0.9.0 finally added persisted Telegram assistant chat history (#611). The implementation stores conversations per Eddo user in CouchDB and loads the active conversation before each assistant turn.
There is also a /new command now, which starts a fresh active assistant conversation. That gives me the behavior I wanted: persistence by default, explicit reset when the thread has gone stale. No support for compaction yet though!
Switching the bot from a Claude wrapper to pi-ai
So the telegram chat bot so far had no concept of a continuous conversation. It also lacked support for different model providers. I’ve used Anthropic’s SDK and that was it. I used the opportunity to migrate the existing code to a more generic provider wrapper with pi-ai (#602). I updated the integration tests too to reflect that. That “VCR” approach now supports recording conversations from multiple provides/models and will play them back on CI to test the recorded tool calls.
0.10.0: structured scheduling instead of title parsing
0.10.0 is mostly about improving timezone support. There was also so far no concept of scheduled times (I just had used the todo title field to mention the time). On todo creating this now gets parsed and something like 09:30 Euromaxxing becomes a title of Euromaxxing plus scheduledTime: "09:30". Due dates are normalized to date-only strings. The time is editable in the table and rendered as its own piece of metadata instead of being hidden inside the title.
The timezone work (#616, #627) was long overdue. Eddo now stores a user timezone preference and uses it in the web client, MCP briefing and recap tools, Telegram briefing schedules, daily recap prompts, and activity reports.
That’s it! Nothing too fancy but I thought I bring that out the door.