You open MushMate in the kennel yard, with no signal. Until now, "Today's tasks" said "Offline", and so did the messages — with nothing to read. The app did say that "everything stays on this phone". That was true of your outings, your weigh-ins, your notes. It was not true of what the team had asked you to do.
What you see
When the network is out, Today's tasks, Kennel messages and the list of task templates open on this phone's last successful read. A banner says so, with its date: "Offline · copy from Oct 11 18:02", and offers "Retry". If it is the server that answered with an error, the banner says "Couldn't refresh · copy from…": same copy, the cause written honestly.
Today's tasks are recomputed for today from what the phone kept: this morning's chore is not hidden by yesterday's tick. And a task you just ticked offline, still waiting to be sent, does not come back to haunt you.
Three new gestures, wherever a screen reads the server:
- "Retry", including on Messages and Task templates, which had none;
- pulling the screen down re-reads: Today (tasks, health carnet, messages), Messages, Task templates;
- the network coming back re-reads on its own, right away — and after every sync cycle that reaches the server, at most a minute later. A message posted from the website now shows up without you leaving the screen. Before, you had to leave the messages and come back.
What others see, and what they don't
Nothing new for them: you publish nothing more. The copy is yours: it is filed by account and by kennel on your phone. A message addressed to one person can only be read by them; on a shared phone, one account's copy never answers for another. And if you delete your account, its copies go with it.
What it doesn't do
It is not a mirror kept up to date behind your back. The copy is born from this phone's first successful read: right after an install, a start with no signal has nothing to show, and the screen says so ("Offline." and "Retry") instead of showing an empty list that would look like "nothing to do".
It doesn't know what happened after it. A health-carnet reminder (a puppy's care, a whelping) that the server hadn't sent you yet isn't in it. That is the reason for the date.
It writes nothing without signal. Posting, editing or pinning a message, creating a task template: refused straight away, as before. Ticking a task goes into the queue, as before.
Supplements, protocols, a puppy's care history, closed days, the Club and the seven-day tracking stay online-only. Those are other pieces of work, with their own lines; protocols also want to become writable.
Three choices we made
A copy of the read, not a mirror of the database. The reflex was to download these tables to the phone, like the dogs. But the task board mixes data the phone holds (vaccines, treatments, litters) with data it doesn't (puppy care): a mirror of the chores alone would not have made the card work offline. Private messages, for their part, have no place in a kennel table.
We keep what was read, not what was computed. "Due today" depends on the date; a list kept yesterday would be wrong today. The phone keeps the rows, and redoes the calculation every time you open it.
The network coming back re-reads these reads, it doesn't launch a full sync. At the kennel, coverage drops and returns. Every return must not cost the download of the whole kennel on a battery already working at -20 °C.