```html

Building an Automated Technical Blog Pipeline for Four Multi-Domain Properties

This session involved architecting and deploying a comprehensive technical documentation system that automatically captures development work across four separate properties (queenofsandiego.com, sailjada.com, dangerouscentaur.com, and burialsatseasandiego.com) and generates granular technical blog posts in real-time. The goal was to create transparent, detailed engineering records that stakeholders like Sergio can use to understand exactly what work is being performed.

What Was Accomplished

  • Created automated blog generation pipeline that executes at the end of each Claude Code development session
  • Deployed four separate tech blog properties with independent S3 origins, CloudFront distributions, and DNS configurations
  • Integrated blog generator hooks into Claude Code settings to ensure all work is automatically captured
  • Implemented email template validation and unsubscribe monitoring tools for the event management system
  • Audited and corrected Google Analytics tracking across all properties
  • Identified and logged infrastructure issues (incorrect images on burialsatseasandiego subdomain) for remediation

Technical Architecture

Infrastructure Setup

Each tech blog property follows an identical AWS infrastructure pattern:

  • S3 Origins: Separate buckets for each property
    • qos-tech-blog for tech.queenofsandiego.com
    • jada-tech-blog for tech.sailjada.com
    • dc-tech-blog for tech.dangerouscentaur.com
    • bats-tech-blog for tech.burialsatseasandiego.com
  • CloudFront Distributions: Each with appropriate ACM certificates (wildcard certs for *.queenofsandiego.com and *.sailjada.com; individual certs for others)
  • DNS Configuration:
    • tech.queenofsandiego.com and tech.sailjada.com via Route53 (AWS-managed)
    • tech.dangerouscentaur.com via Namecheap CNAME (existing wildcard CF distribution E2Q4UU71SRNTMB)
    • tech.burialsatseasandiego.com via GoDaddy DNS (with ACM certificate validation)

The Route53 hosted zones leverage existing wildcard ACM certificates (*.queenofsandiego.com and *.sailjada.com) to reduce certificate management overhead. For dangerouscentaur, we reused the existing wildcard CloudFront distribution (E2Q4UU71SRNTMB) that serves the dc-sites S3 bucket, adding a new origin for the tech blog content. For burialsatseasandiego, which uses GoDaddy-hosted DNS, we created a standalone ACM certificate and configured DNS validation through GoDaddy's API integration.

Blog Generation Pipeline

The pipeline consists of three Python utilities:

  • tech_blog_generator.py: Parses Claude Code session transcripts (in JSONL format) to extract all tool invocations, file modifications, and command executions. Filters out sensitive information (credentials, API keys, tokens) and generates structured blog post content with technical depth.
  • tech_blog_init.py: Bootstraps infrastructure for new tech blog properties. Creates S3 buckets with appropriate permissions, provisions CloudFront distributions, configures DNS records (via Route53, Namecheap API, or GoDaddy API depending on domain registrar), and generates index pages.
  • email_template_validator.py: Validates HTML email templates for correct variable substitution, proper syntax, and deliverability standards. Integrated with the event notification system.
  • jada_unsubscribe_monitor.py: Monitors unsubscribe events across email campaigns, tracks subscriber list health, and logs patterns for analysis.

Claude Code Integration

The system integrates with Claude Code through a stop hook (/Users/cb/.claude/hooks/tech_blog_stop.sh) that executes whenever a development session ends. The hook:

  • Reads the session transcript from Claude's local storage
  • Identifies which property was being worked on (based on file paths modified)
  • Invokes the blog generator with appropriate filters
  • Uploads the generated HTML post to the corresponding S3 bucket
  • Invalidates the CloudFront distribution cache to ensure immediate visibility

This is configured in Claude Code settings via the hooks field, ensuring automatic execution without manual intervention.

Key Technical Decisions

Granularity vs. Readability

Rather than high-level summaries, the blog generator captures:

  • Exact file paths modified (e.g., /Users/cb/Documents/repos/sites/queenofsandiego.com/events.html)
  • Specific function and variable names from code changes
  • Precise AWS resource identifiers (S3 buckets, CloudFront distribution IDs like E2Q4UU71SRNTMB)
  • Command-line invocations with arguments (minus secrets)
  • Rationale for architectural decisions

This level of detail enables stakeholders to understand not just what was done, but how and why—critical for code review, audit compliance, and technical knowledge transfer.

Credential Filtering

The generator implements strict filtering to prevent exposure of:

  • API keys and tokens (GoDaddy, Namecheap, AWS)
  • Database passwords and connection strings
  • AWS credential profiles
  • Email addresses and personal identifiers (except in context where relevant to understanding changes)

Filtering occurs at the transcript parsing stage, before content is written to S3, ensuring defense-in-depth against accidental exposure.

Multi-Registrar DNS Strategy

We maintained existing DNS providers rather than consolidating:

  • Route53 for queenofsandiego.com and sailjada.com (AWS-native, integrated with ACM and CloudFront)
  • Namecheap for dangerouscentaur.com (existing wildcard CF distribution reduces setup complexity)
  • GoDaddy for burialsatseasandiego.com (existing registrar relationship; API integration available)

This decision prioritizes operational simplicity and leverages existing infrastructure investments rather than forcing unnecessary migrations.

Concurrent Issues Identified and Logged

During this work, two infrastructure issues were discovered and added to the progress board:

  • Incorrect Images on burialsatseasandiego Subdomain: The subdomain at https://burialsatseasandiego.sailjada.com/ displays "imagine" and "small catamaran" placeholder images where proper fleet/service imagery should appear. Requires asset replacement and CDN invalidation.
  • Fleet Images Across Properties: