Backend for a habit-tracking application — 10+ REST endpoints, a normalized relational schema, and JWT-based authentication, built end to end in Flask.
Chose Flask to keep the API surface simple across 10+ endpoints. Normalized the schema across users/habits/logs tables to avoid duplicating habit metadata. Used JWT for stateless authentication instead of server-side sessions.
Kept auth checks consistent across every route using a reusable decorator that verifies the JWT before each handler runs. Kept JOIN queries readable as the schema grew by keeping foreign keys explicit and testing each query against sample data first.
A command-line expense tracker with persistent CSV storage, built to practice clean separation between data, logic, and display layers in plain Python.
Used CSV instead of a database since a single-user CLI tool didn't need server or schema overhead. Split the codebase into separate modules for data access, business logic, and display.
Handled invalid input (e.g. non-numeric amounts) without crashing using structured exception handling around every read/input operation. Kept the CSV file consistent across add/edit/delete by always rewriting the full file from an in-memory list rather than editing lines in place.