Multi-Brand Export System
Implemented a comprehensive multi-brand export system that allows managing and exporting memos for multiple VC firm clients from a single installation.
Changelog - 2025-11-18_02
Multi-Brand Export System
Date: November 18, 2025 Type: Feature Impact: Major - enables multi-client support
Summary
Implemented a comprehensive multi-brand export system that allows managing and exporting memos for multiple VC firm clients from a single installation. Users can now customize company branding (name, tagline, colors, fonts) via simple YAML configuration files without touching any code.
Motivation
The original export system had Hypernova branding hardcoded throughout the codebase. To make this tool useful for:
Consultants managing multiple VC firm clients
Other VC firms wanting to use the tool with their own branding
Hypernova managing white-label exports for portfolio companies
We needed a way to easily switch between different brand configurations without code changes.
What Changed
New Features
Brand Configuration System (
src/branding.py)New module for loading and validating brand configurations
Support for
brand-<name>-config.yamlnaming conventionAutomatic validation of hex colors, font paths, and required fields
Graceful fallback to Hypernova defaults if no config specified
Helpful error messages for common configuration mistakes
Multi-Brand Export Support (
export-branded.py)New
--brand <name>command-line parameterDynamic CSS generation with brand colors injected at runtime
Customizable company information (name, tagline, confidential footer)
Support for both custom fonts (WOFF2) and system fonts
Brand configuration warnings displayed on export
Example Brand Configurations
brand-hypernova-config.yaml- Official Hypernova Capital brandingbrand-accel-config.yaml- Example Accel Partners brandingbrand-config.example.yaml- Template for creating new brands
Comprehensive Documentation
New guide:
docs/CUSTOM-BRANDING.md(200+ lines)Quick start instructions
Complete configuration reference
Color scheme examples and recommendations
Troubleshooting guide for common issues
Best practices for multi-brand management
Configuration Schema
Brand configuration files support:
company:
name: "VC Firm Name"
tagline: "Firm tagline or mission"
confidential_footer: "Legal disclaimer with {company_name} placeholder"
colors:
primary: "#hex" # Main brand color
secondary: "#hex" # Accent color
text_dark: "#hex" # Primary text
text_light: "#hex" # Secondary text
background: "#hex" # Page background
background_alt: "#hex" # Alternate background
fonts:
family: "Font Name"
fallback: "Fallback font stack"
custom_fonts_dir: "path/to/fonts" # or null for system fontsUsage Examples
# Export with default branding
python export-branded.py memo.md
# Export with specific brand
python export-branded.py memo.md --brand accel
# Export with brand + dark mode
python export-branded.py memo.md --brand sequoia --mode dark
# Export with brand + PDF
python export-branded.py memo.md --brand hypernova --pdfTechnical Details
Implementation Approach
CSS Variable Injection:
Rather than using CSS variables (:root { --color: value }), we chose runtime string replacement for maximum compatibility with pandoc and older browsers. The generate_css_from_brand() function replaces hardcoded Hypernova colors with brand colors before injecting into HTML.
Configuration Loading Priority:
brand-<name>-config.yamlif--brand <name>specifiedbrand-config.yamlif exists (default)Hardcoded Hypernova defaults (fallback)
Validation Strategy:
Validate on load, not on write
Non-blocking warnings for common issues (missing fonts, etc.)
Blocking errors only for critical problems (missing required fields)
Helpful error messages with suggestions
Files Modified
New Files:
src/branding.py(189 lines) - Brand configuration modulebrand-hypernova-config.yaml- Hypernova brandingbrand-accel-config.yaml- Example Accel brandingbrand-config.example.yaml- Configuration templatedocs/CUSTOM-BRANDING.md(434 lines) - Complete guide
Modified Files:
export-branded.py:Added brand configuration loading (line 33)
Added
generate_css_from_brand()function (line 75-109)Updated
create_html_template()with brand parameter (line 112-192)Updated
convert_to_branded_html()with brand parameter (line 195-220)Updated
main()with--brandargument and brand loading (line 282-371)Updated help text with multi-brand examples (line 286-303)
pyproject.toml:Added
pyyaml>=6.0dependency (line 13)
README.md:Added "Multi-Brand Export System" section (lines 51-58)
Documented key features and usage
Dependencies
Added:
pyyaml>=6.0- For YAML configuration file parsing
No Breaking Changes:
Existing exports work exactly as before
--brandparameter is optionalDefaults to Hypernova branding if no config specified
Testing
Manual Testing Completed:
✅ Export with default config (no brand specified)
✅ Export with Hypernova brand (
--brand hypernova)✅ Export with Accel brand (
--brand accel)✅ Dark mode with brand configuration
✅ Missing font files (graceful fallback to system fonts)
✅ Invalid brand name (helpful error message)
✅ Configuration validation warnings
Test Results:
Default export: Successfully uses Hypernova branding
Hypernova brand: Loads
brand-hypernova-config.yamlcorrectlyAccel brand: Applies Accel colors (#0066CC blue, #FF6B35 orange)
All exports: 64-65 KB HTML files, properly formatted
Font warnings: Non-blocking, exports complete with system fonts
Benefits
Multi-Client Support: Consultants can manage multiple VC firm clients
Zero Code Changes: Non-technical users can customize branding
Quick Customization: 5 minutes to create a new brand configuration
System Fonts: Works without custom font files (easier setup)
Validation: Catches configuration errors early with helpful messages
Backward Compatible: Existing workflows unchanged
Well Documented: Comprehensive guide with examples
Migration Guide
For Existing Users:
No action required - existing exports continue to work with Hypernova branding.
To Add Custom Branding:
Copy example configuration:
BASHcp brand-config.example.yaml brand-yourfirm-config.yamlEdit with your firm's details:
YAMLcompany: name: "Your Firm" tagline: "Your tagline" colors: primary: "#your-color" secondary: "#your-accent"Export with your brand:
BASHpython export-branded.py memo.md --brand yourfirm
Known Limitations
Logo Accent: Special logo styling (colored letter) only works for "Hypernova"
Font Files: Only WOFF2 format supported (not TTF/OTF)
CSS Injection: Uses string replacement (not CSS variables) for compatibility
Pandoc Warnings: Font file warnings are expected when using custom fonts
Future Enhancements
Potential improvements for future iterations:
Logo customization (HTML/SVG injection)
Theme presets (conservative, modern, minimal)
Color palette validation (contrast ratios)
Interactive brand configurator CLI
Export brand preview/comparison tool
Support for multiple color schemes per brand
Related Documentation
Custom Branding Guide - Complete usage guide
Export Guide - General export features
Dark Mode Guide - Light vs dark mode
Credits
Implementation: Claude Code (Sonnet 4.5) Direction: Michael Staton Testing: Manual testing with Harmonic memo exports