0saas

Job ticket 589524 · consumer · token bench · no subscription

Figma's free AI stops at 500 credits. Here is the bench that specs your system for nothing.

This page is a token bench. You feed it a brand, a screen, or a component, a free-tier model returns a design-token spec, a component inventory, or developer handoff notes as strict JSON, and your browser sets it as mono-value tables you export as CSV. No canvas, no account, nothing uploaded — the spec is what you load into Figma, your repo, or any tool that reads tokens. The prompts are printed at the bottom of this page so you keep them even if this site disappears.

Figma is a trademark of Figma, Inc. This is an independent, unaffiliated comparison built on Figma's own published pricing page, linked below. We are not Figma, and nothing here is endorsed by them.

Token bench — rendered in this browser

Source: noneRendered: 0Uploaded to 0saas: nothing

Sample data is illustrative, not a claim about Figma. Every Figma figure on this page comes from the linked pricing page, read 2026-09-17.

The prompt pack

Three prompts, each mapped one-to-one onto a Figma feature you are currently rationed on. Run them from this page with a free key, or copy them into any free chat model — the text is identical either way, and it is printed in full at the bottom of this section so it survives this site.

Loading the pack from tools.json… If this fails, the full prompt text is still readable below.

What Figma's own pricing page says

Read from figma.com/pricing on 2026-09-17. Fields we could not read are marked unconfirmed rather than filled in with a plausible number.

Figma Starter vs Professional vs this page — verified 2026-09-17
The jobStarter (Free)Professional (US$16/seat)This page + a free-tier model
PriceUS$0 — unlimited draftsUS$16 per full seat / monthUS$0 forever. A free-tier key costs nothing; the prompts are yours.
AI credits500 per month3,000 per seat / monthUnmetered by us — the spec is a file. Your ally's free allowance is the only ceiling: the Gemini free tier's daily base covers many runs.
Token authoringManual, or AI within creditsAI within creditsPrompt 01 returns the full token set — color, type, spacing, radius, focus — with exact values and a visible scale.
Component auditManualAI-assisted within creditsPrompt 02 inventories every component with states and props, and files the gaps it could not see.
Dev handoffDev Mode, paid per seatDev Mode includedPrompt 03 writes the handoff table with units in every spec cell and the token ledger attached.
Who sees your design docsFigmaFigmaOnly the inference provider you choose — or nobody at all in Copy-Paste Relay.

What this replaces, and what it does not

A displacement claim you cannot substantiate is a lie with good typography. This is the whole scope, including the parts where Figma wins.

Replaced: metered AI token work

Prompt 01 returns a 12–24 token set across five fixed groups, values exact, scale visible.

Replaced: the component audit

Prompt 02 returns the inventory with states, props and a gap ledger — the honest part of the audit is what it could not see.

Replaced: per-seat Dev Mode handoff

Prompt 03 returns the build table: element, spec with units, state, watch-out — with the tokens it references listed.

Not replaced: the canvas

No drawing, no frames, no component runtime. The tables are loaded into Figma or your repo; the pixels stay with your tools.

Not replaced: multiplayer design review

No live cursors, no comments on a file. The spec is a document you share, deliberately, like a file.

Not replaced: rendering or prototyping

The page produces spec documents, not pixels. Figma (or any editor) still draws what the tokens and inventory describe, and prototypes still have to be built somewhere that renders.

The prompts, in full, as text

Copy these into any model. They are the product; the page around them is convenience. Each block is the exact system prompt the interactive runner sends, plus the user-message template.

Prompt 01 — 1. Token spec · figma-token-spec v1.0.0 · best ally: Google Gemini API — Free usage tier · gemini-2.5-flash-lite

Replaces: Figma's AI-assisted token work on the 500-credit free allowance — a full design-token set generated as a file instead of burned through credits.

Why this model: A token set is a table of exact values with usage rules; strict-JSON on the Gemini free tier keeps hex codes and scale steps honest in one render. Fallback ally: OpenRouter — :free model variants.

System prompt (1467 chars):

You are the token clerk at a token bench. You turn a brand description into a machine-readable design token spec.

Return ONLY one JSON object. No markdown fences, no commentary.

{
  "brand": string (max 8 words),
  "kicker": string (max 6 words),
  "columns": [ "token", "value", "usage" ],
  "rows": [ [ string, string, string ] (12-24 rows) ],
  "notes": [ string (max 15 words) ]
}

Hard rules:
1. "rows" covers exactly five groups, in this order: color (4-8 tokens: bg, surface, ink, ink-muted, accent, plus any the brief names), type (4 tokens: display, heading, body, caption — value is "family / size / line-height"), spacing (4 tokens on a stated scale, e.g. 4/8/16/32), radius (2-3 tokens), elevation or focus (1-2 tokens). Every token value must be exact: hex with #, numbers with px/pt units, no 'a dark blue' in a value cell.
2. If the brief supplies hex colors, use them verbatim as the accent-family base; derive the rest with stated steps (e.g. 'accent at 10% on bg') in "usage", never by inventing a new hue.
3. "usage" is one short rule per token ("body copy only", "never on small text") — not a description, an instruction.
4. The scale must be visible in the values: spacing steps must follow one ratio, type sizes one step pattern. A token set with random numbers is a spec nobody builds from.
5. Do not add tokens the five groups do not cover (no shadows-as-colors, no z-index list). 12 to 24 rows total.
6. Write in the language of the brief.

User message template:

The brand (colors if known, temperament, what it must not look like): {{brand}} What the product is: {{product}}

Variables:

  • {{brand}} — Brand (max 600 chars) sample data shipped with the tool
  • {{product}} — Product (max 160 chars) sample data shipped with the tool

Output schema (the answer must match this exactly):

{ "type": "object", "required": [ "brand", "kicker", "columns", "rows", "notes" ], "properties": { "brand": { "type": "string" }, "kicker": { "type": "string" }, "columns": { "type": "array" }, "rows": { "type": "array", "minItems": 12, "maxItems": 24 }, "notes": { "type": "array" } } }

Decoding: temperature 0.4 · max 1800 output tokens · responseMimeType application/json · budget ~700 in / ~900 out per run · cost per run: 1 request — a rounding error against the Gemini free tier's daily base.

Prompt 02 — 2. Component inventory · figma-component-inventory v1.0.0 · best ally: Google Gemini API — Free usage tier · gemini-2.5-flash-lite

Replaces: Figma's AI component audit on paid tiers — the inventory that says what the product actually has, with states and props, before the redesign.

Why this model: An inventory is exhaustive classification; strict-JSON keeps each component atomic with its state list, and the Gemini free tier handles the full product description in one request. Fallback ally: OpenRouter — :free model variants.

System prompt (1504 chars):

You are the inventory clerk at a token bench. You turn a description of a product's screens into a machine-readable component inventory.

Return ONLY one JSON object. No markdown fences, no commentary.

{
  "product": string (max 8 words),
  "kicker": string (max 6 words),
  "columns": [ "component", "states", "props", "notes" ],
  "rows": [ [ string, string, string, string or null ] (8-20 rows) ],
  "missing": [ string (max 12 words) ] (1-4 items),
  "notes": [ string (max 15 words) ]
}

Hard rules:
1. Every row is one component with a job (button, field, card, tab, toggle, list row, modal, badge, empty state, toast). No row is a screen and no row is a 'misc' bucket.
2. "states" lists the states the component actually needs for this product, separated by ' / ' (e.g. "default / hover / disabled / loading"). An empty state is its own row, not a state of the list.
3. "props" names the variants (e.g. "size: sm/md; tone: primary/neutral"). Max 6 props per row; if a component needs more, it is two components — split it and note the split.
4. Never invent a component the product does not have. If the description implies a screen with no component list, list what the description supports and put the gap in "missing" — that is the honest part of the inventory.
5. "notes" for a row is one build-relevant fact ("loading state reuses the skeleton width") or null. No adjectives.
6. 8 to 20 rows; a 30-row inventory for a 4-screen product is padding.
7. Write in the language of the description.

User message template:

The screens and what is on them: {{screens}}

Variables:

  • {{screens}} — Screens (max 900 chars) sample data shipped with the tool

Output schema (the answer must match this exactly):

{ "type": "object", "required": [ "product", "kicker", "columns", "rows", "missing", "notes" ], "properties": { "product": { "type": "string" }, "kicker": { "type": "string" }, "columns": { "type": "array" }, "rows": { "type": "array", "minItems": 8, "maxItems": 20 }, "missing": { "type": "array", "minItems": 1, "maxItems": 4 }, "notes": { "type": "array" } } }

Decoding: temperature 0.45 · max 2000 output tokens · responseMimeType application/json · budget ~900 in / ~1,000 out per run · cost per run: 1 request per audit — under 1% of the Gemini free tier's daily base.

Prompt 03 — 3. Handoff notes · figma-handoff-notes v1.0.0 · best ally: Google Gemini API — Free usage tier · gemini-2.5-flash-lite

Replaces: Figma Dev Mode's paid per-seat handoff annotations — the developer-facing spec sheet written once, as a file, instead of annotated on a metered canvas.

Why this model: Handoff notes are a fixed table of (element → spec → state → watch-out); strict-JSON keeps the units exact and the sheet renders as a build checklist. Fallback ally: OpenRouter — :free model variants.

System prompt (1425 chars):

You are the handoff clerk at a token bench. You turn a component or screen description into developer-facing handoff notes.

Return ONLY one JSON object. No markdown fences, no commentary.

{
  "component": string (max 8 words),
  "kicker": string (max 6 words),
  "columns": [ "element", "spec", "state", "watch-out" ],
  "rows": [ [ string, string, string, string or null ] (6-14 rows) ],
  "tokens_referenced": [ string ] (3-8 token names),
  "notes": [ string (max 15 words) ]
}

Hard rules:
1. Every "spec" value carries units: px for spacing/size, hex for color, pt/px for type, ms for motion. A spec without units is not a spec — if the input has no number, write the value as 'per token <name>' and add that token to "tokens_referenced'.
2. "state" is the one state that row governs (default, hover, disabled, empty, error, loading). A row never covers two states; add a row.
3. "watch-out" names the single most-likely build mistake for that element ("min-width must hold on 320px viewports") or null. Never generic ("make it responsive" is banned).
4. "tokens_referenced" lists only tokens that plausibly come from a token spec for this product (bg, surface, ink, accent, spacing steps, type roles) — and every one listed must be used by at least one row.
5. 6 to 14 rows. Order: container first, then interactive elements, then content elements, then empty/error states last.
6. Write in the language of the input.

User message template:

The component or screen to hand off: {{target}} The tokens it should use (from prompt 1, or the team's existing set): {{tokens}}

Variables:

  • {{target}} — Handoff target (max 700 chars) sample data shipped with the tool
  • {{tokens}} — Tokens (max 200 chars) sample data shipped with the tool

Output schema (the answer must match this exactly):

{ "type": "object", "required": [ "component", "kicker", "columns", "rows", "tokens_referenced", "notes" ], "properties": { "component": { "type": "string" }, "kicker": { "type": "string" }, "columns": { "type": "array" }, "rows": { "type": "array", "minItems": 6, "maxItems": 14 }, "tokens_referenced": { "type": "array", "minItems": 3, "maxItems": 8 }, "notes": { "type": "array" } } }

Decoding: temperature 0.35 · max 1800 output tokens · responseMimeType application/json · budget ~800 in / ~900 out per run · cost per run: 1 request per handoff — under 1% of the Gemini free tier's daily base.

Questions worth asking before you cancel

Is this actually free, or is there a subscription hiding?

There is no subscription and, right now, no paid tier at all. The whole tool is unmetered. A one-time unlock for token-set diffing is planned, but no price is shown anywhere on this site until a real Stripe Payment Link exists and its price is read back from Stripe's API rather than typed by hand.

Do you need an API key?

No. Copy-Paste Relay works with any free chat model you already use: copy the prompt block, paste it in, paste the JSON answer back into the box. A key only removes the copy-paste step. If you do use one, it is stored in your browser's localStorage and sent only to that provider — 0saas has no endpoint that accepts a key.

Which free model is best for this?

The Gemini free tier — the tables are strict-JSON and the value cells (hex codes, px steps) need a model that will not round a number. OpenRouter's :free variants are the second-opinion pick for the inventory.

Will the token set actually work in Figma?

The rows are (name, value, usage) triples — Figma's token format, or any CSS custom-property / JSON tokens spec. Copy the value column and the naming is yours to keep; the usage column is the part most generators skip.

Is 0saas affiliated with Figma?

No. Figma is a trademark of Figma, Inc. We name it because a comparison that will not name the thing it compares against is useless. Pricing figures come from Figma's own pricing page, linked above, with the date we read it and a per-field confidence marker.

Next on the ledger