On a boat outside Gothenburg, a marine biologist showed me a blank screen. We were testing an early version of Tidepool, and the day’s observations hadn’t appeared. “Does this mean there’s nothing here,” she asked, “or that you don’t know yet?”

I had designed one empty state for several different situations. No observations. No connection. Nothing matching a filter. Data still on its way. The interface looked calm, but it was asking the person holding it to do all the interpreting.

Absence is information

Later that afternoon, I looked at a printed tide table tucked beside the navigation equipment. It had a tiny legend distinguishing predicted heights from measured ones. A missing measurement didn’t become zero. It stayed missing, with a reason attached.

That distinction felt obvious on paper. In software, I had flattened it into an illustration and the words “Nothing to see here.” The cheerful copy was concealing a question we hadn’t answered.

“An empty state should explain what we know, not just what we can’t show.”

We went back to the data model before opening the design file. For each blank screen, we wrote down what had happened, what was certain, and what the person could do next. A small vocabulary emerged:

{
  "state": "awaiting_sync",
  "local_observations": 12,
  "message": "Saved here. Ready to sync ashore."
}

Give the next step a reason

With no observations recorded, the next step was to add one. With a filter applied, it was to widen the search. Without a connection, it was often to do nothing at all: the records were safe on the device, and another tap wouldn’t make the signal return.

That last case changed our thinking the most. We had treated every empty state as an opportunity for a button. Sometimes the useful thing is reassurance, especially when someone is balancing a phone against a railing with wet gloves.

Now I keep a small checklist beside my sketches. Is the value zero, unknown, unavailable, or not applicable? Is this temporary? Has the person’s work been saved? Can we say when the screen will change without making a promise the system can’t keep?

Those questions rarely produce a spectacular screen. They produce a sentence that helps someone carry on with their day. The tide table reminded me that this is a perfectly good ambition for an interface.