Back to Blog
UX/UI DesignFebruary 26, 20269 min read

How to Write a UX Brief That Developers Will Actually Read

DR

Doug Ribeiro

9 min read

I have been on both sides of the handoff for more than ten years. I have written briefs as a designer and received them as a developer. The gap between what most designers write and what developers need to build correctly is not caused by developers not caring about design. The brief is optimized for the wrong reader.

What a Brief Is Actually For

A brief exists to give a developer everything they need to implement the feature correctly without scheduling a follow-up meeting. Every section that does not serve that purpose is noise that reduces the probability of the developer reading the document at all. I stopped attending design review handoffs that were really just design process showcases. The ones I blocked time for were the ones where the author had clearly thought about what I would need to not come back with questions.

The Five Sections That Matter

  • 1. Behavior spec: what happens when the user does X. Not what it looks like. What it does. Cover every interactive state: hover, focus, active, disabled, loading.
  • 2. Edge cases and error states: empty states, loading states, API error states, validation messages. These are the parts developers will invent if you do not specify them. Invented states are inconsistent states.
  • 3. Responsive behavior: exact breakpoints, what layout changes at each breakpoint, which elements reorder or collapse. Not 'mobile-friendly.' Specific.
  • 4. Component inventory: which existing components are used, which are new, exact Figma component names that match Angular component names.
  • 5. Out of scope: explicitly list what is NOT in this implementation. This prevents scope creep and creates a shared record for future decisions.

Error States Are Non-Negotiable in Financial Products

On a financial product, error messages are not UX polish. A payment failure message that is too vague turns into a support call instead of a retry. An overdraft warning that is ambiguous creates call center volume. When I led UX on the credit card PWA at Wonderlabs, I specified every error state, the exact copy, and the trigger condition, and I did the same on the IRIS platform redesign at Strongest Families, where the stakes were different but the discipline was identical. If the brief does not have this table, the implementation will have invented error messages. The table below is written for this post. It is an illustration, not a spec from any product I have worked on.

markdown
## Error States: Transfer Form (illustrative)

| State | Trigger | Message | Component |
|-------|---------|---------|----------|
| Required field empty | Submit with empty field | "This field is required" | FormFieldError |
| Amount exceeds balance | amount > accountBalance | "Insufficient funds. Your available balance is $X.XX" | FormFieldError |
| API timeout | Response > 30s | "Something went wrong. Please try again." | InlineAlert (warning) |
| Daily limit exceeded | amount > dailyTransferLimit | "You've reached your daily transfer limit of $X,XXX" | InlineAlert (warning) |
| Invalid recipient account | 422 from API | "We couldn't find an account with that number. Check the details and try again." | FormFieldError |

Responsive Behavior Requires Specifics

Saying 'mobile-friendly' in a brief is not a specification. Specify the breakpoints you are designing for. Make sure they match the breakpoints defined in your design tokens. Document what layout changes at each one and which interactions change. A sidebar that collapses to a bottom sheet at 768px needs to be written down, not visible in the Figma frames only if you know to look. A developer working from a brief should not need to reverse-engineer the responsive behavior from frame comparisons.

Here is what that looks like for an invented example, a statement summary card in a credit card app. None of the values below come from a real product. At 1280px and above, the card renders in a two-column grid with the account details on the left and the action buttons stacked on the right. Below 1280px the layout shifts to a single column: action buttons move below the details, and the card goes edge-to-edge with 16px horizontal padding. At 375px and below the card drops the secondary action entirely. The 'View history' link is hidden and accessible only through the account detail page. That decision needs to be in the brief. A developer who does not see it will either render the link anyway and break the layout, or remove it globally and break desktop.

markdown
## Responsive Behavior: Statement Summary Card (illustrative)

| Breakpoint | Layout | Changes |
|------------|--------|---------|
| >= 1280px | 2-column grid | Account details left, actions right |
| 376px to 1279px | 1-column stack | Actions move below details, edge-to-edge card, 16px horizontal padding |
| <= 375px | 1-column, reduced | Hide 'View history' link |

Component Naming That Bridges Both Worlds

I push for aligning Figma component names with Angular component names before any brief is written. If the Figma component is called 'Pill/Status/Success' and the Angular component is StatusBadge, every brief that references that component creates a translation problem. Inconsistent naming compounds across a team until handoffs require a glossary.

The convention I use: PascalCase, noun-first, specific over generic. Not 'Card' when 'StatementSummaryCard' is what you mean. Not 'Dialog' when 'ConfirmTransferDialog' is what you mean. Generic names in Figma become ambiguous references in briefs become wrong component choices in Angular. The naming alignment session is one meeting. It pays for itself the first time a brief names a component and nobody has to ask which one it is.

A brief is not finished when all the happy paths are documented. It is finished when every state a user could encounter has a specified behavior.

Format Matters More Than You Think

Keep the brief short. Use tables for states. Use annotated Figma links that go directly to the relevant frame, not to the file root. If the document is longer than four pages, you have probably included things that should be in the Jira ticket or the design archive. Developers have context from planning and story refinement. The brief fills the implementation gaps in that context. It does not replace every other document.

A Figma link that points to the file root forces the developer to navigate to the right frame themselves. On a large file that is a detour, and it happens every time they cross-reference the brief. Link directly to the frame. Use Figma's 'Copy link to selection' (right-click the frame, then Copy/Paste as) on each frame you reference. If you are referencing a specific component variant, select that variant and copy its link. This costs you a few seconds per link. It saves the developer minutes per session and removes the ambient friction that makes people stop opening the brief.

The briefs that get read are the ones that treat developer time as valuable. Short, structured, complete on states and behavior, with direct Figma links. The ones that do not get read are the ones that document the design thinking process for an audience that was not in the design review. Know your reader.

Here is the difference in one view. The component and endpoint names below are invented for this post.

Brief That Causes ReworkMake it mobile-friendlyHandle errors gracefullyUse the brand colorsThe button submits the formShow a loading stateFollow accessibility guidelinesBrief Developers Actually UseLayout breaks at 375px. Use 16p…Error states: see table with 5 …Colors: --color-primary, --colo…Button: ds-button[variant=prima…Loading: ds-spinner centered, d…WCAG 2.2 AA. Focus ring 3px off…VS

References

UX DesignDesign HandoffCollaborationFigma