Figma for developers, what actually matters
A developer need not design in Figma but must be able to read from it. This text skips the drawing tools and focuses on what translates into code: reading measurements, variables, components, and why a well built design file saves days of implementation work.
The biggest change of recent years is that Figma stopped being merely a picture to reproduce. Variables, the developer mode, and an MCP protocol server make a design file a data source rather than only a visual reference.
Dev Mode, the developer's view
It is a separate view of a file where, instead of drawing tools, you get what implementation needs: dimensions, spacing, colours, typography, and a generated style fragment.
Settle one thing straight away: the generated code is a hint rather than a finished component. Figma describes a single element in isolation, knows neither your class system nor your component structure, so pasting the output straight into a project yields code that looks right on one screen and falls apart on resize.
The value of this mode lies elsewhere. First, in comparing versions, since you see what changed since the last review. Second, in marking screens ready for implementation, which organises the work. Third, in access to variables, covered below.
In properly built files every spacing is a multiple of a base value and every colour has a name. If Dev Mode shows spacing like seventeen and twenty three pixels, the file is not ready for implementation and it is worth saying so rather than reproducing arbitrary numbers.
Variables as design tokens
This is the most important thing for a developer and the most often unused. Variables are named values the design uses: colours, spacing, corner radii, text sizes.
Their key property is modes. One variable can hold different values in light and dark mode, in compact and comfortable density, across brands. A designer switches mode and the whole screen changes, exactly as in code with a theme.
That arrangement maps directly onto CSS variables or onto a Tailwind configuration. The variable name in Figma and the name in code should match, since then a conversation about a change comes down to one word rather than to describing a colour.
:root {
--color-surface: #ffffff;
--color-text-primary: #111827;
--space-3: 12px;
--radius-md: 8px;
}
[data-theme='dark'] {
--color-surface: #111827;
--color-text-primary: #f9fafb;
}Variables can be exported through the API, so synchronising with code can be a process rather than manual retyping. That earns its keep with a design system used across several products, where manual updating would drift anyway.
One caveat decides whether this is feasible at all, and it is worth checking before planning the work: the variables API endpoints are available only to full members of organisations on the enterprise plan. On lower plans you see variables in the interface but cannot fetch them programmatically, which leaves a plugin export or manual retyping.
The fetch itself is a single call, authenticated with a personal token passed in a header.
curl -H "X-Figma-Token: $FIGMA_TOKEN" \
"https://api.figma.com/v1/files/$FILE_KEY/variables/local"The response carries variable collections along with their modes, so one pass is enough to build both a light and a dark theme from it. The file key sits in the file's address, between the file type segment and the project name.
Auto Layout, or why this is flexbox
Auto Layout is the mechanism for arranging elements and it matches what flexbox does in CSS. Direction, gap between elements, alignment, and padding all have direct counterparts.
| Figma | CSS |
|---|---|
| Horizontal or vertical direction | flex-direction |
| Gap between items | gap |
| Alignment | justify-content and align-items |
| Padding | padding |
| Hug contents | width: fit-content |
| Fill container | flex: 1 |
That correspondence has a practical consequence. A screen built on Auto Layout translates to code almost one to one, while a screen built by placing elements at arbitrary positions requires guessing what should stretch and what should stay.
An example shows it best. A vertical frame with twelve pixels of spacing, sixteen of padding, and one element set to fill the container turns into a handful of classes, without a single decision to make along the way.
<div class="flex flex-col gap-3 p-4 items-stretch">
<h2 class="text-lg font-semibold">Summary</h2>
<p class="flex-1">Content stretching across the available height.</p>
<button class="w-fit rounded-md px-3 py-2">Continue</button>
</div>The class on the button corresponds to the hug contents setting and the class on the paragraph to fill container. Those are the same two decisions the designer makes in the panel, so transcribing them requires no interpretation.
That is why "does this screen use Auto Layout" is a reasonable question from a developer to a designer and affects implementation time more than graphic quality does.
Components and variants
A component in Figma corresponds to a component in code, and variants correspond to its props. A button with variants for size, state, and type is exactly the same model as a component taking three properties.
That correspondence is convenient while both sides keep the same names. If a variant is called "primary" in the design and "default" in code, every conversation about a change needs translating. Agreeing a shared vocabulary at the start costs an hour and saves weeks of misunderstanding.
Sometimes the component library in a file did not originate with you at all but comes from an outside set such as Relume, which supplies ready page sections as components with variants. For a developer that is practical information: structure and names then repeat across projects, but so does the appearance, so before estimating ask which sections are a deliberate decision and which nobody has reworked since dropping them in from the catalogue.
Note also what the design lacks. A file usually shows the target state, while code must handle loading, empty state, error, and text longer than allowed for. Ask a designer for those four cases before starting, since adding them later always turns out worse.
The MCP server and working with a coding assistant
Figma exposes a server in the MCP protocol, letting a coding assistant read a selected frame: its structure, variables, spacing, and component names.
That changes how you work, since rather than describing a screen in a prompt you point at it in the design. An assistant in Cursor or another tool receives data rather than a description, so it generates code closer to the intent.
The boundary resembles the one on generated code in developer mode. The assistant knows the appearance and not your conventions until you supply them. Project rules describing the class system, component structure, and naming make a bigger difference here than file access alone.
There are two variants of the server and they differ in availability. The remote one, at the vendor's address, works on every seat type and every plan, the free one included. The variant run through the desktop application requires a Dev or Full seat and a paid plan. When rolling this out to a team, start with the remote one, since it needs nothing beyond signing in.
Connecting the remote variant is one command, or a few lines in the client's configuration.
claude mcp add --scope user --transport http figma https://mcp.figma.com/mcpIn tools configured by file you declare the same server directly, giving the address and the transport type.
{
"servers": {
"figma": {
"url": "https://mcp.figma.com/mcp",
"type": "http"
}
}
}Once connected, the assistant reads the selected frame, reaches for variables and layout, and with component mapping configured can point out which component in code corresponds to the one in the design.
Constraints and the spacing scale
Constraints govern what happens to an element when its parent frame resizes. Pinning to the left edge, stretching to full width, centring: that is information invisible on a static image and translating directly into browser behaviour.
Checking them takes a moment and saves a round of fixes. An element with no constraints set behaves on resize differently from what the designer assumed, so a mismatch between design and implementation often starts there rather than in a coding error.
The spacing scale is a separate matter. A well built design rests on one base value, usually four or eight pixels, with every spacing a multiple of it. That is not aesthetic fussiness but the condition for turning spacings into a scale in code.
If a design shows spacings matching no scale, you have two routes. The first is rounding to the nearest scale value and saying so, the second is asking whether the spacing is intentional. Typing an arbitrary number into the code is the worst choice, since it cements the slip.
The third thing is breakpoints. A design usually shows two or three screen sizes while a browser has infinitely many. Settle what should happen between them, since that is territory where the developer will decide anyway, only without consultation.
Pricing and seat types
| Seat type | Professional | Organization | Enterprise | What it covers |
|---|---|---|---|---|
| Full | 16 USD | 55 USD | 90 USD | Full editing, every tool |
| Dev | 12 USD | 25 USD | 35 USD | Developer mode, viewing and comments |
| Collab | 3 USD | 5 USD | 5 USD | Commenting and review |
| View | 0 USD | 0 USD | 0 USD | Read only, no charge on paid plans |
The free plan lets you try the tool but caps file count. The rates above are for monthly billing; annual is cheaper, and the Organization and Enterprise plans bill annually only. A read only seat costs nothing on any paid plan.
For a development team that table matters more than the plan itself. Somebody who only reads designs and implements them in code does not need a full seat. Swapping five full seats for developer seats returns two hundred and forty dollars a year on Professional, but eighteen hundred on Organization and thirty three hundred on Enterprise. The larger the organisation, the further the two seat rates diverge, so auditing the allocation pays off precisely where nobody usually does it.
On the Professional plan annual billing cuts the rate against monthly, an obvious choice for a stable team. Just know that seats added mid year then bill separately by the month until you fold them into the annual subscription.
It pays to review the list of people and their seat types once a quarter, because in a growing team seats get handed out generously and nobody revisits them. Somebody who has not edited a file in six months does not need full access, and changing a seat type is reversible, so the risk of such a correction is small.
If the seat bill turns out hard to defend, look at Penpot. It is an open source tool you can host yourself, and its free plan covers up to eight designers with unlimited viewers. It has no Dev Mode in this form, but its file format rests on web standards, so export goes straight to code.
What a design never contains
Keep a list of things to settle before you start coding. They recur in every project and nobody draws them.
Accessibility comes first. Tab order, a visible focus indicator, labels for screen readers, and text contrast against its background. Contrast is checkable in Figma; the rest needs a decision the developer will make.
The second item is behaviour over time. How long a transition lasts, whether a list appears immediately or after a delay, what the user sees during the first three hundred milliseconds. A static design says none of that, and the gap between a good and a poor impression often sits precisely there.
The third is form validation. When the error message appears, on leaving the field or on submit, what happens to a corrected field, and how the form behaves with five errors at once.
The fourth is content. Text in a design is usually shorter than the real thing, so a sixty character product name will break a layout nobody planned for. Check the extremes before a user does.
The fifth is permissions. A screen shows the view of somebody who can do everything, while in the application some users will not see half the buttons. Settle what happens to them: do they disappear or turn inactive.
Common collaboration mistakes
The first is pasting developer mode code straight into a project. Figma describes an element in isolation, so that code ignores your class system and breaks on a window resize.
The second is reproducing arbitrary numbers. Seventeen pixels of spacing in a design is usually a slip rather than a decision, and asking beats hardcoding it.
The third is having no agreed naming vocabulary. The same colour named differently on each side turns every conversation about a change into translation.
The fourth is skipping edge states. Loading, empty list, error, and long text are four cases usually absent from a design and mandatory in code.
The fifth is buying full seats for the whole team. A developer reading designs needs a cheaper seat, and across ten people the difference registers in an annual budget.
The sixth is working on a file without Auto Layout. Such a screen requires guessing what should stretch, so implementation takes longer and ends in fixes after the first responsive test.
FAQ
Does a developer need a paid Figma account?
Reading designs and working in developer mode requires a Dev seat, cheaper than a full one. The free plan allows viewing shared files but without full developer mode access, so production teams usually buy dedicated seats.
Is the code Figma generates usable?
As a hint about values yes, as a finished component no. Figma describes an element in isolation and knows neither your class system nor your component structure, so treat the output as a source of dimensions and colours rather than code to paste.
What are variables in Figma for?
The same thing as design tokens in code: they hold named values for colours, spacing, and sizes, with different values available per mode. They correspond to CSS variables, so with shared naming, synchronising design with code becomes a process rather than manual retyping.
What does the MCP server give me?
It lets a coding assistant read a selected frame together with its structure, variables, and component names rather than relying on a prompt description. The result is noticeably better, provided the assistant also knows your project conventions, since appearance alone does not suffice.
How do I tell whether a file is ready for implementation?
Three questions suffice. Do the screens use Auto Layout, do colours and spacing come from variables, do edge states exist. A no to any of them means part of the design work lands on the developer, and settling that before starting beats settling it midway.
Developer mode documentation sits in the Figma help centre, and current rates on the pricing page.