"Offline isn't a crash. It's a room where your question waits, safely, for the door to open."
Offline Is a State, Not an Error
Most apps model offline as failure: a red banner, a discarded action, a "try again later" that already threw your input away. Pippa Go models it as a normal state of the world. Sometimes the link is there; sometimes it isn't. Neither is exceptional. When you ask a question with no connection, nothing breaks — the question is captured, durable, and marked as waiting. It sits in the outbox exactly as safely as a question asked with full bars; the only difference is that delivery hasn't happened yet.
This reframing matters because how you model offline decides what your code does at the worst moment. Model it as an error and your instinct is to handle the error — often by discarding, retrying blindly, or faking a result. Model it as a state and your instinct is to represent the state — capture, mark pending, wait honestly.
What 'Durable Waiting' Actually Means
Durable waiting is a specific, three-part guarantee:
- Durable: the waiting question survives app kills, reboots, and hours offline, because it lives in the outbox, not in memory.
- Waiting: its status is honestly
pending— notanswered, not silently dropped. The UI shows a real "waiting to reach Pippa" state. - Resumable: the instant the link returns, the same durable question delivers itself — no user re-action required.
Put together, the user's mental model becomes trustworthy: "I asked; it's saved; it'll go through when it can." That sentence is only true if all three hold. Drop durability and the question dies on reboot. Drop honesty and the UI lies about being done. Drop resumability and the user has to babysit the send.
The Alternative Is a Quiet Betrayal
The tempting shortcut when offline is to give the user something — a cached answer, a local guess, an optimistic "here's probably what Pippa would say." It feels helpful. It's a betrayal, because the user asked a real question and got a manufactured reply wearing Pippa's face. Durable waiting refuses that trade. It would rather show an honest "waiting" for an hour than a confident falsehood in a second. The next lessons make that refusal precise.