brainstorming
Structured design dialogue that validates ideas before implementation begins.
branded-document-suite
Unified document generation system producing professionally styled PDF, DOCX, PPTX, and XLSX files with consistent branding through a single configuration.
Full skill instructions
A unified document generation system producing professionally styled PDF, DOCX, PPTX, and XLSX files with consistent branding, configurable through a single brand configuration file.
Problem Space:
Solution Approach:
Always establish brand configuration first. This drives all document styling.
# brand-config.yaml
brand:
name: "Company Name"
tagline: "Your tagline here"
colors:
primary: "#3AA7F9"
primary_dark: "#2A7BC4"
primary_light: "#E8F4FD"
secondary: "#211644"
accent: "#F59E0B"
# Semantic colors
success: "#22C55E"
warning: "#F59E0B"
danger: "#EF4444"
info: "#0EA5E9"
# Text hierarchy
text_primary: "#0F172A"
text_secondary: "#334155"
text_muted: "#94A3B8"
# Surfaces
surface_primary: "#FFFFFF"
surface_secondary: "#F8FAFC"
surface_tertiary: "#F1F5F9"
border: "#E2E8F0"
typography:
display:
family: "Montserrat"
weights: [600, 700]
fallback: "Arial, sans-serif"
body:
family: "Inter"
weights: [400, 500, 600]
fallback: "system-ui, sans-serif"
mono:
family: "JetBrains Mono"
weights: [400, 500]
fallback: "monospace"
# Type scale (px)
scale:
h1: 32
h2: 24
h3: 20
h4: 16
body: 14
small: 12
caption: 10
spacing:
base: 4 # px
scale: [0, 4, 8, 12, 16, 24, 32, 48, 64]
assets:
logo_primary: "./assets/logo-primary.svg"
logo_icon: "./assets/logo-icon.svg"
logo_white: "./assets/logo-white.svg"
from reportlab.lib.pagesizes import letter
from reportlab.lib.units import inch
from reportlab.lib.colors import HexColor
from reportlab.lib.styles import ParagraphStyle
from reportlab.platypus import SimpleDocTemplate, Paragraph, Table, Spacer, Image
import yaml
class BrandedPDFGenerator:
def __init__(self, config_path: str):
with open(config_path) as f:
self.config = yaml.safe_load(f)
self.styles = self._build_styles()
def _build_styles(self) -> dict:
c = self.config['colors']
t = self.config['typography']
return {
'Title': ParagraphStyle(
'Title',
fontName='Helvetica-Bold',
fontSize=t['scale']['h1'],
textColor=HexColor(c['text_primary']),
spaceAfter=24
),
'Heading1': ParagraphStyle(
'Heading1',
fontName='Helvetica-Bold',
fontSize=t['scale']['h2'],
textColor=HexColor(c['primary_dark']),
spaceBefore=20,
spaceAfter=12
),
'Body': ParagraphStyle(
'Body',
fontName='Helvetica',
fontSize=t['scale']['body'],
textColor=HexColor(c['text_secondary']),
spaceAfter=8
)
}
def create_report(self, title: str, sections: list, output_path: str):
doc = SimpleDocTemplate(output_path, pagesize=letter)
story = []
# Title
story.append(Paragraph(title, self.styles['Title']))
# Sections
for section in sections:
story.append(Paragraph(section['title'], self.styles['Heading1']))
for para in section.get('content', []):
story.append(Paragraph(para, self.styles['Body']))
if 'table' in section:
story.append(self._create_branded_table(section['table']))
doc.build(story)
return output_path
from docx import Document
from docx.shared import Inches, Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
class BrandedDocxGenerator:
def __init__(self, config_path: str):
with open(config_path) as f:
self.config = yaml.safe_load(f)
def create_document(self, title: str, sections: list, output_path: str):
doc = Document()
# Title
title_para = doc.add_heading(title, level=0)
self._apply_brand_style(title_para)
# Sections
for section in sections:
heading = doc.add_heading(section['title'], level=1)
for para in section.get('content', []):
doc.add_paragraph(para)
doc.save(output_path)
return output_path
def _apply_brand_style(self, paragraph):
c = self.config['colors']
for run in paragraph.runs:
run.font.color.rgb = RGBColor.from_string(c['primary_dark'][1:])
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor as PPTXColor
class BrandedPptxGenerator:
def __init__(self, config_path: str):
with open(config_path) as f:
self.config = yaml.safe_load(f)
def create_presentation(self, title: str, subtitle: str, slides: list, output_path: str):
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
# Title slide
self._add_title_slide(prs, title, subtitle)
# Content slides
for slide_data in slides:
self._add_content_slide(prs, slide_data)
prs.save(output_path)
return output_path
def _add_title_slide(self, prs, title, subtitle):
layout = prs.slide_layouts[6] # Blank
slide = prs.slides.add_slide(layout)
# Background
c = self.config['colors']
slide.background.fill.solid()
slide.background.fill.fore_color.rgb = PPTXColor.from_string(c['secondary'][1:])
# Title text
title_box = slide.shapes.add_textbox(Inches(0.5), Inches(2.5), Inches(12), Inches(1.5))
title_frame = title_box.text_frame
title_para = title_frame.paragraphs[0]
title_para.text = title
title_para.font.size = Pt(44)
title_para.font.bold = True
title_para.font.color.rgb = PPTXColor(255, 255, 255)
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
class BrandedXlsxGenerator:
def __init__(self, config_path: str):
with open(config_path) as f:
self.config = yaml.safe_load(f)
def create_spreadsheet(self, title: str, sheets: list, output_path: str):
wb = Workbook()
wb.remove(wb.active) # Remove default sheet
for sheet_data in sheets:
ws = wb.create_sheet(title=sheet_data['name'])
self._populate_sheet(ws, sheet_data)
wb.save(output_path)
return output_path
def _populate_sheet(self, ws, sheet_data):
c = self.config['colors']
# Header style
header_fill = PatternFill(start_color=c['primary'][1:], end_color=c['primary'][1:], fill_type='solid')
header_font = Font(bold=True, color='FFFFFF')
# Write headers
for col, header in enumerate(sheet_data['headers'], 1):
cell = ws.cell(row=1, column=col, value=header)
cell.fill = header_fill
cell.font = header_font
# Write data
for row_idx, row_data in enumerate(sheet_data['data'], 2):
for col_idx, value in enumerate(row_data, 1):
cell = ws.cell(row=row_idx, column=col_idx, value=value)
if row_idx % 2 == 0:
cell.fill = PatternFill(start_color=c['surface_secondary'][1:],
end_color=c['surface_secondary'][1:],
fill_type='solid')
| Document Type | Best For | Key Features |
|---|---|---|
| Final deliverables, print | Pixel-perfect, portable | |
| DOCX | Editable documents | Collaboration-friendly |
| PPTX | Presentations | Visual storytelling |
| XLSX | Data analysis | Calculations, filtering |
Format Selection Logic:
report:
title: "Quarterly Analysis Report"
subtitle: "Q4 2025"
author: "Analytics Team"
date: "2025-01-11"
sections:
- title: "Executive Summary"
content:
- "Key findings paragraph 1"
- "Key findings paragraph 2"
- title: "Analysis"
content:
- "Detailed analysis text"
table:
headers: ["Metric", "Q3", "Q4", "Change"]
rows:
- ["Revenue", "$1.2M", "$1.5M", "+25%"]
- ["Users", "10,000", "15,000", "+50%"]
- title: "Recommendations"
content:
- "Recommendation 1"
- "Recommendation 2"
presentation:
title: "Project Overview"
subtitle: "January 2026"
author: "Team Lead"
slides:
- title: "Agenda"
bullets:
- "Current State"
- "Proposed Changes"
- "Timeline"
- "Q&A"
- title: "Current State"
bullets:
- "Point 1"
- "Point 2"
chart:
type: "bar"
data:
categories: ["Jan", "Feb", "Mar"]
series:
- name: "2024"
values: [100, 120, 140]
- name: "2025"
values: [150, 180, 200]
Input: "Create a quarterly sales report PDF with our brand styling"
Output:
# Using the BrandedPDFGenerator
config = "brand-config.yaml"
generator = BrandedPDFGenerator(config)
sections = [
{
"title": "Q4 Sales Summary",
"content": [
"Total revenue increased by 25% compared to Q3.",
"New customer acquisition exceeded targets by 15%."
],
"table": {
"headers": ["Region", "Q3 Revenue", "Q4 Revenue", "Growth"],
"rows": [
["North", "$500K", "$650K", "+30%"],
["South", "$400K", "$480K", "+20%"],
["East", "$300K", "$370K", "+23%"]
]
}
}
]
generator.create_report(
title="Q4 2025 Sales Report",
sections=sections,
output_path="Q4_Sales_Report.pdf"
)
Input: "Make a project kickoff presentation with 5 slides"
Output: PPTX file with branded title slide, agenda, problem statement, solution overview, and next steps slides, all following brand color palette and typography.
Before completing document generation:
brand-asset-generator - Generate logos and visual assetstechnical-documentation-generator - HTML documentationStructured design dialogue that validates ideas before implementation begins.
Comprehensive design intelligence for web and mobile UI/UX across 10 technology stacks.
Comprehensive implementation plans for multi-step tasks, breaking down specs into bite-sized, testable steps.
Introduction to the obra skills system with mandatory skill invocation rules and best practices.
Execute a written implementation plan with critical review and task checkpoints.
Delegate independent tasks to specialized agents working concurrently with isolated context.
Isolated git worktrees with smart directory selection and safety verification.
Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.
Plan searchable and shareable content that drives traffic, builds authority, and generates leads.
README-first repository scanner that extracts commands and classifies reproduction candidates without executing them.
Brainstorm and prioritize marketing strategies tailored to your SaaS stage, budget, and goals.
Plan and optimize your website's page hierarchy, navigation, URL structure, and internal linking.
The world's fastest calendar for remote work
Capture, organize, and utilize your knowledge effortlessly.
Instant Summaries of Audio & Video Interviews with AnySummary
Transform PDFs into engaging mind maps.
Chat with any PDF instantly
Create an optimal daily plan using your voice
A productivity platform to centralize organizational knowledge and workflows with contextual AI assistance.
AskYourPDF Pricing Plans: Tailored to Your Needs