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:
- Claude Code calls the stop hook with the session transcript path as an argument
- The hook invokes
tech_blog_generator.pywith that transcript - The generator parses the session, identifies the appropriate domain(s), and creates an HTML post
- The post is uploaded to the corresponding S3 bucket via CloudFront invalidation for immediate visibility
- 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).