The hardest question in designing a streak system isn't what it looks like. It's what happens when someone loses it.
A language app I'm working on has 100K+ users. We were mapping out streaks and the question came up: should the visual reward evolve the longer the streak goes? Like an avatar that levels up over time.
Sounds great on paper. The problem is that streaks break. Life happens. You miss a day at day 100 and everything you built visually resets to zero.
If the reward felt earned, losing it doesn't motivate a restart. It motivates an uninstall.
The counter argument is just as strong though. The risk of losing it is exactly why streaks work. Nobody opens an app at 11pm to protect something they don't care about.
That tension is the whole design problem. Make the streak too precious and losing it feels punishing. Make it too disposable and nobody cares enough to maintain it.
The best habit loops aren't built on complexity. They're built on something the user doesn't want to lose but can recover from if they do.