Duolingo-Style Streak Flame Animation in SwiftUI
A streak flame is a small animation with a big job: make returning feel rewarding. Build the delight, but design the streak to forgive, not punish.
TL;DR
A Duolingo-style streak flame is an animated counter where a flame grows or pulses as the streak climbs, with a satisfying burst when the day is completed. Build it in SwiftUI with layered animations and respect Reduce Motion. The design choice that matters more than the code: make the streak forgiving, with freezes or grace days, so a single miss does not erase months of progress and turn motivation into guilt. Start from a free VP0 design.
Want a Duolingo-style streak flame that makes coming back feel good? The short answer: animate a flame that grows or pulses with the streak and bursts when the day is done, built in SwiftUI with a few layered animations. But the more important decision is not the animation, it is the streak design: make it forgiving, so one missed day does not wipe out months and turn a habit into guilt. Start from a free VP0 design, the free iOS design library for AI builders.
Who this is for
This is for builders of learning, fitness, and habit apps who want the rewarding streak moment that drives daily return, and who care about motivating users rather than pressuring them.
How the flame animation works
The effect is a small stack of animations. The flame has a base scale and a subtle, continuous pulse so it feels alive. When the streak increases, the flame scales up with a spring and its glow brightens, and the streak number counts up. On completing the day, a one-time particle burst celebrates the win. Apple’s SwiftUI animation system handles all of this declaratively: change a state value, describe the curve, and the framework tweens it.
| Layer | SwiftUI tool | Effect |
|---|---|---|
| Idle flame | continuous pulse | Feels alive, not static |
| Streak up | spring scale and glow | Rewards the increment |
| Number | animated count-up | Reinforces the milestone |
| Daily win | one-time burst | Celebrates completion |
| Reduce Motion | a calm fallback | Respects the setting |
Build it free with a VP0 design
Pick a streak or reward design from VP0, copy its link, and prompt your AI builder:
Rebuild this VP0 streak design in SwiftUI: [paste VP0 link]. Animate a flame that gently pulses, scales up with a spring and brighter glow when the streak increases, and plays a one-time burst when the day is completed. Count the number up, gate all motion behind Reduce Motion with a calm fallback, and show the streak count as text.
Streaks work: Duolingo has reported more than 100,000,000 monthly users, per Duolingo, and the streak is central to that habit. But the motion must respect users, so follow Apple’s Human Interface Guidelines on motion and honor Reduce Motion. For neighboring engagement craft, see a leaderboard podium animation, a confetti cannon animation in SwiftUI, and a habit tracker source code for the forgiving-streak model. The AI engine behind a learning app is covered in a DeepSeek API chat interface in SwiftUI.
Design the streak to forgive
This is the part that separates a kind product from a manipulative one. A streak that erases months of progress for one missed day creates anxiety, and the research on habit formation, summarized well by sources like Nielsen Norman Group, favors gentle consistency over pressure. Build in freezes or grace days, celebrate the return rather than scolding the lapse, and keep the streak a source of encouragement. The animation is the delight; the forgiveness is the ethics.
Repair and re-engagement
The kindest streak systems give a way back. A streak freeze that a user can earn or buy protects a day they cannot practice, and an occasional streak repair that restores a recently broken streak turns a discouraging lapse into a second chance. Pair that with a single, respectful daily reminder rather than a barrage of notifications. The goal is to make returning feel welcoming, so the flame represents a habit the user wants to keep, not a hostage you are holding.
Common mistakes
The first mistake is a punishing streak that wipes progress for one miss. The second is ignoring Reduce Motion. The third is conveying the streak only through animation with no text. The fourth is an idle flame so busy it distracts. The fifth is paying for a kit when a free VP0 design plus SwiftUI animations does it.
Key takeaways
- A streak flame is a pulsing flame, a spring on increment, and a daily burst.
- Build it with layered SwiftUI animations and a count-up number.
- Always honor Reduce Motion and show the streak as text.
- Make the streak forgiving with freezes or grace days, not punishing.
- Build the flame free from a VP0 design.
Frequently asked questions
How do I build a streak flame animation in SwiftUI? Animate a flame that pulses, scales up with a spring on each increment, and bursts on daily completion, with a count-up number and a Reduce Motion fallback.
What is the safest way to build a streak feature with Claude Code or Cursor? Start from a free VP0 design and prompt for the animation plus a forgiving streak with freezes, respecting Reduce Motion and avoiding guilt-driven patterns.
Can VP0 provide a free SwiftUI or React Native template for a streak UI? Yes. VP0 is a free iOS design library; pick a streak design and your AI tool rebuilds the flame animation and daily celebration at no cost.
Are streaks good or bad for users? They help when forgiving and harm when punishing. Build freezes or grace days so a single miss does not erase progress, designing for encouragement, not pressure.
Frequently asked questions
How do I build a streak flame animation in SwiftUI?
Animate a flame shape that grows or pulses with the streak count, and play a celebratory burst when the user completes the day. Layer a few SwiftUI animations: a scale and glow on the flame, a count-up on the number, and a one-time particle burst. Always gate motion behind the Reduce Motion setting.
What is the safest way to build a streak feature with Claude Code or Cursor?
Start from a free VP0 design and prompt for the flame animation plus a forgiving streak model with freezes or grace days. Respect Reduce Motion, label the streak count as text, and avoid guilt-driven dark patterns that punish a single missed day.
Can VP0 provide a free SwiftUI or React Native template for a streak UI?
Yes. VP0 is a free iOS design library for AI builders. Pick a streak, progress, or reward design, copy its link, and your AI tool rebuilds the flame animation and the daily-completion celebration at no cost.
Are streaks good or bad for users?
They help when they are forgiving and harmful when they are punishing. A streak with freezes or grace days motivates a gentle daily habit, while one that erases months for a single miss creates anxiety and guilt. Design for encouragement, not pressure.
Part of the UI Animations, Gamification & Microinteractions hub. Browse all VP0 topics →
Keep reading
Wheel of Fortune Spinner UI Template for iOS
A free SwiftUI spinner pattern: a smooth spin that lands fairly on a segment, with disclosed odds, Reduce Motion support, and no pay-to-spin. A reward, not gambling.
Confetti Cannon Animation in SwiftUI (Free Pattern)
A confetti cannon celebrates a real win with a burst of particles. Build it in SwiftUI, fire it only on genuine success, and respect Reduce Motion.
Leaderboard Podium Animation for iOS (Free SwiftUI Pattern)
Build a leaderboard podium that ranks your top three with a satisfying rise-into-place animation in SwiftUI, accessible and free, starting from a VP0 design.
Meditation Breathing Circle Animation in SwiftUI
Build a calming breathing-guide animation in SwiftUI: a circle that expands and contracts to pace breathing, with haptics, from a free VP0 design.
Lottie vs Rive for React Native Animations
Lottie and Rive both add rich animation to React Native, but they solve different problems. A clear comparison, plus how to pair either with VP0.
Rive Interactive Button in React Native
Build an interactive button with Rive in React Native: idle, press, loading, and success states in one animation, from a free VP0 design.