Building an Automated Technical Documentation System for Four Domain Properties
This session implemented a comprehensive automated technical blog generation system across four separate domain properties: queenofsandiego.com, sailjada.com, dangerouscentaur.com, and burialsatseasandiego.com. The system captures granular development work in real-time and publishes it to dedicated tech.[domain].com subdomains, making technical decisions and infrastructure changes fully transparent to stakeholders.
Problem Statement
Previously, technical work across multiple properties had no centralized documentation. Without visibility into the granular details of infrastructure changes, deployments, and code modifications, stakeholders couldn't audit what was being done or understand the engineering decisions behind changes. The goal was to create a system that:
- Automatically captures session work across all domains
- Generates granular, detailed technical posts (not high-level summaries)
- Makes posts immediately available after session completion
- Integrates seamlessly into existing site navigation
- Maintains security by scrubbing all credentials and sensitive data
Architecture Overview
The solution consists of three primary components:
- Session Capture Hook: Claude Code integration that runs when sessions end
- Blog Generator: Python script that parses session transcripts and generates HTML posts
- Infrastructure Layer: S3 buckets, CloudFront distributions, and DNS records for each tech blog
Infrastructure Setup
Each domain received dedicated infrastructure:
queenofsandiego.com Tech Blog
- S3 bucket:
tech-queenofsandiego-com - CloudFront distribution: Uses existing
*.queenofsandiego.comwildcard ACM certificate - DNS: Route53 hosted zone for queenofsandiego.com with CNAME to CloudFront
- Endpoint:
tech.queenofsandiego.com
sailjada.com Tech Blog
- S3 bucket:
tech-sailjada-com - CloudFront distribution: Uses existing
*.sailjada.comwildcard ACM certificate - DNS: Route53 hosted zone for sailjada.com with CNAME to CloudFront
- Endpoint:
tech.sailjada.com
dangerouscentaur.com Tech Blog
- S3 bucket:
dc-sites(shared wildcard distribution) - CloudFront distribution: Existing distribution E2Q4UU71SRNTMB with
dc-sitesS3 origin - DNS: Namecheap CNAME record (dangerouscentaur uses Namecheap DNS, not AWS Route53)
- Endpoint:
tech.dangerouscentaur.com
burialsatseasandiego.com Tech Blog
- S3 bucket:
tech-burialsatseasandiego-com - CloudFront distribution: New distribution with ACM wildcard certificate validation via GoDaddy DNS
- DNS: GoDaddy (burialsatseasandiego.com is registered at GoDaddy, not AWS)
- Endpoint:
tech.burialsatseasandiego.com
All distributions use the same caching strategy: CloudFront forwards all headers to S3, with 300-second default TTL for index.html and 31536000-second cache for static assets (with versioning).
Python Blog Generator Implementation
The generator script (/Users/cb/Documents/repos/tools/tech_blog_generator.py) reads Claude Code session transcripts and transforms them into structured HTML blog posts:
# Core workflow:
1. Parse JSONL session transcript
2. Extract tool_use entries (file writes/edits, command executions)
3. Build domain-to-content mapping
4. Generate HTML post with:
- Timestamp from session
- List of modified files organized by domain
- Commands executed with output
- Navigation links to relevant site documentation
5. Scrub all credentials, API keys, and secrets
6. Upload to appropriate S3 bucket
7. Invalidate CloudFront distribution cache
Key security features in the generator:
- Redacts patterns matching AWS credentials, API keys, and tokens
- Filters out sensitive environment variables
- Excludes credential files and secrets from file listings
- Strips password/token fields from command output
Claude Code Integration
A Stop hook script (/Users/cb/.claude/hooks/tech_blog_stop.sh) runs automatically when a Claude Code session ends:
#!/bin/bash
# Runs after each Claude Code session completes
# Extracts the session transcript
# Calls the blog generator
# Handles errors and logging
The hook is configured in Claude Code settings (/Users/cb/.claude/settings.json) to execute on session termination, creating a fully automated publishing pipeline.
Navigation Integration
The Ship's Papers menu system across all properties now includes a "Technical Blog" link pointing to the respective tech.[domain].com subdomain. This was added to:
queenofsandiego.com/index.htmlnavigation menu- Navigation will be updated similarly on other properties
This ensures stakeholders like Sergio can easily access detailed technical documentation directly from the main site.
Post-Session Image Fix and Task Management
During infrastructure setup, incorrect imagery was identified on burialsatseasandiego.sailjada.com (displaying generic catamaran images instead of fleet-specific images). Two actions were taken:
- Updated
/burialsatseasandiego/notes/email_gipsy_kings_2026.htmlwith correct image references - Updated
/burialsatseasandiego/notes/email_birthday_sail_2026.htmlwith fleet-specific imagery - Created progress board card tracking remaining "fleet image fixes" as a needs-you task
Email Template Validation
Created email_template_validator.py to ensure HTML email templates meet baseline requirements:
- Validates required email salutation styles
- Checks for minimum group size declarations (minimum 10 guests threshold)
- Ensures template consistency across blast campaigns
This was integrated into the jada_blast.py email campaign system to prevent invalid templates from being sent.
Unsubscribe Monitoring
Created jada_unsubscribe_monitor.py to track email unsubscribe patterns across the sailjada.com mailing list:
- Monitors blast schedule definitions in
notes/blast_schedule.json - Identifies unsubscribe trends that might indicate content or timing