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://mp-staging.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/accessibility.md
Accessibility Guidelines Reference (WCAG)
Quick Compliance Checklist
Level AA Requirements (Minimum Standard)
[ ] Color contrast 4.5:1 for normal text
[ ] Color contrast 3:1 for large text (18px+ or 14px bold)
[ ] Touch targets minimum 44×44px
[ ] All functionality available via keyboard
[ ] Visible focus indicators
[ ] No content flashes more than 3 times/second
[ ] Page has descriptive title
[ ] Link purpose clear from text
[ ] Form inputs have labels
[ ] Error messages are descriptive
Color and Contrast
Contrast Ratios
| Element | Minimum Ratio | Enhanced (AAA) |
|---|---|---|
| Body text | 4.5:1 | 7:1 |
| Large text (18px+) | 3:1 | 4.5:1 |
| UI components | 3:1 | - |
| Graphical objects | 3:1 | - |
Color Independence
Never use color as the only means of conveying information:
✗ Error fields shown only in red
✓ Error fields with red border + error icon + text message
✗ Required fields marked only with red asterisk
✓ Required fields labeled "(required)" or with icon + tooltip
✗ Status shown only by color dots
✓ Status with color + icon + label text
Accessible Color Combinations
Safe text colors on backgrounds:
| Background | Text Color | Contrast |
|---|---|---|
| White (#FFFFFF) | Dark gray (#1F2937) | 15.5:1 ✓ |
| Light gray (#F3F4F6) | Dark gray (#374151) | 10.9:1 ✓ |
| Primary blue (#2563EB) | White (#FFFFFF) | 4.6:1 ✓ |
| Dark (#111827) | White (#FFFFFF) | 18.1:1 ✓ |
Colors to avoid for text:
Yellow on white (insufficient contrast)
Light gray on white
Orange on white (marginal at best)
Keyboard Navigation
Requirements
All interactive elements must be reachable via Tab key
Logical tab order following visual layout
No keyboard traps (user can always Tab away)
Focus visible at all times during keyboard navigation
Skip links to bypass repetitive navigation
Focus Indicators
/* Example focus styles */
:focus {
outline: 2px solid #2563EB;
outline-offset: 2px;
}
:focus:not(:focus-visible) {
outline: none; /* Hide for mouse users */
}
:focus-visible {
outline: 2px solid #2563EB;
outline-offset: 2px;
}
Keyboard Shortcuts
| Key | Expected Behavior |
|---|---|
| Tab | Move to next interactive element |
| Shift+Tab | Move to previous element |
| Enter | Activate button/link |
| Space | Activate button, toggle checkbox |
| Escape | Close modal/dropdown |
| Arrow keys | Navigate within components |
Screen Reader Support
Semantic HTML Elements
Use appropriate elements for their purpose:
| Purpose | Element | Not This |
|---|---|---|
| Navigation | <nav> | <div class="nav"> |
| Main content | <main> | <div id="main"> |
| Header | <header> | <div class="header"> |
| Footer | <footer> | <div class="footer"> |
| Button | <button> | <div onclick> |
| Link | <a href> | <span onclick> |
Heading Hierarchy
h1 - Page Title (one per page)
h2 - Major Section
h3 - Subsection
h4 - Sub-subsection
h3 - Another Subsection
h2 - Another Major Section
Never skip levels (h1 → h3 without h2)
Image Alt Text
Decorative: alt="" (empty, not omitted)
Informative: alt="Description of what image shows"
Functional: alt="Action the image performs"
Complex: alt="Brief description" + detailed description nearby
Alt text examples:
✓ alt="Bar chart showing sales growth from $10M to $15M in Q4"
✓ alt="Company logo"
✓ alt="" (for decorative background pattern)
✗ alt="image" or alt="photo"
✗ alt="img_12345.jpg"
✗ Missing alt attribute entirely
Touch and Pointer
Touch Target Sizes
| Platform | Minimum | Recommended |
|---|---|---|
| WCAG 2.1 | 44×44px | 48×48px |
| iOS (Apple) | 44×44pt | - |
| Android | 48×48dp | - |
Touch Target Spacing
Minimum 8px between adjacent targets
Prefer 16px+ for comfort
Larger targets for primary actions
Pointer Gestures
Complex gestures must have single-pointer alternatives
Drag operations need equivalent click actions
Avoid hover-only functionality on touch devices
Forms Accessibility
Labels
Every input must have an associated label:
<label for="email">Email Address</label>
<input type="email" id="email" name="email">
Required Fields
<!-- Announce to screen readers -->
<label for="name">
Name <span aria-label="required">*</span>
</label>
<input type="text" id="name" required aria-required="true">
Error Handling
<label for="email">Email</label>
<input type="email" id="email" aria-invalid="true" aria-describedby="email-error">
<span id="email-error" role="alert">
Please enter a valid email address
</span>
Form Instructions
Provide format hints before input
Show password requirements before errors
Group related fields with fieldset/legend
Dynamic Content
Live Regions
For content that updates dynamically:
aria-live="polite" - Announce when convenient
aria-live="assertive" - Announce immediately (interrupts)
role="alert" - Urgent messages (like assertive)
role="status" - Status updates (like polite)
Loading States
<button aria-busy="true" aria-live="polite">
<span class="spinner"></span>
Loading...
</button>
Modal Dialogs
Focus moves into modal when opened
Focus trapped within modal
Escape key closes modal
Focus returns to trigger element when closed
Testing Accessibility
Manual Testing Checklist
Keyboard only: Navigate entire page with Tab/Enter
Screen reader: Test with VoiceOver (Mac) or NVDA (Windows)
Zoom 200%: Content remains readable and usable
High contrast: Test with system high contrast mode
No mouse: Complete all tasks without pointing device
Automated Tools
axe DevTools (browser extension)
WAVE (WebAIM browser extension)
Lighthouse (Chrome DevTools)
Color contrast checkers (WebAIM, Contrast Ratio)
Common Issues to Check
[ ] Missing or empty alt text
[ ] Empty links or buttons
[ ] Missing form labels
[ ] Insufficient color contrast
[ ] Missing language attribute
[ ] Incorrect heading structure
[ ] Missing skip navigation link
[ ] Inaccessible custom widgets
ARIA Quick Reference
Roles
| Role | Purpose |
|---|---|
button | Clickable button |
link | Navigation link |
dialog | Modal dialog |
alert | Important message |
navigation | Navigation region |
main | Main content |
search | Search functionality |
tab/tablist/tabpanel | Tab interface |
Properties
| Property | Purpose |
|---|---|
aria-label | Accessible name |
aria-labelledby | Reference to labeling element |
aria-describedby | Reference to description |
aria-hidden | Hide from assistive tech |
aria-expanded | Expandable state |
aria-selected | Selection state |
aria-disabled | Disabled state |
aria-required | Required field |
aria-invalid | Invalid input |
Golden Rule
First rule of ARIA: Don't use ARIA if native HTML works.
✗ <div role="button" tabindex="0">Click</div>
✓ <button>Click</button>
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