A todo app is the classic first Python project — and for good reason. It is small enough to finish in an evening, but it teaches you the fundamentals of real programs: reading input, storing data, saving it to a file, and organising code into functions. Every bigger Python project is built from the same pieces.
The whole app fits in one file. Here is the core of it:
import json import os FILE = "todos.json" def load_todos(): if not os.path.exists(FILE): return [] with open(FILE) as f: return json.load(f) def save_todos(todos): with open(FILE, "w") as f: json.dump(todos, f, indent=2) def add_todo(todos, task): todos.append({"task": task, "done": False}) save_todos(todos) print(f"Added: {task}") def list_todos(todos): if not todos: print("Nothing to do. Enjoy your free time!") return for i, todo in enumerate(todos, 1): status = "[x]" if todo["done"] else "[ ]" print(f"{i}. {status} {todo['task']}") def complete_todo(todos, number): todos[number - 1]["done"] = True save_todos(todos) print(f"Done: {todos[number - 1]['task']}") json saves your todos to a file, so they survive after the program closes. Each todo is a dictionary with a task and a done flag. The functions each do one job — load, save, add, list, complete — which is the habit that keeps real programs readable.
This project teaches you more than it looks like. You learn file handling, JSON, lists of dictionaries, and how to structure a program so a new feature — like priorities, due dates, or categories — is a small change instead of a rewrite. Try adding one: a due date is just one more field in the dictionary, and sorting by it is one line.
If you are learning Python and want a guided path from your first program to real projects, the Python section on Skill Library walks through it day by day, with examples and practice tasks for each step.
To build it, save the code above as todo.py, add a small menu loop that asks the user to add, list, complete, or quit, and run it with python todo.py. Add three real tasks from your day, close the program, open it again, and check they are still there. Then add your own feature — a delete command, or a priority flag — and make it yours.
Who is it for? Python beginners who have finished the basics and want their first real program. It is also a good interview project: it is simple, it works, and you can explain every line of it.
The limits are honest: this is a command-line app with one user and a local file — it is not a web app, it has no login, and it cannot sync between devices. For a first project that is exactly right; the web version, with Flask or Django, is the natural next step.
Your first step today: run the code, add your three most important tasks, and complete one of them. You have just built a program that remembers things for you — and that is what programming is for.


