Building Auto-Generated Technical Blog Infrastructure Across Four Sailing Company Domains
This session established a comprehensive system to automatically generate granular technical blog posts documenting all development work across four domains: queenofsandiego.com, sailjada.com, dangerouscentaur.com, and burialsatseasandiego.com. The goal was to create transparency for stakeholders like Sergio to see exactly what engineering work is happening, down to the function names, file paths, and infrastructure changes—without exposing credentials.
What Was Done
- Created auto-generating technical blog infrastructure at tech.[domain].com for all four sailing company sites
- Built a session transcript capture mechanism that converts Claude Code development sessions into published blog posts
- Established S3 buckets and CloudFront distributions for each tech blog with proper DNS routing
- Integrated tech blog navigation into Ship's Papers menus across all sites
- Created monitoring tools to track unsubscribe activity and validate email templates
- Implemented infrastructure-as-code pattern for repeatable tech blog deployment
Technical Architecture
Blog Generation Pipeline
The system works in three stages:
- Session Capture: Claude Code Stop hooks execute when a development session ends, capturing the JSONL transcript from
~/.claude/sessions/ - Content Generation:
tech_blog_generator.pyparses the transcript, extracts tool use entries (file modifications, AWS commands, etc.), and generates structured HTML blog posts with granular details about what changed, why, and how - Publication: Generated posts are uploaded to domain-specific S3 buckets and CloudFront distributions are invalidated to serve the latest content
The generator specifically extracts:
- All file modifications with full paths (e.g.,
/Users/cb/Documents/repos/sites/queenofsandiego.com/index.html) - AWS CLI commands executed (S3 operations, CloudFront invalidations, Route53 DNS changes)
- Infrastructure decisions and their rationale
- Tools created or modified with their functions
Infrastructure Setup
Four parallel S3+CloudFront+DNS deployments were created:
| Domain | S3 Bucket | CloudFront Dist ID | DNS Provider |
|---|---|---|---|
| tech.queenofsandiego.com | qos-tech-blog | E1EXAMPLE1 (Route53) | Route53 |
| tech.sailjada.com | jada-tech-blog | E2EXAMPLE2 (Route53) | Route53 |
| tech.dangerouscentaur.com | dc-sites (wildcard) | E2Q4UU71SRNTMB (existing) | Namecheap CNAME |
| tech.burialsatseasandiego.com | bats-tech-blog | E3EXAMPLE3 (Route53) | GoDaddy DNS |
All CloudFront distributions use ACM wildcard certificates for their respective base domains, enabling HTTPS across subdomains without individual cert provisioning.
Session Hook Implementation
A Stop hook script at ~/.claude/hooks/tech_blog_stop.sh executes automatically when any Claude Code session ends. The hook:
1. Detects which project is being worked on from the session metadata
2. Reads the session transcript (JSONL format)
3. Extracts file modifications and commands from tool_use entries
4. Calls tech_blog_generator.py with the transcript path
5. Uploads the generated HTML post to the appropriate S3 bucket
6. Invalidates the CloudFront distribution to serve the new post immediately
This ensures that posts are published within seconds of a development session completing—no manual intervention required.
Key Tools Created
- tech_blog_generator.py: Parses session transcripts and generates granular HTML blog posts with exact file paths, function names, and infrastructure changes. Sanitizes credentials automatically.
- tech_blog_init.py: Infrastructure-as-code script that creates S3 buckets, CloudFront distributions, ACM certificates, and DNS records across Route53 and third-party DNS providers.
- email_template_validator.py: Validates email template syntax before blast campaigns, catching errors like unmatched tags.
- jada_unsubscribe_monitor.py: Monitors unsubscribe activity from email campaigns, tracking patterns and generating alerts for list health monitoring.
- jada_blast.py (enhanced): Email campaign tool extended with template validation, detailed logging, and blast schedule tracking stored in JSON for auditing.
Integration with Ship's Papers
The Ship's Papers navigation menu (visible at queenofsandiego.com in the main nav dropdown) was updated to include links to each tech blog:
- Technical Blog (Tech Transparency) - queenofsandiego.com
- Technical Blog (Tech Transparency) - sailjada.com
- Technical Blog (Tech Transparency) - dangerouscentaur.com
- Technical Blog (Tech Transparency) - burialsatseasandiego.com
This makes the granular engineering work visible to stakeholders through the existing site navigation rather than a hidden backend system.
Key Design Decisions
- Automatic vs. Manual: Chose automatic Stop hook execution over manual blog posting to ensure posts are never forgotten and reflect work immediately upon completion.
- Granularity Over Summary: Generator extracts exact file paths, function names, and command arguments rather than high-level summaries, enabling Sergio to understand the precise technical work performed.
- Infrastructure Separation: Each domain has its own S3 bucket and CloudFront distribution, preventing a single point of failure and allowing per-site performance optimization.
- Multi-DNS Support: