The tireless design robot.
Check a box. Get designs.

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.

Get the robot git clone github.com/imlatheef/design-clanker
Production line — live UNITS PRODUCED 2,047
Full Name Ada Okafor
Job Title Platform Lead
Company Trellis
Ready for Design
SPEAKER CARD · 2×
AO
Ada Okafor
Platform Lead — Trellis

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 →

Spec sheet

Heavy machinery for lightweight design ops

Config, not code

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.

Multi-output

One trigger, a full asset kit

A single checked box renders the OG image, the LinkedIn card, and the speaker social — each to its own attachment field.

Smart variants

The layout picks itself

Second speaker photo filled → two-speaker frame. Is Sponsored checked → sponsored frame. Variants compose: sponsored_two_speakers just works.

True to design

Your fonts, your pixels

Position, size, weight, color, and alignment are read from the Figma file itself and re-rendered with your actual TTFs.

Photo compositing

Headshots, handled

Attachments pulled from the record, backgrounds removed with AI on request, clipped to the exact corner radius in Figma — circles included.

PDF reports

Multi-page documents too

Static pages, data-overlay pages, and conditionally included pages assembled into one branded PDF. Built for sponsor recaps.

Operating manual

Feed it YAML, not tickets

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.

Triggercheckbox or single-select
OutputJPEG / multi-page PDF
Poll interval30s, configurable
Secrets.env only — never in YAML
Failure modelog, skip, keep polling
templates.yamlVALID ✓
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
Assembly diagram

What happens when you check the box

Airtabletrigger set
Clankerpoll · variant
Figmaexport · layers
Renderertext · photos
Airtableupload · done

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.

Installation

Runs anywhere Python runs

Local

On your machine

Two dotfiles and a command. uv sync && uv run airtable-to-figma

Container

Docker / Fly.io

Slim image with the background-removal model pre-baked. fly launch && fly deploy

Serverless

GitHub Actions cron

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.

Free · Open source · MIT

Put a robot on it.

Star it, fork it, point it at your base.

UNIT 001 · EST. 2026 PYTHON · PILLOW · REMBG · PYDANTIC MIT LICENSE