Focus on building something useful, then gradually refine.
I believe in software evolution. The first iteration should get the job done. Maybe it’s an API or a basic function that manipulates or visualizes data. It may not be pretty, clean or sustainable, but it should be useful to somebody before anything else.
What experience do you want your software to provide, and to whom? What do test users, yourself being the first, have to say about it? Once it’s useful, collect feedback and iterate on it until it is useable. Prioritize the biggest problems, and work on it until you feel the core experience is well supported. Add only the features that compliment it. Resist the urge to optimize for developer productivity until the product is well-defined. Let user feedback drive development for your best chance at discovering a viable product, which is often the greatest challenge in software development.
When you and your stakeholders feel you have a viable product, launch it. Your design instincts will be tested in the wild, and you should allocate time and resources to addressing issues that arise in production.
Sometimes with production software, it may look like starting over is the best approach. This is often not the case. Developers have a tendency to see most code as complicated, or ill-conceived, when in reality, it is necessarily complex. The true work of a developer is in the gentle and continuous evolution of software from one operational state to the next.