Agent skill
proposal-ui-mockup
Install this agent skill to your Project
npx add-skill https://github.com/ChinchillaEnterprises/ChillSkills/tree/main/proposal-ui-mockup
SKILL.md
Proposal UI Mockup Skill
Generate quick UI mockups for Upwork proposals using ClaudeCanvas. This runs automatically when jobs move to #upwork-pipeline, alongside the architecture diagram.
No Blender required. Uses HTML/CSS mockups with Puppeteer screenshots.
When to Invoke
This skill runs as part of the proposal workflow:
- Job identified in #upwork-jobs
- Draft proposal written
- Architecture diagram generated (existing)
- UI mockup generated (this skill)
- Both visuals + proposal sent to #upwork-pipeline
Core Approach
1. Analyze the Job
Before generating, determine:
- Product type: Dashboard, calculator, form, widget, chat interface, admin panel, etc.
- Industry: Healthcare, real estate, finance, e-commerce, etc.
- Primary user: End customer, admin, internal team
- Key features: What does the UI need to show?
2. Reference ChatGPT History
Search for similar past projects:
grep -i "[project type]" /Users/tori/Documents/Repos/CHI/chatgpt-upwork-history.txt | head -50
Extract:
- Successful proposal language
- UI patterns that won similar jobs
- Pricing context
3. Select Template Type
| Job Type | Template | Key Elements |
|---|---|---|
| Data dashboard | Dashboard | Sidebar nav, metric cards, charts, tables |
| Pricing/Quote tool | Calculator | Input form, live preview, result summary |
| AI chatbot/agent | Chat Interface | Message thread, input bar, status indicators |
| Admin panel | Admin Dashboard | User table, filters, actions, stats |
| Form/Wizard | Multi-step Form | Progress bar, form sections, validation |
| API/Backend | API Console | Endpoint list, request builder, response viewer |
| E-commerce | Product Interface | Product display, cart, checkout flow |
Chinchilla AI Brand Template
Colors (ALWAYS USE)
:root {
--navy: #1B2D4F;
--navy-light: #2A4170;
--cream: #FDF8F3;
--cream-dark: #F5EDE4;
--warm: #E8DED3;
--warm-dark: #D4C8BB;
--terracotta: #C4785A;
--terracotta-light: #D4927A;
--sage: #7A9484;
--sage-light: #9BB5A5;
--text: #2C2C2C;
--text-light: #6B6B6B;
}
Typography
- Font: Plus Jakarta Sans
- Import:
https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap
Design Tokens
- Border radius: 8px (small), 12px (medium), 16px (large), 20px (cards)
- Shadows:
0 4px 24px rgba(27, 45, 79, 0.08) - Transitions:
all 0.3s ease
Template: Dashboard
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>[Project Name] Dashboard</title>
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<style>
:root {
--navy: #1B2D4F;
--navy-light: #2A4170;
--cream: #FDF8F3;
--cream-dark: #F5EDE4;
--warm: #E8DED3;
--warm-dark: #D4C8BB;
--terracotta: #C4785A;
--terracotta-light: #D4927A;
--sage: #7A9484;
--text: #2C2C2C;
--text-light: #6B6B6B;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'Plus Jakarta Sans', sans-serif;
background: var(--cream);
color: var(--text);
min-height: 100vh;
display: flex;
}
/* Sidebar */
.sidebar {
width: 260px;
background: var(--navy);
padding: 30px 20px;
display: flex;
flex-direction: column;
}
.logo {
color: var(--cream);
font-size: 20px;
font-weight: 800;
margin-bottom: 40px;
}
.logo span { color: var(--terracotta); }
.nav-item {
padding: 14px 16px;
color: rgba(253, 248, 243, 0.7);
font-size: 14px;
font-weight: 500;
border-radius: 10px;
margin-bottom: 4px;
cursor: pointer;
transition: all 0.2s ease;
}
.nav-item:hover { background: rgba(255,255,255,0.1); color: var(--cream); }
.nav-item.active { background: var(--terracotta); color: var(--cream); }
/* Main content */
.main {
flex: 1;
padding: 30px 40px;
overflow-y: auto;
}
.header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 30px;
}
.header h1 {
font-size: 28px;
font-weight: 700;
color: var(--navy);
}
/* Metric cards */
.metrics {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 20px;
margin-bottom: 30px;
}
.metric-card {
background: white;
border-radius: 16px;
padding: 24px;
box-shadow: 0 2px 12px rgba(27, 45, 79, 0.06);
}
.metric-label {
font-size: 13px;
color: var(--text-light);
margin-bottom: 8px;
}
.metric-value {
font-size: 32px;
font-weight: 700;
color: var(--navy);
}
.metric-change {
font-size: 13px;
color: var(--sage);
margin-top: 8px;
}
/* Content grid */
.content-grid {
display: grid;
grid-template-columns: 2fr 1fr;
gap: 24px;
}
.card {
background: white;
border-radius: 16px;
padding: 24px;
box-shadow: 0 2px 12px rgba(27, 45, 79, 0.06);
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
}
.card-title {
font-size: 16px;
font-weight: 700;
color: var(--navy);
}
/* Table */
table { width: 100%; border-collapse: collapse; }
th, td {
text-align: left;
padding: 14px 12px;
font-size: 14px;
}
th {
color: var(--text-light);
font-weight: 600;
border-bottom: 1px solid var(--warm);
}
td { border-bottom: 1px solid var(--cream-dark); }
.status {
padding: 6px 12px;
border-radius: 20px;
font-size: 12px;
font-weight: 600;
}
.status.active { background: rgba(122, 148, 132, 0.15); color: var(--sage); }
.status.pending { background: rgba(196, 120, 90, 0.15); color: var(--terracotta); }
/* Branding footer */
.branding {
position: fixed;
bottom: 20px;
right: 30px;
font-size: 11px;
color: var(--text-light);
}
.branding strong { color: var(--terracotta); }
</style>
</head>
<body>
<aside class="sidebar">
<div class="logo">[Client<span>App</span>]</div>
<div class="nav-item active">Dashboard</div>
<div class="nav-item">Analytics</div>
<div class="nav-item">Reports</div>
<div class="nav-item">Settings</div>
</aside>
<main class="main">
<div class="header">
<h1>Dashboard</h1>
</div>
<div class="metrics">
<div class="metric-card">
<div class="metric-label">Total Users</div>
<div class="metric-value">12,847</div>
<div class="metric-change">↑ 12% from last month</div>
</div>
<div class="metric-card">
<div class="metric-label">Revenue</div>
<div class="metric-value">$48.2K</div>
<div class="metric-change">↑ 8% from last month</div>
</div>
<div class="metric-card">
<div class="metric-label">Active Sessions</div>
<div class="metric-value">1,429</div>
<div class="metric-change">Live now</div>
</div>
<div class="metric-card">
<div class="metric-label">Conversion</div>
<div class="metric-value">3.2%</div>
<div class="metric-change">↑ 0.4% from last month</div>
</div>
</div>
<div class="content-grid">
<div class="card">
<div class="card-header">
<span class="card-title">Recent Activity</span>
</div>
<table>
<thead>
<tr>
<th>User</th>
<th>Action</th>
<th>Status</th>
<th>Time</th>
</tr>
</thead>
<tbody>
<tr>
<td>John Smith</td>
<td>Completed onboarding</td>
<td><span class="status active">Active</span></td>
<td>2 min ago</td>
</tr>
<tr>
<td>Sarah Johnson</td>
<td>Submitted form</td>
<td><span class="status pending">Pending</span></td>
<td>15 min ago</td>
</tr>
<tr>
<td>Mike Davis</td>
<td>Upgraded plan</td>
<td><span class="status active">Active</span></td>
<td>1 hour ago</td>
</tr>
</tbody>
</table>
</div>
<div class="card">
<div class="card-header">
<span class="card-title">Quick Stats</span>
</div>
<!-- Additional content -->
</div>
</div>
</main>
<div class="branding">Concept by <strong>Chinchilla AI</strong></div>
</body>
</html>
Template: Calculator/Pricing Widget
<!-- Similar structure with:
- Two-column layout: inputs left, summary right
- Form inputs with labels
- Live calculation display
- CTA button
- Embedded in mock client website context
-->
Template: Chat/AI Interface
<!-- Similar structure with:
- Message thread area
- AI vs User message styling
- Input bar with send button
- Status indicators
- Typing animation
-->
Generation Workflow
Step 1: Create HTML
Based on job analysis, use appropriate template and customize:
- Replace
[Client App]with project-relevant name - Adjust metrics/data to match industry
- Customize navigation items
- Update table content to reflect use case
Step 2: Screenshot with Puppeteer
cd /Users/tori/Documents/Repos/CHI/automations
node -e "
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
executablePath: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
headless: 'new',
args: ['--no-sandbox']
});
const page = await browser.newPage();
await page.setViewport({ width: 1440, height: 900, deviceScaleFactor: 2 });
await page.goto('file:///Users/tori/Documents/Repos/CHI/automations/output/[MOCKUP].html');
await page.waitForTimeout(500);
await page.screenshot({ path: 'output/[MOCKUP].png' });
await browser.close();
console.log('Screenshot saved');
})();
"
Step 3: Upload to Slack
cd /Users/tori/Documents/Repos/CHI/automations/scripts
node slack-upload.js ../output/[MOCKUP].png C09BDVBD1EY --title "[Project] UI Mockup" --comment "Frontend concept showing what the finished product could look like"
Channel IDs:
- #upwork-pipeline: C09BDVBD1EY
- #upwork-jobs: C09BNP18741
- #general: C072D98C41X
Output Location
All outputs: /Users/tori/Documents/Repos/CHI/automations/output/
Naming convention:
Proposal-[JobTitle]-UI.html- Mockup sourceProposal-[JobTitle]-UI.png- Screenshot for SlackProposal-[JobTitle]-Architecture.png- Backend diagram (existing workflow)
Integration with Proposal Workflow
When drafting a proposal for #upwork-pipeline:
- Analyze job - Determine product type, industry, key features
- Search ChatGPT history - Find similar past proposals
- Generate architecture diagram - (existing workflow)
- Generate UI mockup - (this skill)
- Upload both to Slack - Architecture + UI mockup
- Post proposal text - Draft application
The UI mockup shows clients: "We understand what you're building, and here's what it could look like."
Quality Checklist
Before uploading mockup:
- Uses Chinchilla AI brand colors (cream, navy, terracotta, sage)
- Plus Jakarta Sans font loaded
- Relevant to the actual job (not generic)
- Data/content reflects the industry
- "Concept by Chinchilla AI" branding present
- Clean, professional, not cluttered
- Screenshot is sharp (2x deviceScaleFactor)
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
Red Team
Use this skill when the user says "red team", "stress test", "attack this", "critique this", "run the models against this", "test this plan", "refine this with AI", or wants to use external AI models to critique, validate, or improve a document, pitch, plan, or idea. Also use when the user wants to save Claude Code usage by offloading analysis to other models.
Upwork Scanner
This skill should be used when the user asks to "scan upwork", "find upwork jobs", "check upwork", "run the scanner", "look for jobs", or mentions finding freelance projects for Chinchilla AI.
Polymarket Arb Scanner
This skill should be used when the user asks to "scan polymarket", "find arb opportunities", "check polymarket arbs", "run arb scanner", "polymarket arbitrage", or mentions detecting price inefficiencies on Polymarket.
captain-update
Polymarket Copy Trader
This skill should be used when the user asks to "copy trade", "telegram bot polymarket", "follow traders", "copy polymarket", or mentions building a copy trading bot for Polymarket.
Architecture Diagram
This skill should be used when the user asks to "generate a diagram", "create an architecture diagram", "make a diagram", "draw a system diagram", or needs a branded Chinchilla AI technical diagram for proposals or documentation.
Didn't find tool you were looking for?