Lossless Changelog
component

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

  1. Brand Configuration System (src/branding.py)

    • New module for loading and validating brand configurations

    • Support for brand-<name>-config.yaml naming convention

    • Automatic 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

  2. Multi-Brand Export Support (export-branded.py)

    • New --brand <name> command-line parameter

    • Dynamic 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

  3. Example Brand Configurations

    • brand-hypernova-config.yaml - Official Hypernova Capital branding

    • brand-accel-config.yaml - Example Accel Partners branding

    • brand-config.example.yaml - Template for creating new brands

  4. 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:

YAML
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 fonts

Usage Examples

BASH
# 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 --pdf

Technical 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:

  1. brand-<name>-config.yaml if --brand <name> specified

  2. brand-config.yaml if exists (default)

  3. 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 module

  • brand-hypernova-config.yaml - Hypernova branding

  • brand-accel-config.yaml - Example Accel branding

  • brand-config.example.yaml - Configuration template

  • docs/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 --brand argument and brand loading (line 282-371)

    • Updated help text with multi-brand examples (line 286-303)

  • pyproject.toml:

    • Added pyyaml>=6.0 dependency (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

  • --brand parameter is optional

  • Defaults to Hypernova branding if no config specified

Testing

Manual Testing Completed:

  1. ✅ Export with default config (no brand specified)

  2. ✅ Export with Hypernova brand (--brand hypernova)

  3. ✅ Export with Accel brand (--brand accel)

  4. ✅ Dark mode with brand configuration

  5. ✅ Missing font files (graceful fallback to system fonts)

  6. ✅ Invalid brand name (helpful error message)

  7. ✅ Configuration validation warnings

Test Results:

  • Default export: Successfully uses Hypernova branding

  • Hypernova brand: Loads brand-hypernova-config.yaml correctly

  • Accel 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

  1. Multi-Client Support: Consultants can manage multiple VC firm clients

  2. Zero Code Changes: Non-technical users can customize branding

  3. Quick Customization: 5 minutes to create a new brand configuration

  4. System Fonts: Works without custom font files (easier setup)

  5. Validation: Catches configuration errors early with helpful messages

  6. Backward Compatible: Existing workflows unchanged

  7. 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:

  1. Copy example configuration:

    BASH
    cp brand-config.example.yaml brand-yourfirm-config.yaml
  2. Edit with your firm's details:

    YAML
    company:
      name: "Your Firm"
      tagline: "Your tagline"
    colors:
      primary: "#your-color"
      secondary: "#your-accent"
  3. Export with your brand:

    BASH
    python export-branded.py memo.md --brand yourfirm

Known Limitations

  1. Logo Accent: Special logo styling (colored letter) only works for "Hypernova"

  2. Font Files: Only WOFF2 format supported (not TTF/OTF)

  3. CSS Injection: Uses string replacement (not CSS variables) for compatibility

  4. 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

Credits

Implementation: Claude Code (Sonnet 4.5) Direction: Michael Staton Testing: Manual testing with Harmonic memo exports