Penpot Uiux Design
GitHubOfficialFirst committed by JcardifDistributed by GitHub
- Skill
- Tool integration
- Design and creative
- MIT
- Low risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured approach to UI/UX design within Penpot, leveraging the penpot-mcp server to automate design tasks, manage components, and ensure accessibility. It covers the entire design lifecycle, from initial setup and design system discovery to layout creation, validation, and export. The guide emphasizes user-centered principles, consistent design patterns, and technical best practices for Penpot's API.
What it does
- Automates design tasks and modifications via Penpot MCP tools.
- Provides workflows for building and maintaining design systems.
- Offers guidance on applying accessibility standards (WCAG) to designs.
- Includes patterns for common UI components like buttons, forms, and navigation.
- Facilitates design validation through visual inspection and code analysis.
- Provides technical guidance for Penpot API interactions and layout management.
When to use it
- When creating new UI/UX designs for web, mobile, or desktop applications.
- When building or maintaining a design system with components and tokens.
- When designing specific interface elements like dashboards, forms, or landing pages.
- When auditing existing Penpot designs for usability and accessibility compliance.
- When needing to follow platform-specific guidelines like Material Design or iOS.
Advantages
- Enforces consistency through reusable design tokens and component patterns.
- Reduces manual effort by automating repetitive design and layout tasks.
- Ensures accessibility is integrated into the design process from the start.
- Provides clear technical guardrails for using the Penpot API effectively.
- Supports a professional, user-centered design workflow.
Usage examples
- “Design a mobile login form for my app.”
- The agent will guide you through creating a mobile-friendly form, ensuring it meets touch target requirements, uses proper input labels, and follows the defined spacing scale.
- “Check if my current Penpot design is accessible.”
- The agent will walk you through a checklist covering color contrast, touch target sizes, and heading hierarchy, while suggesting code-based validation for specific elements.
- “Create a new dashboard layout using my existing design system.”
- The agent will first discover your existing components and tokens, then help you structure the dashboard layout using your established brand colors and typography.
- “How do I add a button component to my design?”
- The agent will provide the recommended button specifications, including size, padding, and state handling, and help you implement it using the Penpot MCP tools.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/github/penpot-uiux-design/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip penpot-uiux-design.zip -d .agents/skills
Documentation by Jcardif
Penpot UI/UX Design Guide
Create professional, user-centered designs in Penpot using the penpot/penpot-mcp MCP server and proven UI/UX principles.
Available MCP Tools
| Tool | Purpose |
|---|---|
mcp__penpot__execute_code | Run JavaScript in Penpot plugin context to create/modify designs |
mcp__penpot__export_shape | Export shapes as PNG/SVG for visual inspection |
mcp__penpot__import_image | Import images (icons, photos, logos) into designs |
mcp__penpot__penpot_api_info | Retrieve Penpot API documentation |
MCP Server Setup
The Penpot MCP tools require the penpot/penpot-mcp server running locally. For detailed installation and troubleshooting, see setup-troubleshooting.md.
Before Setup: Check If Already Running
Always check if the MCP server is already available before attempting setup:
Try calling a tool first: Attempt
mcp__penpot__penpot_api_info- if it succeeds, the server is running and connected. No setup needed.If the tool fails, ask the user:
"The Penpot MCP server doesn't appear to be connected. Is the server already installed and running? If so, I can help troubleshoot. If not, I can guide you through the setup."
Only proceed with setup instructions if the user confirms the server is not installed.
Quick Start (Only If Not Installed)
# Clone and install
git clone https://github.com/penpot/penpot-mcp.git
cd penpot-mcp
npm install
# Build and start servers
npm run bootstrapThen in Penpot:
Open a design file
Go to Plugins → Load plugin from URL
Enter:
http://localhost:4400/manifest.jsonClick "Connect to MCP server" in the plugin UI
VS Code Configuration
Add to settings.json:
{
"mcp": {
"servers": {
"penpot": {
"url": "http://localhost:4401/sse"
}
}
}
}Troubleshooting (If Server Is Installed But Not Working)
| Issue | Solution |
|---|---|
| Plugin won't connect | Check servers are running (npm run start:all in penpot-mcp dir) |
| Browser blocks localhost | Allow local network access prompt, or disable Brave Shield, or try Firefox |
| Tools not appearing in client | Restart VS Code/Claude completely after config changes |
| Tool execution fails/times out | Ensure Penpot plugin UI is open and shows "Connected" |
| "WebSocket connection failed" | Check firewall allows ports 4400, 4401, 4402 |
Quick Reference
| Task | Reference File |
|---|---|
| MCP server installation & troubleshooting | setup-troubleshooting.md |
| Component specs (buttons, forms, nav) | component-patterns.md |
| Accessibility (contrast, touch targets) | accessibility.md |
| Screen sizes & platform specs | platform-guidelines.md |
Core Design Principles
The Golden Rules
Clarity over cleverness: Every element must have a purpose
Consistency builds trust: Reuse patterns, colors, and components
User goals first: Design for tasks, not features
Accessibility is not optional: Design for everyone
Test with real users: Validate assumptions early
Visual Hierarchy (Priority Order)
Size: Larger = more important
Color/Contrast: High contrast draws attention
Position: Top-left (LTR) gets seen first
Whitespace: Isolation emphasizes importance
Typography weight: Bold stands out
Design Workflow
Check for design system first: Ask user if they have existing tokens/specs, or discover from current Penpot file
Understand the page: Call
mcp__penpot__execute_codewithpenpotUtils.shapeStructure()to see hierarchyFind elements: Use
penpotUtils.findShapes()to locate elements by type or nameCreate/modify: Use
penpot.createBoard(),penpot.createRectangle(),penpot.createText()etc.Apply layout: Use
addFlexLayout()for responsive containersValidate: Call
mcp__penpot__export_shapeto visually check your work
Design System Handling
Before creating designs, determine if the user has an existing design system:
Ask the user: "Do you have a design system or brand guidelines to follow?"
Discover from Penpot: Check for existing components, colors, and patterns
// Discover existing design patterns in current file
const allShapes = penpotUtils.findShapes(() => true, penpot.root);
// Find existing colors in use
const colors = new Set();
allShapes.forEach(s => {
if (s.fills) s.fills.forEach(f => colors.add(f.fillColor));
});
// Find existing text styles (font sizes, weights)
const textStyles = allShapes
.filter(s => s.type === 'text')
.map(s => ({ fontSize: s.fontSize, fontWeight: s.fontWeight }));
// Find existing components
const components = penpot.library.local.components;
return { colors: [...colors], textStyles, componentCount: components.length };If user HAS a design system:
Use their specified colors, spacing, typography
Match their existing component patterns
Follow their naming conventions
If user has NO design system:
Use the default tokens below as a starting point
Offer to help establish consistent patterns
Reference specs in component-patterns.md
Key Penpot API Gotchas
width/heightare READ-ONLY → useshape.resize(w, h)parentX/parentYare READ-ONLY → usepenpotUtils.setParentXY(shape, x, y)Use
insertChild(index, shape)for z-ordering (notappendChild)Flex children array order is REVERSED for
dir="column"ordir="row"After
text.resize(), resetgrowTypeto"auto-width"or"auto-height"
Positioning New Boards
Always check existing boards before creating new ones to avoid overlap:
// Find all existing boards and calculate next position
const boards = penpotUtils.findShapes(s => s.type === 'board', penpot.root);
let nextX = 0;
const gap = 100; // Space between boards
if (boards.length > 0) {
// Find rightmost board edge
boards.forEach(b => {
const rightEdge = b.x + b.width;
if (rightEdge + gap > nextX) {
nextX = rightEdge + gap;
}
});
}
// Create new board at calculated position
const newBoard = penpot.createBoard();
newBoard.x = nextX;
newBoard.y = 0;
newBoard.resize(375, 812);Board spacing guidelines:
Use 100px gap between related screens (same flow)
Use 200px+ gap between different sections/flows
Align boards vertically (same y) for visual organization
Group related screens horizontally in user flow order
Default Design Tokens
Use these defaults only when user has no design system. Always prefer user's tokens if available.
Spacing Scale (8px base)
| Token | Value | Usage |
|---|---|---|
spacing-xs | 4px | Tight inline elements |
spacing-sm | 8px | Related elements |
spacing-md | 16px | Default padding |
spacing-lg | 24px | Section spacing |
spacing-xl | 32px | Major sections |
spacing-2xl | 48px | Page-level spacing |
Typography Scale
| Level | Size | Weight | Usage |
|---|---|---|---|
| Display | 48-64px | Bold | Hero headlines |
| H1 | 32-40px | Bold | Page titles |
| H2 | 24-28px | Semibold | Section headers |
| H3 | 20-22px | Semibold | Subsections |
| Body | 16px | Regular | Main content |
| Small | 14px | Regular | Secondary text |
| Caption | 12px | Regular | Labels, hints |
Color Usage
| Purpose | Recommendation |
|---|---|
| Primary | Main brand color, CTAs |
| Secondary | Supporting actions |
| Success | #22C55E range (confirmations) |
| Warning | #F59E0B range (caution) |
| Error | #EF4444 range (errors) |
| Neutral | Gray scale for text/borders |
Common Layouts
Mobile Screen (375×812)
┌─────────────────────────────┐
│ Status Bar (44px) │
├─────────────────────────────┤
│ Header/Nav (56px) │
├─────────────────────────────┤
│ │
│ Content Area │
│ (Scrollable) │
│ Padding: 16px horizontal │
│ │
├─────────────────────────────┤
│ Bottom Nav/CTA (84px) │
└─────────────────────────────┘
Desktop Dashboard (1440×900)
┌──────┬──────────────────────────────────┐
│ │ Header (64px) │
│ Side │──────────────────────────────────│
│ bar │ Page Title + Actions │
│ │──────────────────────────────────│
│ 240 │ Content Grid │
│ px │ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │ │Card │ │Card │ │Card │ │Card │ │
│ │ └─────┘ └─────┘ └─────┘ └─────┘ │
│ │ │
└──────┴──────────────────────────────────┘
Component Checklist
Buttons
[ ] Clear, action-oriented label (2-3 words)
[ ] Minimum touch target: 44×44px
[ ] Visual states: default, hover, active, disabled, loading
[ ] Sufficient contrast (3:1 against background)
[ ] Consistent border radius across app
Forms
[ ] Labels above inputs (not just placeholders)
[ ] Required field indicators
[ ] Error messages adjacent to fields
[ ] Logical tab order
[ ] Input types match content (email, tel, etc.)
Navigation
[ ] Current location clearly indicated
[ ] Consistent position across screens
[ ] Maximum 7±2 top-level items
[ ] Touch-friendly on mobile (48px targets)
Accessibility Quick Checks
Color contrast: Text 4.5:1, Large text 3:1
Touch targets: Minimum 44×44px
Focus states: Visible keyboard focus indicators
Alt text: Meaningful descriptions for images
Hierarchy: Proper heading levels (H1→H2→H3)
Color independence: Never rely solely on color
Design Review Checklist
Before finalizing any design:
[ ] Visual hierarchy is clear
[ ] Consistent spacing and alignment
[ ] Typography is readable (16px+ body text)
[ ] Color contrast meets WCAG AA
[ ] Interactive elements are obvious
[ ] Mobile-friendly touch targets
[ ] Loading/empty/error states considered
[ ] Consistent with design system
Validating Designs
Use these validation approaches with mcp__penpot__execute_code:
| Check | Method |
|---|---|
| Elements outside bounds | penpotUtils.analyzeDescendants() with isContainedIn() |
| Text too small (<12px) | penpotUtils.findShapes() filtering by fontSize |
| Missing contrast | Call mcp__penpot__export_shape and visually inspect |
| Hierarchy structure | penpotUtils.shapeStructure() to review nesting |
Export CSS
Use penpot.generateStyle(selection, { type: 'css', includeChildren: true }) via mcp__penpot__execute_code to extract CSS from designs.
Tips for Great Designs
Start with content: Real content reveals layout needs
Design mobile-first: Constraints breed creativity
Use a grid: 8px base grid keeps things aligned
Limit colors: 1 primary + 1 secondary + neutrals
Limit fonts: 1-2 typefaces maximum
Embrace whitespace: Breathing room improves comprehension
Be consistent: Same action = same appearance everywhere
Provide feedback: Every action needs a response
Files
- ATTRIBUTION.mdAdded by AutoGineer867 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md12.6 KiB
- references/accessibility.md7.3 KiB
- references/component-patterns.md11.4 KiB
- references/platform-guidelines.md9.9 KiB
- references/setup-troubleshooting.md8.2 KiB
references/setup-troubleshooting.md
Penpot MCP Server Setup & Troubleshooting
Complete guide for installing, configuring, and troubleshooting the Penpot MCP Server.
Architecture Overview
The Penpot MCP integration requires three components working together:
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ MCP Client │────▶│ MCP Server │◀───▶│ Penpot Plugin │
│ (VS Code/Claude)│ │ (port 4401) │ │ (in browser) │
└─────────────────┘ └────────┬────────┘ └────────┬────────┘
│ │
│ WebSocket │
│ (port 4402) │
└───────────────────────┘MCP Server - Exposes tools to your AI client (HTTP on port 4401)
Plugin Server - Serves the Penpot plugin files (HTTP on port 4400)
Penpot MCP Plugin - Runs inside Penpot browser, executes design commands
Prerequisites
Node.js v22+ - Download
Git - For cloning the repository
Modern browser - Chrome, Firefox, or Chromium-based browser
Verify Node.js installation:
node --version # Should be v22.x or higher
npm --version
npx --versionInstallation
Step 1: Clone and Install
# Clone the repository
git clone https://github.com/penpot/penpot-mcp.git
cd penpot-mcp
# Install dependencies
npm installStep 2: Build and Start Servers
# Build all components and start servers
npm run bootstrapThis command:
Installs dependencies for all components
Builds the MCP server and plugin
Starts both servers (MCP on 4401, Plugin on 4400)
Expected output:
MCP Server listening on http://localhost:4401
Plugin server listening on http://localhost:4400
WebSocket server listening on port 4402Step 3: Load Plugin in Penpot
Open Penpot in your browser
Open or create a design file
Go to Plugins menu (or press the plugins icon)
Click Load plugin from URL
Enter:
http://localhost:4400/manifest.jsonThe plugin UI will appear - click "Connect to MCP server"
Status should change to "Connected to MCP server"
Important: Keep the plugin UI open while using MCP tools. Closing it disconnects the server.
Step 4: Configure Your MCP Client
VS Code with GitHub Copilot
Add to your VS Code settings.json:
{
"mcp": {
"servers": {
"penpot": {
"url": "http://localhost:4401/sse"
}
}
}
}Or use the HTTP endpoint:
{
"mcp": {
"servers": {
"penpot": {
"url": "http://localhost:4401/mcp"
}
}
}
}Claude Desktop
Claude Desktop requires the mcp-remote proxy (stdio-only transport):
Install the proxy:
npm install -g mcp-remoteEdit Claude Desktop config:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%/Claude/claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
Add the Penpot server:
{ "mcpServers": { "penpot": { "command": "npx", "args": ["-y", "mcp-remote", "http://localhost:4401/sse", "--allow-http"] } } }Fully quit Claude Desktop (File → Quit, not just close window) and restart
Claude Code (CLI)
claude mcp add penpot -t http http://localhost:4401/mcpTroubleshooting
Connection Issues
"Plugin cannot connect to MCP server"
Symptoms: Plugin shows "Not connected" even after clicking Connect
Solutions:
Verify servers are running:
# Check if ports are in use lsof -i :4401 # MCP server lsof -i :4402 # WebSocket lsof -i :4400 # Plugin serverRestart the servers:
# In the penpot-mcp directory npm run start:allCheck browser console (F12) for WebSocket errors
Browser Blocks Local Connection
Symptoms: Browser refuses to connect to localhost from Penpot
Cause: Chromium 142+ enforces Private Network Access (PNA) restrictions
Solutions:
Chrome/Chromium: When prompted, allow access to local network
Brave: Disable Shield for the Penpot website:
Click the Brave Shield icon in address bar
Toggle Shield off for this site
Try Firefox: Firefox doesn't enforce these restrictions as strictly
"WebSocket connection failed"
Solutions:
Check firewall settings - allow ports 4400, 4401, 4402
Disable VPN if active
Check for conflicting applications using the same ports
MCP Client Issues
Tools Not Appearing in VS Code/Claude
Verify endpoint:
# Test the SSE endpoint curl http://localhost:4401/sse # Test the MCP endpoint curl http://localhost:4401/mcpCheck configuration syntax - JSON must be valid
Restart the MCP client completely
Check MCP server logs:
# Logs are in mcp-server/logs/ tail -f mcp-server/logs/mcp-server.log
"Tool execution timed out"
Cause: Plugin disconnected or operation took too long
Solutions:
Ensure plugin UI is still open in Penpot
Verify plugin shows "Connected" status
Try reconnecting: click Disconnect then Connect in plugin
Plugin Issues
"Plugin failed to load"
Verify plugin server is running on port 4400
Try accessing
http://localhost:4400/manifest.jsondirectly in browserClear browser cache and reload Penpot
Remove and re-add the plugin
"Cannot find penpot object"
Cause: Plugin not properly initialized or design file not open
Solutions:
Make sure you have a design file open (not just the dashboard)
Wait a few seconds after opening file before connecting
Refresh Penpot and reload the plugin
Server Issues
Port Already in Use
# Find process using the port
lsof -i :4401
# Kill the process if needed
kill -9 <PID>Or configure different ports via environment variables:
PENPOT_MCP_SERVER_PORT=4501 npm run start:allServer Crashes on Startup
Check Node.js version (must be v22+)
Delete
node_modulesand reinstall:rm -rf node_modules npm install npm run bootstrap
Configuration Reference
Environment Variables
| Variable | Default | Description |
|---|---|---|
PENPOT_MCP_SERVER_PORT | 4401 | HTTP/SSE server port |
PENPOT_MCP_WEBSOCKET_PORT | 4402 | WebSocket server port |
PENPOT_MCP_SERVER_LISTEN_ADDRESS | localhost | Server bind address |
PENPOT_MCP_LOG_LEVEL | info | Log level (trace/debug/info/warn/error) |
PENPOT_MCP_LOG_DIR | logs | Log file directory |
PENPOT_MCP_REMOTE_MODE | false | Enable remote mode (disables file system access) |
Example: Custom Configuration
# Run on different ports with debug logging
PENPOT_MCP_SERVER_PORT=5000 \
PENPOT_MCP_WEBSOCKET_PORT=5001 \
PENPOT_MCP_LOG_LEVEL=debug \
npm run start:allVerifying the Setup
Run this checklist to confirm everything works:
Servers Running:
curl -s http://localhost:4401/sse | head -1 # Should return SSE stream headersPlugin Connected: Plugin UI shows "Connected to MCP server"
Tools Available: In your MCP client, verify these tools appear:
mcp__penpot__execute_codemcp__penpot__export_shapemcp__penpot__import_imagemcp__penpot__penpot_api_info
Test Execution: Ask your AI assistant to run a simple command:
"Use Penpot to get the current page name"
Getting Help
GitHub Issues: penpot/penpot-mcp/issues
GitHub Discussions: penpot/penpot-mcp/discussions
Penpot Community: community.penpot.app
Requirements and compatibility
Written for: GitHub Copilot
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an MCP server, Needs a command-line tool, Needs Node.js
Security
What our scanner noticed· Low risk
- Instructions that use the network
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- First committed by
Jcardif
- Publisher
- GitHub (Official)
- Distributed by
- GitHub
- Source
- github/awesome-copilot · skills/penpot-uiux-design · commit 797337f
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
- Contributors
- Jcardif
AutoGineer is not affiliated with or endorsed by Jcardif or GitHub.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download penpot-uiux-design.zip