Structure & Interaction. How a product is arranged, and how it answers back.
Before anything is beautiful, it has to be findable, understandable and safe to use. This guide covers the skeleton and the nervous system of software: the objects it is made of, how people move between them, what each screen shows in every state, which control to use, how forms behave, how mistakes get forgiven, and how keyboard, touch and tiny interactions make the whole thing feel solid.
Map your product's objects, their relationships and actions before drawing a single screen (understand).
Choose a navigation pattern and justify it by the number and type of destinations (evaluate).
Draw a task flow with its happy path and edge cases, and list every screen state it implies (create).
Pick the right control, button hierarchy and validation timing for any input (apply).
Replace confirmations with undo, and decide between a dialog, sheet, popover, toast, banner or inline message (evaluate).
Design for keyboard, pointer and thumb, including shortcuts, command palettes, drag and drop and touch targets (create).
Dissect any microinteraction into trigger, rules, feedback and loops, and improve it (analyse).
Decide what deserves a setting and what deserves a better default (evaluate).
Warm-up: what you already know
You have used thousands of apps. You already have strong instincts about structure and interaction; you just may not have names for them. Answer these four questions quickly, without scrolling ahead. Getting them wrong is fine and useful: it tells you which chapters to read slowly.
Hold one idea from The Human Mind in your head while you read: people act on a mental model, a small private story about how the thing works. Every chapter in this guide is a way of making the product's real structure match that story, and of making the product answer clearly when the story is wrong.
Diagnostic 1 of 4
You are adding a "Delete project" action that removes a project and its 200 tasks. Which pattern is best by default?
Reversibility beats warnings. People click through "Are you sure?" dialogs on autopilot, so they protect little. A recoverable delete with an Undo toast lets people act fast and fix mistakes. Chapter 9 goes deep on this.
Diagnostic 2 of 4
A sign-up form shows "Invalid email" in red the moment you type the first letter. What is wrong?
Premature errors punish people for being in the middle of typing. The usual best timing: validate when the field loses focus, and once an error is showing, re-validate on each keystroke so it clears the moment it is fixed. Chapter 8 has a live demo.
Diagnostic 3 of 4
Your phone app has four main sections used daily. Which navigation is the best starting point?
A small set of frequent, peer destinations is exactly what a tab bar is for: always visible, one tap away, and it tells you where you are. Hiding them behind a menu costs a tap and, worse, costs awareness. Chapter 3 compares the patterns.
Diagnostic 4 of 4
A settings toggle reads "Dark mode". When should the change happen?
A switch is a promise of immediate effect, like a light switch. If a change needs a Save step, use a checkbox inside a form instead. Chapter 7 explains the semantics of each control.
How to study this guide
Read one part per sitting. Keep your own product open beside the page; every exercise asks you to apply the idea to it. The demos are meant to be played with, not admired: break them on purpose, and notice the exact moment the bad version annoys you. That moment of annoyance is the lesson.
Part one
Structure: what things are and where they live
Interaction design starts long before buttons. It starts with deciding what your product is made of, what those things are called, how they are grouped, and how a person moves among them. Get this skeleton right and many screens almost design themselves. Get it wrong and no amount of polish will save the product from feeling confusing.
1
Objects before actions
Taught by Sophia Prater (object-oriented UX), with Alan Cooper and the original Xerox Star team
People think in things before they think in actions. Design the nouns of your product first, then attach the verbs to them, and the interface becomes a set of places people recognise instead of a list of functions they must remember.
Ask someone what a calendar app is for and they will talk about events, people and days. Ask what a notes app is for and they say notes, folders, tags. Those nouns are the person's mental model. The actions (create, share, move, archive) only make sense attached to one of them. When a product is organised around actions instead, you get screens like "Manage", "Tools" and "Actions", and people have to translate their goal ("I want to change Tuesday's meeting") into the product's vocabulary ("Event management, then Edit"). Every translation is a small tax on attention.
This idea is old. The Xerox Star (1981) let you select an object on screen, a document or a folder, and then apply a generic command to it: Move, Copy, Delete, Show Properties. Noun, then verb. Today the approach has a name and a method: object-oriented UX (OOUX), developed and taught by Sophia Prater. Her process, called ORCA, walks through four layers in order: Objects, Relationships, Calls to action, Attributes.
The ORCA pass, step by step
Objects. Read your notes, support emails and your own product description, and underline every noun people care about. Keep the ones that have their own identity, that a person would want to see, find or talk about. "Book", "highlight", "collection" pass. "Settings" and "dashboard" are not objects; they are containers.
Relationships. For each pair, ask how they connect and how many: a book has many highlights; a highlight belongs to one book; a collection contains many books, and a book can be in many collections. These lines become your navigation and your links.
Calls to action. List what people do to each object: create, edit, share, archive, export. Verbs live on objects, which tells you where every button goes.
Attributes. List what each object is made of: title, author, date added, progress. These become the fields in your forms, the columns in your lists and the options for sort and filter.
Every line is a future link; every grey verb is a future button. Notice Author has no "create": it exists only because books name it. Spotting derived objects early saves you from building screens nobody needs.
Nouns become screens, verbs become controls
Once the map exists, a predictable shape appears. Each important object usually gets two views: a collection view (a list or grid of many) and a detail view (one of them, with its attributes and actions). Relationships become links between detail views: a book's page lists its highlights, a highlight links back to its book. Actions appear where the object is, as buttons on the detail view or items in a context menu on the list row. This is why well-structured products feel "obvious": every screen answers "which thing am I looking at, and what can I do to it?"
Don't
Organised by function. To add a note to a book you must go to Create, pick a type, and type the parent's ID. The person has to hold the relationship in their head.
Do
Organised by object. You open the book, and its highlights and the "Add note" action are right there. The relationship is shown, not remembered.
Naming objects: one word, used everywhere
The object map also fixes your vocabulary. If the object is a "collection", it is a collection in the sidebar, the button ("New collection"), the empty state, the URL (/collections/42), the API and the support docs. Products drift when the code says "list", the UI says "shelf" and the help page says "folder". People assume different words mean different things. Keep a one-page glossary of your objects and treat it as part of the design (more on words in Words).
Key idea
Find the nouns, connect them, hang the verbs on them. Screens come last.
Do
Write an object map before wireframes, even on paper.
Give each core object a list view and a detail view.
Put actions on the object they change (row menu, detail toolbar).
Use the same object name in UI, URL, code and docs.
Show relationships as links in both directions.
Don't
Name sections after functions ("Manage", "Tools", "Actions").
Invent a cute synonym for a common object ("Spaces" for folders) without a real difference.
Make people type IDs or pick parents from a dropdown when they could start from the parent.
Create objects that nobody wants to find or talk about.
In the wild
Xerox StarXerox, 1981
Select an icon (document, folder, printer), then press a generic key such as Move, Copy or Delete. A handful of verbs worked on every noun. Few universal verbs plus many objects is easier to learn than many special commands.
LinearLinear, 2019 onward
The core objects are issues, projects, cycles and teams, and they show up consistently in the sidebar, the URL and the command menu. Actions such as assign or change status work on whichever issue is selected. A small, stable object model lets power features (shortcuts, bulk edits) stay simple.
Things 3Cultured Code, 2017
Areas contain projects, projects contain to-dos, to-dos contain checklists. That containment hierarchy is visible in the sidebar and in each project's page. When the relationships are simple and visible, people rarely need a manual.
Apple PhotosApple, 2015 onward
Photos, albums, people and places are all objects; a photo can be in many albums and contain many people. You can arrive at the same photo from any of these directions. Many-to-many relationships become multiple paths to the same thing.
For the solo creator
You already have an object model: it is your database schema. The trap is letting tables leak into the UI unedited, such as a "user_settings_override" screen. Do the ORCA pass from the person's side, then compare it with your schema. Where they differ, the UI should follow the person, and the code can map between them. A twenty-minute object map also makes your API, URLs and docs consistent for free.
Common mistakes
Designing the home screen first
The home screen feels like the product, so it is tempting to start there.
Start with the most important object's detail view. The home screen is a summary of objects; you cannot summarise what you have not defined.
Too many objects
Every database table feels like it deserves a page.
Promote only what people seek out by name. Fold the rest in as attributes ("tag" may be an attribute of a note, not its own object, until people want to browse by tag).
Orphan verbs
Features get added as top-level buttons ("Export", "Sync") because there was no obvious home.
Ask which object the verb changes. Export a collection lives on the collection. If the answer is "everything", it may belong in a command palette or settings.
Check yourself
You are building a small invoicing tool. Users keep asking "how do I see all invoices for one client?" Your nav has: Dashboard, New invoice, Reports, Settings. What does the object view suggest?
The question reveals a missing object (Client) and a missing relationship (client has many invoices). Making both first-class turns the question into a place: open the client, see the invoices. A report or search would answer it, but every time, at extra cost.
Exercise 1.1 45 minutes · on your own product
Draw your object map
Write a one-paragraph description of your product as a user would say it. Underline every noun.
Keep 3 to 7 core objects. For each, list attributes (what it is made of) and actions (what people do to it).
Draw lines between objects with cardinality (1, many).
Compare the map with your current navigation. Circle any nav item that is a verb or a container with no object behind it.
You're done when: you have one page with 3 to 7 objects, their relationships, attributes and actions, plus a list of nav items to rename or move.
Beginner
Competent
Strong
Lists objects, but includes containers like "Dashboard" as objects.
Objects, relationships and actions are clear; nav mismatches spotted.
Also identifies derived objects, attributes that should be promoted, and one rename that would simplify the whole product.
2
Organizing: groups, labels and hierarchy
Taught by Louis Rosenfeld & Peter Morville, with Abby Covert and Donna Spencer
Information architecture is deciding how things are grouped, what the groups are called, and how deep they go. Good IA matches the groupings already in your users' heads, so they guess right the first time.
Rosenfeld and Morville's book Information Architecture for the World Wide Web (first edition 1998, nicknamed "the polar bear book") split the field into a few systems: organisation (how you group), labelling (what you call groups), navigation (how people move), and search (how people look things up). Abby Covert's How to Make Sense of Any Mess (2014) made the same ideas approachable: every mess is made of information, and the work is to agree on what things mean before arranging them.
The mechanism behind all of it is information scent, a term from Peter Pirolli and Stuart Card's information foraging theory at Xerox PARC in the 1990s. People choose links the way animals follow a scent trail: they pick the label that seems most likely to lead to their goal. If the scent is strong at every step, they move fast and confidently. If it is weak (vague labels, unexpected groups), they hesitate, guess, backtrack, and eventually leave.
Ways to organise
There are only a few basic schemes, and mixing them in one list is the most common source of confusion.
Scheme
Works when
Example
Alphabetical
People know the exact name they want
Contacts, a country picker
Chronological
Recency matters more than kind
Inbox, activity feed, journal
Geographical
Location drives the decision
Store finder, weather cities
Topic / category
People browse by subject
Settings sections, a help centre
Task
People arrive with a job to do
"Send money", "Pay a bill" in a bank app
Audience
Different groups need different things
"For individuals / For teams" on a pricing page
Alphabetical, chronological and geographical are exact schemes: there is one right answer for where something goes. Topic, task and audience are ambiguous: reasonable people disagree. Ambiguous schemes are more useful for browsing but need testing, which is what card sorting and tree testing are for.
Depth versus breadth
Every hierarchy trades depth (how many levels) against breadth (how many items per level). Deep and narrow means few choices per screen but many clicks, and each click is another chance to take a wrong turn. Broad and shallow means more scanning per screen but fewer decisions. Studies of menu structures from the 1980s and 1990s (Kiger in 1984, Larson and Czerwinski in 1998) generally found that broader, shallower structures beat deep ones, as long as the broad lists are well grouped and labelled. The reason is compounding: if people choose correctly 90% of the time at each level, three levels give 0.9 × 0.9 × 0.9 ≈ 73% success, and five levels give about 59%.
Same 27 items, different shape. A wrong turn at the top of a deep tree hides the target completely. A broad page shows everything; the visual groups do the work that levels did, without the compounding risk.
Lab: how depth compounds
Levels needed
3
Chance a person reaches the item on the first try
73%
Try 300 items with 3 choices per level, then 20 per level. Then lower label clarity to 75%: watch how unclear labels hurt deep trees far more than broad ones. Breadth costs scanning time, which grouping can reduce; depth costs probability, which nothing recovers.
Card sorting and tree testing, solo
Card sorting asks people to group your content. Write each item on a card (real or virtual), hand them to someone, and ask them to sort into piles that make sense and name each pile. In an open sort they invent groups; in a closed sort they use yours. Donna Spencer's Card Sorting (2009) is the standard short guide. Five to fifteen people usually show the main patterns. Watch for items everyone places the same way (safe) and items that wander between piles (they need a better label, or should live in two places).
Tree testing is the reverse check. Give people only the text hierarchy, no visual design, and a task ("Where would you change your billing email?"). Record the path they click. The classic tool is Optimal Workshop's Treejack, but a spreadsheet and a video call work. It isolates the IA from the visuals: if people fail on a plain text tree, colour and icons will not save it.
A tree test shows where people expect things, not where you put them. The numbers here are illustrative. The fix is rarely "teach users"; it is to put the item where they look, or to link it from there.
Labels carry the scent
Labels should be specific, familiar and parallel. Specific: "Invoices" beats "Documents". Familiar: use the words your users use in support emails, not your internal jargon. Parallel: items in one list should be the same kind of word (all nouns, or all verbs), so people can compare them. Clever labels ("The Vault", "Magic Box") feel like personality but have zero scent: nobody can predict what is inside.
Don't
Discover›
The Vault›
Manage stuff›
Resources›
Misc.›
No scent. Vague, clever, mixed types (verb, metaphor, phrase). "Misc." is a confession that the grouping failed.
Do
Books142
Highlights1,208
Notes87
Collections9
Trash3
Strong scent. Plain nouns from the object map, parallel, with counts that hint at what is inside.
Taxonomies: folders, tags and both
A folder (hierarchy) says "this thing is in exactly one place". A tag (facet) says "this thing has these properties". Folders are easy to understand and match physical habits; tags are flexible but need discipline and good tools. Most mature products offer one primary hierarchy plus a few facets: Gmail moved from folders to labels in 2004, which let one email live in many places. Things uses areas and projects as hierarchy, and tags as optional facets. For your own product, pick one primary structure and make the second optional; asking people to maintain both from day one is asking them to be librarians.
Do
Use one organisation scheme per list.
Prefer broad, shallow trees with visual grouping.
Borrow labels from your users' own words.
Test the tree as plain text before designing visuals.
Put an item in two places when people genuinely look in both.
Don't
Mirror your company's or your code's structure.
Create "Misc.", "Other" or "More" buckets as a first resort.
Nest more than three levels without a strong reason.
Make people tag and file everything to get started.
In the wild
Gmail labelsGoogle, 2004
Replaced the single-folder model with labels, so one conversation could be in "Travel" and "Receipts" at once, with search as the main way back. When items belong to several groups, facets beat folders.
macOS System SettingsApple, 2022 (Ventura)
Moved from a grid of icons to an iOS-style sidebar list. Many long-time Mac users reported trouble finding familiar panes in the new grouping. Reorganising changes what people already know; even a "better" structure has a relearning cost.
GOV.UKGovernment Digital Service, 2012
Merged hundreds of department websites into one site organised around what citizens need to do, not which department does it. Organise by the user's task, not by your org chart.
For the solo creator
You do not need a research budget. Write your 20 to 40 key items on index cards and ask three friends to sort them over coffee or a video call (a shared whiteboard works). Then run a tree test with five tasks in a plain bulleted list. Two hours total. The most valuable output is the list of items that "wander": those are your naming and placement problems.
Common mistakes
Organising by your code
The structure you know best is your module structure.
Run an open card sort with people who do not know your code, and compare.
Split into separate groups with headings, or move task items into a create menu or command palette.
Deep settings trees
Each new option gets its own sub-page.
Flatten to one scrollable page with section headings plus search (see chapter 17).
Check yourself
Your app has 40 help articles in 4 levels of categories. Tree-test success is 45%. What is the best first move?
Forty items do not need four levels; each level compounds the chance of a wrong turn. Flatten, group visually, use users' words, then run the tree test again to see if success rises. Icons do not add scent to a weak structure.
Exercise 2.1 2 hours · with 3 to 5 people
A one-afternoon card sort and tree test
List 20 to 40 items people look for in your product (screens, settings, objects).
Run an open card sort with three people. Photograph each result.
Draft a tree from the patterns. Keep it to two levels if you can.
Write five realistic tasks and run a tree test with three other people. Record the first click and the final answer.
Mark items with under 70% success and propose a rename or a second location.
You're done when: you have a revised text tree, a table of task success rates, and three concrete label or placement changes.
Beginner
Competent
Strong
Ran a sort but kept the original tree.
Revised the tree from evidence; tested it.
Identified wandering items, explained why from the participants' words, and verified the fix in a second round.
3
Navigation patterns
Taught by Steve Krug, with Luke Wroblewski and the Apple and Material guidelines
Navigation is a map you can touch. Choose a pattern by counting your destinations and how often people switch between them; the best navigation is the one that keeps the most-used places visible and the rest one predictable step away.
There are only about eight navigation patterns in common use, and each one fits a particular shape of product. The questions that pick between them are simple: How many top-level destinations are there? Are they peers (people switch between them often) or a hierarchy (people go in, then come back)? Is the product used on a phone, a desktop, or both? Do people know the name of what they want (search) or do they browse?
Eight shapes of navigation. Most products combine two or three: a tab bar or sidebar for top-level places, a drill-down stack inside each place, and search or a command palette as an accelerator.
Pattern
Choose it when
Its cost
Tab bar
3 to 5 peer destinations used often on a phone
Hard limit on count; takes vertical space on every screen
Sidebar
Many destinations, user-created places (projects, channels), wide screens
Uses horizontal space; collapses awkwardly on phones
Top nav
Websites and marketing sites with a few sections
Does not scale past about 7 items; poor for deep apps
Hub and spoke
Separate, self-contained tasks (a settings app, a utility suite)
Every switch goes through the hub: two steps instead of one
Drill-down stack
Hierarchies: list to detail to sub-detail
Deep stacks get lost; needs a clear back
Hamburger
Secondary or rarely used destinations
Out of sight, out of mind: lower discovery and use
Command palette
Many commands and places, keyboard users
Invisible to newcomers; needs visible paths too
Search-first
Huge content where people know what they want (maps, music, docs)
Fails for browsing and for people who do not know the words
The cost of the hamburger
The hamburger icon (three lines) was drawn by Norm Cox for the Xerox Star around 1981 and became the default mobile menu in the early 2010s. It is tidy. The trouble is psychological, not visual: what people cannot see, they forget exists. Nielsen Norman Group's 2016 testing found that hidden navigation was used less often than visible navigation and made content harder to discover, on both desktop and mobile. Several large apps moved their main sections out of drawers and into bottom tab bars in the mid-2010s for the same reason. The rule of thumb: if a destination matters to most people every week, it must be visible. Put the rest (settings, help, account, legal) in a drawer or a "You" tab.
Don't
Four daily destinations behind one icon. Every switch costs two taps, and newcomers may never discover Stats at all.
Do
Visible, labelled, one tap. The tab bar also answers "where am I?" on every screen. Settings can live in the Home screen's top corner.
Command palettes and search as accelerators
A command palette (press a shortcut, type a few letters, pick a result) gives fast access to every place and action without crowding the screen. Sublime Text popularised it for editors, VS Code made Ctrl/⌘ShiftP famous, and web apps such as Superhuman, Linear and GitHub brought ⌘K to everyday software. Chapter 12 builds one. The rule: a palette is an accelerator layered over visible navigation, never a replacement for it. Newcomers learn by seeing; experts speed up by typing.
Do
Count destinations and frequency before picking a pattern.
Keep daily destinations visible and labelled (icons plus words).
Combine: top-level pattern, drill-down inside, palette or search on top.
On desktop, let a sidebar hold user-created places (projects, folders).
Keep the tab bar on every top-level screen, in the same order.
Don't
Hide primary sections behind a hamburger to look minimal.
Use more than five tabs on a phone; the sixth becomes "More".
Use a tab to trigger an action (a "+" tab that opens a sheet) unless it is the product's single core action.
Rely on a command palette or gestures as the only way to reach something.
In the wild
SlackSlack, 2013 onward
A sidebar of user-created channels and DMs on desktop, plus a quick switcher (⌘K) to jump by typing. Sidebars scale to places that users create; a switcher makes hundreds of them fast to reach.
Apple Settings (iOS)Apple, 2007 onward
A drill-down stack: a long grouped list, tap into a section, tap again, back button shows the previous screen's name. Search was added at the top later. Drill-down suits hierarchies people enter and leave; search rescues depth.
Google MapsGoogle
Search-first: the search box is the main control, and browsing is secondary. When people almost always know the name of what they want, start with search.
InstagramMeta
A bottom tab bar for the main places, with a profile tab that holds settings and less-used destinations. The "You" tab is a good home for everything that is not daily.
For the solo creator
Platform navigation components are free: UITabBarController, NavigationStack and Android's bottom navigation give you back gestures, state restoration and accessibility for nothing. Fighting them costs weeks. On the web, a sidebar plus a ⌘K palette is one of the cheapest high-value structures you can build.
Common mistakes
Navigation by feature list
Each new feature gets a top-level item.
Top-level items should be places, ideally objects from chapter 1. Features live inside them.
Icon-only tabs
Icons look cleaner.
Most icons are ambiguous; add labels. Only a few (home, search) are close to universal.
Different navigation on each platform for no reason
The web and mobile apps were built at different times.
Keep the same top-level places and names, adapting only the pattern (sidebar on desktop, tabs on mobile).
Check yourself
A desktop note app lets people create unlimited notebooks. Which top-level navigation fits best?
User-created places grow without limit and need to be visible while working, which is exactly what sidebars do well. A switcher handles the long tail. Tabs do not scale, hamburgers hide, and a hub costs a round trip for each switch.
Exercise 3.1 40 minutes · on your own product
Audit and redraw your navigation
List every top-level destination and estimate how often a typical user visits each (daily, weekly, rarely).
Label each as peer (switched between) or hierarchy (enter and return).
Pick a top-level pattern for mobile and for desktop using the table above.
Sketch both versions. Move rarely used items to a secondary location and name it.
You're done when: you have a frequency table and two sketches (mobile and desktop) with a one-line reason for each placement.
Beginner
Competent
Strong
Picks a pattern by taste.
Pattern follows from count and frequency; daily items visible.
Also adds an accelerator (search or palette) and checks that names match the object map on both platforms.
4
Wayfinding: where am I, where can I go, how do I get back
Taught by Steve Krug, with Kevin Lynch and Tim Berners-Lee
At every moment a person should be able to answer three questions without thinking: where am I, where can I go from here, and how do I get back. Navigation is the system; wayfinding is the experience of never feeling lost in it.
The urban planner Kevin Lynch's The Image of the City (1960) described how people find their way through cities using paths, edges, districts, nodes and landmarks. Software has the same needs. The page title is your street sign. The highlighted nav item is the district. Breadcrumbs are the path you could retrace. A consistent header is the landmark you can always see.
Steve Krug's Don't Make Me Think (2000) turned this into a quick test he called the trunk test: imagine you were blindfolded, driven around, and dropped on a random page of the site. Can you immediately say what site this is, what page you are on, what the major sections are, what your options at this level are, where you are in the scheme of things, and how you can search? Try it on your own product with a screenshot of a deep page.
Five cues, one glance. None is decorative. Remove any one and a person arriving from a shared link has to work out where they are.
Breadcrumbs
Breadcrumbs show the location of the current page in a hierarchy, with every ancestor as a link. They are cheap and help most when people land deep in a site from search or a shared link. Show the hierarchy, not the browsing history (that is what the back button is for). Keep them small and above the title. On phones, show only the parent as a single "‹ Philosophy" link, because a full trail wraps and crowds the screen.
Back must mean back
The back button is the most used navigation control on the web, and people build a strong expectation around it: back returns me to exactly where I was, scroll position included. Single-page web apps often break this by changing the content without changing the URL, so back leaves the app entirely; or by pushing every filter tweak into history, so back has to be pressed ten times. On iOS, the back button in a navigation stack names the previous screen, and the edge swipe pops the stack. On Android, the system back gesture is global. Your job is to make your app's internal history match what people expect from those gestures.
Two kinds of "going back". Popping a screen and dismissing a modal feel different and should look different. Mixing them is how apps end up with "close" buttons that navigate and "back" buttons that cancel.
URLs are part of the interface
Tim Berners-Lee's 1998 note "Cool URIs don't change" argued that addresses should be stable for years. A good URL is readable, hackable (you can delete the end and land somewhere sensible), shareable and permanent. It is also your deep-link system: if every meaningful state of the app has a URL, people can bookmark it, share it, open it in a new tab, and come back to it from a notification. Apps without addresses for their states force people to describe how to get somewhere ("click Projects, then the second one, then the Files tab").
Every part is meaningful and hackable. The same shape works as a deep link from a push notification or an email.
Do
Run the trunk test on your deepest page.
Mark the active nav item clearly, not just with a slight tint.
Give every meaningful state a URL or deep link, including tabs and selected items.
Restore scroll position and selection on back.
Use replace (not push) for filter and sort changes so back stays useful.
Don't
Break the browser back button in a web app.
Open internal links in new tabs by default.
Change URL structures without redirects.
Use page titles that differ from the link that led there.
In the wild
GitHubGitHub
URLs read like sentences: owner, repository, then "pull" or "issues" and a number. People type and edit them by hand. Predictable URLs become a power-user navigation system for free.
iOS navigation barApple, 2007 onward
The back button shows the title of the previous screen, and the large title shrinks as you scroll so the place name stays visible. "Back" is vague; "‹ Library" is wayfinding.
FigmaFigma
Copying a link to a selected frame produces a URL that opens the file zoomed to that frame. Deep links to the exact state make collaboration and support much easier.
For the solo creator
Routing is design. When you set up routes in your framework, write the URL list first as if it were a sitemap, using object names from your map. It costs nothing on day one and is very expensive to retrofit. Deep links also make your own support easier: a user can send you the exact page that is broken.
Common mistakes
Modals that hold whole flows
A modal seemed quick for "new item" and then grew tabs and steps.
If it has its own navigation, it is a page. Give it a URL.
Losing place on return
Lists re-fetch and render from the top.
Cache the list and its scroll offset; restore both on back.
The invisible active state
A subtle background tint that disappears in dark mode or on cheap screens.
Combine at least two signals: weight plus background, or a bar plus colour.
Check yourself
In your web app, changing the sort order of a list pushes a new history entry. What will people experience?
Back should move between places, not tweaks. Store sort in the URL (so refresh and sharing work) but use history replace, not push. Then back leaves the list as people expect.
Exercise 4.1 30 minutes · on your own product
Trunk test and URL map
Take screenshots of your three deepest screens. Cover the browser bar.
For each, write the answers to: which product, which section, which page, what options here, how to go up a level. Mark any you could not answer in two seconds.
Write the URL (or deep link) for every meaningful state. Note any state with no address.
Test back from each deep screen and note whether scroll and tabs are restored.
You're done when: you have a trunk-test table, a URL map, and a list of fixes ranked by how often the screen is used.
Beginner
Competent
Strong
Runs the test, notes failures.
Fixes active state and titles; every state has an address.
Also fixes back behaviour (replace vs push), scroll restoration, and adds redirects for any URL changes.
5
User flows, edge cases and the golden path
Taught by Dan Brown (Communicating Design), with Alan Cooper and Kathy Sierra
A screen is a frame; a flow is the film. Draw the path a person takes to finish a task, decision by decision, and you will find the missing screens, the dead ends and the edge cases before you write code.
Designers often start with the beautiful screen in the middle of a task. People do not experience screens; they experience sequences: they arrive from somewhere, with some expectation, make a few decisions, hit a snag, and either finish or give up. A user flow (sometimes called a task flow) is a diagram of that sequence. It is the cheapest design artefact there is, and it catches more problems per minute than any mockup.
A tiny notation
You do not need a formal standard. Four shapes are enough, and keeping them consistent makes flows readable months later.
Four shapes cover nearly every flow. The dashed box marks things the system does without a screen (fetching, saving, sending email), which is where many edge cases hide.The happy path is one line; the product is all the lines. Drawing the edge cases turned one "Scan" screen into five designed states, each with a way forward instead of a dead end.
Happy path, then edge cases
Draw the happy path first: the shortest route when everything goes right. Then walk it again and at every step ask a fixed set of questions. This list catches most edge cases:
Nothing: what if there is no data yet, or the search returns nothing?
Too much: what if there are 10,000 items, or the name is 200 characters long?
Wrong: what if the input is invalid, or the file is the wrong type?
Slow or gone: what if the network is slow, offline, or the server errors?
Denied: what if a permission is refused or the plan does not include this?
Interrupted: what if they leave halfway, get a call, or close the tab?
Duplicate or conflict: what if it already exists, or changed on another device?
Each answer is either a screen state (chapter 6), a message (see Words), or a design decision to remove the edge case entirely. The best edge-case handling is the edge case that cannot happen: if duplicates are a problem, detect them and offer to open the existing one rather than showing an error.
The golden path
Among all flows, one matters most: the sequence from first launch to the first moment the product delivers its core value. Call it the golden path. Kathy Sierra, in Badass: Making Users Awesome (2015), argued that people stay with products that make them feel capable quickly. For a note app, the golden path ends at the first note saved. For a reading app, at the first highlight. Count the steps and seconds on that path, and treat every step as a cost to justify. Sign-up, onboarding tours and permission requests that sit in front of value are the usual offenders. Can someone try the core action before creating an account?
Don't
Value at step seven. Every step before value is a place to quit, and each one asks for trust the product has not earned yet.
Do
Value first, commitment later. Ask for an account when there is something worth saving; ask for notification permission when there is something worth notifying about.
Screen inventory
Once flows exist, list every screen they touch in a table, with a column per state (chapter 6). This screen inventory is your real scope. It turns "build sign-up" into "build 4 screens × 5 states, 14 of which are not designed yet". For a solo creator, it is the most honest estimate you will ever make.
Screen
Ideal
Empty
Loading
Partial
Error
Offline
Library
Done
Done
Skeleton
n/a
To do
To do
Camera / scan
Done
n/a
To do
n/a
Denied: to do
Queue: to do
Manual add
Done
n/a
n/a
Prefilled
Validation
Local save
Book detail
Done
No highlights yet
Skeleton
Cover missing
To do
Cached
Do
Draw flows before screens; use paper or a plain diagram tool.
Label arrows with the person's action.
Walk each step with the seven edge-case questions.
Measure the golden path in steps and seconds.
Keep a screen-by-state inventory as your task list.
Don't
Design only the happy path and leave errors to code.
Put sign-up, tours and permissions before first value.
Leave dead ends: every error state needs a way forward.
Draw flows so detailed they become a second codebase.
In the wild
DuolingoDuolingo
New users can start a first lesson before creating an account; sign-up is offered after some progress exists. Let people feel the value, then ask them to save it.
ExcalidrawExcalidraw, 2020
Opening the site drops you straight onto a canvas; there is nothing to set up before drawing. The shortest golden path is zero steps.
Stripe CheckoutStripe
The payment flow handles many edge cases (card declined, 3-D Secure verification, wallets) inside one consistent flow, so the merchant's happy path stays simple. Edge cases are where trust is won, especially around money.
For the solo creator
Flows are your spec, your test plan and your estimate in one. Before you build a feature, spend 15 minutes on its flow with the seven questions. Then write one test per edge case. You will ship fewer "it works on my machine" features, and your support inbox will shrink.
Common mistakes
Flows as screen thumbnails
It feels more "designed" to chain mockups with arrows.
Use boxes and words first. Mockups make it expensive to change the order, which is what flows are for.
Edge cases with no exit
The error is handled in code, so it feels done.
Each error state needs a recovery action: retry, edit, go somewhere useful.
Optimising a flow nobody takes
Settings flows are fun to perfect.
Rank flows by frequency × importance. The golden path and the daily loop come first.
Check yourself
Your habit app's flow: open app, sign up, verify email, pick a goal, see the dashboard, create first habit. Where would you cut first?
The golden path ends at "first habit created". Everything before it is cost. Moving sign-up after first value removes two or three steps and lets the product make its case before asking for commitment.
Exercise 5.1 60 minutes · on your own product
Map your golden path and one core flow
Install your product fresh (or use a private window). Time and count every step from launch to first value. Note every screen.
Draw the flow with the four shapes, highlighting the golden path.
Walk it with the seven edge-case questions. Add each edge case as a branch.
Propose one change that removes at least one step before first value.
Build the screen-by-state inventory for this flow.
You're done when: you have a flow diagram, the golden path in steps and seconds (before and after your proposed change), and a screen inventory.
Beginner
Competent
Strong
Draws the happy path only.
Includes edge cases with exits; golden path measured.
Removes at least one edge case by design, cuts a step, and turns the inventory into a prioritised task list.
Recap and connect: Part one
Structure flows from objects (chapter 1) to groups and labels (2), to navigation patterns (3), to the experience of moving through them (4), to the paths people take for a task (5). Each layer constrains the next. Before moving on, connect these ideas with earlier guides.
Connect the ideas
In The Human Mind you met the limits of working memory. Which structural choice from Part one most directly reduces working-memory load?
Recognition beats recall. Showing related objects where they are needed means nothing has to be held in mind. Hiding items (a) increases recall load; deeper trees (c) make people remember the path; clever labels (d) must be learned.
Connect the ideas
In Problems Worth Solving you defined the core job of your product. How should that job shape the golden path?
The job defines what "value" means, so it defines where the golden path ends. A tour of features (b) delays the job. Surveys (d) can help personalise, but only if they shorten the path to the job, not lengthen it.
Part two
States and inputs: what the screen shows, and what people tell it
A screen is not one picture; it is a set of pictures, one for each state of its data. And most screens ask something of the person: a choice, a value, a confirmation. This part covers how screens behave across states, which controls to use, how forms should validate, how to forgive mistakes, and when to interrupt with an overlay.
6
Screen states: the UI stack
Taught by Scott Hurff, with Luke Wroblewski and Jakob Nielsen
Every screen that shows data has at least five states: blank, loading, partial, error and ideal. Most products design only the ideal one, so people meet the other four as raw, confusing defaults.
In a 2015 essay, designer Scott Hurff named this the UI stack: for any screen, stack up its blank state (nothing here yet), loading state (waiting for data), partial state (some data, not enough to feel complete), error state (something went wrong), and ideal state (the screenshot on your marketing page). The insight is that people spend a surprising share of their time in the non-ideal states, especially new users (blank and partial) and mobile users (loading and offline). Those states are where trust is built or lost.
The stack, left to right in the order a new user meets it. Blank and partial are a new user's whole first impression. Loading and error are every user's experience on a bad connection.
Lab: cycle the states
Cycle through every state in both versions. For each naive state, ask: what does the person know, and what can they do next?
Blank states are onboarding
An empty screen is the most valuable real estate a new user sees, because it is the first place they will act. A good blank state does three things: says what this place is for, shows what it will look like when full (a faint preview or sample), and offers the one action that fills it. Distinguish three kinds of empty: first use (nothing created yet: invite and teach), user cleared (inbox zero: reward, do not nag), and no results (search or filter found nothing: show what was searched and how to widen it).
Don't
No data.
A dead end. Says nothing about purpose or next step.
Do: first use
Your highlights live here
Select text in any book and tap Highlight. It will show up here, grouped by book.
Purpose, preview, action. One button, not five.
Do: no results
No highlights match "stoic" in Philosophy
Try searching all collections.
Echo the query, offer the widening move. The person sees why it is empty.
Loading: show shape, not just motion
Robert Miller's 1968 research, later popularised by Jakob Nielsen, gave three useful limits: about 0.1 second feels instant, about 1 second keeps the flow of thought, and about 10 seconds is the limit of attention. Under roughly a second, show nothing (a flashing spinner is worse than a short pause). Between one and ten seconds, show a skeleton: grey blocks in the shape of the coming content, an approach Luke Wroblewski wrote about in 2013 under the advice "avoid the spinner". Skeletons tell people what is coming and make the page feel as if it is arriving piece by piece. Beyond ten seconds, show real progress (a determinate bar, steps, a count) and let people do something else.
Match the feedback to the wait. A spinner that flashes for 200 ms makes a fast app feel slow.
Errors: say what happened, what is safe, what to do
A useful error state answers three questions in plain words: what happened, is my work safe, and what can I do now. "Something went wrong" answers none. "Couldn't sync. Your notes are saved on this device. Retry" answers all three. Keep the rest of the screen usable: show cached content with a small banner instead of replacing the whole screen with an error. For writing the words, see Words.
Offline is a state, not a crash
Phones lose signal in lifts, trains and basements every day. Decide for each screen what works offline: read cached data, create items that sync later, or nothing. Show a quiet, persistent indicator ("Offline. Changes will sync."), keep the UI usable, and mark unsynced items subtly. Apps built "local-first" store data on the device and treat the server as a sync partner, which makes offline the normal case instead of an error.
Do
Design all five states for every data screen, plus offline.
Make first-use blank states teach and offer one action.
Use skeletons for 1 to 10 second waits; nothing for under 1 second.
Keep cached content visible during errors and offline.
Use optimistic UI for actions that almost always succeed.
Don't
Ship "No data", "Error 500" or an infinite spinner.
Replace the whole screen with an error when one part failed.
Show sample data that looks like real data (people try to delete it).
Animate a spinner for sub-second operations.
In the wild
Things 3Cultured Code, 2017
Empty lists show a quiet illustration and short text rather than a blank page; completing everything in Today feels like a small reward. "User cleared" empty is a moment to celebrate quietly, not to upsell.
Facebook and LinkedIn feeds2010s onward
Grey placeholder blocks in the shape of posts appear while content loads, a technique widely copied. Skeletons set expectations about layout before data arrives.
Figma, Linear, Notion2020s
Edits appear instantly and sync in the background, with an indicator only when something fails. Optimistic UI makes networked software feel local, as long as failure is handled clearly.
For the solo creator
Make states a component, not an afterthought. Build one <StateView> that takes a status (blank, loading, partial, error, ideal, offline) and renders the right thing, and every screen gets all six states nearly for free. Then add a hidden debug menu that forces each state, so you can review them all in two minutes before each release.
Common mistakes
Designing with perfect data
Mockups use ideal names, ideal photos and exactly six items.
Design with real, messy data: one item, 500 items, missing images, 80-character names.
Spinners everywhere
The framework's default loading state is a spinner.
Delay any indicator by about 300 to 500 ms; use skeletons for content; use inline indicators on the specific button or row.
Errors without a way forward
The developer caught the exception and printed it.
Every error state gets a recovery action and reassurance about data.
Check yourself
Your stats screen needs at least 7 days of data to draw a chart. A user on day 2 opens it. What should they see?
Partial states should show what exists and explain what will unlock the full view, turning a disappointment into a goal. An empty chart and a bare message are dead ends; fake data confuses people about what is theirs.
Exercise 6.1 60 minutes · on your own product
Stack your three most important screens
Pick your three most-used data screens.
Force each into blank, loading, partial, error, ideal and offline (use dev tools: throttle network, go offline, delete data).
Screenshot all 18 states into one grid.
Rewrite the three worst states: purpose, reassurance, next action.
You're done when: you have an 18-cell state grid with the three worst states redesigned and shipped or ticketed.
Beginner
Competent
Strong
Captures states; finds problems.
Every state has purpose and an action; spinners replaced where apt.
Builds a shared state component and a debug switch so new screens get all states by default.
7
Choosing controls and buttons
Taught by the Apple Human Interface Guidelines and Material Design, with Jakob Nielsen and the GOV.UK Design System
Each control is a promise about how a choice works: how many options, how many can be picked, and when the choice takes effect. Choose the control whose promise matches the choice, and people will use it correctly without reading anything.
Controls are a vocabulary that everyone already learned from thousands of other apps. A round radio button says "pick exactly one of these". A square checkbox says "pick any". A switch says "this takes effect now, like a light". A dropdown says "there are more options than I want to show". Using the wrong one is like using the wrong word in a sentence: people understand the literal meaning and make the wrong move.
Each shape is a contract. Round means one, square means any, a pill-shaped switch means now. Breaking a contract (a switch that needs Save, checkboxes that behave like radios) makes people doubt every control.
Lab: control chooser
What kind of choice is it?
How many options?
When does it take effect?
What kind of number?
Describe a real choice from your product and see which control fits. The recommendation is a strong default, not a law; the reason line tells you what would change it.
Toggles mean now
A switch borrows from physical light switches: flip it and the light changes. Nielsen Norman Group's guidance on toggle switches makes the same point: use them for settings that take effect immediately. If the setting only applies after a Save button, use a checkbox, because a switch that does nothing until Save makes people wonder whether it worked. Label switches with the thing being controlled ("Sync over cellular"), not a question, and never with a label that changes when flipped ("Turn on" / "Turn off"), which makes the state ambiguous.
Button hierarchy
Most screens have one action that matters most. Give it the strongest visual weight (the primary button: filled, high contrast). Give alternatives a quieter style (secondary: outlined or tinted). Give low-stakes or escape actions the quietest (tertiary: text only). One primary per view is a good rule; two primaries mean you have not decided what the screen is for. Destructive actions get a warning colour (red), but not the primary weight, unless the whole purpose of the dialog is to destroy (then the red button is the primary).
Don't
Everything shouts, so nothing guides. Delete sits next to Save with equal weight, one slip from disaster.
Do
One primary, a quiet escape, destruction set apart. Distance and colour both protect the dangerous action.
Placement conventions per platform
Where the primary button goes is a convention, and conventions differ. Follow the platform, because people's hands move before their eyes read.
In macOS alerts the default button sits at the bottom right with Cancel to its left; destructive buttons are red, and the default button responds to Return. iOS alerts with two buttons place them side by side; action sheets put Cancel at the bottom, separated. Sheets on iOS use navigation-bar buttons: Cancel top left, Done or Save top right.
Windows dialogs traditionally right-align the buttons with the affirmative button first: OK then Cancel. Mac users moving to Windows (and the reverse) often hit the wrong one at first, which is exactly why following the platform matters more than any universal rule.
Material dialogs place text buttons at the bottom right, with the confirming action on the far right and dismiss to its left. Full-screen dialogs put a close icon at top left and the confirming action at top right.
The web has no single convention. Pick one and use it everywhere in your product. A common choice for forms is primary on the left, aligned with the fields above it, so the eye flows straight down; for dialogs, primary at the bottom right. Consistency inside your product beats any outside rule.
Links versus buttons
A link goes somewhere; a button does something. Links change the URL, can open in a new tab and are announced as links by screen readers. Buttons submit, toggle, open menus or change data. Styling a link to look like a button is fine for a navigation call to action ("Start free trial" going to a sign-up page); making a <div> behave like either is not, because it loses keyboard and assistive-technology behaviour (see Accessible & Inclusive).
Pickers and dates
Match the date control to how people think about the date. For a known date far away (a birth date, a passport expiry), let people type it: the GOV.UK Design System uses three separate text boxes for day, month and year, because scrolling a calendar back 35 years is tedious. For a near date relative to today (a booking, a due date), a calendar helps because people think in weekdays ("next Friday"). For natural language, apps such as Fantastical and Things parse "tomorrow 3pm" or "next week". For sliders, add a number field next to them when exact values matter, because sliders are imprecise for fingers.
Do
Show options as radios or a segmented control when there are 5 or fewer.
Use switches only for immediate effect.
Keep one primary button per view.
Follow platform button order.
Let people type dates they already know.
Don't
Hide 2 or 3 options inside a dropdown.
Use a dropdown for country lists without type-to-filter.
Make destructive actions primary-styled by default.
Use a slider for an exact value like a price.
Use a div as a button.
In the wild
iOS SettingsApple
Switches change things immediately (Wi-Fi, Bluetooth), with no Save button anywhere in Settings. A whole app can use the immediate-effect model consistently.
GOV.UK Design SystemGovernment Digital Service
Publishes researched patterns for date input, radios, checkboxes and more, with notes on when not to use each. A free, evidence-based reference for form controls.
FantasticalFlexibits, 2011 onward
Creating an event by typing a sentence such as "Lunch with Asha Friday 1pm" fills in all the fields. The best picker can be no picker, when language is faster.
For the solo creator
Use native controls first: <select>, <input type="date">, system switches. They are accessible, localised and familiar. Write a custom control only when the native one clearly fails your users, and then copy the native keyboard behaviour exactly.
Common mistakes
Switches that need Save
The switch looks nicer than a checkbox.
Either apply immediately or use a checkbox in the form.
Two primaries
Both actions feel important to you.
Decide which one most people want right now; demote the other.
Dropdown for yes/no
Form builders default to selects.
Two visible radios (or one checkbox) are faster and show both options at once.
Check yourself
In a reading app, people choose between "Light", "Sepia" and "Dark" themes and expect to see the change right away. Which control?
One of three, visible, immediate effect: that is the segmented control's promise. Swatches that show the actual colours are even better. Checkboxes and switches allow impossible combinations; a dropdown hides three short options.
Exercise 7.1 45 minutes · on your own product
Control audit
List every control in your product's settings and main forms.
For each, note kind (on/off, one, several, number), option count and timing.
Run each through the chooser above. Mark mismatches.
Check button hierarchy on your five busiest screens: count primaries per view.
You're done when: you have a table of controls with current versus recommended, and a list of screens with more than one primary.
Beginner
Competent
Strong
Finds a few mismatches.
All controls audited; fixes listed with reasons.
Also checks keyboard behaviour and platform button order, and replaces at least one control with a smarter default or natural-language input.
8
Forms that people finish
Taught by Luke Wroblewski (Web Form Design), with Caroline Jarrett and the GOV.UK Design System
A form is a conversation in which you ask for something. Ask for less, ask clearly, accept answers in the form people give them, and tell them about problems at the right moment and in the right place.
Forms are where products make money and lose people: sign-up, checkout, onboarding, settings. Luke Wroblewski's Web Form Design: Filling in the Blanks (2008) and Caroline Jarrett and Gerry Gaffney's Forms that Work (2008) are still the best short books on the subject. Their shared message: most form problems are not visual. They come from asking unnecessary questions, in an order that makes no sense, with rules the person cannot see until they break them.
Layout: one column, labels on top
A single column gives the eye one straight path: top to bottom, no zig-zag, no wondering whether the field on the right comes before or after the one below. Multi-column forms cause people to skip fields. Labels above fields are fastest to scan, work at any screen width, and handle long translations. Matteo Penzo's 2006 eye-tracking study, reported on UXmatters, found top-aligned labels needed the fewest fixations. Placeholder text as the only label is the worst option: it disappears as soon as someone types, so they cannot check what the field was for, and its pale grey usually fails contrast.
Don't: placeholder only
Labels vanish on typing and pale hints fail contrast.
OK: left labels
Zig-zag path. Fine on wide screens for short, familiar data; breaks on phones.
Do: top labels
One straight path, label always visible, works at any width.
Validation timing: the most common form bug
When should a form tell someone they made a mistake? Too late (only after Submit, with all errors at the top) and people must hunt for the problem. Too early (on every keystroke from the first letter) and the form scolds people for being in the middle of typing: "Invalid email" appears while they are still typing "rohit@". The pattern that works best for most fields:
Stay quiet while the person types a field for the first time.
Validate when they leave the field (on blur). Show the message right under the field.
Once an error is showing, re-check on every keystroke, so the error disappears the instant it is fixed. Reward is fast; punishment is patient.
On submit, validate everything, move focus to the first error, and (for long forms) show a summary at the top that links to each error.
A 2009 study by Luke Wroblewski with the usability firm Etre compared inline validation to submit-only validation and found higher success rates and much faster completion with inline validation, especially when messages appeared after people finished a field rather than while they were typing. Exceptions where live feedback while typing is right: password strength meters, character counters and username availability, because there the feedback helps people compose the answer.
Demo: validation, bad versus good. Type in both.
Without: placeholder labels, asterisks on everything, errors from the first keystroke, hidden password rules revealed only after you fail, and phone formats rejected.
With: labels on top, the rule shown up front, quiet until you leave a field, then live once an error shows, a Show button for the password, phone tidied on blur, and "optional" marked instead of "required".
Where error messages go
Put the message directly below the field it is about, start it with what to do ("Enter an email like name@example.com"), and mark the field with more than colour (an icon or thicker border) so it is visible to colour-blind people. Keep the person's input; never clear a field because it was wrong. For a form longer than one screen, add an error summary at the top after submit, with links that jump to each field: that is the GOV.UK pattern and it works well with screen readers.
The GOV.UK error pattern. Summary for orientation, inline message for repair. Both use the same words.
Required, optional, and asking less
If most fields are required, mark the few optional ones with "(optional)" in the label, as GOV.UK recommends; a sea of red asterisks is noise. Better still, question every optional field: why ask at all? Each field has a cost in time and in trust. A phone number "for account security" on a reading app makes people wonder what you will do with it.
Accept input the way people give it
Input masks that force a format while typing (brackets and dashes appearing in a phone field) often fight paste, autofill and international numbers. A gentler approach: let people type freely, strip spaces and punctuation, and display a tidy format after they leave the field. Exception: card numbers, where grouping digits in fours while typing helps people check them. Smart defaults remove work: preselect the country from the device locale, the currency from the country, today for a date. Autofill is the cheapest speed-up there is: use the correct autocomplete values (email, name, street-address, one-time-code) and the right input types, so phones show the right keyboard and offer saved details.
Passwords
The US National Institute of Standards and Technology's digital identity guidelines (SP 800-63B, 2017) recommend against composition rules (one uppercase, one symbol) and forced periodic changes, and in favour of a minimum length, checking against lists of breached passwords, allowing paste (so password managers work), and offering a way to show the password. Those recommendations are good design too: show the length rule before people type, let them see what they typed, and never block paste. Better still, consider passkeys or email sign-in links.
Multi-step and long forms
Split a long form into steps when the steps match a natural grouping (shipping, then payment, then review) or when later questions depend on earlier answers. Show progress honestly ("Step 2 of 3", not a bar that jumps), let people go back without losing data, save progress automatically, and end with a review step for anything costly. GOV.UK's "one thing per page" pattern goes further: each page asks one question, which works very well on phones and for complex, branching forms.
Honest progress with named steps. Completed steps stay clickable for edits; the review step is where costly mistakes are caught.
Do
One column, labels above fields.
Validate on blur; re-check live after an error shows.
Show rules before people type.
Use correct input types and autocomplete values.
Mark optional fields; remove the ones you can.
Keep data when going back or on error.
Don't
Use placeholder text as the only label.
Show errors on the first keystroke.
Clear the password or the whole form on error.
Block paste in password or code fields.
Force rigid formats for phone numbers or names.
In the wild
Stripe ElementsStripe
The card field detects the card brand from the first digits, groups numbers, and moves to the expiry field automatically when the number is complete. Small anticipations add up to a form that feels like it is helping.
iOS one-time codesApple, iOS 12 (2018)
Fields marked as one-time-code offer the code from an incoming SMS above the keyboard. One attribute in your markup can remove a whole app switch.
GOV.UKGovernment Digital Service
"One thing per page" forms and the error summary pattern, both documented with research notes. Simple, plain forms serve everyone, including people under stress.
For the solo creator
Write one form field component with label, hint, error, and the validation timing built in, and use it everywhere. Ten lines of state (touched, dirty, error) give you blur-then-live validation on every form for free. And before adding any field, write down what you will do with the answer. If you cannot, delete the field.
Common mistakes
Validating like a compiler
Validation libraries run on every change by default.
Track a "touched" flag per field; show errors only after blur or submit.
Hidden rules
Rules live in backend code and surface as errors.
Show every rule as hint text before input.
Splitting names
The database has first and last name columns.
Many cultures do not fit "first/last". Ask for "Full name" and, if needed, "What should we call you?"
Check yourself
A user types "rohit" in the email field and moves on. Then they come back and type "@gmail.com". When should the error appear and disappear?
Blur reveals the error once the person has finished; live re-checking removes it as soon as it is fixed. That pairing is patient with mistakes and quick with rewards.
Exercise 8.1 60 minutes · on your own product
Rebuild your most important form
Pick the form that matters most (sign-up, checkout, first setup).
For every field, write why you need it. Delete or defer any field without a clear reason.
Rebuild with top labels, hints for rules, blur-then-live validation, correct input types and autocomplete values.
Test it on a phone with autofill, a password manager and a deliberately wrong entry in each field.
You're done when: the form has fewer fields, every rule is visible up front, and you have a short screen recording of the error and recovery behaviour on a phone.
Also adds smart defaults, a reusable field component, and measures completion time before and after.
9
Errors, forgiveness and safety
Taught by Don Norman, with Aza Raskin, Ben Shneiderman and Shigeo Shingo
People will make mistakes; that is not a user problem but a design input. Prevent the errors you can, make the rest cheap to reverse, and save warnings for the few actions that truly cannot be undone.
Don Norman distinguishes slips (you meant to do the right thing but your hand did something else: clicked the wrong row) from mistakes (you formed the wrong goal: you thought "Archive" meant delete). Slips happen most to experts working fast; mistakes happen to people whose mental model is wrong (see The Human Mind). The defences differ. Slips are stopped by constraints, spacing and undo. Mistakes are stopped by clear labels, previews and visible consequences.
Climb the ladder before writing an error message. Most products start at rung 5 and 4. The calm ones live on rungs 1 to 3.
Prevention: constraints and poka-yoke
The Japanese engineer Shigeo Shingo popularised poka-yoke ("mistake-proofing") at Toyota: design the part so it can only fit one way. In software: a date picker cannot produce February 30; a "Send" button is disabled until there is a recipient (with a hint that says why); a file type filter only shows files you can open; dangerous actions are placed away from frequent ones. When you disable something, explain why near it, otherwise people think the product is broken.
Undo beats "Are you sure?"
Confirmation dialogs fail for a simple reason: habituation. After the third "Are you sure?" that did not matter, people click "Yes" before reading, so the dialog protects nothing on the one day it matters. Aza Raskin made this case in his 2007 A List Apart essay "Never Use a Warning When You Mean Undo". Undo works with habits instead of against them: people act at full speed, and the rare slip costs one click. Gmail's "Undo send" (a short delay before the message really goes) is the famous example. Feel the difference yourself below.
Demo: confirm versus undo. Delete three notes, quickly.
Confirm: every delete costs two clicks and a decision. By the third one you stop reading the dialog, which is exactly when it fails to protect you.
Undo: one click per delete, full speed, and a slip is fixed with Undo. Count your clicks in both versions.
Layers of reversibility
Undo is not one feature but a set of safety nets at different time scales. Immediate undo (a toast with Undo, or ⌘Z) covers seconds. A trash or archive covers days: Google Drive and many other services keep deleted files in trash for 30 days. Version history covers weeks or forever: Google Docs keeps a full revision history, and macOS added Auto Save and Versions in OS X Lion (2011). Autosave removes the oldest disaster in computing, losing work you forgot to save. Together they let people experiment, which Shneiderman lists among his "eight golden rules" as "permit easy reversal of actions".
Nets at every time scale. Each one lets people act faster and worry less. The longer nets also cover the mistakes people notice only later.
When you must warn: make it specific and effortful
Some actions really are irreversible: deleting an account, permanently emptying trash, deleting a repository, sending money. For these, a generic "Are you sure?" is too easy to dismiss. Name the consequence precisely ("This permanently deletes 'Thesis' and its 214 notes. This cannot be undone."), make the button label the action ("Delete 214 notes", not "OK"), and for catastrophic cases ask for deliberate effort. GitHub asks you to type the repository's name before deleting it. The typing is not a password; it is a speed bump that forces you to read.
Don't
Vague and easy. Sure about what? "OK" invites the reflex click.
Do
Specific, effortful, labelled with the action. Reserved for the truly irreversible.
Action
Reversible?
Pattern
Archive or delete one item
Yes, via trash
Act immediately, toast with Undo
Bulk delete 300 items
Yes, via trash
Act, toast "300 items moved to Trash · Undo"
Send a message
Briefly
Delay sending a few seconds with Undo
Empty trash permanently
No
Specific confirmation naming the count
Delete account or workspace
No, catastrophic
Type-to-confirm plus email notice; consider a grace period
Discard an unsaved draft
Avoidable
Autosave the draft instead of asking
Do
Prefer constraints and undo to warnings.
Add a trash with a clear retention period.
Autosave everything people type.
Name the object and count in irreversible confirmations.
Label destructive buttons with the verb and object.
Don't
Ask "Are you sure?" for reversible actions.
Use OK and Cancel as labels for a destructive choice.
Disable a button without saying why.
Put destructive and frequent actions side by side.
Ask "Save changes?" when you could have saved them.
In the wild
Gmail Undo SendGoogle, Labs 2009, standard 2015
After sending, a toast offers Undo for a few seconds (adjustable in settings) while the message is held back. A small delay turns an irreversible act into a reversible one.
GitHub repository deletionGitHub
Deleting a repository requires typing its name. Effort proportional to consequence.
Google DocsGoogle
No Save button; changes save continuously and Version history lets you restore any earlier state. When everything is saved and versioned, "Save changes?" disappears from the product.
macOS TrashApple
Deleting a file moves it to Trash, and Put Back restores it to its original folder. The best delete is a move.
For the solo creator
Implement delete as a soft delete from day one: a deleted_at column, hidden from queries, purged by a job after 30 days. It costs an hour and makes Undo, Trash and "I deleted it by accident" support emails trivial forever. Undo for edits is harder; start with soft delete and autosave, which cover most of the pain.
Common mistakes
Confirmation everywhere
It feels responsible.
Remove confirmations for reversible actions; add undo. Keep a few specific ones for the irreversible.
Undo that expires too fast
A 2-second toast looks tidy.
Keep undo toasts visible for at least 5 to 8 seconds, pause the timer on hover, and keep the action reachable in trash afterwards.
Blaming the user
Error messages are written from the system's point of view.
Say what happened and how to fix it, not "Invalid input" or "You failed to…" (see Words).
Check yourself
People in your note app keep accidentally archiving notes with a swipe. What is the best fix?
The swipe is fast and valuable for most people; slips are cheap if undo is immediate and the archive is findable. A confirmation would slow everyone and soon be ignored. Removing the gesture punishes the majority.
Exercise 9.1 45 minutes · on your own product
Climb the ladder for every destructive action
List every action that removes, overwrites, sends or pays.
For each, write which rung of the ladder it currently uses.
Move each one as high as possible: a constraint, a soft delete with undo, autosave or versions.
Rewrite the remaining irreversible confirmations with object names, counts and action-labelled buttons.
You're done when: you have a table of actions with old and new rungs, and every remaining confirmation is specific.
Beginner
Competent
Strong
Rewrites confirmation text.
Replaces most confirmations with undo; soft delete in place.
Adds trash with retention, versions or autosave, and type-to-confirm for the one catastrophic action.
10
Modes, modals and overlays
Taught by Larry Tesler and Jef Raskin, with the Apple and Material guidelines
A mode is any state in which the same action does something different. Modes cause errors because people forget which one they are in. Avoid them where you can, make them loud where you cannot, and choose the lightest overlay that does the job.
Larry Tesler spent much of his career at Xerox PARC and Apple campaigning against modes; his car's licence plate famously read NOMODES. In the 1970s he and Tim Mott built Gypsy, an early modeless text editor at PARC, where you could simply click and type rather than first entering an "insert mode". Jef Raskin, who started the Macintosh project, wrote in The Humane Interface (2000) that modes are a major source of errors, because a habit formed in one mode fires in the other. Caps Lock is the everyday example: you type a password with Caps Lock on and it fails, because the keyboard was in a mode you did not notice.
Raskin's alternative is the quasimode: a mode that lasts only while you physically hold it, like the Shift key. Your body keeps track of the mode, so you cannot forget it. Holding Space to pan in Figma or Photoshop is a quasimode; pressing a tool key that stays on until you change it is a full mode.
Where the mode lives decides how often it bites. Make unavoidable modes visible on the screen, or tie them to a held key or gesture.
When modes are worth it
Some modes earn their place: an editor's "focus mode", a drawing app's pen tool, a camera's video mode. Make them safe with three rules. Make the mode visible where the person is looking (a coloured border, a changed cursor, a persistent label). Make it easy to exit with the same control that entered it, plus Esc. Keep it short-lived where possible, or revert automatically when the task ends.
Modals: the interruptions
A modal dialog is a mode: while it is open, the rest of the app does not respond. That is its power (it forces a decision) and its cost (it blocks everything, including copying information from the page behind it). Overlays come in a range from heavy to light. Choose the lightest one that does the job.
Heavy at the top, light at the bottom. Most messages belong in the bottom three. If you reach for a dialog for something that is not critical, you are spending the person's attention without asking.
Dialog (alert)
Small, centred, blocks everything. For decisions that cannot wait and are costly to get wrong. Two or three buttons with verb labels.
Sheet / modal page
A larger surface for a contained task (compose a message, create an event). Has its own Cancel and Done. Should autosave drafts if dismissed.
Popover / menu
Anchored to the element that opened it. Dismissed by clicking outside or pressing Esc. Does not block the page.
Toast / snackbar
Brief message near the bottom confirming an action, often with Undo. Does not block. Never use for errors that need action, since it disappears.
Banner
A persistent strip at the top of a screen or section for ongoing conditions. Stays until the condition ends or is dismissed.
Inline
The message lives in the content itself: an empty state, a field error, a hint under a setting. The calmest option.
Don't
A dialog for good news. Blocks the work to announce that nothing went wrong, and demands a click to continue.
Do
Inline status. The work continues; the confirmation is there if you look for it.
Do
Choose the lightest overlay that fits.
Make any mode visible and exit it with Esc.
Prefer quasimodes (hold to activate) for temporary tools.
Return focus to the triggering element when an overlay closes.
Autosave sheet contents if dismissed.
Don't
Use a modal for success messages.
Stack a modal on a modal.
Put errors needing action in a toast that vanishes.
Open a dialog on page load (newsletter, cookie walls aside, see Honest & Calm).
Hide the current mode in a small icon.
In the wild
GypsyXerox PARC, mid-1970s
Larry Tesler and Tim Mott's editor let people select text by dragging and insert by typing, without modes, and introduced cut and paste in a form close to what we use today. Modeless editing became the default because it removed a whole class of errors.
vimBram Moolenaar, 1991
A deliberately modal editor: normal mode for commands, insert mode for typing. Experts love its speed; newcomers famously cannot find how to quit. Modes can pay off for experts who invest in them, and they cost newcomers dearly.
FigmaFigma
Holding Space turns the cursor into a hand for panning; releasing returns to the previous tool. A quasimode gives a temporary tool with no state to forget.
For the solo creator
Make one overlay system: a dialog, a sheet, a popover, a toast and a banner component, with focus trapping, Esc handling and focus return built in. The native <dialog> element and the popover attribute in modern browsers handle much of this for you. Then ban ad-hoc overlays in your own code review.
Common mistakes
The modal as a page
Modals feel quick to build.
If it scrolls, has tabs, or needs a URL, make it a page.
Silent modes
A selection or editing mode is shown only by a small icon change.
Change something large: the toolbar, a border, a label. Offer Esc to exit.
Toasts for errors
One notification component handles everything.
Errors that need action go inline or in a banner that stays until resolved.
Check yourself
Your app loses connection while the person is editing. Which overlay?
Offline is an ongoing condition affecting the whole screen: a banner. A dialog blocks work for no reason; a toast vanishes while the condition persists; silence leaves people unsure whether their work is safe.
Exercise 10.1 40 minutes · on your own product
Overlay and mode inventory
List every dialog, sheet, popover, toast and banner in your product.
Run each through the decision tree. Mark each one that is heavier than needed.
List every mode (editing, selection, tools, focus). Check: visible, exit with Esc, short-lived?
Replace the two worst offenders.
You're done when: you have an inventory table with "current" and "should be" columns and two overlays downgraded in the product.
Beginner
Competent
Strong
Inventory exists.
All overlays checked; success dialogs removed.
Also fixes focus return, Esc handling and mode visibility across the product.
Recap and connect: Part two
States (6), controls (7), forms (8), forgiveness (9) and overlays (10) share one theme: respect for the person's attention and effort. Every chapter asked you to pick the lightest, most predictable option that still does the job.
Connect the ideas
Chapter 1 said verbs belong on objects. Chapter 9 said deletes should be reversible. Where should "Restore" live?
Trash is just a collection view of deleted objects, and Restore is a verb on each. The toast covers the first seconds; the Trash covers the rest. Objects-first thinking places it naturally.
Connect the ideas
In Foundations you met feedback as a basic principle. Which design gives the best feedback for a "Save" action in an editor that autosaves?
Feedback should be proportional: quiet when things go right, loud only when they go wrong. A modal blocks; a toast per keystroke is noise; no indicator leaves people anxious.
Part three
Hands on: pointer, keyboard, touch and the small moments
People do not use software with their eyes; they use it with hands, through a mouse, a trackpad, a keyboard or a fingertip. This part covers direct manipulation, keyboard-first design, touch and gestures, and the microinteractions where a product's feel lives.
11
Direct manipulation, drag and drop, selection
Taught by Ben Shneiderman, with Bret Victor and the Apple Human Interface Guidelines
When people can see the objects and act on them directly, with immediate, visible and reversible results, they learn by doing instead of by reading. Drag and drop, selection and bulk actions are where this works or fails.
Ben Shneiderman coined "direct manipulation" in a 1983 paper in IEEE Computer. He described three properties: a continuous representation of the objects of interest; physical actions (pointing, dragging) instead of typed commands; and rapid, incremental, reversible operations whose effect is immediately visible. Spreadsheets, the desktop, and today's design tools and kanban boards all follow this model. You met Bret Victor's version of the idea in the starter guide: creators need an immediate connection to what they make. The interaction-design job is to make that connection reliable.
Drag and drop: four moments to design
A drag has a beginning, a middle and an end, and each needs feedback. Most broken drag interactions skip one of them.
Every moment answers a question. Can I drag this? Did I pick it up? Where will it land? Did it land where I meant? Skip one and people drop things in the wrong place or never discover the drag at all.
Demo: drag a card to another column
Without: nothing tells you the card is draggable, nothing moves with your pointer, no column lights up. You find out where it went only after letting go.
With: grip handle, the card lifts and follows the pointer, the target column highlights, and an Undo appears after dropping. The "Move" button is the non-drag path (works with keyboard and screen readers).
Selection models
Desktop operating systems settled on a selection grammar decades ago, and people's hands know it: click selects one and deselects others; Shift-click extends a range; Cmd-click (Ctrl on Windows) toggles one item; ⌘A selects all; Esc clears. On touch, there is no hover or modifier key, so apps add an explicit selection mode ("Select" button, then tap to toggle, with a count in the title) or long-press to start selecting. Follow these conventions exactly; a list where Shift-click does something different is a list people distrust.
Bulk actions
When items are selected, the actions that apply to all of them should appear where the selection is (a toolbar that replaces the normal header, with a count: "12 selected"). Gmail solved a subtle problem well: "select all" selects only the visible page, and a banner then offers "Select all 1,240 conversations that match this search". That keeps the common case safe and the powerful case one click away. After a bulk action, report the result with a count and an Undo.
Don't
Selection with nowhere to go. No count, actions far away, no hint of what applies to the selection.
Do
The header becomes a selection toolbar. Count, relevant actions and a clear exit, right where the eye already is.
Do
Design all four drag moments: affordance, lift, travel, drop.
Highlight valid drop targets only, and show the exact insertion point.
Offer a non-drag alternative (menu, keyboard) for every drag.
Follow platform selection conventions exactly.
Show a selection count and put bulk actions where the selection is.
Don't
Make drag the only way to reorder or move.
Let things drop silently onto invalid targets.
Start drags with zero movement threshold (clicks become accidental drags).
Apply bulk actions to hidden items without saying so.
In the wild
TrelloFog Creek, 2011
Cards tilt slightly when lifted, the target list shows a gap where the card will land, and every card also has a "Move" action in its menu. The tilt is not decoration; it says "this is in your hand now".
Things 3 Magic PlusCultured Code, 2017
The "+" button can be dragged into a list to insert a new to-do exactly where you drop it, or tapped to add at a default position. Drag as an accelerator layered on a simple tap.
Gmail select allGoogle
Selecting all selects the page, then offers a banner to extend to every match. Safe default, explicit escalation.
For the solo creator
Drag and drop is expensive to get right, especially with touch, scrolling containers and accessibility. Use a well-tested library (for example dnd-kit on the web, or the platform's drag APIs on iOS and Android), and ship the "Move to…" menu first. Many products never need more.
Common mistakes
Invisible draggability
The designer knows it can be dragged.
Show a grip on hover, change the cursor, and mention it in the empty state once.
No auto-scroll
Tested with a short list.
Scroll the container when the pointer nears its edge during a drag.
Selection that resets
Lists re-render after any action.
Keep selection stable across refreshes and after non-destructive actions.
Check yourself
Your kanban board lets people drag cards between columns. A screen reader user reports they cannot move cards at all. What is the right fix?
Drag is a pointer gesture; the underlying operation (move to column X, position Y) needs a non-pointer path. A labelled action works for keyboards, screen readers and anyone who finds dragging hard. Labels alone do not make dragging possible.
Exercise 11.1 40 minutes · on your own product or one you use daily
Dissect a drag and a selection
Record yourself (screen recording) dragging something in your product or a favourite tool.
Step through frame by frame. For each of the four moments, write what feedback appears.
Try multi-select with Shift-click, Cmd-click and keyboard. Note any convention it breaks.
List the non-drag path for every drag. Add any that are missing to your backlog.
You're done when: you have a four-moment table, a selection-convention checklist, and missing non-drag paths listed.
Beginner
Competent
Strong
Describes the drag.
Identifies missing moments and broken conventions.
Implements a non-drag path and fixes one missing moment in your own product.
12
Keyboard-first design and command palettes
Taught by the makers of Superhuman, Linear, Raycast and VS Code, with Jef Raskin
The keyboard is the fastest input device most people own. Products that respect it let beginners use menus and buttons while showing them, every time, the shortcut that will make them faster.
Mouse and touch are great for discovery and spatial work; the keyboard is great for repetition. A person who archives 100 emails a day saves real time with a single-key shortcut. But shortcuts are invisible, so they must be discoverable: shown next to the menu item or in the tooltip of the button, so people learn them by using the product normally. macOS has done this since 1984: every menu item lists its shortcut on the right. That is the model: the slow path teaches the fast path.
Three layers, each one discovered through normal use. Gmail, GitHub and many others open a shortcut overlay with ?. Command palettes add a fourth layer: they show the shortcut next to each command they find.
Command palettes
A command palette is a search box for actions and places. Press a shortcut (often ⌘K), type a few letters, use arrow keys to pick, press Enter. It turns a product with hundreds of commands into one with a single, learnable entry point. Sublime Text and VS Code (⌘ShiftP) made the pattern familiar to developers; Superhuman and Linear made ⌘K central to their products; Raycast and Alfred apply it to the whole Mac, following Spotlight (2005). A good palette has: forgiving matching (typing "arc" finds "Archive"), results grouped by type, the shortcut shown next to each command, recent commands first, and context awareness (actions for the selected item appear at the top).
Lab: a mini command palette
Click the box, then type "arc", "new", "dark" or "go". Use ↑ ↓ and Enter.
Notice: matching is forgiving (letters in order, not exact words); matched letters are underlined; each result shows its group and shortcut; Enter runs the highlighted item. Every run teaches you the shortcut for next time.
Designing shortcuts
Respect platform standards first.⌘Z, ⌘C, ⌘F, Esc, Tab, Enter must do what they do everywhere.
Single keys for frequent actions in list-based apps (Gmail's E archive, J/K next/previous, inherited from vi). Only when focus is not in a text field.
Mnemonics:C for compose, A for assign. Sequences such as G then I ("go to inbox") give a whole namespace of navigation.
Never override browser or system shortcuts people rely on, such as ⌘W or ⌘L.
Focus management
Keyboard use depends on focus: which element receives keys. Focus must always be visible (a clear ring), move in a logical order with Tab, go into a dialog when it opens, stay trapped inside while it is open, and return to the button that opened it when it closes. After deleting an item from a list, move focus to the next item, not to the top of the page. These rules are also accessibility rules (see Accessible & Inclusive), and they make the product faster for everyone who prefers keys.
Don't
Focus lost. After closing the edit dialog, the keyboard user must tab through 30 items to get back.
Do
Focus returns home. The person continues exactly where they were.
Do
Show shortcuts in menus, tooltips and the palette.
Offer a ? overlay listing all shortcuts.
Keep focus visible and logical; return it after overlays close.
Use single-key shortcuts only outside text fields.
Make every palette command also reachable by visible UI.
Don't
Override standard system or browser shortcuts.
Hide features only in the palette.
Remove focus outlines for looks.
Require exact text matches in the palette.
In the wild
SuperhumanSuperhuman, 2017 onward
Built around the keyboard and ⌘K; the palette shows each command's shortcut so people graduate to it. Teach the fast path through the slow path.
VS CodeMicrosoft, 2015
The Command Palette exposes nearly every command, with fuzzy matching and recently used commands at the top. One entry point can make a huge feature set approachable.
RaycastRaycast, 2020
A launcher where extensions add commands to the same search-and-run interface. A palette scales as a platform when every command shares one grammar.
GmailGoogle
Optional single-key shortcuts (J, K, E, R) and a ? overlay. Power features can sit quietly behind a simple default.
For the solo creator
A command palette is a great investment for a small team: it gives every new feature an instant, discoverable home without new navigation. Keep a single registry of commands (id, title, group, shortcut, handler, "is available" check) and render menus, the palette and the ? overlay from it. One source of truth, three surfaces.
Common mistakes
Secret shortcuts
They are documented only in a help page.
Show them everywhere the command appears.
Shortcuts firing while typing
Global key handlers ignore focus.
Ignore single-key shortcuts when focus is in an input, textarea or contenteditable.
The palette as the only map
It feels elegant to have one box for everything.
Newcomers need visible navigation; the palette accelerates, it does not replace.
Check yourself
You add a single-key shortcut D for "Delete note". Users report notes disappearing. What happened, and what is the fix?
Typing a word with "d" in it triggered deletion. Scope single-key shortcuts to non-editing focus, and make destructive shortcuts undoable (chapter 9). A confirmation would make the shortcut pointless.
Exercise 12.1 90 minutes · on your own product
A command registry and a palette
List your 15 most-used actions and places. Give each a group and, for the top 5, a shortcut that respects platform standards.
Create a single command registry in code.
Render a palette with forgiving matching and arrow-key selection (copy the lab's approach).
Show shortcuts in tooltips and menus from the same registry. Add a ? overlay.
Unplug your mouse for 15 minutes and use your product. Note every dead end.
You're done when: the palette works, shortcuts show up in at least two places, and you have a list of keyboard dead ends with fixes.
Beginner
Competent
Strong
Lists shortcuts.
Working palette from a registry; focus visible everywhere.
Context-aware palette, ? overlay, focus return after overlays, and the no-mouse test passes.
13
Touch, thumbs and gestures
Taught by Steven Hoober, with Paul Fitts, Josh Clark and the Apple and Material guidelines
A fingertip is large, imprecise and covers what it touches. Make targets big enough, put frequent actions where thumbs reach, and treat gestures as shortcuts layered on visible controls, never as the only way.
Fitts's law (from The Human Mind) says the time to hit a target depends on its distance and size. On touch screens there is a second problem: the finger pad is roughly a centimetre across, and it hides the target as you press. That is why both major platforms set minimum target sizes: Apple's Human Interface Guidelines recommend at least 44 × 44 points, and Material Design recommends at least 48 × 48 dp (about 9 mm). WCAG 2.2 added a minimum of 24 × 24 CSS pixels (success criterion 2.5.8, level AA), with spacing exceptions, and keeps 44 × 44 as the stricter AAA level (2.5.5). The visible icon can be smaller; the tappable area should not be.
Lab: target size versus a fingertip
The dashed circle approximates a fingertip contact area (about 40 CSS px across on a typical phone; real fingers vary). Watch where your target passes each guideline, and how spacing makes small targets safer.
Thumb zones
Steven Hoober's observational research (published from 2013 onward) watched how people actually hold phones in the street and found many grips: one-handed with the thumb, cradled in two hands, and two thumbs. He found people shift grip often, and that the centre of the screen is easiest to reach and to tap accurately. On today's tall phones, the top corners are the hardest to reach one-handed. That is why primary actions have migrated to the bottom: tab bars, bottom sheets, floating action buttons and the search bar at the bottom of Safari on iOS 15 (2021).
Not a precise map, a pressure. Zones vary with phone size and grip. The direction is reliable: frequent toward the bottom, risky toward the top.
Gestures are accelerators
Gestures (swipe to archive, pinch to zoom, pull to refresh, long-press for a menu) are fast once known and invisible until then. Josh Clark's writing on touch design (including Designing for Touch, 2015) makes the case for gestures as the "keyboard shortcuts of touch": treat them like shortcuts. Every gesture should have a visible equivalent: a swipe-to-delete row also has Delete in its menu; long-press menus repeat actions available elsewhere. Pinch to zoom, scroll, tap and swipe-between-pages are close to universal; anything else must be taught or discovered, and some people never will.
Edge swipes and conflicts
The screen edges belong to the system. iOS uses a swipe from the left edge for back (since iOS 7) and from the bottom for home; Android 10 and later use swipes from either side edge for back. An app that puts its own horizontal swipe gestures near an edge (a drawer, a carousel, a drawing canvas) fights the system, and the system usually wins. Keep custom swipes away from the edges, or respect the platform's gesture exclusion rules where you truly need them, such as in a drawing app.
Gesture conflicts are invisible in mockups and obvious in the hand. Test every gesture on real devices with system navigation gestures turned on.
Long-press and hover
Long-press is the touch equivalent of right-click: useful for context menus and previews, but hidden. Keep it for secondary actions. Hover does not exist on touch, so anything shown only on hover (tooltips, row actions, previews) must also be reachable another way. On iPad with a trackpad and on laptops with touch screens, design for both at once: hover reveals, tap and click both work.
Don't
Small, crowded, far from the thumb, with a destructive action one slip away.
Do
Big, spaced, in reach, with delete moved into "More" where it cannot be hit by accident.
Do
Make tappable areas at least 44 pt (iOS) or 48 dp (Android).
Put frequent actions in the bottom half.
Give every gesture a visible equivalent.
Keep custom swipes away from screen edges.
Test on a real phone, one-handed, walking.
Don't
Put primary actions only in the top corners.
Rely on hover or long-press for essential actions.
Place destructive targets next to frequent ones.
Invent gestures that need a tutorial to discover.
In the wild
Safari on iOS 15Apple, 2021
Moved the address bar to the bottom by default, within thumb reach, with swipes on the bar to switch tabs. After feedback, Apple made the top position an option again. Ergonomics can justify breaking a habit, but give people a way back.
Apple Mail, Gmail swipes2010s
Swipe a message to archive or delete, with the same actions available in the message's toolbar. The gesture is a shortcut; the button is the guarantee.
Material Floating Action ButtonGoogle, 2014
A large primary action placed at the bottom right, in thumb reach. The main action belongs where the hand already is.
For the solo creator
Add a debug overlay that outlines every tappable area in your app; anything smaller than 44 points shows red. It takes an hour and finds problems faster than any review. Then use your app for a day one-handed, standing on a bus or walking. You will move at least one button.
Common mistakes
Icon size equals target size
The visual is 20 px, so the button is 20 px.
Pad the hit area to 44 pt while keeping the icon small.
Desktop layout shrunk to phone
The responsive layout just reflows the desktop toolbar.
Redesign for thumbs: bottom bar, fewer actions, overflow menu.
Gesture-only features
Gestures feel clean and modern.
Add the action to a visible menu too.
Check yourself
Your reading app opens its table of contents by swiping from the left edge. Android users say it often goes back instead. Best fix?
Both side edges belong to the system back gesture on modern Android; the right edge has the same conflict. A visible button is reliable for everyone. Disabling system gestures across the app breaks people's expectations of back.
Exercise 13.1 45 minutes · on your own product (or a daily app)
The one-thumb audit
On your phone, use the app one-handed for its three main tasks. Note every stretch, regrip and mis-tap.
Screenshot the main screens and overlay a thumb-zone sketch. Mark primary actions in the hard zone.
Measure the smallest targets (use developer tools or the debug overlay).
List every gesture and its visible equivalent; mark gestures without one.
You're done when: you have annotated screenshots, a list of targets under 44 pt, and a plan to move at least one primary action into reach.
Beginner
Competent
Strong
Finds small targets.
Moves primary actions into reach; all gestures have visible equivalents.
Also tests with system gestures on, on two phone sizes, and builds the debug overlay.
14
Microinteractions
Taught by Dan Saffer (Microinteractions, 2013), with Loren Brichter
A microinteraction is a single, contained moment that does one thing: toggling a setting, liking a post, refreshing a list. Products are judged by these moments, because people repeat them thousands of times.
Dan Saffer's book Microinteractions: Designing with Details (2013) gave a simple structure for dissecting any of them. Four parts: a trigger starts it (a tap, a gesture, or a system condition such as a new message); rules decide what happens; feedback shows what is happening, in light, motion, sound or haptics; and loops and modes govern what happens over time and in special cases (does it repeat, does it change after the tenth use, is there a mode for power users).
A lens, not a process. Use it to take a microinteraction apart, then improve one part at a time.
Three dissected
Trigger
Tap the heart, or double-tap the photo (Instagram).
Rules
Toggle: liked if not, unliked if liked. Count updates. Saved to server in the background (optimistic).
Feedback
Heart fills instantly with a short scale bounce; a large heart flashes over the photo on double-tap; count increments.
Loops & modes
If the server rejects (offline), the heart quietly reverts and retries. No confirmation, because it is trivially reversible.
Twitter replaced its star "favorite" with a heart "like" in November 2015, with a burst animation. The change of symbol changed what people felt the action meant.
Trigger
Pull the list down past its top while already at the top.
Rules
Past a threshold, release starts a refresh; below it, release cancels.
Feedback
An indicator that grows or rotates with the pull distance, a change (often a haptic tick) at the threshold, then a loading state, then new items appear.
Loops & modes
If nothing is new, say so briefly. If refresh fails, show it without losing the list.
Loren Brichter introduced pull-to-refresh in Tweetie 2 for iPhone (2009); Twitter later acquired Tweetie, and the gesture spread across nearly every list-based app. Its genius is that the trigger extends a motion people were already making (scrolling up to see the newest items).
Trigger
Tap the switch or its label (the whole row should be tappable).
Rules
Flip state immediately (chapter 7). If applying takes time, the switch moves, then shows a small pending indicator.
Feedback
The knob slides with a short animation; colour changes; the effect is visible (sync starts, theme changes).
Loops & modes
If applying fails, the switch returns to its previous state and a message explains why.
Feedback: proportional and immediate
Feedback should arrive within about 100 milliseconds, so the action and the response feel like cause and effect, and it should be proportional to the importance of the action: a toggle deserves a slide, a payment deserves a clear confirmation, a keystroke deserves nothing but the character. Motion details (durations, easing, springs) are covered in Motion & Feel; this chapter is about the structure.
Don't
Waiting for the server. The delay breaks cause and effect and invites double taps.
Do
Optimistic feedback. The response feels like part of the tap; the network becomes invisible.
Loops: microinteractions that learn
The most overlooked part is the loop: how the moment changes over time. A first-run hint shows the first time, then never again. A notification groups after the third similar one. Autocomplete puts your most-used choice first. A "Snooze" offers the time you usually pick. These quiet adaptations make a product feel attentive without adding a single setting (see chapter 17).
Do
Dissect key moments into trigger, rules, feedback, loops.
Respond within about 100 ms, even if work continues.
Make feedback proportional to the action's importance.
Handle failure inside the microinteraction (revert, explain).
Let moments adapt to repeated use.
Don't
Wait for the server before showing a response to a trivial action.
Add celebration animations to routine actions.
Make triggers so small or hidden that they are found by accident.
Forget the edge cases: offline, double taps, failures.
In the wild
Tweetie 2Loren Brichter, 2009
Introduced pull-to-refresh: a trigger built from a gesture people already made. The best triggers extend existing habits.
Instagram double-tapInstagram
Double-tapping a photo likes it, with a large heart flash on the photo itself as feedback. Feedback where the eye is, not in a corner.
Slack "mark as read"Slack
Pressing Esc marks the current channel as read. A tiny keyboard trigger for a very frequent moment.
For the solo creator
Pick the five actions your users do most often and dissect each with the four parts. Polishing those five moments improves the felt quality of the product more than any new feature. It is also one of the most enjoyable kinds of work you can do in an afternoon.
Common mistakes
Delight as decoration
Animations are added to impress.
Every piece of feedback should tell the person something: it worked, it is happening, it moved here.
No failure path
Optimistic UI is built for the happy path.
Revert visibly and explain if the background save fails.
Check yourself
In your app, people "star" items. Some star an item twice by accident and then it is unstarred. Which part of the microinteraction is failing?
Double taps are a classic symptom of slow feedback: people repeat the action because nothing happened. Fill the star instantly (optimistic), then save in the background.
Exercise 14.1 45 minutes · on your own product
Dissect and improve five moments
List the five most frequent small actions in your product.
Fill a trigger / rules / feedback / loops table for each, as in the tabs above.
Measure feedback latency for each (screen recording at 60 fps works).
Improve the weakest part of each: faster feedback, a failure path, or a loop that adapts.
You're done when: you have five dissection tables with latencies, and at least two moments improved and shipped.
Beginner
Competent
Strong
Tables filled.
All five respond within about 100 ms; failures handled.
At least one moment adapts over time (a loop), and you can explain each change in one sentence.
Recap and connect: Part three
Direct manipulation (11), keyboard (12), touch (13) and microinteractions (14) are four views of the same principle: input and response should feel like one continuous act, and every fast path should sit on top of a visible, reliable one.
Connect the ideas
Which statement connects swipe gestures (13), keyboard shortcuts (12) and drag and drop (11)?
All three are fast and invisible. Pair each with a visible path (button, menu, "Move to…") and use that path to show the shortcut. Onboarding explanations are quickly forgotten.
Part four
Finding, interrupting and configuring
Three last structures sit on top of everything else: how people find things in a growing pile (search, filter, sort, paging), how the product reaches out when they are not looking (notifications), and how much of the product people can reshape (settings). Each is a test of restraint.
15
Search, filter, sort and paging
Taught by Marti Hearst (Search User Interfaces), with Peter Morville and Aza Raskin
Once a collection outgrows a screen, people need three tools: search when they know what they want, filters when they know what kind, and sort when they know what order. Paging decides how the rest arrives.
Marti Hearst's Search User Interfaces (2009, free online) and Peter Morville and Jeffery Callender's Search Patterns (2010) catalogue the patterns. The key distinction: search narrows by words (best when people can name the thing), filters narrow by attributes (best when people know properties but not names: unread, from this month, tagged "work"), and sort reorders without removing anything. Your object map's attributes (chapter 1) tell you exactly which filters and sorts make sense.
Every part answers a question. What am I searching? What narrows it? How many? In what order? Why did this match?
Search that forgives
People misspell, use synonyms, and type partial words. Good search is forgiving: it matches prefixes and typos, searches the fields people expect (title and body, not just title), ranks recent and frequently opened items higher, and shows results as you type when the data is local and fast. Keep the query visible in the field after searching, so people can refine it. Show recent searches when the field is focused and empty.
Filters and sort
Show active filters as visible, removable chips; hidden filters are the main cause of "where did my items go?" support requests. Show the result count, and update it as filters change. For each filter value, consider showing how many items it would leave (faceted search), so people never filter themselves into an empty page. Default sort should match the most common task: newest first for feeds, alphabetical for reference lists, relevance for search. Remember the person's chosen sort per view.
Pagination, load more, infinite scroll
Choose by the task, not the trend. Goal-directed finding wants position and an end; leisurely browsing tolerates no end. "Load more" is a calm middle path for most products.
Aza Raskin designed an early version of infinite scroll in 2006 and has since said publicly that he regrets how it has been used to keep people scrolling. Google switched its search results to continuous scrolling (mobile in 2021, desktop in 2022) and went back to page-based results in 2024. Infinite scroll also makes footers unreachable and makes it hard to return to a position. For calm products, prefer pagination or "load more", and if you use continuous loading, keep scroll position on back and show where the content ends.
Do
Derive filters and sorts from object attributes.
Show active filters as removable chips and a live count.
Make search forgiving: prefixes, typos, recent items first.
Echo the query in empty results and offer to widen.
Keep position when returning to a list.
Don't
Hide active filters inside a closed panel.
Clear the search box after searching.
Use infinite scroll for goal-directed lists or above a footer.
Offer sort options nobody uses ("Sort by ID").
In the wild
Amazon facetsAmazon
The sidebar filters by brand, price, rating and more, narrowing a huge catalogue without typing. Facets let people find what they cannot name.
Linear filtersLinear
Filters appear as chips in the view header and can be saved as custom views. Visible filters prevent "where did my issues go?"
Google SearchGoogle, 2021 to 2024
Tried continuous scrolling of results, then returned to pages. Even the biggest teams revisit paging; there is no universal answer.
For the solo creator
For collections under a few thousand items, load everything and search on the device: it is instant, works offline and needs no search server. A small fuzzy-matching library (or the matching in this guide's palette lab) is enough. Add server search only when you must.
Common mistakes
Search as an afterthought
Collections start small.
Plan search, filter and sort from the object map's attributes before the collection grows.
Silent filters
The filter panel closes after applying.
Keep a visible summary of active filters with one-tap clear.
Check yourself
People use your invoice list to find a specific invoice from last March. It uses infinite scroll. What should change?
This is goal-directed finding by a known attribute (date) and maybe a name. Search and filters get there fastest; paging gives a sense of position and an end. Infinite scroll suits browsing, not finding.
Exercise 15.1 45 minutes · on your own product
Finding audit
For your largest collection, list the attributes from your object map.
Decide which become filters, which become sorts, and which are searchable text.
Test five realistic "find" tasks. Time each. Note the failure points.
Choose paging per list (pagination, load more, or infinite) and write a one-line reason.
You're done when: you have an attribute table (filter / sort / search), five timed tasks, and a paging decision per list.
Beginner
Competent
Strong
Adds a search box.
Visible filters with counts, sensible default sort, empty results handled.
Forgiving search with ranking, saved views, and position kept on back.
16
Notifications and interruptions
Taught by Gloria Mark (research on attention), with Amber Case (Calm Technology) and the Apple and Android guidelines
A notification is the product reaching into someone's life uninvited. Send one only when it is timely, personal and actionable, at the lightest level that works, and give people control before they ask for it.
Gloria Mark's research at UC Irvine on workplace attention has shown how interruptions fragment work and raise stress, and how long it can take to return to an interrupted task. Amber Case's Calm Technology (2015), building on Mark Weiser and John Seely Brown's 1990s writing, argues that technology should require the smallest possible amount of attention and inform without demanding. For a calm product, notifications are the place where those ideas are tested every day. The ethics of engagement-driven notifications are covered in Honest & Calm; here we focus on the structure.
Only one quadrant earns a push. Everything else waits for the person to come to the product, or does not exist.
A ladder of loudness
Choose the quietest channel that delivers the message in time: inline (visible when they next look), badge or dot (a count, no sound), in-app inbox (collected, read on their schedule), digest email (batched), push notification (interrupts now), and at the top, time-sensitive or critical alerts. iOS 15 (2021) formalised this with interruption levels (passive, active, time-sensitive and critical), a scheduled notification summary, and Focus modes that let people decide who can break through. Android has notification channels (since Android 8, 2017) that let people turn off categories individually. Use these system tools honestly: marking marketing as "time-sensitive" will get your app's notifications turned off.
Permission in context
On iOS, an app gets one chance to show the system's notification permission prompt; if people decline, they must go to Settings to change it. Asking on first launch, before people know what the notifications would be, wastes that chance. Ask at the moment the value is obvious: after someone follows a thread ("Get notified when someone replies?"), or sets a reminder. Explain what you will send, and how often.
Don't
Asked before trust exists. Most people decline, and the one system prompt is spent.
Do
Asked at the moment of value, with what, when and how often. Only "Remind me" triggers the system prompt.
Do
Send push only when timely, personal and actionable.
Ask for permission in context, after explaining.
Group and batch similar notifications.
Offer per-category controls in your own settings.
Deep-link each notification to the exact item (chapter 4).
Don't
Use push for marketing or "we miss you".
Ask for permission on first launch.
Mark ordinary messages as time-sensitive.
Open the home screen from a notification about a specific item.
In the wild
iOS notification summaryApple, iOS 15 (2021)
People can batch non-urgent notifications into scheduled summaries, and Focus modes filter who can interrupt. The platform is moving toward calm; design with it, not around it.
Slack notification settingsSlack
Per-channel choices (all messages, mentions only, nothing) and scheduled "do not disturb". Granular control is a sign of respect in a product that can be very noisy.
Apps declare categories that people can mute independently. If you do not split your categories, people will mute all of them.
For the solo creator
Start with zero push notifications and add one only when users ask for it. Every notification type you add is a promise to maintain, a setting to build and a reason to be muted. A weekly digest email, sent only if there is something to say, is often all a small product needs.
Common mistakes
Engagement-driven pushes
Metrics reward opens.
Measure mutes and uninstalls too. A push that annoys costs future attention.
Notifications that dead-end
Deep links were not built.
Every notification opens the exact item, already loaded.
Check yourself
Your journaling app wants more daily use. Which notification plan fits a calm product?
A reminder chosen by the person serves their goal, not your metric. It is asked in context and stays under their control. Streak pressure and feature announcements serve the product's goals at the person's expense.
Exercise 16.1 30 minutes · on your own product
Notification inventory
List every notification, email and badge your product can send.
Place each on the urgency × relevance matrix. Move or delete anything outside the push quadrant.
Check when and how you ask for permission. Rewrite it to happen in context.
Check that each notification deep-links to its item.
You're done when: you have a matrix with every message placed, a list of deletions, and a new in-context permission moment.
Beginner
Competent
Strong
Lists notifications.
Deletes or demotes several; permission asked in context.
Per-category controls, batching, deep links throughout, and a mute-rate metric.
17
Settings: defaults over options
Taught by Alan Cooper, with Jared Spool, 37signals and Oliver Reichenstein
Every setting is a decision you handed to the user. Most people never change defaults, so the default is the design. Add a setting only when reasonable people genuinely need different behaviour, and organise the few you keep around the person's goals.
Jared Spool's 2011 article "Do users change their settings?" reported that the vast majority of people never change the defaults in the software they use. Alan Cooper's About Face (first edition 1995) makes the design consequence clear: the default is not a starting point, it is what most people will experience forever. When a designer cannot decide between two behaviours, adding a setting feels like a kind compromise. It is really a way of postponing the decision and charging every user a small tax to make it themselves. 37signals' Getting Real (2006) put it bluntly as "make opinionated software". iA Writer, from the starter guide, is the extreme example: very few preferences, because the defaults were designed with care.
Most candidate settings stop at the first two questions. Dark mode, for example, is now usually "adapt automatically" (follow the system), with an override for those who differ.
Adapt before you ask
Many settings exist because the product could not tell what the person needed. Often it can: follow the system's appearance, language, text size and reduced-motion preference; remember the last-used view, sort and export format; infer time zone. A remembered choice is a setting the person made without visiting Settings. That is the "loop" from chapter 14, applied to configuration.
Organising the settings you keep
Group settings by the person's goals and the object map, not by your code modules: "Reading", "Highlights and notes", "Sync and backup", "Notifications", "Account". Put the most-changed settings first. Use one scrollable page with section headings for up to roughly 20 to 30 settings; beyond that, split into sections and add search. Settings should take effect immediately with switches and live previews (chapter 7). Every setting needs a short description of its effect in plain words, and destructive account actions (delete account, sign out everywhere) belong at the bottom, separated.
Don't
General›
Advanced›
Engine›
Misc.›
Experimental›
Delete account›
Organised by the code. No scent, a drill-down for everything, and a destructive action sitting among the ordinary ones.
Do
READING
Theme Follows your deviceAuto
Text size18
SYNC
Sync over cellular
ACCOUNT
Delete account…
Organised by goals. Plain sections, current values visible, descriptions under ambiguous settings, destruction at the bottom.
Do
Treat the default as the design; test it hardest.
Follow system preferences automatically.
Remember choices instead of asking for them.
Group by goal; show current values; describe effects.
Apply changes immediately with previews.
Don't
Add a setting to avoid a design decision.
Put frequent choices only in Settings (put them where they are used).
Create "Misc." or "Advanced" as a dumping ground.
Require Save on a settings page.
In the wild
iA WriterInformation Architects, 2010 onward
Deliberately few preferences; the typography and layout are designed as the default rather than left to the user. Strong defaults are a statement of care, not a lack of features.
System appearancemacOS Mojave (2018), iOS 13 (2019)
Apps that follow the system's light and dark setting need no theme setting of their own for most people. Let the platform hold preferences people set once for everything.
VS Code settingsMicrosoft
Thousands of settings, made usable by search, grouping, descriptions and a "modified" indicator. If a product truly needs many settings, search and descriptions are not optional.
For the solo creator
Every setting doubles some part of your test matrix and lives forever, because removing one upsets the people who changed it. Keep a "settings budget" (say, 12) and require that adding one means removing or automating another. When a user asks for a setting, ask them what they are trying to do; the answer is often a better default.
Common mistakes
Settings as feature flags
An experimental feature ships behind a toggle and stays there.
Decide within a release or two: make it the default, or remove it.
Frequently used options buried in Settings
Settings is the easy place to put a new control.
If people change it weekly, put it in context (a view menu, the toolbar) and remember the choice.
Check yourself
Users ask for a setting to choose the default export format (PDF or Markdown). Most use PDF; a minority always use Markdown. What is the best design?
Remembering the last choice serves both groups with no visit to Settings and no extra decision. A setting would work but adds a page few will find; asking every time taxes the majority.
Exercise 17.1 40 minutes · on your own product
Settings diet
List every setting. For each, estimate what share of users change it.
Run each through the decision flow. Mark: default, adapt, remember, keep, advanced, delete.
Regroup the keepers by user goal. Write a one-line description for each.
Ship at least two removals or automations.
You're done when: you have a categorised settings table, a regrouped settings page sketch, and a shorter settings list in the product.
Beginner
Competent
Strong
Regroups settings.
Removes or automates several; descriptions added.
Introduces a settings budget and turns at least one setting into a remembered choice in context.
Wrap-up
Structure and interaction are where a product's honesty shows. A calm, minimal product is not one with fewer pixels; it is one where every object has a home, every place says where you are, every state has a purpose, every input is forgiving, and every fast path rests on a visible one.
Twelve things to remember
Find the nouns, connect them, hang the verbs on them. Screens come last.
Broad and shallow beats deep and narrow; each level compounds the chance of a wrong turn.
Labels carry scent. Use your users' plain words, and test the tree as text.
Choose navigation by counting destinations and frequency; keep daily places visible.
Every meaningful state deserves an address, and back must mean back.
Draw the flow before the screen, and walk every step with the edge-case questions.
Design all states: blank, loading, partial, error, ideal and offline.
Controls are contracts: round is one, square is any, switches mean now.
Validate on blur, re-check live after an error, and show rules up front.
Undo beats "Are you sure?"; reserve specific, effortful confirmations for the irreversible.
Gestures, shortcuts and drag are accelerators layered on visible controls.
The default is the design. Add a setting only when people truly differ.
Run this on your product
Checklist: structure and interaction audit
Structure
Wayfinding
Flows and states
Inputs and safety
Hands
Finding, interrupting, configuring
Self-assessment: I can…
Practice assignment for the next two weeks
About 45 minutes a day. Use your own product throughout; if it is early, use the product you plan to build, on paper.
Days 1–2: the skeleton. Object map (Exercise 1.1), then a card sort with three friends (2.1).
Days 3–4: the map. Navigation audit and redraw (3.1); trunk test and URL map (4.1).
Days 5–6: the paths. Golden path and one core flow with edge cases (5.1); state grid for three screens (6.1).
Day 7: rest and review. Re-read your notes. Run the audit checklist above and record your score.
Days 8–9: inputs. Control audit (7.1); rebuild your most important form (8.1).
Day 10: safety. Climb the ladder for every destructive action (9.1); overlay inventory (10.1).
Days 11–12: hands. Command registry and palette (12.1); one-thumb audit (13.1).
Day 13: details. Dissect and improve five microinteractions (14.1).
Day 14: restraint. Notification inventory (16.1) and settings diet (17.1). Run the audit checklist again and compare with day 7.
Reflection
At the end of the two weeks, write half a page: which change made your product feel calmest, which one was hardest to build, and which principle you disagreed with and why. Disagreement you can explain is a sign you have understood.
Reading list
Information Architecture: For the Web and Beyond
Louis Rosenfeld, Peter Morville, Jorge Arango (4th ed., 2015) · the standard reference on organisation, labelling, navigation and search systems.
How to Make Sense of Any Mess
Abby Covert (2014) · a short, friendly guide to IA thinking; read it in an evening.
Card Sorting: Designing Usable Categories
Donna Spencer (2009) · everything you need to run sorts yourself and analyse them.
Don't Make Me Think, Revisited
Steve Krug (2000; 3rd ed., 2014) · the trunk test, navigation and cheap usability testing; the most readable usability book.
Object-oriented UX (OOUX) and the ORCA process
Sophia Prater · articles and talks on mapping objects before screens; search for her "OOUX" writing.
Designing Interfaces
Jenifer Tidwell, Charles Brewer, Aynne Valencia (3rd ed., 2020) · a pattern library for navigation, lists, forms and more.
Web Form Design: Filling in the Blanks
Luke Wroblewski (2008) · labels, validation, layout and the evidence behind them.
Forms that Work
Caroline Jarrett and Gerry Gaffney (2008) · forms as conversations; excellent on question wording.
The Humane Interface
Jef Raskin (2000) · modes, quasimodes, habituation; opinionated and still provocative.
Microinteractions: Designing with Details
Dan Saffer (2013) · the trigger, rules, feedback and loops model, with many examples.
About Face
Alan Cooper and colleagues (4th ed., 2014) · goal-directed design, defaults, and why software should not ask what it can know.
Designing for Touch
Josh Clark (2015) · thumbs, gestures and touch ergonomics in one short book.
"Never Use a Warning When You Mean Undo"
Aza Raskin, A List Apart (2007) · the five-minute case for undo over confirmation.
"Cool URIs don't change"
Tim Berners-Lee, W3C (1998) · why addresses are a promise.
Search User Interfaces
Marti Hearst (2009, free online) · research-based patterns for search, results and facets.
Next: Visual Design builds on this structure with hierarchy, layout and colour. For the timing and feel of the transitions mentioned here, see Motion & Feel.