I have this old project called Invoicepedia. I built it about six months ago when I was just starting out with full-stack development , Next.js, Clerk, Neon, basic CRUD. The usual “I just learned how to connect a database” kind of project.
I opened it recently, and honestly, it was rough.
The delete button would crash the app sometimes. You could submit an empty invoice form with no validation. The Stripe integration was half-working. I had both Drizzle and Prisma installed at the same time for some reason.
It was the kind of codebase you hesitate to touch because you don’t know what might break next.
I almost deleted it and moved on.
Instead, I decided to fix it.
Why Not Just Start Fresh
Every new project starts the same way , setup.
Auth, database, environment variables, middleware. Three to four days gone before you even start building the actual product. And somewhere in that process, interest drops or something breaks and the project gets abandoned.
Invoicepedia already had the foundation.
Auth worked. The database was connected. Routes existed. It wasn’t clean, but it was there.
So instead of starting from zero again, I chose to rebuild on top of what already existed.
Fixing Before Building
Earlier, I would’ve started adding features immediately , charts, dark mode, AI integrations. Anything that sounded interesting.
This time, I did the opposite.
I made a list of everything that was broken and fixed that first.
- Removed unnecessary dependencies
- Rewrote the database schema
- Added proper validation using Zod
- Replaced hard deletes with soft deletes
- Fixed middleware issues
- Added structured error handling
It took about a week, and visually nothing changed.
But internally, everything did.
The codebase stopped feeling fragile. I could make changes without worrying about breaking unrelated parts. That shift matters more than any new feature.
What I’m Actually Building
There are already plenty of invoicing apps.
Most of them either cost too much or try to do too much.
Some tools charge monthly and still limit basic functionality. Others pack in so many features that the interface becomes overwhelming.
The focus here is simpler.
This is for freelancers , developers, designers, writers , people who just need to send an invoice, track payments, and move on.
Not accounting software. Not a full financial suite.
Just something that does the basics well.
What Comes First
There are a lot of features that could be built , automated reminders, recurring invoices, client portals, expense tracking.
But waiting for everything to be “complete” usually means nothing gets shipped.
So the first version is intentionally small:
- PDF generation , a functional invoice should be exportable
- Email sending , invoices should be sent directly from the app
- A usable dashboard , clear visibility into paid, pending, and overdue invoices
That’s enough to make the product useful.
Everything else can come later.
The Real Goal
The goal isn’t scale right now.
It’s usefulness.
A small number of real users using the product properly is far more valuable than building features in isolation. Feedback matters more than assumptions at this stage.
Stack
- Next.js 15
- Prisma
- NeonDB
- Clerk
- Tailwind
- shadcn/ui
Rebuilding this project isn’t just about improving the app.
It’s about learning how to slow down, fix what’s already there, and build something that actually works , not just something that looks complete.