One YAML file runs the factory
Every workflow lives in templates.yaml. Map Airtable field names to Figma layer names — adding a template is a config change, not a deploy.
Design Clanker watches your Airtable base and stamps out finished artwork from your Figma templates — real data, real fonts, real photos — then files it straight back onto the record. No exports, no copy-paste, no designer on call at 2am.
Field record This isn't a demo reel. The robot ran PlatformCon 2026 — 2,000+ speaker cards, OG images, socials, video backgrounds, and sponsor recap PDFs across a global virtual conference and live days in London and New York. Read the case study →
Every workflow lives in templates.yaml. Map Airtable field names to Figma layer names — adding a template is a config change, not a deploy.
A single checked box renders the OG image, the LinkedIn card, and the speaker social — each to its own attachment field.
Second speaker photo filled → two-speaker frame. Is Sponsored checked → sponsored frame. Variants compose: sponsored_two_speakers just works.
Position, size, weight, color, and alignment are read from the Figma file itself and re-rendered with your actual TTFs.
Attachments pulled from the record, backgrounds removed with AI on request, clipped to the exact corner radius in Figma — circles included.
Static pages, data-overlay pages, and conditionally included pages assembled into one branded PDF. Built for sponsor recaps.
The whole contract between your base and your design file fits on one screen: which table to watch, which frame to render, and how fields map to layers.
The poller claims records where the trigger is set, walks the status through Pending → Working → Done inside Airtable, and never lets one bad record stop the line.
templates: - name: "Speaker Card" airtable_table_name: "Speakers" airtable_trigger_field: "Ready for Design" airtable_attachment_field: "Generated Design" figma_file_key: "AbCdEfGhIjKlMnOp" figma_frame_node_id: "12:345" field_mappings: # Airtable field → Figma layer "Full Name": "Speaker Name" "Talk Title": "Title" image_field_mappings: "Headshot": "Photo" remove_background: true # AI headshot cutout
Figma's API can't edit files — so the frame is exported once as a base image, the layer geometry is read from the file JSON, and your data is redrawn on top, pixel-matched. Frame assets are cached, so a batch of fifty records hits Figma once.
Two dotfiles and a command. uv sync && uv run airtable-to-figma
Slim image with the background-removal model pre-baked. fly launch && fly deploy
No server at all — a scheduled workflow runs one poll pass. airtable-to-figma --run-once
Or skip the manual setup entirely — open the repo in your coding agent and say "set me up". AGENTS.md hands the robot to your robot: a guided interview that discovers your bases and frames, writes the config, and deploys.
Star it, fork it, point it at your base.