Skip to content
Expert Guide Series

Creating an App Design Developers Tips

A design file that looks beautiful in Figma and falls apart in development is a wish list. We have seen this play out on real products, and the consequences range from expensive rework to fractured relationships between designers and developers who each believed they were doing their job correctly.

The wellness genetics product we worked on is a clear example: we were brought in to improve the emotional layer of what was a very data-heavy, premium-positioned product. Our designs were handed off through a third-party designer, who produced something that looked luxurious and refined. The development team then struggled to understand how to implement it on top of their existing codebase, and there was considerable back and forth before anything resembling the intended design was live. The gap between visual intent and technical reality had been allowed to grow unchecked, and closing it cost everyone time.

The relationship between a designer and a developer is, at its best, a collaboration built on shared language. At its worst, it is two people working in parallel with different assumptions and no mechanism to surface the difference. Getting this right is about knowing what actually matters to the person who builds what you draw.

Responsive behaviour needs to be documented, not assumed

Responsive behaviour is the other area where assumptions do real damage. A designer who has laid out a screen at 375px and another at 1440px has shown two states. What happens between them, which columns collapse, which elements stack, what happens to a card grid at 768px, is often left to the developer to figure out. That is a design decision being made by someone whose job is implementation, and the design intent gets lost in it. Breakpoint behaviour, reflow rules, and what gets hidden at which size all belong in the design file, not in a developer's head.

Define spacing as named tokens (such as "space-sm", "space-md", "space-lg") and use those token names in both Figma and the codebase. When a value needs to change, you change it once.

States, Edge Cases, and Error Handling

The default state of a screen is the easiest thing to design. It is also the smallest fraction of what a developer needs to build. Every interactive element in a product exists in multiple states: default, hover, focused, active, disabled, loading, and error. Every form field has a valid state, an invalid state, and a state for each specific type of error. Designing only the default state and leaving the rest to be resolved during development is the single most common source of inconsistency in a built product.

Error states deserve particular attention because they are where most design files are thinnest. Baymard Institute found that 98% of sites do not use specific, adaptive error messages that state exactly what is wrong and how to fix it, according to Baymard's guidelines on adaptive error messages. A design file that contains only a red border and a generic "something went wrong" message is deferred error handling. Each error condition needs a specific message that tells the user what happened and what to do next.

Edge cases that belong in every design file

  • Empty states, what does a feed, a list, or a dashboard look like with no data
  • Truncation, what happens when a user name, product title, or address is longer than expected
  • Loading states, skeleton screens or spinners, and how long before a timeout message appears
  • Offline states, what does the app show when there is no connection
  • Maximum content, what a list looks like with 200 items, not 5

Run a "what if" pass on every screen before handoff. Ask: what if this field has no content, what if this name is 60 characters, what if this request times out. Each answer that produces a different screen is a state that needs designing.

Interaction and Animation Specifications

Animation is where design intent is most frequently lost in translation. A designer who has built a smooth, considered transition in a prototype and then hands off a static file has effectively handed off no animation at all. The developer will implement something, a default transition, a sudden state change, or nothing, and the product will feel different from what was intended. If animation is part of the design, it needs to be specified with enough detail that a developer can reproduce it without watching the prototype on loop.

A useful animation specification contains four things: the trigger (what user action starts it), the target (what element changes), the properties that change (opacity, position, scale, colour), and the timing (duration in milliseconds, easing curve). An easing curve described as "ease in out" is more useful than "it should feel smooth." A duration of 200ms is more useful than "quick." Most design tools allow motion specifications to be added directly to components; using that feature is far more reliable than writing timing values in a comment.

When to specify and when to defer

Not every transition needs a detailed specification. Micro-interactions on standard components, a button press, a checkbox check, can often be handled by a well-chosen library with sensible defaults, and specifying them individually adds overhead without adding quality. The interactions that need detailed specification are the ones that carry brand or emotional intent: an onboarding animation, a success state, a transition that communicates progress. Those are the moments where the difference between a generic and a considered interaction is visible to users, and where developer defaults will not serve the design.

How to Review a Design File Before Sign-Off

A design review before handoff is a check that the file contains everything a developer needs to build without making design decisions. The two activities require different eyes, and the distinction matters: a designer reviewing their own work for visual quality will miss structural gaps in the specification because they already know what they intended.

The most reliable review process involves a developer walking through the file before handoff and flagging every point where they would have to make a decision. Each flag is a gap in the specification. Not a request for more decoration, a question the file does not answer. "What's the spacing between these two elements?" is a gap. "What happens if the user submits this form with no content?" is a gap. Gathering those flags and resolving them before handoff is more valuable than any internal design review, because it surfaces the real questions rather than the hypothetical ones.

A pre-handoff checklist

  1. All layers are named consistently and grouped logically
  2. Every component exists in all relevant states
  3. Spacing values match the defined scale with no one-off values
  4. Typography uses named styles, not ad hoc font settings
  5. Colour uses named tokens, not raw hex values applied directly
  6. Every screen has been reviewed at both its minimum and maximum content
  7. Responsive breakpoint behaviour is documented for every layout
  8. Error states and empty states exist for every relevant screen

Why Polite Approval Is Not Real Approval

Design reviews, especially in client settings, tend to produce agreement that does not represent genuine understanding. A client who nods through a design presentation has approved the visual appearance of what they saw at the size it was shown to them, in the order it was shown, without seeing most of the states the developer will need to build. That is a social exchange, and treating it as sign-off creates problems downstream.

We saw this on the wellness genetics product. The design went through multiple parties before it reached the development team, and at each handover there was approval, but the approval was of the surface, not of the specification. When development began, the gaps became visible: interactions that had no specification, spacing that had been set by eye, states that had never been designed. The back and forth that followed was expensive for everyone involved.

Real approval means someone with implementation knowledge has reviewed the file and confirmed it is buildable as specified. That is a different conversation from a client saying the screens look good. Both conversations need to happen, and they should not be conflated. A design can be visually approved by a client and technically reviewed by a developer, and both sign-offs are needed before a file is ready to build.

Before any design review meeting, share the file in advance with a note on what kind of feedback you need. A client reviewer and a technical reviewer are looking for different things, and separating those conversations produces more useful feedback from both.

What Happens When the Technical Constraints Are Not Surfaced Early

Technical constraints that emerge during development rather than during design create a particular kind of waste: work that has to be undone, redesigned, and rebuilt at the point where changing it is most expensive. A constraint known at the start of a project shapes the design approach. A constraint surfaced mid-build breaks the design approach and requires either a compromise on quality or a delay in delivery.

On the wellness genetics product, the core constraint was an existing codebase that had been built for function rather than for the premium, wellness-positioned brand the product was meant to represent. That constraint was known before we were brought in. But the process of translating our emotional design layer through an intermediary designer, and then to a development team unfamiliar with the intent, meant the constraint was never properly confronted early. The result was a design that looked appropriate in isolation but was disconnected from what the code could support, and the reconciliation took time that a cleaner handoff process would have avoided.

The same pattern appeared on the logistics platform we built for transport-based deliveries. Because we were building both a web product for customers and a mobile app for drivers, third-party drivers with no formal relationship to the business, the technical architecture for delivery confirmation had to be decided before any screen design began. We implemented swappable codes and QR code scanning to create a double confirmation from both the customer and the driver. Had that mechanism been left to figure out during development, the design of the confirmation flow would have had to be rebuilt around whatever technical solution emerged.

Keeping Emotional and Brand Intent Legible to Developers

A developer working from a design file does not automatically understand why a design looks the way it does. They understand what it looks like. The emotional intent behind a colour choice, a type scale, a rounded corner, or an animation curve is invisible in a Figma file unless it is made explicit. When that intent is not documented, developers make implementation decisions that are technically correct but emotionally wrong, and the product drifts from the brand.

On the concierge app we built for a high-end property development, the emotional intent was the core design problem. The product was meant to create a genuine sense of community in a high-rise building where residents typically do not know each other. We ran focus groups with two groups: the high-net-worth individuals who were the target customers, and people from social housing who embodied the quality we were trying to build into the product.

The social housing group had a natural neighbourliness and openness that the target audience lacked. The design decisions that followed, personalisation features so residents could see who their neighbours are and what they care about, a social space within the app, automation of mundane tasks to free up space for real interaction, were all in service of that emotional goal.

None of that intent is readable from a static screen. A developer looking at a personalisation component sees a card with a name, a photo, and a list of interests. The reason that component exists, what it is meant to make a resident feel, and why it takes the form it does, those things need to be written down, attached to the component, and discussed before build begins. A short annotation saying "this component is about making residents feel they live among people, not strangers, warmth and openness are the intended response" gives a developer context that changes small decisions across the implementation.

Add a brand intent annotation to any component where the emotional response matters as much as the function. A developer who understands what a feature is meant to feel like will make better micro-decisions during build than one working purely from the visual specification.

Conclusion

A design file that reaches a developer without ambiguity, without gaps, and with the emotional intent made legible is a rare thing. The gap between what a designer intends and what a developer builds is almost always a communication gap, not a skill gap, and it closes through process rather than talent.

What we have learned across products in healthcare, travel, logistics, and property is that the work of making a design file developer-ready is as much design work as the screens themselves. Defining the spacing scale, designing every state, specifying the motion, annotating the intent, these are design decisions that determine whether the product that gets built matches the product that was designed.

The wellness genetics product taught us that distance in the handoff chain amplifies every ambiguity. The concierge app taught us that emotional intent has to be named to survive implementation. The logistics platform taught us that technical constraints caught early become design decisions rather than design problems. Each of these shaped how we prepare files, how we structure reviews, and how we talk to developers before build begins.

If your design files are producing a product that looks close but not quite right, or your development team is making calls that drift from the brief, the specification is where to look first. Let's talk about your design and development process.

Frequently Asked Questions

Why do designs that look great in Figma often fail during development?

A design file can look polished in isolation but fall apart when a developer tries to implement it on top of an existing codebase. Without clear documentation of behaviour, spacing, and states, developers are left to fill in the gaps themselves, which causes the original design intent to get lost.

What is the best way to document responsive behaviour in a design file?

Designers should document breakpoint behaviour, reflow rules, and which elements hide or stack at each screen size directly within the design file. Showing only two screen widths and leaving everything in between to the developer means design decisions are being made by someone whose job is implementation, not design.

What are design tokens and why should I use them?

Design tokens are named values for things like spacing, for example 'space-sm' or 'space-lg', that are used consistently in both the design file and the codebase. When a value needs to change, you update it in one place rather than hunting through dozens of individual components.

Which interactive states should a designer document beyond the default screen?

Every interactive element needs designs for its default, hover, focused, active, disabled, loading, and error states. Leaving these to be resolved during development is the most common cause of visual inconsistency in a finished product.

How specific should error messages be in a design file?

Each error condition should have its own message that tells the user exactly what went wrong and what they should do next. Research from the Baymard Institute found that 98% of sites fail to provide specific, adaptive error messages, so this is an area where clear design documentation makes a real difference.

What are edge cases and which ones should every design file include?

Edge cases are the non-default situations a user might encounter, such as empty states, long text that needs truncating, loading states, and offline states. Designing these upfront prevents developers from making visual and content decisions that should belong to the designer.

How can designers and developers build a better working relationship?

The relationship works best when both parties share a common language and have a clear mechanism for surfacing different assumptions early. When designers document their intent thoroughly and developers raise implementation questions before building begins, costly back-and-forth is significantly reduced.

What happens when the gap between design intent and technical reality is not managed?

When that gap is left unchecked, closing it costs everyone time and can damage the relationship between designers and developers, both of whom may feel they were doing their job correctly. Expensive rework and missed timelines are common consequences on real products.