Why build instead of install
Existing to-do bots were either unmaintained, overcomplicated, or mismatched with how I organize tasks. Building a custom bot gave me clear control over behavior, command naming, and data structure.
Core product goals
- Slash commands only for discoverable usage.
- Multiple named lists per server.
- Durable storage that survives restarts.
- Fast bulk task input for planning sessions.
Technology choices
- Runtime: Python
- Library:
discord.pywithapp_commands - Persistence: JSON file (
todo_data.json) - Secrets: environment variable in
.env
JSON was selected intentionally for simplicity. For this scope, it is enough and keeps the project easy to move across environments.
Data model
Data is scoped by Discord guild ID so each server has isolation by default.
{
"guild_id": {
"current_list": "default",
"lists": {
"default": []
}
}
}
Command design
All functionality is grouped under /todo to keep command discovery clean.
/todo addand/todo add-bulkfor input flow./todo listfor indexed output./todo checkand/todo uncheckfor status updates./todo create-list,/todo switch, and/todo delete-listfor context control.
Deployment path
The bot can run locally in seconds and can be deployed to Railway, Render, Heroku, or a VPS depending on uptime and budget needs. Setup remains simple:
pip install -r requirements.txt
python todo_bot.py
Outcome and lesson
The final bot solved the original workflow problem with fewer dependencies and better predictability than off-the-shelf options.
Good tooling is not always feature-rich. It is often just opinionated enough to match real usage patterns.