← Portfolio
UX Case Study · Flutter · Android + iOS

Reminder apps only remember what you must do.

They cannot tell you who asked, or whether you already did it. Reminder Bunny catches a whole obligation from one spoken sentence — in English, Hindi and Marathi, mixed.

Product ownerRole
Solo, with AITeam
Idea → installed appScope
5 kinds, 1 engineOutput
In daily useStatus

Built in a day. Scoped in a week. The building was never the hard part — deciding what to refuse was.

01The mapPhase 1 of 7

Forgetting is three problems, not one.

Before designing anything I mapped what people actually forget. It falls into three buckets — and the tools we all use only serve the first.

Bucket 1

DO

“What was I supposed to do?”

A pending action. Call the bank, send the report, take the tablet.

Every reminder app handles this
Bucket 2

KNOW

“Who asked me, and what exactly?”

The detail attached to the action — who it came from, what they expect back.

Almost nothing handles this
Bucket 3

CONFIRM

“Did I already do it?”

The doubt after the fact. Standing at the door wondering about the gas.

Almost nothing handles this

The insight the whole product rests on: DO is the solved bucket. The suffering is in KNOW and CONFIRM, and that is where there is no help — so that is where a new app has a reason to exist.

02The rivalsPhase 2 of 7

Why the existing tools fail this user.

Not because they are badly made. Because they are built for someone who is already sitting down, in English, ready to type.

ToolCapture costMixed-language voiceStores who asked Confirms it was doneComes to youPrivate by default
Paper diaryMediumYesIf you lookNeverYes
Phone reminders4–6 tapsEnglish-firstNoNoYesCloud account
To-do appsForm + project + tagsNoA field, if you fill itA checkboxIf configuredCloud account
Medicine appsSetup wizardNoNoYesYesVaries
Notes / WhatsApp to selfFastYesBuried in textNoNeverCloud
Reminder BunnyOne sentenceEN · हिंदी · मराठीA fieldDone logAlarmOn-device only

The gap is not features — it is the moment of capture. A task arrives while you are already busy with something else. Anything that costs more than a sentence will not be used at the only moment it matters.

03ScopePhase 3 of 7

Ten cases, judged by one test.

Can the app genuinely catch it at the right moment, and push it back at the right moment? If the catching moment is one where nobody would ever reach for a phone, no amount of design fixes it — better to drop it honestly.

Build first5 cases
  • Someone gave me a taskHappens mid-conversation. Voice catches it in seconds.
  • I asked someone, must follow upThe same, with a check-back date.
  • Medicine and daily routineFixed, known time. Ideal for an alarm.
  • Did I already do it?If the app fires it, the app can record the Done tap.
  • Bills, EMI, renewalsDates known weeks ahead. Nothing is a surprise.
LaterRides the same engine
  • A passing ideaSame microphone. Nearly free once capture exists.
  • Locked the door? Gas off?Same Done log as medicine.
  • BirthdaysEasy — but everything else already does it.
DroppedHonestly
  • Forgetting a person’s nameYou will not pull out a phone mid-handshake. The catching moment does not exist.
  • Where I put somethingWhen you put the spare keys away, you are not thinking about an app.

Dropping two cases with a stated reason was more useful than shipping ten badly. A feature you will never trigger is not a feature.

04The enginePhase 4 of 7

Five cases. One thing underneath.

The discovery that made the product buildable: every case is the same shape — a thing, a time, a person, and a done mark. So it is not five features. It is one, built properly.

Said out loud, in mixed Marathi and English
Ramesh ne sangitla report pathvayacha ahe udya sakali
↓   one sentence, four answers
KindTask
WhatSend the report
Who askedRamesh
WhenTomorrow, 8:00 am
TaskSomeone gave it to you. Stores who asked.
Follow-upYou asked someone. Stores who owes you.
MedicineOne kind among five — not the app.
MoneyBills, EMI, renewals, with a date.
Note to selfA passing thought, caught before it goes.

The “who” field is the differentiator. The original problem was never “I forget the task” — it was “I forget that somebody gave me the task”. No mainstream reminder app has a place to put that person.

05The featuresPhase 5 of 8

Nine features. Each one answers a specific failure.

Nothing here was added because it would be nice to have. Every one exists because something broke — in the old tools, or in this app during real use.

Open app → choose type → title → date → time → save
One spoken sentence

Capture in one sentence

The problemA task arrives while you are already busy. Anything longer than a sentence never gets entered at the one moment it matters.
What it doesHold the mic, speak normally, done. No type picker, no date field, no form — the sentence is the whole input.
“Ramesh ne sangitla report pathvayacha ahe udya sakali”
WhoRamesh
WhatSend the report

Mixed-language understanding

The problemPeople do not speak one language per sentence. Voice tools assume they do, and mangle anything that switches mid-thought.
What it doesEnglish, Hindi and Marathi in the same line, in either script. The phone can only listen in one at a time, so the language sits as a chip under the mic — not buried in settings.
“after 5 minutes” → 5:00 pm
↓   fixed
“after 5 minutes” → 9:11 pm
also: in 2 hours · 20 minute baad · 10 minitanni

Time the way people say it

The problemRelative time is how anyone actually speaks. Read as a clock time it produces a confidently wrong answer — and a reminder that fires seven hours late.
What it doesGaps from now are understood as gaps, not hours. A relative reminder can never be marked as repeating, because “every 5 minutes from now” is never what was meant.
TaskSend the report
WhoRamesh asked
↳ and who owes you, on follow-ups

The person, kept with the task

The problemThe original failure was never “I forgot the task”. It was forgetting that somebody gave it to you — and no mainstream reminder app has a field for that person.
What it doesEvery task stores who asked; every follow-up stores who owes you. That single field is what turns a to-do list into an obligation you can honour.
WhatTake the tablet
When9:00 am
No time was said, so we picked 9:00 am · Change

It says when it guessed

The problemAn app that fills in a blank silently will eventually be wrong, and the user will never know until the reminder fails to arrive.
What it doesGuessing is allowed. Guessing invisibly is not. Every assumption is shown on screen with a one-tap way to correct it, before anything is saved.
🔔
Time for this
Take the tablet
Done ✓
Remind in 10 minSkip it

It keeps ringing until you answer

The problemA notification you can swipe away without reading is the same as no reminder. For someone who forgets, a silent dismissal is the failure mode.
What it doesIt rings until you tap Done, Snooze or Skip — and that tap is what fills the done log, which is what answers “did I already do it?” later.
Today  ·  empty
↓   but you just saved one
Nothing due today
Coming up · tomorrow 8:00 am · Send the report

Nothing you save can vanish

The problemToday only showed today. Save something for tomorrow and it disappeared from view — for a person who forgets, an app that swallows what he just told it is worse than useless.
What it doesA Coming up list sits under Today, and the empty state says what is ahead instead of pretending nothing exists.
Alarms are blocked by this phone · Fix
Android 12+ needs a separate “Alarms & reminders” permission
Falls back to an inexact alarm rather than none

It never fails silently

The problemThe worst bug in the project: exact alarms were being blocked by the phone, the scheduling call was failing, and nothing rang — while the app reported success.
What it doesEach reminder is scheduled independently so one failure cannot take the rest down, it falls back to an inexact alarm rather than none, and the home screen says plainly when the phone is blocking it.
🔒 Everything stays on this phone
No account · no sign-in · nothing uploaded
Opens straight into use — no setup to abandon

No account, nothing uploaded

The problemSign-up is where a personal tool loses people. And these reminders name real colleagues, doctors and money.
What it doesIt works entirely on the device. That is a privacy decision, and also the reason the app has no setup step to abandon before the first use.
06The screenPhase 6 of 8

Four things on screen, and a rule about honesty.

A hard limit was set before any drawing: one to three steps for any action. It killed forms, wizards and category pickers in advance.

Say it in one line, with what the app understood
Say it in one line — then what it understood, before you save
Today screen
Today — what is due now, what is coming later
Alarm behaviour settings
Keeps ringing until you tap Done — it will not go quiet on its own
Everything stays on this phone
No account, no sign-in, nothing uploaded anywhere

The rule that mattered most

  • The app may be wrong. It may never be quietly wrong.
  • If no time was said, it fills one in — and says so, with a Change button.
  • If the phone is blocking alarms, the home screen says it, with a button to the right settings page.
  • If a language pack is missing, it names the problem instead of mangling the sentence.

Why that rule exists

  • This app is for someone who already forgets. An app that silently forgets is worse than no app at all.
  • A confident wrong answer costs more trust than an honest “I did not understand”.
  • Guessing is fine. Guessing invisibly is not.
07The lookPhase 7 of 8

Three directions, decided by comparison.

Built as scrollable phones rather than flat images, so the choice was made by using them.

Calm Care direction
A · Calm Care · warm paper, deep green
Night Glass direction
B · Night Glass · dark, frosted, violet to cyan
Bold Minimal direction
C · Bold Minimal · big type, one electric colour
Pick a look comparison page
Pick a look · same screen, three styles, side by side
The approved navy direction
Shipped · navy — calm enough for a bedside alarm

The rejected option is the useful part: a warm orange call-to-action tested as cheerful, and this is an app that fires at 10 pm beside a bed. Tone is a functional decision, not a taste one.

08After user testingPhase 8 of 9

Thirteen rounds of using it changed the product.

Everything below came from one person living with the app on his own phone, in his own languages — not from a test suite, and not from a review. Each one is a real defect or a real gap, and what it forced.

13Rounds of feedback after the first working build.
9 → 3Fields on the manual form, after it was called too complicated.
1 → 9Repeat options, making monthly and yearly possible at all.
1Feature added and removed on the same day, on purpose.
The alarm now actually ringsFound on his own phone
Was

A scheduled notification. Android treats that as ordinary background work, so it delayed it, silenced it, or dropped it once the app closed. A notification arrived; no alarm ever sounded.

Now

A real alarm clock registration plus a foreground service at alarm volume — exempt from Doze and battery saving, and it keeps ringing until answered. The phone now lists the app under its own next-alarm register.

Why it mattersThe fix came from reading a working Android app I had built earlier rather than debugging this one further. The most valuable instruction in the project was “go and look at how you already solved this”.
A silent channel that could never be changedAlarm still failing after fixes
Was

The notification channel had been created deliberately silent so it would not clash with the service. Android will not let a channel be changed once created — so every phone that ran the early build was permanently stuck with a silent alarm, whatever we fixed afterwards.

Now

A new channel that carries the alarm sound itself, the old one deleted. Settings now also reports how many alarms the phone is really holding, and when the next one is.

Why it mattersThis is why it kept failing across several attempted fixes. A silent failure is worse than a loud one — so anything in this app that can quietly do nothing must now be able to say so.
Correct the reading, not the wordsTwo rounds, one week apart
Was

A misheard word meant redoing the whole thing. The result box was technically editable, but nothing said so — no cursor, no label, no affordance. “Looks editable” and “is editable” are not the same feature.

Now

Every line of the understood card is now a control — tap the time, the date, the person, the repeat. Two taps instead of a retyped sentence. The sentence box is still editable, but it is no longer the only way to fix a mistake.

Why it mattersThe first fix made the sentence box obviously editable. That was half right. Retyping words means guessing on top of a guess — the card is the reminder, so correcting the card is certain.
Nine fields became threeCalled the form too complicated
Was
9sections

The manual form had grown to nine sections: kind, title, who, detail, day, time, note, how often, how many days.

Now
3+ More

Three: what you need to remember, when (one date button, one time button), and a repeat switch. Everything else moved behind More.

Why it mattersThe same pattern as before — every fix arrives as a new control, and nobody adds nine on purpose. The difference this time was having a working older app to compare against.
Repeats that match real lifeAsked for the older app's options
Was
daily, or not

One switch: repeat daily, or not. A monthly EMI had to be saved as a one-off and then forgotten the next month — exactly the failure this app exists to prevent.

Now
30mHourly2h6hDailyWeekdaysWeeklyMonthlyYearly

Nine choices, from every 30 minutes to yearly. Monthly steps by one calendar month, so an EMI due on the 5th lands on the 5th rather than drifting. The sentence reader learned them too, in all three languages.

Why it mattersTwo whole categories — monthly bills and yearly renewals — were simply not expressible before.
Repeating reminders were invisibleTwo gaps found in real use
Was
today only

Today showed only today, and Coming up deliberately excluded repeats. So a repeating reminder could not be seen unless it happened to be due right now — and therefore could not be found in order to stop it.

Now
month view

A month calendar with a dot on every day that has something, amber when overdue. Repeating and one-off separated in the list, each repeat with its own Stop. And Stop repeating on the alarm screen itself.

Why it mattersBoth complaints were the same hole seen from two sides. The alarm screen is where someone actually wants to stop a repeat — the thing is going off, and they want it never to do that again.
Added on Sunday, removed on SundayLock-screen microphone
Was

A microphone on the lock screen was the logical end of the idea — but Android has not allowed third-party lock-screen widgets since 2014, and will not let an app draw over a locked phone. The closest possible was a permanent notification: one tap plus a fingerprint, not zero.

Now

Built, tried, and taken out the same day. It also had to un-post itself — a permanent notification already on the phone does not disappear when its code is deleted, so the app now cancels it and its channel on startup.

Why it mattersTwo lessons. Name the platform limit at the start rather than quietly shipping something that looks like the request. And removing a feature is not the same as deleting its code — anything already placed on the phone has to be taken back too.

The pattern across all thirteen: the machine was never the thing that noticed. Every one of these was found by a person using the app for real — and several had been passing their tests the whole time.

09The human partPhase 9 of 9

Five ways the human changed the outcome.

The app was built with AI in a day. These are the specific moments where a person changed what got built — not opinions, but interventions with consequences.

The working loop — where each side is actually strong
Human

Problem, user, constraints, and what is out of scope

AI

Framework, architecture, and the whole build — fast

AI

Confident output, including when it is off-course

Human notices, corrects, points at prior work↺ back to the top
Context in, framework outPattern 01
HumanThe problem, the user, the constraint: 1–3 steps, on-device, three languages
AIProposes an architecture, a data model and a build order from it

Give it the why and it will build a sound how, quickly. The framework was genuinely good — it just could not have been derived without the context, because none of it exists in any codebase.

It forgets what it is forPattern 02
Human“Start with medicine — it is the simplest case to prove the alarm”
AIBuilds medicine. Then names the screens after it.
AIdose field. “Add a medicine”. The person who asked is gone.
HumanPoints out the product has become a different product

The most costly pattern. Nothing failed — every screen worked as specified. The drift only exists relative to an intention, and the intention lives in the human's head.

Taste needs a reference, not a critiquePattern 03
AIProposes a warm orange call-to-action
HumanRejects it — the app rings at 10 pm beside a bed
HumanSupplies a visual reference to work from
AIProduces the navy direction, and holds it consistently

Saying “I don't like it” produces another guess. Handing over a reference converts taste into a specification the machine can actually apply — and then it stays applied across every later screen.

Only real use finds the real bugsPattern 04
AITest suite passes. Build ships.
HumanUses it on his own phone, in Marathi, for a week
Human“After 5 minutes” became 5 pm · Marathi mangled · nothing ever rang
AIFixes all three, once each was named

Every serious defect came from a person living with the app, not from the tests. The alarm bug is the sharpest: the app had been silently failing to schedule anything and reporting success.

Point it at prior workPattern 05
AIStuck on the core problem. Keeps producing variations.
Human“Look at how the earlier app solved this”
AIReads the previous build and applies the working approach

The unlock nobody talks about. The machine had no memory of a product built months earlier — but the human did. Knowing that a solved version already exists, and where, is context no model can retrieve on its own. Minutes of work, after hours of circling.

What the machine did, fast

  • A working Flutter app for both platforms, from a description
  • Three complete UI directions to compare, in minutes
  • A sentence reader for mixed English, Hindi and Marathi
  • Local database, alarm scheduling, migrations, tests
  • Every fix — once the problem had been named

What it never produced

  • The map. Splitting forgetting into DO, KNOW and CONFIRM — and seeing that the market only serves the first.
  • The refusal. Medicine was meant to be the first case; it quietly became the whole app. No test failed. Someone had to notice the product was becoming the wrong one.
  • The cuts. Two cases dropped on the grounds that the catching moment does not exist in real life.
  • Taste with a reason. Orange rejected because the app rings at bedtime, not because of preference.
  • Real use. Every serious bug surfaced from using it on a real phone, in Marathi — not from the test suite.

At each of those moments the AI was fluent, confident and wrong — and never once flagged it. That is the argument for the human, stated plainly: not that the machine is weak, but that its confidence carries no information.

3 bucketsDO, KNOW, CONFIRM — the map the product is built on.
5 kindsOne engine: a thing, a time, a person, a done mark.
3 languagesEnglish, Hindi and Marathi, mixed in one sentence.
2 droppedCases refused, with the reason written down.