| name | drawbot-designer |
| description | Create well-designed posters, layouts, and graphics using DrawBot with automatic enforcement of typography principles from Hochuli, Bringhurst, and Müller-Brockmann. Use when users request posters, layouts, graphics, editorial designs, or mention DrawBot, typography, grid systems, or programmatic design. |
| allowed-tools | Read, Write, Edit, Bash, Glob, Grep |
DrawBot Designer
Create professional posters, layouts, and graphics with automatic enforcement of design principles.
Quick Start
- Read design-vocabulary.md to translate user intent → design choices
- Use templates/ to start implementation
- Check examples.md for working patterns
- See reference.md for API details
Design Thinking (BEFORE Code)
Before touching templates, commit to a bold creative direction:
1. Purpose & Context
- What problem does this solve? (inform, persuade, celebrate, warn?)
- Who sees this? (executives, students, general public, insiders?)
- Where does it live? (wall, hand, screen, street?)
2. Aesthetic Direction
Pick an extreme. Mediocrity is the enemy. Choose from:
| Direction | Characteristics |
|---|
| Swiss Modernism | Grid worship, Helvetica, mathematical precision, asymmetry |
| Punk Zine | Photocopied texture, ransom-note type, deliberate chaos |
| Japanese Minimalism | Vast emptiness, one perfect element, asymmetric balance |
| Constructivist | Diagonal energy, red/black, bold geometry, propaganda feel |
| Psychedelic | Melting forms, vibrating colors, horror vacui |
| Corporate Brutalism | Oversized type, stark contrast, confrontational |
| Art Deco | Geometric ornament, gold accents, symmetry, luxury |
| Editorial/Magazine | Pull quotes, drop caps, sophisticated grid breaks |
| Bauhaus | Primary colors, geometric shapes, form follows function |
| Vernacular/Found | Hand-painted signs, imperfect type, authentic roughness |
| Tech Noir | Dark themes, neon accents, high contrast, terminal aesthetic |
| Organic/Natural | Flowing forms, earth tones, hand-drawn elements |
3. The Memorable Thing
Ask: "What's the ONE thing someone will remember 5 seconds after looking away?"
- A massive word?
- An unexpected color?
- A jarring juxtaposition?
- Perfect silence (whitespace)?
If you can't answer this, the design isn't ready.
4. Then Implement
Only after committing to direction → open design-vocabulary.md → map to technical choices → use the design system.
Workflow: Natural Language → Design
Step 0: Interpret Intent (BEFORE coding)
When user says something like "create a bold modern poster":
- Ask the design thinking questions above
- Open design-vocabulary.md
- Look up mood words: "bold" → high contrast, large title; "modern" → asymmetric, sans-serif
- Identify content type: poster → announcement pattern
- Commit to a memorable element
- Then implement using the design system
Example Translation
User says: "Make an elegant invitation for a gala"
Design thinking:
- Purpose: Celebrate, make guests feel special
- Audience: Wealthy donors, formal crowd
- Direction: Art Deco meets Japanese Minimalism
- Memorable thing: One word in gold, swimming in cream space
Technical mapping:
- "elegant" → symmetric grid, serif type, muted colors, balanced whitespace
- "invitation" → announcement pattern (WHAT → WHEN → WHERE)
Result:
- Grid: 12×8, centered
- Font: Didot or similar high-contrast serif
- Colors: Warm cream, charcoal, gold accent
- Structure: Event name (HUGE, gold) → Date → Venue → RSVP
- The memorable thing: "GALA" in 200pt gold, nothing else competing
When to Use This Skill
Activate when the user requests:
- Posters, layouts, graphics, or editorial designs
- Modifications to existing DrawBot code
- Typography or layout advice
- DrawBot script creation or debugging
Core Principles
This skill automatically enforces:
- Typography: Hochuli's Detail in Typography (microtypography)
- Layout: Müller-Brockmann grid systems (macrotypography)
- Hierarchy: CRAP principles (Contrast, Repetition, Alignment, Proximity)
Mandatory Workflow
CRITICAL: Always use the design system. Never write manual calculations.
Step 1: Setup
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent.parent / "lib"))
import drawBot as db
from drawbot_grid import Grid
from drawbot_design_system import (
POSTER_SCALE,
get_output_path,
draw_wrapped_text,
setup_poster_page
)
Step 2: Create Page and Grid
WIDTH, HEIGHT, MARGIN = setup_poster_page("letter", margin_ratio=1/10)
grid = Grid.from_margins(
(-MARGIN, -MARGIN, -MARGIN, -MARGIN),
column_subdivisions=12,
row_subdivisions=16
)
Step 3: Use Semantic Coordinates
header = (*grid[(0, 14)], *grid*(12, 2))
header = (MARGIN, HEIGHT - 200, WIDTH - MARGIN*2, 150)
Step 4: Wrap Text Properly
draw_wrapped_text(text, x, y, width, height, font, size)
wrapped = textwrap.wrap(text, width=70)
Step 5: Save with Portable Paths
db.saveImage(str(get_output_path("output.pdf")))
db.saveImage("/Users/you/...")
Resources
This Skill Directory
- examples.md - Working code examples
- reference.md - Complete API reference
- filters.md - Image effects, textures, blend modes
- templates/ - Starting templates:
minimal_poster.py - Simple poster
two_column.py - Magazine layout
card_layout.py - Color-coded cards
Project Files
- Complete examples:
../../examples/
minimal_poster_example.py - 80-line working poster
longitudinalbench_poster_v7.py - 352-line production poster
- Documentation:
../../docs/
design-system-usage.md - Complete usage guide
layout-design-principles.md - Grid theory, CRAP, decision matrices
typography-style-guide.md - Hochuli's spacing, line length, readability
print-production-checklist.md - Bleed, CMYK, export settings
- Assets:
../../assets/ - 1,807 textures
Typography Scales
| Context | Scale | Base | Ratio | When to Use |
|---|
| Poster | POSTER_SCALE | 18pt | 1.5 | Posters, displays |
| Magazine | MAGAZINE_SCALE | 11pt | 1.25 | Magazines, newsletters |
| Book | BOOK_SCALE | 11pt | 1.2 | Books, long-form |
| Report | REPORT_SCALE | 12pt | 1.25 | Reports, docs |
Access sizes:
scale = POSTER_SCALE
scale.caption
scale.body
scale.h3
scale.h2
scale.h1
scale.title
Color Palette Generation
Generate harmonious color palettes from a single base color:
from drawbot_design_system import (
generate_color_palette,
hex_to_rgb,
check_contrast_ratio,
get_accessible_text_color
)
base = hex_to_rgb("#2E86AB")
palette = generate_color_palette(base, harmony="complementary")
ratio, level = check_contrast_ratio(palette['text'], palette['background'])
print(f"Contrast: {ratio:.1f}:1 ({level})")
text_color = get_accessible_text_color(palette['accent'])
OpenType Features
Enable professional typography features:
from drawbot_design_system import (
set_opentype_features,
get_available_opentype_features
)
import drawBot as db
db.font("Adobe Garamond Pro")
features = get_available_opentype_features()
print(features)
set_opentype_features(['smcp', 'onum'])
db.text("The Quick Brown Fox 1234", (x, y))
Variable Fonts
Control variable font axes dynamically:
from drawbot_design_system import (
set_font_variation,
get_font_variation_axes
)
import drawBot as db
db.font("Skia")
axes = get_font_variation_axes()
print(axes)
set_font_variation(wght=600, wdth=85)
db.text("Variable Font Text", (x, y))
Print Production
Set up print-ready documents with bleed:
from drawbot_design_system import (
setup_print_page,
validate_print_ready,
PRINT_PRESETS
)
import drawBot as db
specs = setup_print_page("letter", include_bleed=True)
db.fill(0.2, 0.4, 0.8)
db.rect(0, 0, specs['canvas_width'], specs['canvas_height'])
content_x = specs['trim_x'] + specs['safe_margin']
content_y = specs['trim_y'] + specs['safe_margin']
db.cmykFill(0.6, 0.4, 0.4, 1.0)
is_valid, warnings = validate_print_ready()
for w in warnings:
print(w)
Grid Patterns
Full Width Section
header = (*grid[(0, 14)], *grid*(12, 2))
Two Columns
left = (*grid[(0, 1)], *grid*(5, 13))
right = (*grid[(7, 1)], *grid*(5, 13))
Stacked Sections
section1 = (*grid[(0, 10)], *grid*(12, 3))
section2 = (*grid[(0, 6)], *grid*(12, 3))
section3 = (*grid[(0, 2)], *grid*(12, 3))
Decision Matrix
| Content | Grid | Typography | Line Length |
|---|
| Poster | 12×16 | POSTER_SCALE | 20-30 CPL |
| Magazine | 12×8 | MAGAZINE_SCALE | 45-50 CPL |
| Book | 6×8 | BOOK_SCALE | 60-65 CPL |
| Report | 12×8 | REPORT_SCALE | 50-60 CPL |
Verification Checklist
Before finalizing code, verify:
Error Prevention
Never Do This (Technical)
❌ Hardcode page size in grid
❌ Use character counts for wrapping
❌ Approximate line height with fontSize
❌ Manual calculations instead of grid
❌ Truncate text with [:N]
❌ Hardcode absolute paths
Always Do This (Technical)
✅ Let grid read canvas size
✅ Use point-based wrapping
✅ Use real font metrics
✅ Use semantic grid coordinates
✅ Draw all text that fits
✅ Use portable path helpers
Avoid "AI Slop" Aesthetics
CRITICAL: These patterns make work look machine-generated. Avoid them:
Typography Anti-Patterns
❌ Helvetica Neue for everything — It's fine, but predictable. Try Akzidenz-Grotesk, Univers, or something unexpected.
❌ Safe font pairings (Montserrat + Open Sans) — Too common. Be bolder.
❌ Centered everything — Easy but lazy. Asymmetry creates energy.
❌ Even text sizes (24pt, 18pt, 14pt) — Use the scale ratios; they create proper tension.
❌ Justified text in narrow columns — Creates rivers of whitespace.
Color Anti-Patterns
❌ Blue gradient on white — The default "tech startup" look.
❌ Purple/pink gradients — Overused in AI-generated content.
❌ Gray text on white (#666 on #fff) — Low contrast, looks washed out.
❌ Rainbow gradients — Almost never appropriate.
❌ Equal color distribution — Use 70-20-10, not 33-33-33.
Layout Anti-Patterns
❌ Perfect symmetry everywhere — Real design has controlled asymmetry.
❌ Everything centered vertically AND horizontally — Creates static, lifeless compositions.
❌ Uniform margins — Vary them intentionally; tension creates interest.
❌ Clip art shapes (perfect circles, rounded rectangles) — Too geometric, too safe.
❌ Stock photo compositions — If it looks like a template, it is.
The "AI Look" Checklist
If your design has 3+ of these, reconsider:
The Antidote
Make ONE bold choice that a template wouldn't:
- Extremely large type (bigger than feels comfortable)
- Extremely small type (challenges the reader)
- Unexpected color (not blue, not purple)
- Deliberate asymmetry
- Texture or grain
- One element that breaks the grid
Common Tasks
Create a Poster
- Copy
templates/minimal_poster.py to ../../examples/ or your working directory
- If copying to
examples/, update the import path to use .parent.parent instead of .parent.parent.parent.parent.parent
- Update title, subtitle, body text
- Change filename in
get_output_path()
- Run:
uv run python your_file.py
Two-Column Layout
- Copy
templates/two_column.py to ../../examples/
- Update the import path if needed (see Create a Poster above)
- Update column content
- Adjust grid if needed (more/fewer rows)
Color-Coded Cards
- Copy
templates/card_layout.py to ../../examples/
- Update the import path if needed (see Create a Poster above)
- Modify card titles and descriptions
- Change colors if desired
Debug Layout Issues
- Add
grid.draw(show_index=True) before saveImage()
- View PDF to see grid structure
- Verify grid coordinates
- Remove
grid.draw() for final output
Troubleshooting
| Problem | Cause | Fix |
|---|
| Text overflows | Character-count wrapping | Use draw_wrapped_text() |
| Grid doesn't match | Created before newPage() | Create page FIRST |
| Wrong sizes | Wrong scale for context | Use POSTER_SCALE for posters |
| Paths don't work | Hardcoded paths | Use get_output_path() |
See reference.md for detailed troubleshooting.
Example Session
User: "Create a poster for an AI conference"
Response:
- Copy
templates/minimal_poster.py
- Modify content:
- Title: "AI Conference 2025"
- Subtitle: "Advancing Machine Learning"
- Body: Conference details
- Save as
ai_conference.py
- Run:
uv run python examples/ai_conference.py
Result: Professional poster following all design principles automatically.
Progressive Disclosure
Start with templates, refer to examples and reference as needed:
- Start:
templates/minimal_poster.py
- Learn:
examples.md for patterns
- Reference:
reference.md for API details
- Effects:
filters.md for images/textures (when needed)
- Deep dive:
../../docs/ for theory
Claude loads resources progressively as needed (saves context).
Force Variation
No two designs should look the same. Before finalizing, ask:
Variation Prompts
- "What if the title was 3x larger?"
- "What if I used only one color?"
- "What if text was at the bottom instead?"
- "What if margins were twice as wide?"
- "What if I removed everything except the essential?"
- "What if this was for the opposite audience?"
Rotation Mandates
Cycle through these to avoid convergence:
Fonts (never default to the same one):
- This project: Serif
- Next project: Geometric sans
- Next: Humanist sans
- Next: Slab serif
- Next: Display/decorative
Color temperature:
- This project: Warm palette
- Next: Cool palette
- Next: Neutral with warm accent
- Next: Monochrome
Layout energy:
- This project: Asymmetric, dynamic
- Next: Symmetric, calm
- Next: Vertical emphasis
- Next: Horizontal bands
The Creative Mandate
DrawBot is capable of extraordinary creative work.
The design system handles the rules—grids, scales, metrics. That's the foundation.
But foundations are invisible. What people see is the vision on top.
Don't settle for "correct." Aim for unforgettable.
The difference between good and great:
- Good: Follows the grid, uses the scale, wraps text properly
- Great: Does all that AND has one moment of genuine surprise
Every poster should have that moment. Find it before you write code.
Trust the system. Then transcend it.
Remember
The design system makes it impossible to violate design principles. That's the floor, not the ceiling.
Hochuli gives you the rules. Müller-Brockmann gives you the grid. You give it soul.
Version History
- v1.2.0 (2025-12-31): Added design thinking, aesthetic directions, anti-patterns, variation mandates
- v1.1.0 (2025-12-31): Added color harmony, OpenType/variable fonts, print production
- v1.0.0 (2025-10-18): Initial Agent Skill with curated content