// Python Dev
Why I decided to build the billionth ToDo app in my spare time
Published on 2026-06-01
A todo app is a kind of Hello World in the programming world. Every developer has made one at least once, usually at the very beginning, when you don’t yet know what to write but already want to create something that works. The difference is that most of those projects are not meant to be used in real life. I made an app that I use myself.
It all started on a regular evening: I was sitting at the computer in that state when you’re too lazy to work, but your hands are itchy. I remembered my long-standing idea — to make a sort of notebook with elements of a todo list. Of course a paper notebook on the desk is convenient, but it’s hard to find things in it. Like many people, I constantly try to bring order to my work, but it’s hard to pick the right tool. At some point you catch yourself spending more time choosing the tool than doing the tasks. Fine, I decided, I’ll make my own.
Why the ready-made ones didn’t work
It’s not about functionality. They usually have enough features, often even too many. The problem is different.
First, convenience: to write down a task, you need to open the app, find the right list, formulate the task in the format the system expects. It’s a small thing, but it’s exactly what kills the habit. The brain is lazy — if adding a task is a bit inconvenient, it’s easier to “remember” it and forget.
Second, emotional connection. A ready-made tool is not yours. You didn’t put anything into it except a few minutes for registration. It’s easy to abandon. Your own tool works differently: you spent time on it, you know how it’s built, you want to use it at least out of principle. And as a bonus — it’s easy to add new features.
What came out
The bot lives in Telegram — where I already spend most of my working time. No separate app, no context switching.
You can add a task in free form: just write what needs to be done, with or without a deadline. An LLM parses the text, extracts facts and dates, and writes them to the list. You can write “call Vanya on Friday evening at six” — the bot will understand. But the main thing — you can just send a voice message. Hold down the button in Telegram, dictate what needs to be done and when — and it’s done, the entry is created.
But the most interesting feature is something else.
Voice message as a task
If you work with people in messengers, you know this scenario: a client or partner sends a two-minute voice message at 11 p.m. It contains a task, a deadline, details. And all of this somehow must not be forgotten.
Before: you listen, retell it to yourself, write it down manually. Yes, Telegram can transcribe the text, but you have to read it and pick out the facts. Now: forward the voice message to the bot — and the task is already in the list. The LLM parses the audio, extracts the essence, and adds it to the list. Nothing is lost. And if there were deadline dates — they get attached too.
Technically
The bot is written in Python with aiogram, tasks are stored in PostgreSQL. Voice is recognized locally via Vosk — a small model I run on my server, so there’s no need to pay for an API. Classification and data extraction go through OpenRouter, I use Gemini — at these volumes it’s literally pennies per month. We don’t load a lot of context, we only classify the text and look for facts — the LLM does this very quickly and accurately.
Deployment is via Docker on a self-hosted server. Cursor with a Pro subscription helped put together the first working version — from idea to a functioning bot with voice input in about two hours. And I didn’t even open the code: I formulated the architecture, the plan, iterated through tests and fixes.
Honestly, a significant part of those two hours was spent not on development — but on coming up with a name, registering the bot, writing the description and creating an image. That’s work too.
Group chats
You can add the bot to a group chat — then it becomes possible to assign tasks to several people. Tasks are tied to specific users.
There is a nuance here: Telegram doesn’t give bots the user_id of chat participants just like that. A user must interact with the bot in the group chat themselves — perform any command. After that the bot receives an event with userId and chatId, and from that moment it can address tasks to that person.
In the list, tasks are grouped by status: overdue, for today, others. Each can be marked as done.
Notifications — necessary?
I haven’t added notifications yet, and that’s a deliberate decision. Annoying reminders are irritating — and it’s easy enough to open the bot and check your personal and shared tasks. If the need appears — I’ll add them. The bot is fully editable. I don’t see the point yet.
Conclusion
A todo is truly a Hello World. But it’s in simple tasks that you can see what makes a tool work in practice, not just in theory. For me, a combination of three things worked: remove the inconvenience of creating a task, work in the environment where you already spend time, and make the tool yours — not someone else’s.
The main takeaway I got from that evening: you don’t need to tolerate tools that don’t fit. Making something for yourself today is much easier than it seems — especially if you have a clear idea of what should work differently. Sometimes two hours and the right prompt solve a problem that had been covered by an inconvenient compromise for years.
If you want to try the bot — @eshche_tudushka_bot. Interface in Russian.
And if you have an idea for your own tool but no time or desire to figure it out yourself — write, we’ll discuss. Or send a voice message.
// Python Dev
Другие статьи Python Dev
2026-05-30
Two days on a task that seemed trivial: asynchronous loading in Telegram bots
There’s a class of tasks that look like fifteen minutes of work. Then you sit down to them and discover it’s not about the code — it’s about how the system is …
2026-05-15
n8n: a pretty wrapper that ate up two days
The client came with an idea: they have access to the level.travel API, hundreds of Telegram channels for travel agents, and a desire to automatically publish …
2026-05-14
How to integrate an LLM with memory: store the facts yourself
LLMs reason very well. Their memory is poor. Ask an AI assistant about something you mentioned earlier in a long dialogue — and it might get confused, mix up …
// Python Projects
Проекты Python Dev
2026-05-28
Robot collector: automatic debtor calls
An automated voice-calling system for debt collection with Google Sheets integration, speech synthesis, response recognition, and repeated call attempts.
2026-05-27
Automatic management of a Telegram channel network for a travel agent
An automated publishing system for 150 Telegram channels with tour and flight selection, image generation, and scheduled posting.
2026-04-29
Automated call transcript: from recording to a structured document
Automatic call minutes: from recording to a structured document Distributed teams spend a lot of time on calls. They discuss tasks, make decisions, assign …
// Contact
Need help?
Get in touch with me and I'll help solve the problem
Message on TelegramОтвечаю в течение рабочего дня (03:00–13:00 GMT)
Или оставьте заявку здесь: