FocusBottle has never asked who I am — you tap a time and the bottle fills with light. That is the standard I now hold every 'skip sign-in' path to, because a guest is a real user, not a postponed one.
The button that is really a door
FocusBottle has never asked who I am. You open it, tap 25, 50 or 90 minutes, and a bottle slowly fills with light while you work — no sign-up, no settings, nothing to remember. So when I finally added sign-in to another app of mine, I wanted its skip path to feel the way FocusBottle feels: the real thing, not a consolation prize.
That path is usually labelled "Maybe later", which is a poor name for it. It is not a deferral. It is a mode, and it deserves the same care as the signed-in one.
The guest is anonymous, and says so
A guest is anonymous in the plainest sense: no id_token, no backend session, no record that they were ever there. Reads do not phone home — they hand back the local defaults, which on a fresh install are empty, and that is the honest answer. No placeholder rows dressed up as data, no spinner waiting on a request that will never be sent.
Refuse out loud, or not at all
Writing is where a careless guest mode falls apart. When a guest taps save, the app can quietly do nothing — and that silence is the worst possible behaviour, because the user walks away believing their work exists. The version I want refuses out loud: one plain sentence asking them to sign in with Google first, in the same voice as the rest of the interface, no dead refusals, no greyed-out buttons with no explanation.
A refusal a person can read is a feature. A refusal they have to guess at is a bug report waiting to happen.
Prove it with a token you know is worthless
There is a tidy way to check the whole chain without trusting the happy path. Send the login endpoint a deliberately invalid id_token. You want a 401 — that single response proves your server actually reached Google and received a rejection, rather than failing locally and blaming the client. Any other answer means the chain was never really tested.
And the guest path turns out to be the best test of all of it. If you want to know what your app does when nobody is logged in, do not read the code — log out, and use it for ten minutes. FocusBottle starts without asking a question. That is the standard I now hold the other app to.