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/component-patterns.md
UI Component Patterns Reference
Buttons
Button Types
| Type | Purpose | Visual Treatment |
|---|---|---|
| Primary | Main action on page | Solid fill, brand color |
| Secondary | Supporting actions | Outline or muted fill |
| Tertiary | Low-emphasis actions | Text-only, underline optional |
| Destructive | Delete/remove actions | Red color, confirmation required |
| Ghost | Minimal UI, icon buttons | Transparent, subtle hover |
Button States
Default → Resting state, clearly interactive
Hover → Cursor over (desktop): darken 10%, subtle shadow
Active → Being pressed: darken 20%, slight scale down
Focus → Keyboard selected: visible outline ring
Disabled → Not available: 50% opacity, cursor: not-allowed
Loading → Processing: spinner replaces or accompanies label
Button Specifications
Minimum size: 44×44px (touch target)
Padding: 12-16px horizontal, 8-12px vertical
Border radius: 4-8px (consistent across app)
Font weight: Medium or Semibold (600-700)
Text: Sentence case, 2-4 words max
Button Label Patterns
✓ Save Changes ✗ Submit
✓ Add to Cart ✗ Click Here
✓ Create Account ✗ OK
✓ Download PDF ✗ Go
✓ Start Free Trial ✗ Continue
Forms
Form Layout Guidelines
Single column preferred: Reduces cognitive load
Top-aligned labels: Fastest completion times
Logical grouping: Related fields together
Smart defaults: Pre-fill when possible
Input Field Anatomy
┌─ Label (required) ─────────────────────────┐
│ │
│ ┌────────────────────────────────────┐ │
│ │ Placeholder text... │ │
│ └────────────────────────────────────┘ │
│ Helper text or error message │
└────────────────────────────────────────────┘
Input States
| State | Border | Background | Additional |
|---|---|---|---|
| Default | Gray (#D1D5DB) | White | - |
| Focus | Primary color | White | Shadow/glow |
| Filled | Gray | White | Checkmark optional |
| Error | Red (#EF4444) | Light red tint | Error icon + message |
| Disabled | Light gray | Gray (#F3F4F6) | 50% opacity text |
Validation Timing
On blur: Validate when user leaves field
On change (after error): Clear error as user types correct input
On submit: Final validation before processing
Never on focus: Don't show errors before user types
Error Message Guidelines
✓ "Email address is required"
✓ "Password must be at least 8 characters"
✓ "Please enter a valid phone number (e.g., 555-123-4567)"
✗ "Invalid input"
✗ "Error"
✗ "This field is required" (generic)
Form Best Practices
Mark optional fields, not required (fewer asterisks)
Show password requirements before errors occur
Use input masks for formatted data (phone, date)
Preserve data on errors (don't clear the form)
Provide clear success confirmation
Navigation
Navigation Patterns
Top Navigation Bar
┌─────────────────────────────────────────────────────┐
│ Logo Nav Item Nav Item Nav Item [Search] [User] │
└─────────────────────────────────────────────────────┘
Best for: Marketing sites, simple apps
Max items: 5-7 top-level links
Mobile: Collapse to hamburger menu
Sidebar Navigation
┌────────┬────────────────────────────────┐
│ Logo │ Content Area │
├────────┤ │
│ Nav 1 │ │
│ Nav 2 │ │
│ Nav 3 │ │
│ │ │
│ ────── │ │
│ Nav 4 │ │
│ Nav 5 │ │
└────────┴────────────────────────────────┘
Best for: Dashboards, complex apps
Width: 200-280px expanded, 64px collapsed
Mobile: Overlay drawer
Bottom Navigation (Mobile)
┌─────────────────────────────────────┐
│ Content Area │
│ │
├─────────────────────────────────────┤
│ 🏠 🔍 ➕ 💬 👤 │
│ Home Search Add Chat Profile │
└─────────────────────────────────────┘
Max items: 3-5 destinations
Best for: Primary app sections
Always visible: Persistent navigation
Breadcrumbs
Home > Products > Electronics > Headphones
Use for: Deep hierarchies (3+ levels)
Current page: Not clickable, different style
Separator: > or / or chevron icon
Tab Navigation
┌─────────┬─────────┬─────────┬─────────┐
│ Tab 1 │ Tab 2 │ Tab 3 │ Tab 4 │
└─────────┴─────────┴─────────┴─────────┘
│ │
│ Tab Content Area │
│ │
└───────────────────────────────────────┘
Max tabs: 3-5 for clarity
Active indicator: Underline or background
Use for: Related content within same page
Cards
Card Anatomy
┌─────────────────────────────────┐
│ ░░░░░░░ Image/Media ░░░░░░░░░░ │
├─────────────────────────────────┤
│ Category Label │
│ Card Title │
│ Description text that may │
│ span multiple lines... │
│ │
│ [Action Button] [Secondary] │
└─────────────────────────────────┘
Card Guidelines
Consistent sizing: Use grid, equal heights
Content hierarchy: Image → Title → Description → Actions
Padding: 16-24px internal spacing
Border radius: 8-12px (matching buttons)
Shadow: Subtle elevation (0 2px 4px rgba(0,0,0,0.1))
Modals and Dialogs
Modal Structure
┌─────────────────────────────────────┐
│ Modal Title [×] │
├─────────────────────────────────────┤
│ │
│ Modal content goes here. │
│ Keep it focused on one task. │
│ │
├─────────────────────────────────────┤
│ [Cancel] [Confirm] │
└─────────────────────────────────────┘
Modal Guidelines
Size: 400-600px width (desktop), full-width minus margins (mobile)
Overlay: Semi-transparent dark background (rgba(0,0,0,0.5))
Close options: X button, overlay click, Escape key
Focus trap: Keep keyboard focus within modal
Primary action: Right-aligned, visually prominent
Dashboards
Dashboard Layout Principles
Most important metrics at top: KPIs, summary cards
Progressive detail: Overview → Drill-down capability
Consistent card sizes: Use grid system
Minimal chartjunk: Only data-serving visuals
Actionable insights: Highlight anomalies
Data Visualization Selection
| Data Type | Chart Type |
|---|---|
| Comparison across categories | Bar chart |
| Trend over time | Line chart |
| Part of whole | Pie (≤5 slices) or Donut |
| Distribution | Histogram |
| Correlation | Scatter plot |
| Geographic | Map |
| Single metric | Big number + sparkline |
Dashboard Best Practices
Limit to 5-9 widgets per view
Align to grid: Consistent gutters and sizing
Filter controls: Top or sidebar, always visible
Date range selector: Common need, make prominent
Export options: PDF, CSV for data tables
Responsive: Stack cards on smaller screens
Empty States
Empty State Components
┌─────────────────────────────────────┐
│ │
│ [Illustration/Icon] │
│ │
│ No projects yet │
│ │
│ Create your first project to │
│ start organizing your work. │
│ │
│ [Create Project] │
│ │
└─────────────────────────────────────┘
Empty State Guidelines
Friendly illustration: Not just "No data"
Explain value: Why create something?
Clear CTA: Primary action to fix empty state
Keep it brief: 1-2 sentences max
Loading States
Loading Patterns
| Duration | Pattern |
|---|---|
| <1 second | No indicator (feels instant) |
| 1-3 seconds | Spinner or progress indicator |
| 3-10 seconds | Skeleton screens + progress |
| >10 seconds | Progress bar + explanation |
Skeleton Screen
┌─────────────────────────────────────┐
│ ░░░░░░░░░░░░ ░░░░░░░░░░ │
├─────────────────────────────────────┤
│ ░░░░░░░░░░░░░░░░░░░░░░░░░ │
│ ░░░░░░░░░░░░░░░░░░░ │
│ ░░░░░░░░░░░░░░░░░░░░░░░ │
└─────────────────────────────────────┘
Match layout of loaded content
Use subtle animation (shimmer/pulse)
Show actual content structure
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