```html

Building an Automated Technical Blog System Across Four Domain Brands

This session involved architecting and deploying a comprehensive technical documentation system that automatically captures development work across four separate domains: queenofsandiego.com, sailjada.com, dangerouscentaur.com, and burialsatseasandiego.com. The goal was to create granular, real-time visibility into technical operations—not high-level summaries, but detailed posts that drill into the specifics of what's being built.

What Was Done

  • Created an automated blog generation pipeline triggered on session completion
  • Set up independent S3 buckets and CloudFront distributions for four tech blog domains
  • Implemented DNS infrastructure across three different providers (Route53, Namecheap, GoDaddy)
  • Integrated tech blog links into existing site navigation menus
  • Built validation and monitoring tools to ensure data quality and credential security

Technical Details: The Blog Generator Architecture

The core of this system is tech_blog_generator.py, which reads Claude Code session transcripts (JSONL format) and transforms them into structured HTML blog posts. The generator:

  • Parses session metadata: file modifications, commands executed, reasoning/agent notes
  • Filters out sensitive data: API keys, credentials, passwords, personal identifiers
  • Extracts granular technical details: exact file paths, S3 bucket names, CloudFront distribution IDs, function names, DNS changes
  • Generates context-aware HTML articles with proper semantic structure
  • Maps sessions to the correct domain brand (queenofsandiego vs. sailjada vs. dangerouscentaur vs. burialsatseasandiego)

The generator reads from /Users/cb/.claude/projects/[project-path]/sessions/ where each session transcript is stored as a JSONL file containing tool use entries and user/assistant messages. The mapping logic determines which tech blog receives the post based on which domains/files were modified during the session.

Infrastructure: Four Independent Blog Deployments

Rather than a single centralized tech blog, this solution creates brand-specific documentation sites. Here's what was provisioned:

queenofsandiego.com Tech Blog

  • S3 Bucket: qos-tech-blog (us-west-2)
  • CloudFront Distribution: Points to qos-tech-blog S3 origin
  • DNS: Route53 hosted zone for queenofsandiego.com; CNAME alias for tech.queenofsandiego.com
  • SSL/TLS: Wildcard certificate *.queenofsandiego.com (already existed)

sailjada.com Tech Blog

  • S3 Bucket: sailjada-tech-blog (us-west-2)
  • CloudFront Distribution: Points to sailjada-tech-blog S3 origin
  • DNS: Route53 hosted zone for sailjada.com; CNAME alias for tech.sailjada.com
  • SSL/TLS: Wildcard certificate *.sailjada.com (already existed)

dangerouscentaur.com Tech Blog

  • S3 Bucket: dc-sites (existing wildcard CloudFront distribution E2Q4UU71SRNTMB was already configured)
  • CloudFront Distribution: Reused existing wildcard distribution
  • DNS: Namecheap; CNAME record for tech.dangerouscentaur.com
  • SSL/TLS: Wildcard certificate via existing distribution

burialsatseasandiego.com Tech Blog

  • S3 Bucket: bats-tech-blog (us-west-2)
  • CloudFront Distribution: Points to bats-tech-blog S3 origin
  • DNS: GoDaddy (domain registrar for burialsatseasandiego.com); CNAME record for tech.burialsatseasandiego.com
  • SSL/TLS: New ACM certificate created; DNS validation CNAME added to GoDaddy DNS

Automation and Triggering

The system is triggered via a Claude Code "Stop" hook: /Users/cb/.claude/hooks/tech_blog_stop.sh. When a development session ends:

  1. Claude Code calls the stop hook with the session transcript path as an argument
  2. The hook invokes tech_blog_generator.py with that transcript
  3. The generator parses the session, identifies the appropriate domain(s), and creates an HTML post
  4. The post is uploaded to the corresponding S3 bucket via CloudFront invalidation for immediate visibility
  5. A timestamp index is maintained so posts appear chronologically on the tech blog homepage

This ensures that as soon as work is completed, technical documentation is automatically published without manual intervention.

Data Security and Filtering

A critical requirement was ensuring no credentials appear in the public tech blogs. email_template_validator.py and security checks within the generator filter against patterns for:

  • AWS access keys and secret keys
  • API tokens and bearer tokens
  • Database passwords and connection strings
  • GoDaddy/Namecheap API credentials
  • Private keys and certificates
  • Personal email addresses and phone numbers

The generator redacts these before publishing while preserving the technical substance of what was changed.

Navigation Integration

The tech blog links are integrated into the "Ship's Papers" navigation menu on queenofsandiego.com's index.html. This makes the technical documentation discoverable alongside operational pages, allowing stakeholders like Sergio to drill into implementation details without requesting ad-hoc reports.

Additional Tools Created

jada_unsubscribe_monitor.py was built to track email unsubscribes and maintain compliance, working alongside the updated jada_blast.py email campaign system. email_template_validator.py ensures templates meet formatting requirements before blast distribution.

Key Decisions

  • Domain-specific blogs vs. centralized: Separate tech blogs per brand maintain clear operational boundaries and allow each organization to control what's visible to its stakeholders.
  • S3 + CloudFront architecture: Provides cost-effective static hosting with global CDN distribution and zero-downtime deployments via invalidation.
  • DNS provider diversity: Rather than consolidating all DNS to Route53, this respects existing registrar relationships (GoDaddy for burialsatseasandiego.com, Namecheap for dangerouscentaur.com).