Inspiration

Most focus timers are either a bare countdown or a gamified garden that asks you for more attention. I wanted the opposite: a screen that is calm enough to glance at between thoughts, and honest enough to tell you what your week actually looked like.

Georgia gave me the scene: a mountain with the Georgian flag, clouds drifting across it, a table with khinkali and wine, and a character with a panduri waiting for you to finish. The hourglass on the table empties at the pace of your pomodoro.

What it does

Free, and complete on its own

  • Focus and break timer with your own lengths; the break can start automatically, going back to focus is always your decision.
  • An end-of-session alert that fires even with the app closed, with action buttons to start the next block without opening the app.
  • Time is measured against the wall clock, so leaving the app or having it suspended never loses or miscounts a session.
  • Today, last 7 days, completed vs. abandoned sessions, and how many times you left the app mid-pomodoro.

Geo Pomodoro Pro (one pro entitlement in RevenueCat)

  • Full statistics and the hours when you actually focus.
  • A calendar with every day in detail.
  • AI task breakdown: paste a big task, get it split into focus-sized sessions.
  • AI weekly coach: a short written summary of what really happened in your week.
  • Immersion Mode: pins the app and keeps the screen on, so leaving takes a deliberate gesture.
  • Unlimited categories and sync across devices (Google or Apple sign-in).

Available in English, Spanish and Georgian.

How I built it

  • Flutter app with BLoC, a local SQLite store and a session engine that is tested against a fake clock (pauses, suspension, clock moved backwards, timezone changes).
  • Rive for the scene: the art was layered and rigged by hand, and a state machine is driven by the timer, so the scene reacts to focus, break and finish.
  • RevenueCat for all monetization: offerings, a paywall, the pro entitlement as the single source of truth in the app, and webhooks into the backend.
  • Go backend (Postgres) that verifies RevenueCat webhooks, gates the AI endpoints on the entitlement, enforces a monthly AI quota, and syncs sessions across devices. The AI features run server-side, so no model key ever ships inside the app.
  • Self-hosted on a VPS behind Caddy, with Sentry and Grafana Cloud for errors and metrics.

Challenges

  • Exact alarms on Android. A timer that rings late is a broken timer. Getting the alert to fire on time with the app killed, across Android versions and aggressive OEM battery managers, took more work than the timer itself.
  • Performance of a living scene. A full-screen animated scene running for 25 minutes is GPU work the whole time. I profiled on a real device and cut the cost until the phone stays cool during a session.
  • Trusting the server, not the device. Pro status in the backend comes from RevenueCat webhooks and the REST API, never from the client, so AI quota and sync can't be unlocked by tampering with the app.
  • Real data vs. test data. Two serious bugs only appeared when I compared numbers between the app, my server and RevenueCat's dashboard. Now every purchase flow is checked end to end.

What I learned

That monetization is a product decision, not a checkout screen. Keeping the free tier genuinely useful and putting the AI inside Pro, instead of a higher tier, made the paywall much easier to explain.

What's next

  • iOS release (the build and Sign in with Apple are ready; waiting on the App Store paid agreement).
  • Real app blocking on iOS via Screen Time APIs.
  • More scenes from other regions of Georgia.

Built With

Share this project:

Updates

Submission history