This is a submission for the DEV Weekend Challenge: Community
The Community
This project inspired by observing how quickly motivation can drop among my peers—not just in programming, but in other activities as well. Many people struggle to see the results of their efforts immediately, which often makes it hard to stay consistent. I wanted to create a tool that helps users track their time spent on tasks or learning sessions, while also giving instant feedback and a sense of progression.
What I Built
I built Solo Learning, an app that gamifies productivity and learning. Users can set timers for their tasks, and after completing each timer, they earn XP (experience points) and level up—similar to a game. This system allows users to visually see their progress and stay motivated, even for tasks that take time or effort to complete.
This is an MVP version, and while I had many more ideas for features like multiple timers, progress charts, and advanced analytics, I was limited by the two-day timeframe and my current level of experience with Flutter. Despite these limitations, I focused on creating a working prototype that clearly demonstrates the core concept of motivating users through visualized progress and gamification.
Demo

This is a main screen. Here you can see your level, how much xp you need before the next one, and a motivational block (it was planned to make a diagram there to show how much time was spent, but I didn’t have time to implement it)

This is a screen with a timer. After the timer ends, the user receives xp

This is a congratulations screen where it is indicated that the user has earned 50 xp

This is the level up congratulations screen.
Code
The project is available on GitHub: (https://github.com/RatRatatyu/SoloLearningApp)
How I Built It
I built this project entirely in Flutter, using Provider for state management. I focused on creating a clean and responsive interface with interactive components like timers, progress indicators, and level-up notifications. The gamification elements were designed to be simple yet engaging, allowing users to see immediate rewards for completing tasks.
class stateProvider extends ChangeNotifier{
bool isLevelUp = false;
int levelNow = 1;
late int nextLevelXp = 100;
int totalXpNow = 0;
void levelUp(){
levelNow++;
isLevelUp = true;
nextLevelXp = levelNow * 100;
notifyListeners();
}
void resetLevelUp(){
isLevelUp = false;
notifyListeners();
}
void xpUp(int xp){
totalXpNow += xp;
if (totalXpNow >= nextLevelXp){
totalXpNow -= nextLevelXp;
levelUp();
}
notifyListeners();
}
}
I created a stateProvider class that handles XP, levels, and level-up logic. Functions like xpUp(), levelUp(), and resetLevelUp() manage the user’s progress. This way, all the core data is centralized and easy to track.
final isLevelUp = context.select((stateProvider p) => p.isLevelUp);
if (isLevelUp) {
WidgetsBinding.instance.addPostFrameCallback((_) async {
await Navigator.push(
context,
MaterialPageRoute(builder: (_) => levelUpWidget()),
);
if (!context.mounted) return;
context.read<stateProvider>().resetLevelUp();
});
}
On the main screen, I monitor whether the provider has been updated and whether the level has increased, which would show a screen with rewards
timer = Timer.periodic(const Duration(seconds: 1), (t) {
if (remainingTime.inSeconds > 0) {
setState(() {
remainingTime -= const Duration(seconds: 1);
});
} else {
t.cancel();
setState(() {
isRunning = false;
});
Navigator.push(context, MaterialPageRoute(builder: (context)=> xpUpWidget()));
}
});
}
After the timer has expired I show the user a screen to increase xp
Also, pictures with cats were created using AI
Although this is my first submission to a challenge like this, it has been an invaluable learning experience. I now understand more clearly the areas where I need to improve and the tools I want to explore further. I plan to continue developing this app beyond the competition, adding features such as multiple timers, progress charts, more interactive animations, and overall polish for a future release.
I also want to wish good luck to all other participants! For me, the main goal was not only competing but testing my skills, learning, and gaining experience, and I look forward to participating in similar challenges in the future.
Top comments (0)