localStorage persistence
A to-do list that forgets everything on refresh is useless. Adding localStorage persistence with a single useEffect hook made the app actually useful while teaching me about the React lifecycle and side effects.



A React task manager with Tailwind CSS — add, complete, and delete tasks with a clean, minimal interface.
A to-do list that forgets everything on refresh is useless. Adding localStorage persistence with a single useEffect hook made the app actually useful while teaching me about the React lifecycle and side effects.
Directly mutating the tasks array was tempting but wrong. I deliberately used spread operators and array methods (map, filter) to produce new arrays on every update — building the functional programming instincts that matter in larger React codebases.
Tasks need unique IDs for React's key prop and for deletion logic. Rather than importing uuid, I used Date.now() combined with a counter to generate IDs — a simple but effective approach that also taught me why a proper ID strategy matters as state grows.