Empty States
Turn ânothing hereâ into a clear, useful next step.
What it is
Section titled âWhat it isâAn empty state is what a surface shows when thereâs nothing to display yetânot nothing wrong, just nothing there: a fresh project with no files, a search with no matches, an inbox thatâs genuinely empty. Itâs one of the five states Surfaces, Flows, and States defines for every surface, and itâs easy to confuse with Loading, the state next door: both can look like a blank screen, but Loading means the system is working and will resolve on its own, while Empty means the system has already resolved and thereâs genuinely nothing there yetâwhich means the two need opposite treatment. Show a spinner on a genuinely empty state and youâre lying about work that isnât happening; show a static ânothing hereâ message during a slow fetch and youâre telling the user to give up on data thatâs still coming.
A new userâs dashboard on day one, a filtered list that matches nothing, and a cleared notification tray are all empty states, but they call for different words: âget startedâ belongs to the first, âtry different filtersâ to the second, âyouâre all caught upâ to the third. Answering them all with âNo items foundâ is technically true and practically useless.
Why it works
Section titled âWhy it worksâThe mechanism is Mental Models: a blank area with no explanation forces the user to guess what it means, and the guesses people reach for under uncertaintyâbroken, loading forever, I did something wrongâare all worse than the truth. A well-designed empty state closes that gap immediately: it names the absence, confirms the system is working as intended, and, where thereâs a next step, states the smallest one. Thatâs enough to convert a moment of doubt into a moment of orientation, which matters most on first use, before the user has any other evidence the product works.
Skip empty-state design and the default isnât neutralâitâs whatever the framework renders when an array is empty, which is usually a jarring blank rectangle that reads as broken even when nothing has failed. Thatâs the specific failure Surfaces, Flows, and States calls out: every surface has an empty state whether anyone designed it or not; the only choice is whether it was designed on purpose. Overdo it and the opposite failure appearsâfilling a quiet, successful empty state (an inbox at zero, a completed checklist) with promotional prompts, which punishes the user for the exact moment they should feel calm and finished.
When to use it
Section titled âWhen to use itâ- On first use, before a user has created or connected content
- When search, filters, or permissions produce no visible results
- After a user clears content, archives a collection, or completes a workflow
- In dashboards or containers whose purpose is otherwise unclear without data
- Name the state plainly: what is absent, why, and whether the system is still working
- Offer one proportionate next action, such as âCreate projectâ or âClear filtersâ
- Show a small, representative example when it teaches the outcome better than copy alone
- Use Discovery and Progressive Disclosure to reveal possibilities without overwhelming a first visit
Donât
Section titled âDonâtâ- Use the same generic âNo items foundâ message for every kind of absence
- Pretend data is loading, personalised, or unavailable when it is not
- Fill a quiet success state with promotional prompts
- Add decorative illustrations that compete with the explanation or action
Founder Tip
Section titled âFounder TipâBefore writing empty-state copy, classify the absence: new, no-result, cleared, unavailable, or loading. The right next step follows from that answer.
Make It Yours
Section titled âMake It Yoursâ-
Inventory the absences
- Which screens begin empty, and which become empty through search, filters, permissions, or user action?
- Can a person tell the difference between ânothing existsâ, ânothing matchesâ, and âsomething went wrongâ?
-
Give the state a job
- What does the user need to understand before acting?
- Is the best next step to create, import, change a filter, wait, ask for access, or simply continue?
-
Design the smallest useful prompt
- Can the action use the userâs own language and name the result it creates?
- Would one realistic example reduce uncertainty without becoming a tutorial?
-
Validate the outcome
- Do people take the intended action, change their query, or leave confused?
- Which empty states lead to support requests, repeated refreshes, or rapid exits?
Related concepts
Section titled âRelated conceptsâFurther reading
Section titled âFurther readingâ- Designing Empty States in Complex Applications: 3 Guidelines â durable guidance on status, learnability, and key tasks.
- 10 Usability Heuristics for User Interface Design â the foundation for system status and recognition over recall.
- Information Scent: How Users Decide Where to Go Next â helps make an empty stateâs action clear and credible.
- Progressive Disclosure â shows how to reveal complexity only when users need it.
Agent skill
Section titled âAgent skillâ- Primary command:
/productfeeling statesâ classify absence and offer the smallest useful next step - Related commands:
/productfeeling jobs,/productfeeling friction,/productfeeling map,/productfeeling delight - When the agent should load this TTP: âempty stateâ, âno resultsâ, âfirst useâ, âblank screenâ, ânothing here yetâ
- Companion handoff: Impeccable â empty-state layout, examples, and primary action craft; none â unless the absence type needs product-policy capture
- Feeling north star this TTP serves: clarity in absence, orientation without overwhelm
- Anti-goals: generic no-items copy, fake loading or personalisation, promotional quiet states, decorative noise
- Reference path:
skill/reference/states.md