← back

Three Places My App Answered a Person With Silence

#product-decisions#ui-ux#ai-product-management#responsible-ai

A reminder that vanished at night, a button that went grey without saying why, and a rule I reversed, three places my product answered with silence and was wrong.

For several nights my own evening reminder did not arrive. The setting was on and I had saved it, and nothing came. Today I traced it, shipped the feature that was supposed to be the day's work, and reversed five of my own design decisions along the way. The thread through all of it, which I only saw at the end, is that every time the product answered a person with silence, the silence was hiding something.

Prove the server before you touch the phone

My first instinct was the phone. Settings, permissions, something I had toggled. I made myself start at the other end instead, because a phone has a hundred settings and a server has logs.

The logs were unambiguous. The scheduler had run every minute for a week without a failure. The sender had been called once a night, at the one minute something was due, and the night before it had reported three messages accepted by the push service, mine among them. The server had marked my reminder as sent. From where it sat, the job was done.

I also found a trap I had set for myself. Earlier that night I had moved my reminder half an hour later, hoping to see it fire. By design a reminder fires once per night, and the night was already marked. A later time can never fire twice. That is correct behaviour and it still cost me an evening of wondering.

So I ran the cheapest possible experiment: I set the reminder for three minutes from now, in the afternoon. It arrived in seconds. Same account, same phone, same subscription the server had been sending to all week. The path works. It works in daylight.

That narrows the question to a sharp one. What is different about my phone at 9:30 at night? The browser did not ask for permission again, so the grant was intact. Bedtime mode starts at ten, after the send. My best remaining guess, and I am calling it a guess, is how the phone treats a browser that has been idle for hours in the background, and a reminder only lives for an hour before the push service discards it, because a reminder that arrives at midnight is noise. Tonight's read is a reminder at 9:30 with the phone's notification history switched on and the phone untouched from 8:30. I would rather read one real night than change a setting on a theory.

Four reversals on one feature

The feature was a small card on the screen you see after saving an entry. Want a quiet nudge tomorrow night? One tap, pre-filled with about the time you started writing tonight, because the research on habit cues says a concrete time tied to a thing you just did is the kind that tends to stick. Decline once and the card stays gone on that phone.

The first version, drafted with my AI pair, had four problems I only saw with it in my hand.

The Save button on the writing screen was shown greyed out while Luna finished her goodnight, so nobody could save before the close. I had asked for that the day before. On the phone it read as broken. A visible button that does nothing is a question the interface refuses to answer, and the rule I wrote down after is blunt: buttons should always be clickable if they are present. Guard the action with a confirmation if you must, never the button.

"Change time" and "Not tonight" were plain text. I could not tell they were tappable. They are bordered buttons now.

"Change time" itself was a tap that existed only to reveal the time input. The input is on the card now, visible, with the chip following whatever you set. One decision, one surface.

And the morning intention, the second reminder that reads back what you said you would do tomorrow, was offered as a line pointing at Settings. Two screens for one choice. It is a second step on the same card now, shown only on nights you set an intention, with the sentence that explains it shows your own words on the lock screen so you choose with that known.

Seven checks on a real phone, six changes pushed while the checks ran. One of them was a blank screen on the back gesture from an entry opened on the home screen, found in the sixth check and fixed before the merge.

A rule I reversed with no data

A month ago I locked a rule: if you touched a draft tonight, you have journaled, so no reminder. It felt kind. Do not nag someone who already showed up.

Today I reversed it, and the argument was the only thing I had to go on. The app keeps one draft per person and deletes it when the entry is saved, so a night with a draft and no entry leaves no trace in the data. I cannot count how often it happens. I had to decide on reasoning alone, and the reasoning is that a half-written entry left at nine is the clearest possible signal that a nudge at ten would land. Silence there is not kindness. It is the product declining to help at the exact moment it could.

The reminder for that case will say: "You started tonight's entry. It's here when you're ready." It fires once, only if the draft is at least an hour old, and its words are fixed; none of yours are in it. It lands before the beta's build freezes.

Mental Models

Prove the cheap end first. Logs before settings, server before phone. The side with records narrows the question before the side with a hundred switches gets touched.

A visible button is a tappable button. If the action is unsafe right now, confirm the action. Never grey the button and leave the reader to guess why.

Put the choice where the moment is. A second decision that belongs to the first one goes on the same card, not behind a pointer to another screen.

Silence is a decision too. Where the product says nothing, ask what it is hiding. The greyed button and the untouched draft were the product choosing silence, and both choices were wrong. The reminder that never came is a silence I still cannot explain, and that is the one I am reading tonight. All three left a person with nothing to act on.