If you're like me, I toy around with side projects until they get boring. I'm great at 'proving the concept', and when I'm hired for pay, I don't generally have the same problems, but problems without clear objectives, or 'side projects' generally end up dying on the vine. A couple of improvements I've made over the years that help me finish.
1) Do the boring parts first. Start off writing (or using libraries for) the boring parts of your code that you don't like. Profiles? Logins? That sort of thing? You can generally drop something in that will service the need with very little effort, and replace it later if and when it gets traction. This leaves the 'fun' parts of code to be written that I generally prefer to work on.
2) Start using Github, as much as you can. Make meaningful commit messages, so that you can look at your commit history and see what you were doing and what you planned to do next. I often misuse the commit log and put things in like "Finished such and such, but I really need to implement function_x()". This lets me know what was a priority the last time I was working on it so that I don't start on new_function_y and then lose steam when I realize that, oh yeah, I forgot to do function_x, which new_function_y will need.
3) Use Github issues. If something isn't working as expected, only fix it if it's something dire. If it's just a glitch, or a render bug or something minor, then just create a Github issue to come back to it later. Also important that you set milestones. Alpha, Beta, Closed Beta, Release.. something like that. Don't tie to version numbers, just tie your milestones to actionable times. If you can implement three features and fix five bugs and then be able to show it to friends and family, that should belong to a 'closed beta' milestone. After that, let them report issues back to develop your 'open beta' milestone.
4) Break things down into the smallest tasks possible and avoid scope creep. Make an issue for every new enhancement and bugs. Pick a couple of boring issues and 1 really exciting one to work on per day. If the features are big enough that you can't do a couple a day, then they probably need to be scoped down and broken up in to smaller issues. How many you do a day isn't as important as making sure to knock out more boring things than exciting things to keep momentum going. By the time you get to the exciting thing, you should feel accomplished and motivated by the two boring things you already knocked out.
5) Hold yourself accountable to someone, something. If you've got potential customers as friends, let them in on it. Keep them updated weekly or bi-weekly. If you don't have potential customers, use a wife, a girlfriend, a teacher, a friend, whomever. Ask them to keep you moving forward and specify dates for milestones. There's a big difference between slacking off on your own and slacking off when you know that somebody at the end of the week is going to expect a progress report.