joe / sukar
All projects

TimeStop

Trust your sense of time.

A small timing challenge with a surprisingly rich set of modes: feel the interval, stop the clock, and find out how close your internal timer came.

My work
Game design, Flutter development, competition systems, and Android release
Platform
Android
Stack
Flutter / Dart / Riverpod / go_router / SharedPreferences / Supabase / Sentry
Have a related project? Let’s talk ↗
TimeStop home screen presenting the timing game and its modes
TimeStop's focused mobile interface.
The challenge
A tiny timing mechanic needs reliable measurement and a reason to return.
My contribution
Game design, Flutter development, competition systems and Android release.
The result
A shipped timing game with local measurement, varied modes and recoverable submissions.

How accurately can you feel time?

TimeStop asks the player to hold a target interval in their head. Start the clock, let the visible timing give way to a blind interval, then stop when the target feels complete. The result shows how close the attempt came.

I built and shipped the game through Jiss Tech for Android. The mechanic is small enough for a quick session, but it supports progression, practice, and competition without requiring a different fundamental interaction for every mode.

One interaction, several reasons to return.

Daily and weekly challenges give players shared targets and a limited official attempt. A six-character code connects two people for a duel, with a rematch available afterward. The progression path spans 45 levels across five worlds, moving toward longer and harder blind targets.

Practice changes the constraint: quick intervals, stopping without overshooting, a shrinking survival margin, a 100-round marathon, and extended focus. Those variations explore the same sense of timing while letting someone choose how much attention and time to commit.

Measure first. Render afterward.

The precision-sensitive work stays on the device. A monotonic Dart Stopwatch captures the stop before the result interface renders. Flutter provides the application experience, with Riverpod and go_router organizing state and navigation.

The network has a different responsibility: sharing the result. It does not decide how long the player's attempt took. Keeping measurement local separates a slow connection from the central game mechanic, so the score is based on the captured interval rather than a server response.

A lost connection should not erase an attempt.

SharedPreferences stores progress and pending submissions. An attempt is saved before upload, allowing synchronization to retry if the connection fails. Cached standings remain available while the client catches up.

Daily and weekly targets are derived from UTC dates. Supabase and PostgREST support leaderboard records, while Realtime broadcast and presence serve temporary duel channels. Persistent results and a live two-player session have different lifetimes, so they use different parts of the system.

Focus is also an interface decision.

The visual direction centers on prominent numbers, quiet color, and a direct start-and-stop action. Text-size controls, a colorblind palette, selectable accents, and separate sound, music, and haptics settings let players tune the experience.

Notification reminders can be disabled. Optional Play Games integration connects selected statistics, while progress remains stored on the device rather than becoming cloud save. Making those distinctions clear helps the game stay understandable when a player changes devices or adjusts their settings.

A complete game around a small idea.

The Android release includes ads, optional rewarded refills, and diagnostic services. These support a shipped application around the core mechanic, alongside the less visible work of navigation, persistence, retry behavior, and release maintenance.

TimeStop displays timing differences in milliseconds; that display is not a promise of certified hardware accuracy. The useful design choice is that measurement, feedback, and network submission each have a defined job. A simple game still benefits from careful boundaries when an attempt matters to the player.

How it fits together.

  1. 01

    Set the target

    Choose a challenge, level, practice mode, or coded duel.

  2. 02

    Feel the interval

    Start, focus, and stop against the device's monotonic timer.

  3. 03

    Save & compare

    Keep the attempt locally before synchronizing eligible results.

Next project
CMD Mail

Got a good problem?

Tell me what you’re building—or what needs to work better.

Start a project ↗