Agent skill

Penpot Workflow

by espennilsen in espennilsen/pi

Manage design work in Penpot — create projects, organize pages, build components, export assets, review designs visually, and handle design-to-code handoff.

MITAuto-check passedFrontend & Design

Install Penpot Workflow

skills CLI
$ npx skills add espennilsen/pi --skill penpot-workflow -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install espennilsen/pi penpot-workflow --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/espennilsen/pi.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/penpot-workflow .claude/skills/penpot-workflow && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
penpot-workflow
GitHub stars
122
Token cost
~2.7k tokens
SKILL.md length
1,038 words
Files
1
Skills in repo
36
Repo updated
First seen
Licence
MIT

At a glance

Manage design work in Penpot — create projects, organize pages, build components, export assets, review designs visually, and handle design-to-code handoff.

  • Works in 4 steps: Get the file and page IDs → Create a share link → Screenshot each page with Playwright → …
  • Asked to create designs
  • SKILL.md covers Project Setup, Shape Creation, Shape Styling (modify-shape) and Design Workflow — Best Practices, plus 6 more sections
  • Reaches penpot.e9n.dev

What it does

Penpot Workflow is an agent skill from espennilsen/pi. Manage design work in Penpot — create projects, organize pages, build components, export assets, review designs visually, and handle design-to-code handoff. Use when asked to create designs, manage Penpot projects, build components, export tokens, set up a new design project, review a design, take screenshots, or show what something looks like.

Its SKILL.md is about 2.7k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Frontend & Design, covering Design to code. The licence is MIT.

When your agent uses it

  • Asked to create designs
  • Manage Penpot projects
  • Build components
  • Set up a new design project

Example prompts

  • “/penpot-workflow”

Workflow steps

4 steps, taken from the step headings in SKILL.md.

  1. Get the file and page IDs
  2. Create a share link
  3. Screenshot each page with Playwright
  4. Review what you see

What it can do on your machine

Read from SKILL.md and the folder at commit 79d019b. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are bash and json).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • penpot.e9n.dev

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Penpot Workflow loads about 2.7k tokens when it runs. Until then it costs about 91 tokens; SKILL.md has 1,038 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~91
When it runs · the whole SKILL.md, loaded when a task matches
~2.7k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from espennilsen/pi at commit 79d019b, republished under its MIT licence (© espennilsen). 1,038 words, ~2,744 tokens.

Download SKILL.mdSave it as .claude/skills/penpot-workflow/SKILL.md (or your agent's skills folder).
name
penpot-workflow
description
Manage design work in Penpot — create projects, organize pages, build components, export assets, review designs visually, and handle design-to-code handoff. Use when asked to create designs, manage Penpot projects, build components, export tokens, set up a new design project, review a design, take screenshots, or show what something looks like.

Penpot Workflow

Step-by-step workflows for managing design work in Penpot via the pi-penpot extension.

Project Setup

When starting a new design project:

  1. Create the Penpot project with a clear, matching name (same as the code repo)
  2. Set up standard pages:
    • Design System — shared components, tokens, and styles
    • Wireframes — low-fidelity layouts and flows
    • One page per major screen or user flow (e.g., Dashboard, Settings, Onboarding)
  3. Define foundations first:
    • Color palette (primary, secondary, neutral, semantic: success/warning/error/info)
    • Typography scale (headings h1-h6, body, caption, label, mono)
    • Spacing scale (aligned with Tailwind: 4px base unit)
    • Border radius tokens
    • Shadow/elevation tokens

Shape Creation

Creating shapes with full styling

Use penpot_page tool actions. All shapes support fills, opacity, and rotation on creation.

Rectangles and frames also support r1-r4 for border radius on creation:

penpot_page add-rectangle fileId=X pageId=Y x=0 y=0 width=200 height=100
  fills=[{fillColor: "#1E293B", fillOpacity: 1}]
  r1=12 r2=12 r3=12 r4=12

Text supports fontSize, fontWeight, fontFamily, fontColor on creation:

penpot_page add-text fileId=X pageId=Y x=0 y=0 width=200 height=40
  text="Hello World"
  fontSize="24" fontWeight="700" fontFamily="sourcesanspro" fontColor="#FFFFFF"
Available font families
  • sourcesanspro — Source Sans Pro (default, always available)
  • Custom fonts can be uploaded via create-font-variant
Font size and weight are STRINGS

Always pass fontSize and fontWeight as strings: "24" not 24, "700" not 700.

Shape Styling (modify-shape)

After creation, use modify-shape to add advanced styling. First-class params:

Border Radius
penpot_page modify-shape fileId=X pageId=Y shapeId=Z r1=16 r2=16 r3=16 r4=16
  • r1 = top-left, r2 = top-right, r3 = bottom-right, r4 = bottom-left
Shadows
penpot_page modify-shape fileId=X pageId=Y shapeId=Z
  shadow=[{
    style: "drop-shadow",
    color: {color: "#000000", opacity: 0.3},
    offsetX: 0, offsetY: 4, blur: 12, spread: 0
  }]
  • Styles: drop-shadow, inner-shadow
  • UUID is auto-generated if not provided
  • Multiple shadows supported (array)
Blur
penpot_page modify-shape fileId=X pageId=Y shapeId=Z
  blur={type: "layer-blur", value: 4}
  • Types: layer-blur, background-blur
  • UUID is auto-generated
Strokes
penpot_page modify-shape fileId=X pageId=Y shapeId=Z
  strokes=[{strokeColor: "#7C3AED", strokeOpacity: 0.5, strokeWidth: 2, strokeAlignment: "inner"}]
  • Alignment: inner, center, outer
  • Style (via attrs): solid, dotted, dashed, mixed, none
Text Content (re-style existing text)
penpot_page modify-shape fileId=X pageId=Y shapeId=Z
  textContent={
    type: "root",
    children: [{type: "paragraph-set", children: [{type: "paragraph", children: [{
      text: "Updated text",
      fontFamily: "sourcesanspro",
      fontSize: "32",
      fontWeight: "700",
      fontStyle: "normal",
      fillColor: "#FFFFFF",
      fillOpacity: 1
    }]}]}]
  }
Generic attrs (any shape attribute)

Use attrs as a catch-all for any shape property not covered above:

penpot_page modify-shape fileId=X pageId=Y shapeId=Z
  attrs={hidden: true, blocked: false}

Design Workflow — Best Practices

Step-by-step for polished designs
  1. Create shapes with basic geometry + fills + border radius
  2. Style shapes with modify-shape: shadows, strokes, blur
  3. Create text with proper fontSize/fontWeight/fontColor from the start
  4. Re-style text with textContent on modify-shape if needed later
  5. Batch work — create all shapes first, then style them (reduces API calls)
Performance tips
  • Create shapes in rapid succession (each is one API call)
  • Use modify-shape to batch multiple styling changes on one shape (fills + strokes + shadow in one call)
  • Always get file features from penpot get-file before manual API calls
What works with the extension tools
FeatureCreateModifyNotes
Position & size✅✅x, y, width, height
Fills✅✅Array of fill objects
Border radius✅✅r1, r2, r3, r4 params
Shadows❌✅shadow param, UUID auto-generated
Blur❌✅blur param, UUID auto-generated
Strokes✅✅strokes param
Text styling✅✅fontSize/fontWeight/fontColor on create; textContent on modify
Opacity✅✅0-1 number
Rotation✅✅degrees

Visual Review

When you need to review your own work or the user asks you to review a design, capture actual rendered screenshots from Penpot's viewer.

When to do this
  • After creating or modifying designs — always screenshot to verify the result
  • When the user says "review", "show me", "how does it look", "screenshot"
  • Before handoff — capture final state for documentation
Workflow
1. Get the file and page IDs
penpot get-file fileId=<fileId>
penpot create-share-link fileId=<fileId> pages=[<pageId1>, <pageId2>] whoInspect="all"

Share links are required — Penpot's viewer won't render without either authentication or a share token.

3. Screenshot each page with Playwright

The Penpot viewer URL format is:

https://penpot.e9n.dev/#/view?file-id=<fileId>&page-id=<pageId>&section=interactions&index=0&share-id=<shareId>

Use Playwright to screenshot each page URL. Penpot is a complex ClojureScript SPA — wait 6+ seconds after navigation for it to render.

Cleanup: Always close the Playwright browser after capture to prevent leaking Chromium processes:

javascript
await browser.close();

Save screenshots to /tmp/penpot-<page-name>.png, then read them to view inline. After viewing, delete the temporary file to avoid accumulating disk usage:

bash
rm /tmp/penpot-<page-name>.png
4. Review what you see

After viewing the screenshot, evaluate:

  • Layout — is there wasted space? Are elements aligned to a grid?
  • Visual hierarchy — can you immediately tell what's important?
  • Consistency — do similar elements (cards, tags, buttons) share the same styling?
  • Completeness — are there missing states, empty areas, placeholder content?
  • Accessibility — text contrast, touch target sizes, focus indicators
  • Polish — border radius consistency, shadow consistency, proper spacing

Component Creation

Follow atomic design methodology:

Show full SKILL.md (436 more words)Show less
Atoms (smallest building blocks)
  • Buttons (primary, secondary, ghost, destructive — each with default/hover/active/disabled/focus)
  • Inputs (text, textarea, select, checkbox, radio, toggle)
  • Labels, badges, tags
  • Icons (use Lucide as base set)
  • Avatar, tooltip, separator
Molecules (composed atoms)
  • Form fields (label + input + helper text + error message)
  • Search bar (input + icon + button)
  • Card (container + content slots)
  • Menu item (icon + label + shortcut badge)
Organisms (composed molecules)
  • Navigation (sidebar, topbar, breadcrumbs)
  • Data tables (headers + rows + pagination + filters)
  • Modals/dialogs (overlay + card + action buttons)
  • Forms (multiple form fields + submit action)
Naming Convention

Use slash-separated categories: category/component-name/variant

  • buttons/primary/default
  • buttons/primary/hover
  • forms/text-input/filled
  • navigation/sidebar/collapsed

States & Variants

Every interactive component needs these states:

  • Default — resting state
  • Hover — mouse over (desktop)
  • Active/Pressed — being clicked/tapped
  • Focus — keyboard focus (visible focus ring, WCAG required)
  • Disabled — non-interactive
  • Loading — async operation in progress (skeleton or spinner)
  • Error — validation failure

Responsive Design

Design at these breakpoints (aligned with Tailwind):

  • Mobile: 375px (iPhone SE baseline)
  • Tablet: 768px
  • Desktop: 1280px
  • Wide: 1536px

Use Penpot's grid and layout features:

  • Auto-layout for flex-like behavior
  • Grid components for dashboard layouts
  • Constraints for responsive positioning

Design-to-Code Handoff

When preparing designs for developer handoff:

  1. Export design tokens as JSON:

    json
    {
      "colors": { "primary-500": "#7c6ff0", ... },
      "spacing": { "1": "4px", "2": "8px", ... },
      "typography": { "heading-1": { "size": "36px", "weight": 700, "lineHeight": 1.2 } },
      "radii": { "sm": "4px", "md": "8px", "lg": "12px" },
      "shadows": { "sm": "0 1px 2px rgba(0,0,0,0.05)", ... }
    }
  2. Map components to shadcn-svelte — document which Penpot component maps to which shadcn component and what customization is needed

  3. Annotate specs — add notes on each page for:

    • Spacing between elements
    • Interaction behavior (transitions, animations)
    • Edge cases (empty states, error states, loading states)
    • Accessibility notes (ARIA labels, focus order)
  4. Export assets — SVGs for icons and illustrations, optimized images

Penpot API Patterns

Use the pi-penpot extension's three tools:

  • penpot — org-level: projects, files, teams, libraries, webhooks, snapshots, share links
  • penpot_page — design: pages, shapes (create/modify/delete/move), components
  • penpot_comment — collaboration: comment threads and replies
Critical API knowledge
  1. Always get the file first — penpot get-file returns pageIds and file features
  2. File features must match — features from get-file must be passed back in update-file
  3. Transit+JSON encoding — the extension handles this automatically for all write operations
  4. UUIDs auto-generated — shadow and blur IDs are auto-generated when not provided
  5. camelCase in params, kebab-case internally — the extension converts automatically

Checklist Before Handoff

  • All components use the design system (no one-off styles)
  • States documented (default, hover, active, focus, disabled, error, loading)
  • Responsive layouts at all breakpoints
  • Color contrast passes WCAG AA (4.5:1 text, 3:1 large text/UI)
  • Focus indicators visible on all interactive elements
  • Empty states, error states, and loading states designed
  • Design tokens exported as JSON
  • Component-to-shadcn mapping documented
  • Spacing and typography use the defined scale (no magic numbers)

© espennilsen, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/penpot-workflow of espennilsen/pi.

Open the folder on GitHubat commit 79d019b

Compare with similar skills

Penpot Workflow next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Penpot Workflow compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Penpot Workflow this skillespennilsen/pi122—~2.7kAutomated safety check: PassMIT
Figma use_figma Plugin API Ruleswarpdotdev/warp65k4 repos~4.4kAutomated safety check: PassAGPL-3.0
Figma Design to Codewarpdotdev/warp65k4 repos~2.9kAutomated safety check: PassAGPL-3.0
Scalar Design Systemscalar/scalar16k—~2.7kAutomated safety check: PassMIT
Figma Design System Rules Generatorwarpdotdev/warp65k3 repos~4.6kAutomated safety check: PassAGPL-3.0
Figma Code Connect Componentswarpdotdev/warp65k2 repos~4.2kAutomated safety check: PassAGPL-3.0

Similar skills

  • Required groundwork before any use_figma call: the rules and reference files for running JavaScript in a Figma file through the Plugin API without common failures.

    65k GitHub starsUsed in 4 repos~4.4k tokens
    Frontend & DesignAuto-check passed
  • Figma Design to Code

    warpdotdev/warp

    Turns a Figma frame or component into production code that matches the design, using the Figma MCP server and the project's own design system.

    65k GitHub starsUsed in 4 repos~2.9k tokens
    Frontend & DesignAuto-check passed
  • Scalar's design system — design tokens, theming (@scalar/themes), CSS variables, and the @scalar/components library.

    16k GitHub stars~2.7k tokensUpdated today
    Frontend & DesignAuto-check passed
  • Creates project-specific design system rules from your codebase so coding agents implement Figma designs with your components, naming and tokens.

    65k GitHub starsUsed in 3 repos~4.6k tokens
    Frontend & DesignAuto-check passed
  • Maps published Figma components to their code implementations with Code Connect, using the Figma MCP suggestion and mapping tools.

    65k GitHub starsUsed in 2 repos~4.2k tokens
    Frontend & DesignAuto-check passed
  • Design To Code

    MigoXLab/coderio

    Pixel-perfect Figma to React conversion using coderio. An agent skill from MigoXLab/coderio.

    114 GitHub starsUsed in 2 repos~1.2k tokens
    Frontend & DesignAuto-check passed

More from espennilsen/pi

All 36 skills in this repo
  • GitHub

    espennilsen/pi

    Interact with GitHub repos, PRs, issues, CI, and notifications via the pi-github extension commands and gh CLI.

    122 GitHub stars~1k tokensUpdated 17 days ago
    Auto-check passed
  • Skill Creator

    espennilsen/pi

    Create, review, and improve skills for Pi agents. An agent skill from espennilsen/pi.

    122 GitHub stars~2.1k tokensUpdated 17 days ago
    Auto-check passed
  • Dry Code Review

    espennilsen/pi

    Perform a comprehensive DRY (Don't Repeat Yourself) code review on a codebase.

    122 GitHub stars~1.7k tokensUpdated 17 days ago
    Auto-check passed
  • Extract Design System

    espennilsen/pi

    Reverse-engineer a design system from a live website (public URL or localhost).

    122 GitHub stars~2k tokensUpdated 17 days ago
    Auto-check passed
  • Herdr Operations

    espennilsen/pi

    A skill your agent uses when inspecting or operating Herdr sessions, workspaces, tabs, panes, agents, terminal output, agent messaging, or waits.

    122 GitHub starsUsed in 1 repo~525 tokens
    Auto-check passed
  • PDF Reader

    espennilsen/pi

    Read and extract content from PDF files — text, tables, metadata, and images.

    122 GitHub stars~1.6k tokensUpdated 17 days ago
    Auto-check passed

Questions about Penpot Workflow

What does Penpot Workflow do?

Manage design work in Penpot — create projects, organize pages, build components, export assets, review designs visually, and handle design-to-code handoff. Penpot Workflow is an agent skill from espennilsen/pi. Manage design work in Penpot — create projects, organize pages, build components, export assets, review designs visually, and handle design-to-code handoff.

When should I use Penpot Workflow?

Penpot Workflow fits situations like: asked to create designs; manage Penpot projects; build components; set up a new design project.

How do I install Penpot Workflow in Claude Code?

Run `npx skills add espennilsen/pi --skill penpot-workflow -a claude-code`. Or copy the skill folder (skills/penpot-workflow in espennilsen/pi) into .claude/skills/penpot-workflow in your project. Claude Code loads it when a task matches its description.

How do I install Penpot Workflow in Codex?

Run `npx skills add espennilsen/pi --skill penpot-workflow -a codex`. Or copy the skill folder (skills/penpot-workflow in espennilsen/pi) into .agents/skills/penpot-workflow in your project. Codex loads it when a task matches its description.

Can I use Penpot Workflow in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add espennilsen/pi --skill penpot-workflow -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/penpot-workflow, .gemini/skills/penpot-workflow, .github/skills/penpot-workflow and .opencode/skills/penpot-workflow in your project.

What does Penpot Workflow need to run?

SKILL.md names no scripts, command-line tools or credentials: Penpot Workflow is instructions for the agent only.

Does Penpot Workflow access the network?

SKILL.md names 1 domain. In commands or code: penpot.e9n.dev; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Penpot Workflow safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Penpot Workflow use?

Penpot Workflow is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Penpot Workflow use?

About 2.7k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Penpot Workflow?

Skills that share tags, products or a category with Penpot Workflow: Figma use_figma Plugin API Rules (warpdotdev/warp, 65k stars), Figma Design to Code (warpdotdev/warp, 65k stars), Scalar Design System (scalar/scalar, 16k stars) and Figma Design System Rules Generator (warpdotdev/warp, 65k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Penpot Workflow?

espennilsen (a GitHub user) maintains it in espennilsen/pi, which has 122 GitHub stars. The repository holds 36 skills in this directory. The repository was last updated on September 21, 2026.

Source: espennilsen/pi on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.