On a boat off the west coast of Sweden, a marine biologist turned her phone towards me. The observation list was empty. “Is that because we haven't found anything,” she asked, “or because it hasn't downloaded?”

It was a reasonable question. Our prototype answered neither possibility. It showed a tidy illustration, a friendly sentence, and a button to add an observation. Back at my desk, that had felt like enough.

Then she pulled out a tide table. Some cells contained a dash. Others contained a number close to zero. The difference mattered: one meant no prediction was available; the other meant the water level was expected to sit near the reference point. Absence and zero were different information.

Nothing is still a state of something

We had treated an empty list as a single condition. In practice, it could mean the survey hadn't started, a filter excluded every record, the device hadn't synced, or a completed survey had found nothing. Each condition called for a different response.

“An empty state should explain what we know, not decorate what we don't.”

I started mapping those conditions with the team before drawing another screen. We wrote down what the app actually knew, what it was waiting for, and what a biologist could safely do next. A little data sketch made the conversation concrete:

{
  "observations": [],
  "syncStatus": "offline",
  "surveyStatus": "not_started"
}

Now the message could say: “No observations recorded on this device. You're offline; records from other devices may be missing.” The primary action remained “Add observation.” A secondary line showed the last successful sync time.

Design the uncertainty, too

For a completed survey with no sightings, we used different language: “Survey complete. No species recorded.” That wasn't a failure to fill the screen. It was a result worth keeping. We also made that result explicit in the exported data, rather than asking researchers to infer it from missing rows.

The useful change wasn't the copy alone. Naming the conditions exposed a gap in our data model and gave engineering, research, and design a shared vocabulary. We could test each state deliberately, including the awkward transitions when a connection returned.

I still sketch empty screens. But first I ask a less visual question: what kind of nothing is this? A tide table turned out to be a surprisingly good place to learn the answer.