None.
In any case, you will have to think about the start of the project, deciding the general approach that you will take and what operations you will support.
Do it well enough and you will define the interface between the view and the underlying logic. Take a look at the Model-View-Controller approach for some inspiration.
What you want at an early stage is an idea of what basic operations your logical code must do in order to achieve the goal. This will usually be a simple function call, but sometimes it may include more than that. This is clear at first.
Further, a complex system that works is based on a simple system that works.
This means that you will need to have a basic interface that you will use to test the basic logical implementation. The simple form with the button that represents the message is quite simple. Then it can grow, you implement some of the functionality, and then add a simple user interface with which you can test it.
It is easier to do both in parts, and the logic and interface for a small part of the logic are conceptually similar, and it will be easy to track both, while you implement and verify.
The most important part is to keep the interface and logical isolation, forcing them to talk through a common interface. This will allow you to make quick changes as needed and improve the look of the GUI to the end.
You can better refuse the user interface if you do not like it. All you have to do is use the same interface that you know how to do it because you wrote it and you already implemented it.
If at some point you realize that you made a big mistake, you can still save part of the code, again, because the interface and logic are separate from each other, and I hope the logic part is also quite modular.
In short: think first, make both the UI and the logic small increments and keep modularity.