Inspiration

Like new grads do, we shoot for the stars at our dream tech companies by practicing LeetCode problems.

This summer, I took a CodePath technical interview prep course that taught me the UMPIRE ('Understand,' 'Implement,' 'Plan,' 'Implement,' 'Review,' 'Evaluate') protocol, which gives you a structured approach for breaking down and solving LeetCode problems.

The problem is, I still struggle with the clock. I've failed assessments because I can't solve problems fast enough. While FAANG companies give about 45-60 minutes for two complex problems, it can take me an hour to get through just one. :(

I realized I need a tool to help me track how I spend my time—specifically, to measure the time it takes to read the problem, write the pseudocode, and then implement the solution. Ideally, this would use seamless gestures, like a single tap or a swipe, so I can stay focused on my IDE.

I also need to practice the collaborative side of interviewing. I often forget to engage the interviewer with my thought process. A practice tool with an AI assistant could simulate this interaction, accounting for the time an interviewer speaks and helping me build that crucial muscle.

What it does

  • Timer clock has interactive UI for seamlessly moving between problem-solving stages.
  • Stage wheel is customizable to support any protocol (besides UMPIRE) with adjustable time limits.
  • Dynamic time management, monitoring, and feedback. (e.g., Did I recognize a pattern <30 seconds?)
  • Goes beyond being a timer with interviewer mode: once the clock starts, an AI-interviewer will read you the problem like a real interviewer does, will listen to your thought process, and answer clarifying questions. Uses your voice audio, current stage, and the LeetCode problem info for context. Powered by Google Gemini, conversations have low latency and minimizes the awkward pauses between you speaking and the AI-interviewer responding.
  • Stays up to date with latest LeetCode problems.

How I built it

  • I used Kotlin Multiplatform and Jetpack Compose libraries to build this app for Android, iOS, and the web.
  • Everything is in written in Kotlin with the MVVM architecture.
  • I used multiplatform-settings and DataStore for cross-platform caching.
  • I used leetcode-api for fetching LeetCode information.
  • I used Firebase AI Logic to call Gemini Live API for bidirectional audio streaming so that the user's voice streams to the Gemini model and streams back the AI's voice in real-time.

Challenges I ran into

  • Dependency collisions happened frequently between all three platforms.
  • IntelliJ kept crashing whenever I accidentally ran the emulator instead of deploying the app to my physical phone, or when running too many app processes at once (ex. web and Android app at once).
  • Gemini Live API functions are experimental and it was difficult to find the right dependencies.

Accomplishments that I'm proud of

  • Kotlin is my favorite programming language, and I'm so excited to have finally done my first MVP using Kotlin Multiplatform. Having fun with this project is my biggest win. :)

What I learned

  • How to use Dependency Injection in fake/mock tests.
  • Caching with DataStore instead of ViewModels + SharedPreferences.

What's next for LeetTime

  • Add 'Flex mode' for timer: allows overtime and wheel colors adjust based on current time.
  • Add 'Stopwatch mode': counts up and wheel colors adjust based on current time.
  • For the web: Have Gemini take a snapshot of your IDE when you ask a question for more context.

Built With

Share this project:

Updates