Get the stupidest thing done and finished. I started my compiler with waay too much ambition. I planned out a Hindley Milner type system but with row polymorphism. I planned out the entire syntax, records and all. But I didn't actually have anything done. I spent so much time trying to think about how to implement x feature or y feature because I thought I should get it all done at once. It took me maybe a year to figure out that I should just get the stupidest thing working: arithmetic from parsing to code gen. I had resisted this because frankly there's a million tutorials online about making a calculator compiler. But who cares? It doesn't have to be original. It needs to be done.
Also only learn one new thing at a time. Don't make a side project where you're learning to write a compiler in a language that's new to you. That's two new topics and therefore infinitely harder.
The unpredictable schedule of a personal project means that you can't have unfinished work over long periods of time. You have 2 hours today. Get the smallest thing done to satisfy your goals for today no matter what it takes. You can always do it better in the future because there is no boss that interrupts you and tells you to work on feature X.
Also only learn one new thing at a time. Don't make a side project where you're learning to write a compiler in a language that's new to you. That's two new topics and therefore infinitely harder.