What a tide table taught me about empty states
Sometimes an empty screen is telling you something useful about the world outside it.
Independent product designer & writer
Gothenburg, Sweden
Available for new projects from January 2027.
A little more about meNordic Ocean Institute Lead designer
A field app that helps marine biologists record what they find, even offline on a boat.
Field visits shaped a simple observation flow with large touch targets, local saves, and explicit sync status. The core question: can a researcher trust that their work is safe before the boat reaches shore?
Västkust Credit Union Product designer
Replacing a 20-year-old member banking system, one understandable form at a time.
I mapped the old system with member support staff, untangled field dependencies, and prototyped a keyboard-friendly transfer flow. Familiar language and a clear review step helped preserve trust through the migration.
Region Väst Transit Design and front-end
A live map that makes tram and bus delays legible to commuters and dispatchers.
Route labels, plain-language delay summaries, and a visible update time make the map useful at a glance. I prototyped the interface in code to explore how changing data affects the reading experience.
Self-initiated Author and designer
A free, practical guide for municipalities publishing their very first datasets.
The handbook turns open data principles into manageable steps: choose a useful dataset, describe its limits, and make it easy to reuse. Short chapters pair publishing checklists with concrete examples.
02Writing
Showing all 6 posts.
Sometimes an empty screen is telling you something useful about the world outside it.
Cold hands, a moving deck, and a reminder that a good prototype needs to leave the studio.
What legacy fields reveal about the people, habits, and workarounds behind a system.
A small change in chart choice made the important conversations a lot easier to have.
Thirty days of looking up from my phone and noticing how a city explains itself.
How a better first question changed my proposals, my estimates, and my working days.
On a boat outside the Koster Islands, a marine biologist handed me her phone. The observation list was empty. My prototype offered a neat illustration and an encouraging instruction: “Add your first observation.” She looked at the water, then back at me. “We’re waiting for the tide,” she said.
I had designed the absence of records as the absence of progress. In her working day, waiting was part of the method. The screen knew nothing about that, and its cheerful little prompt made the wrong assumption.
Back at my desk, I opened the tide table she used. Its quiet stretches were as informative as its peaks. A low reading wasn’t a missing reading. It described a condition, placed that condition in time, and helped her decide what to do next.
We started separating the reasons a list might be empty. No observations yet. No observations matching these filters. Observations saved on another device. A download that hadn’t finished. These states looked identical in the first prototype, but each asked something different of the person holding it.
“An empty state should explain the situation before it asks someone to change it.”
That distinction changed our content model before it changed our layouts. Instead of passing an empty array straight to a generic component, we passed a little context alongside it:
{
"observations": [],
"sync": "up_to_date",
"survey": "waiting_for_low_tide"
}
The resulting message was plain: “No observations for this survey yet. Low tide is expected at 14:20.” The action to add a record stayed available, but it stopped being the screen’s only idea of what might happen next.
Now, when I encounter an empty view, I write down three questions before drawing anything: What do we actually know? What might the person reasonably expect? What useful step is available? Sometimes the answer is a button. Sometimes it’s an explanation, a timestamp, or permission to wait.
There’s a limit here: an interface shouldn’t invent certainty. If the connection is gone, say when the data was last checked. If the reason is unknown, say so. A specific, honest message earns more trust than a friendly guess.
The boat taught me something my component library couldn’t: a screen is never really empty. Someone brings a task, a place, and a moment to it. Our job is to make room for those things.
Maya Lindqvist · Notes from making Tidepool
↑ Back to all writingI’m Maya, a freelance product designer and writer based in Gothenburg, Sweden. I work with teams turning complicated data into useful, understandable software. That might mean a researcher’s field app, a banking form, or a map someone checks on the way to work.
Before going independent, I spent five years in studios and product teams, learning to ask better questions and build things early. These days, I move between research, interaction design, and code, staying close to the people who use what we make.
I write to make sense of the work, and to share the bits that might help someone else. Away from the screen, you’ll usually find me near the water, with a notebook in my bag.
I’d love to hear what you’re working on.
Open for projects, collaborations,
and a good conversation.