Recommended Free Tools
Leandros Georgiou’s first substantial Python project was a terminal-based to-do list: it lets a user view, add, delete, and complete tasks, then saves the list in a JSON file so it can be opened again later. His account is a useful look at the decisions and debugging behind a small beginner project—not a benchmark or a claim that every first Python project should use the same design.
What the task tracker does
Georgiou describes the app as a task tracker that runs in the terminal, rather than a web or mobile service. Its menu offers five choices: view tasks, add one, delete one, mark one complete, or quit. The task list is saved to a JSON file, allowing the program to retain it between runs.
In the implementation described in the post, a TaskList class holds a dictionary. Each task name is a key, and its value indicates whether the task is complete: an empty list represents an incomplete task, while ["X"] represents a completed one. This is a deliberately small representation for a simple app.
How the menu handles input
The program repeatedly asks for a numeric menu choice, converts the response to an integer, and checks whether that number falls between 1 and 5. Georgiou says an early version could crash or appear to do nothing when someone typed a letter instead of a number. He also found an approach with separate loops confusing.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
#1 Best Overall
His eventual approach uses one loop to prompt for input, validate it, and perform an action only after the choice is valid. He describes this as the change that resolved the behavior he was debugging. It is a personal lesson from this program, not a rule that one loop is always the right design.
The account also describes two specific error cases:
Rank #2
try/except ValueErrorhandles a response that cannot be converted to an integer.try/except KeyErrorhandles an attempt to delete a task that is not in the dictionary.
These checks let the app respond to expected mistakes instead of stopping at the first invalid choice or missing task.
Why the data model stays simple
A dictionary keyed by task name keeps the current design compact. Georgiou suggests that separate Task and TaskList classes could be a future improvement if tasks need more information, such as due dates or priorities. He also says the extra structure is unnecessary for a small app as it stands. The post does not compare or benchmark the two designs.
Free tools Windows power users keep installed
One-click scans. No signup required.
What the project shows about a first real Python project
The account’s practical emphasis is less on adding features than on making the basic interaction behave predictably: save the data, offer the core task actions, and recover when input does not match what the menu expects. For someone choosing a first substantial project, this example shows how a modest terminal program can bring together a class, a dictionary, file persistence, a menu loop, and exception handling without requiring a web interface.
Georgiou’s original DEV Community post is available at “I built a task tracker as my first real Python project”.
Quick Recap
Best Value
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




