Skip to content

Brand in Sparse Interfaces

A UX principle for coding agents. Also covers brand, brand voice, brand in product, product personality, agent personality, assistant personality, and 16 more.

Show all 22 aliases

brand, brand voice, brand in product, product personality, agent personality, assistant personality, agent voice, how the agent introduces itself, chat interface brand, conversational ui, minimal interface, low chrome, sparse ui, empty screen, prompt and response, waiting state personality, interruption, stop button, refusal copy, saying no, brand and product design, one experience

Products keep shedding surface. A text field and a response. A person hands work to an agent and waits. Each release removes more chrome, and teams read that as the brand having less room to live.

The opposite happens. With fewer things to look at, every remaining thing carries more weight. The microcopy is brand. The pause before the answer arrives is brand. How the agent introduces itself, what it admits it cannot do, how it behaves when someone interrupts it: those are the moments a person forms an opinion from now, and there are fewer of them than ever, so each one counts for more.

This doc covers where identity lives once the navigation, the sidebar, the toolbar, and the dashboard are gone. It assumes the words themselves are already good; microcopy.md covers how to write a string, and this doc covers which strings are load-bearing when there are only six of them. ui/quieter.md covers making a busy screen calm. This is the problem after that: the screen is already calm, and it needs to be somebody's.

Count the Carriers Before You Style Anything

A dense product has hundreds of brand carriers, so no single one matters much. A prompt-and-response product has about eight. List them before writing any of them, because the list is short enough to hold in your head and long enough that teams forget half of it.

For a typical agent product the full set is:

  1. The opening state, before the person has done anything.
  2. The input's placeholder and its submit affordance.
  3. The wait: what appears between the request and the first token.
  4. The response itself: its shape, density, and default length.
  5. The limit: what the agent says when it will not or cannot do the thing.
  6. The interruption: what happens when the person stops it mid-answer.
  7. The failure: the error, the timeout, the retry.
  8. The transitions between all of the above.
  • Budget attention across the list, not into one item. Teams pour a week into the opening state and ship a default spinner, a generic refusal, and an abrupt stop. The person meets the opening state once and the wait a hundred times.
  • Rank by frequency, then by emotional weight. The wait is the most repeated moment in the product. The failure is the most remembered one. Those two deserve more care than the marketing-adjacent empty state.
  • A carrier you did not decide is still a carrier. The framework's default easing, the library's default spinner, and the model's default apology all say something. They say "nobody chose this."

The Opening State Says What Kind of Thing This Is

The first screen is usually a logo, one line, and an empty field. That line is doing the work an entire homepage used to do: setting expectations for scope, tone, and effort.

❌ How can I help you today?
✅ Describe the page you want. Rough is fine.

❌ Ask me anything
✅ Paste a URL and I will pull the design tokens out of it.

❌ Welcome to Assistant
✅ Start with a screenshot, a link, or a sentence.
  • Name the input, not the product. "Ask me anything" describes a capability nobody doubts. "Paste a URL" tells the person what to type in the next two seconds, which is the actual problem they have.
  • Set the effort expectation in the line. "Rough is fine" and "one sentence is enough" lower the cost of starting more than any onboarding tour does. See onboarding.md, Time to First Value.
  • Do not open with a personality performance. A greeting that is trying to be charming before the product has done anything useful reads as a costume. Character earns its place once there is competence to attach it to.
  • Offer two or three real starting points, not a feature list. Concrete examples teach scope faster than a description of scope, and the examples you choose are themselves a statement about what this product is for.

Say the Limit Early, Plainly, and Once

What a product refuses to do defines it as much as what it does. In a dense UI the limits are implicit: there is no button for the thing, so nobody asks. In an open text field a person can ask for anything, so every limit becomes a spoken moment.

❌ I'm sorry, but I'm unable to assist with that request.
✅ I cannot read private Figma files. Export the frame as SVG and I will work from that.

❌ As an AI, I don't have the ability to access external websites.
✅ I cannot open that link. Paste the text and I will keep going.

❌ Something went wrong.
✅ That model is not available on your plan. Sonnet can do this one.
  • State the limit, then the way forward. A refusal without a next step ends the session. A refusal with a next step is the product still helping. This is the same shape as a good error message, so errors.md applies directly.
  • Apologise at most once, briefly, and only when the product is at fault. Repeated apology is not warmth. It reads as a service that expects to disappoint you.
  • Do not hedge a hard limit into a soft one. "I may not be able to" invites a retry that will fail again. If the answer is no, the sentence is "I cannot."
  • Never explain the limit by naming the implementation. "My context window is full" is the product's problem, not the person's. "This conversation is too long to continue. Start a new one and I will carry the summary over" is the same fact, made usable.
  • Keep the voice identical in refusal and in success. A product that is casual when it works and stiff and legalistic when it declines has two voices, and people trust the stiff one less.

The Wait Is the Most Repeated Moment You Own

Between the request and the first token there is a pause. It happens on every single interaction. Almost nobody designs it, and it is the single largest piece of unclaimed brand surface in an agent product.

  • Under about 300ms, show nothing. A spinner that appears and vanishes is a flash of anxiety for no information. Let fast responses feel instant.
  • From about 300ms to a couple of seconds, show one calm indicator. One. Not a spinner plus a skeleton plus a status line. The indicator's shape, rhythm, and colour are a brand decision, so make it deliberately rather than accepting the framework default.
  • Past a couple of seconds, say what is happening, and say it truthfully. Real steps ("reading the page", "pulling the tokens", "writing the components") hold attention because they are informative. Invented steps that do not correspond to real work are a lie the person will eventually catch, and catching it costs more trust than the wait ever cost patience. See interactions.md, Honest Loading States.
  • Stream as soon as you have anything. First token time matters more than total time. A response that starts in 400ms and finishes in 12 seconds feels faster than one that appears complete at 6 seconds. See ui/perceived-speed.md.
  • Do not fill the wait with jokes on rotation. Amusing on the first view, grating by the twentieth, and the twentieth arrives within an hour of real use.
  • Hold the layout still. Content that jumps when the response lands undoes whatever the wait earned. See interactions.md, Loading Button Width Stability.

Interruption Is a Character Test

The stop button is pressed when a person has decided the product is going the wrong way. It is the moment of most friction in the whole experience, and the response to it is remembered.

  • Stop immediately, and stop for real. Text that keeps arriving after the stop tells the person the control was decorative. Cancel the request, do not just hide the output.
  • Keep the partial work. Deleting what was already written punishes the person for interrupting and teaches them to sit through answers they do not want. Leave the partial response, marked as stopped.
  • Do not editorialise about being stopped. No "Okay, I'll stop!" and no apology. A quiet state change is the confident behaviour. The person is busy; they interrupted precisely because they did not want more words.
  • Make correcting cheaper than restarting. After a stop, the next most likely action is a redirect, so the input should already be focused and the previous prompt should be recoverable for editing.
  • Treat a correction as information, not as a complaint. When someone says "no, smaller", the product's job is the next attempt, not a paragraph acknowledging the feedback.

Motion Carries the Personality When Nothing Else Can

With no chrome to hold an identity, timing and easing are where character lives. Two agent products with identical layouts and identical palettes feel like different companies entirely if one settles softly and the other snaps.

  • Choose a house timing and hold it everywhere. Pick the duration band and the easing curve once, put them in tokens, and use them for every transition in the product. Consistency is what turns timing from a detail into a signature.
  • Let the curve express the intent. A gentle ease-out reads as considered and calm. A short spring with a little overshoot reads as quick and eager. Linear reads as mechanical. None of these is correct in general, and one of them is correct for your brand.
  • Give the response's arrival a shape. How text enters, whether blocks fade or slide, whether the cursor pulses or holds, is the most-seen animation in the product. See ui/animation-and-motion.md for technique and motion-brief.md for how to specify it.
  • Match sound to the motion, or ship no sound. A click that lands off the transition is worse than silence. See sound-design.md.
  • Keep the identity in the reduced-motion variant. Honour prefers-reduced-motion, and design that path rather than stripping it to nothing. Cross-fades and instant state changes still have timing, and timing still has character.

People Experience the Company as One Thing

The split between product design and brand design assumes there are two surfaces to divide. In a sparse product the marketing site's tone and the agent's refusal message sit a single click apart, so a person meets both inside a minute.

  • Write the product's strings and the marketing strings against the same voice. If the landing page is warm and direct and the agent is formal and hedged, the person concludes the landing page was written by the marketing team, which is exactly the seam to hide.
  • Carry the timing across the boundary. The site's transitions and the product's transitions should come from the same tokens. A snappy site into a sluggish product reads as a bait and switch, whatever the words say.
  • Review the sparse moments together, in one room. The opening line, the wait, and the refusal are simultaneously brand decisions and product decisions. Splitting them across two teams produces the seam.
  • Audit by walking the whole path in one sitting. Landing page, sign-up, opening state, first wait, first refusal, first error. Read it as one document. Inconsistency that is invisible inside a single screen is obvious across six.

Common Mistakes

  • Treating the empty screen as a lack of brand surface rather than a concentration of it, and therefore leaving every default in place.
  • Spending the whole budget on the opening state, which is seen once, while the wait and the refusal, which are seen constantly, stay generic.
  • Performing personality instead of having one. Jokes in the loading state and exclamation marks in the greeting are a substitute for the harder work of consistent timing and honest copy.
  • Apologising as a default register. Frequent apology reads as an expectation of failure.
  • Inventing progress steps that do not match real work, which converts a small wait into a discovered lie.
  • A stop button that hides output instead of cancelling work, which teaches the person that the controls are decoration.
  • Different voices in success and failure, which is the clearest sign that two teams wrote the product.

Checklist

  • Every brand carrier in the eight-item list has been decided, not defaulted.
  • The opening line names what to type, not what the product is.
  • Refusals state the limit plainly and give a next step.
  • Nothing appears for waits under about 300ms.
  • Longer waits show one indicator, and any named steps are real.
  • The response streams, so first token beats total time.
  • Stop cancels the request, keeps the partial output, and adds no commentary.
  • One timing and easing pair is tokenised and used for every transition.
  • The reduced-motion path is designed, not stripped.
  • The marketing site and the product read as one voice when walked end to end.

Use this guidance in your coding agent

Install the Better Design MCP once. Your agent then loads this page with one call.

get-ux-principle({ topic: "brand-in-sparse-interfaces" })
claude mcp add --scope user better-design --transport http https://better-design.com/api/mcp --header "Authorization: Bearer <YOUR_API_KEY>"
Browse related design systems