Figma plugin · Design Sorcery

Frame 47 is not a name.

Neat reads what is inside each frame, component and layer, and names it for what it is. Sign In, Button / Continue, Tab Bar. You review every name first, and one undo reverses the whole pass.

BeforeAfter
iPhone 14 - 7Sign In
Frame 12Onboarding / Welcome to Bracket
Frame 11Button / Continue
Group 1Status Bar
Frame 30Tab Bar
Frame 31List Item / Class 2 Prep
Named14%

01 — Live demo

Six screens. Sixty default names. One pass.

This is the plugin's real code running on a mock Figma page with six screens and about 60 layers. Every layer starts with a default name. Check the proposed names, untick or edit any you don't like, then press Tidy and watch the layers panel.

LayersNotes app — v2
Canvas
Neat✕
Hover a name for the reason behind itClick a new name to edit it, a row to leave it outTidy, then Undo⌘ ↵ tidies from the keyboard

02 — Principles

An instrument, not an assistant.

Neat makes a precise judgement, shows its reasoning, and gets out of the way.

01

Reads the content

Headings by size and weight, placeholders by colour, buttons by shape. It also reads images, icons, page dots, toggles and the components you used.

02

Knows 20+ screen patterns

Sign In, Onboarding, Checkout, Settings, Profile, Editor, Landing and more. A screen with no pattern is named after its own heading.

03

Names the layers inside

Nav bars, tab bars, inputs, list items, cards, avatars and icons follow the parent-to-child structure a developer expects.

04

Leaves your names alone

“Messy only” touches defaults like Frame 12, Group 3 or Copy of… and nothing you named by hand.

05

Shows its confidence

Each suggestion comes with a three-step confidence mark and a readable reason. Low-confidence names start unticked.

06

One undo reverses a pass

Every pass is a single undo step. Variant names are never touched, because they hold component properties.

03 — Vocabulary

Names both sides of hand-off read the same way.

Names follow Type / Title, the convention most design systems use. Switch to title-only or type-only, change the separator or case, or number your screens.

Screens

Sign InSign UpVerificationOnboardingHomeDashboardSettingsProfileSearchChatCheckoutCartProduct DetailPricingEditorEmpty StateErrorSuccessLanding

Elements

Status BarNav BarTab BarTabToolbarHeaderHeroFooterButtonInputFormChipListList ItemSetting RowCardCard GridModalBottom SheetPage IndicatorAvatarImageIcon

Components

Instance → its componentButton / SaveIcon / SearchVariants untouched

Instances borrow the name of their main component, then add what makes each one different.

Install

Three steps. No account.

Neat runs as a development plugin in Figma desktop. It makes no network calls, so your file never leaves Figma.

Download and unzip neat-plugin.zip. You'll get manifest.json, code.js and ui.html.

In Figma desktop, open Plugins → Development → Import plugin from manifest… and pick manifest.json.

Select screens or a section, run Plugins → Development → Neat, review, and press Tidy.

04 — How it's built

Read, understand, review, write.

A Figma plugin runs as two sandboxed halves that can only talk through messages. Neat uses that split on purpose: the canvas side only reads and writes, and the UI side does all the thinking, so previews are instant and nothing changes until you press Tidy.

01 · code.js

Digest

Walks each layer once and records its texts with size, weight and colour, its buttons, inputs, images, icons, components, bars and repeated siblings.

02 · postMessage

Send

Only a small summary crosses to the UI. It holds no pixels and no file data, just what is needed to name the layer.

03 · ui.html

Infer

Rules score 20+ screen patterns and 25 element types, pick a title, and attach a confidence score and a readable reason.

04 · code.js

Write

Your approved names are applied in one batch with commitUndo(), so a single ⌘Z undoes everything.

smart.js — a screen pattern is just a scored rule

['Sign In', (text, d) =>
  (/sign ?in|log ?in|welcome back/.test(text) ? 3 : 0)
+ (/password|forgot/.test(text)       ? 2 : 0)
+ (d.inputs.length >= 1               ? 1 : 0)],

// the best score wins; the heading becomes the title
// "iPhone 14 - 7" → "Sign In"  (95% sure)

digest.js — what counts as a button

const button =
  boxed && h >= 28 && h <= 64 && w <= 420
  && labels.length === 1 && words(label) <= 4
  && radius >= 4
  && (saturated(fill) || dark(fill) || /button|cta/.test(name));

// "Frame 11" → "Button / Continue"
Tested in real Figma, not just in this demo. The digest and naming engine were run inside an actual Figma file through the Plugin API. That run caught two cases the mock missed, status bars built as groups and list rows without auto layout, and both are now handled. Automated tests also cover the engine and the full rename-and-revert loop.

Ship files that read
like they were meant.

Download Neat