Breathing New Life into an Old Tasks App
Status: Design Phase
I’ve been using a web app called Tasks for years. It started life as an open-source PHP and JavaScript project, and back then it was exactly what I needed. Over time, though, the cracks showed. The codebase ballooned into 4,800 files across 500 folders. Much of it was outdated, stitched together by decades-old practices.
Every small change felt like pulling a thread from a fraying sweater. Finally, at some point, I stopped asking “How can I patch this?” and started asking “Wouldn’t it be easier to just rebuild?”
Why I Decided to Rebuild
Patching an old app can work for a while, but there are costs:
- Time loss: Debugging legacy PHP scripts means spending hours untangling problems that modern tools solve automatically.
- Fragile features: Adding new functionality often breaks something old.
- Maintenance debt: The longer you keep patching, the harder it gets to modernize later.
Rebuilding will give me a clean slate. Instead of dragging legacy code along, I can focus only on the features I actually use: projects, tags, quick-add input, and recurring tasks.
Picking a Modern Toolkit
The trick is choosing tools that are both powerful and approachable:
- Next.js – A framework that lets you build both the interface (what you see) and the backend (how the app talks to the database) in one place.
- Prisma – A friendlier way to work with databases, turning raw SQL into easy-to-use objects.
- React + TanStack Query – React handles the UI; TanStack Query keeps data in sync and makes the app feel snappy with instant updates.
- Zod – A safety net that validates input before it hits the database.
- Docker (perhaps) – Creates a MySQL database locally with a single command, avoiding messy setups.
These tools mean less boilerplate, fewer bugs, and more confidence in every feature.
What the New Version Will Do
My rebuild, Tasks 2.0, will cover the essentials without the bloat:
- Organize naturally – Tasks belong to projects and can be tagged for quick filtering.
- Stay on top of things – Each task can have a due date, priority level, and even a recurrence rule for repeating schedules.
- Quick-add input – Type:
Pay invoice p:Finance @tax !tomorrow #highand the app understands: title = Pay invoice, project = Finance, tag = tax, due date = tomorrow, priority = high. - Feels fast – Add a task and it shows up instantly. The server confirms in the background, and if something fails, it rolls back gracefully.
A Simpler Setup
Instead of wrestling with hundreds of folders, the new version will start clean:
- Install dependencies (
npm i). - Point it to a database in a
.envfile. - Run one command to set up the tables.
- Seed a demo task to see it in action.
- Start the app and open it in the browser.
And if I don’t feel like setting up MySQL manually? I can fire up the included Docker file and be ready to go.
The Road Ahead
The foundation is solid, but there’s plenty of room to grow:
- Add authentication so multiple people can use the app securely.
- Bring recurring tasks to life with a background job system.
- Upgrade search from simple text matching to something more powerful.
- Write migration scripts to pull old data into the new structure.
Lessons Learned
Sometimes the smartest way forward isn’t another patch. It’s walking away from the old scaffolding and building what you actually need, with tools that make sense today.
The new Tasks 2.0 will be smaller, faster, easier to understand—and it will finally feel fun to work on again.
Rebuilding will give me not just a better app, but peace of mind.