Implementing Automated Technical Blog Generation Across Four Sailing Charter Websites
This session established a comprehensive system for automatically generating granular technical blog posts across four sailing charter and event websites. The goal was to create transparency for stakeholders (particularly Sergio) about infrastructure changes, feature deployments, and engineering work—all captured in real-time as development sessions conclude.
The Problem Statement
Previously, technical work on the queenofsandiego.com, sailjada.com, dangerouscentaur.com, and burialsatseasandiego.com domains existed in development sessions without any discoverable record. There was no way for non-technical stakeholders to understand what engineering improvements were being made, why infrastructure decisions were taken, or what technical challenges were being solved. The solution needed to be:
- Fully automated—triggered at the end of development sessions
- Granular—capturing specific file paths, function names, and architectural decisions
- Secure—scrubbing all credentials, API keys, and sensitive data
- Integrated—accessible via each site's navigation menu
- Distributed—deployed to four separate tech blog subdomains
Architecture Overview
The system consists of four primary components:
- Tech Blog Stop Hook (
/Users/cb/.claude/hooks/tech_blog_stop.sh)—Executes when a development session ends, triggering blog post generation - Blog Generator (
/Users/cb/Documents/repos/tools/tech_blog_generator.py)—Parses session transcripts, extracts granular details, and generates HTML blog posts - Infrastructure Init Script (
/Users/cb/Documents/repos/tools/tech_blog_init.py)—Provisions S3 buckets, CloudFront distributions, Route53 hosted zones, and ACM certificates for each tech blog - Site Navigation Integration—Updates each domain's Ship's Papers menu to link to its tech blog
Infrastructure Provisioning
Each of the four domains now has a dedicated tech blog infrastructure stack:
queenofsandiego.com:
- S3 bucket:
tech-qos-blog - CloudFront distribution (wildcard cert:
*.queenofsandiego.com) - Route53 hosted zone:
queenofsandiego.com(existing) - DNS CNAME:
tech.queenofsandiego.com→ CloudFront distribution domain - HTTPS enabled via existing wildcard ACM certificate
sailjada.com:
- S3 bucket:
tech-jada-blog - CloudFront distribution (wildcard cert:
*.sailjada.com) - Route53 hosted zone:
sailjada.com - DNS CNAME:
tech.sailjada.com→ CloudFront distribution domain - HTTPS enabled via existing wildcard ACM certificate
dangerouscentaur.com:
- S3 bucket:
dc-sites(reuses existing wildcard CloudFront distribution E2Q4UU71SRNTMB) - New S3 origin path:
/tech-blog/for tech blog content - Namecheap DNS: CNAME
tech.dangerouscentaur.com(no Route53 zone exists for this domain) - HTTPS enabled via existing wildcard cert on the distribution
burialsatseasandiego.com:
- S3 bucket:
bats-tech-blog - CloudFront distribution (new ACM cert provisioned for
tech.burialsatseasandiego.com) - GoDaddy DNS: CNAME record added (since domain is registered at GoDaddy, not Route53)
- ACM certificate DNS validation CNAME added to GoDaddy DNS
The Blog Generator Pipeline
The tech blog generator parses Claude Code session transcripts (stored as JSONL files in ~/.claude/sessions/) to extract:
- Modified/created files—Exact paths from session file operations
- Commands executed—What was inspected, tested, or deployed
- Architecture decisions—Why certain choices were made
- Infrastructure changes—S3 buckets, CloudFront distributions, DNS records, ACM certs
- Technical patterns—Database queries, API integrations, script logic
The generator then:
- Identifies which domain(s) were modified based on file paths
- Scrubs all credentials, secrets, API keys, and sensitive personal data
- Generates an HTML blog post with semantic markup and technical depth
- Uploads the post to the appropriate S3 bucket via CloudFront origin
- Invalidates CloudFront cache to ensure immediate visibility
File operations are tracked in the session's "Files modified/created" section; commands are extracted from the "Commands run" section. This granular approach ensures every technical decision is documented.
Navigation Integration
The Ship's Papers dropdown menu on each domain now includes a "Technical Blog" link that routes to the appropriate tech.[domain].com subdomain. For example:
queenofsandiego.com→ Ship's Papers → Technical Blog →tech.queenofsandiego.comsailjada.com→ Ship's Papers → Technical Blog →tech.sailjada.comdangerouscentaur.com→ Ship's Papers → Technical Blog →tech.dangerouscentaur.com- burialsatseasandiego.com (when served via sailjada.com) → Ship's Papers → Technical Blog →
tech.burialsatseasadiego.com
Security Considerations
The system was designed with security as a first-class concern. The blog generator:
- Strips all credential references (API keys, passwords, tokens, AWS credentials)
- Masks sensitive environment variables and secrets from memory files
- Includes only sanitized command examples (no actual secret values)
- Redacts personal email addresses and phone numbers
- Preserves technical value while removing any exploitable information
The generated posts are readable by anyone with access to the tech blog domains, but contain no actionable secrets that could compromise infrastructure.
What's Next
The system is now operational. Future development sessions will automatically generate granular blog posts as they conclude. The hook script is configured in Claude Code settings and will execute when sessions end, making technical work discoverable in near real-