*/
Back to Blogs

Building ContestFlow: A Flutter App for Programming Contest Tracking

How I built a cross-platform contest tracking app with Flutter, tracking contests from Codeforces, CodeChef, and LeetCode.

Flutter
Dart
Material 3

The Problem

As a competitive programmer, I constantly needed to check multiple platforms for upcoming contests. I wanted a single app that aggregates contests from Codeforces, CodeChef, and LeetCode.

Tech Stack

  • Flutter for cross-platform UI
  • Dart for business logic
  • Material Design 3 for modern UI components
  • REST APIs from competitive programming platforms

Architecture

I followed a clean architecture pattern:

code
class ContestRepository {
  final List<ContestSource> sources;

  Future<List<Contest>> getAllContests() async {
    final contests = await Future.wait(
      sources.map((source) => source.fetchContests()),
    );
    return contests.expand((list) => list).toList()
      ..sort((a, b) => a.startTime.compareTo(b.startTime));
  }
}

Each platform has its own source implementation, making it easy to add new platforms.

Key Features

  • Real-time updates with pull-to-refresh
  • Dark mode support following Material 3 guidelines
  • Platform-specific branding with official logos
  • Countdown timers for upcoming contests
  • Filter and search by platform, difficulty, and time

Challenges

The biggest challenge was normalizing data from different APIs. Each platform has its own format for contest durations, start times, and difficulty ratings. I created a unified model that handles all variations.

GitHub
LinkedIn
youtube