← All posts

Building a To Do App to Learn Where Simple Software Stops Being Simple

2023Python · Desktop

To do apps are a cliché beginner project for a reason. They look simple enough to start and just complicated enough to teach you where software complexity hides. That was the appeal.

I built this less as a productivity breakthrough and more as a way to learn event driven interfaces, persistence, and what happens when a small app starts accumulating state.

The Interesting Part Was Not Adding Tasks

Adding and deleting tasks was easy. The interesting part was everything around that. Searching. Filtering. Theme state. Validation. Persisting changes and keeping the interface in sync.

That was where the project started feeling like software instead of a coding exercise. Every user action changed both interface state and stored state. Keeping those aligned mattered.

One small thing I liked was deadline validation. It was basic, but it was one of the first times I thought about bad input as part of the design.

Why The Interface Mattered

Using CustomTkinter was part of the experiment. I wanted something less raw than default Tkinter while still understanding desktop GUI mechanics.

Dialog driven input was a deliberate constraint. It kept the main interface uncluttered, even if it was not the most scalable approach.

I also learned how much GUI work is event coordination. Buttons are easy. Managing what each action does to state and display is the work.

What Was Rough

This was a small project and it showed. Search and filtering rebuilt UI components in ways I would not keep now. That worked, but it was inefficient.

Task identity was also weak. Using names to mark complete or delete is fragile if duplicates exist. I would use unique identifiers immediately if rebuilding it.

There were unfinished ideas too. Recurring tasks were captured but not really implemented. There was no editing flow. Some features hinted at more than the project actually supported.

What I Learned

The useful lesson was that even tiny CRUD apps have architecture decisions hiding inside them. Data modeling starts earlier than you think.

I also realized many beginner projects become interesting once you stop treating them as tutorials and start treating design tradeoffs seriously.

Even dark mode, which was simple here, taught me how presentation state can leak into application logic.

What It Represented

This was an early project, and I would build it differently now. Probably split logic out of one file, use stronger models, and avoid refreshing the UI so bluntly.

But it represented an important step. It was one of the first times I could feel small product decisions compounding.

Simple apps stop being simple fast.

View all projects →View on GitHub ↗