Building an Auto-Generated Technical Blog System Across Four Sailing Event Sites
What Was Done
We implemented a fully automated technical blog generation system that captures development work in real-time and publishes granular, detailed posts to four separate tech blogs:
tech.queenofsandiego.comtech.sailjada.comtech.dangerouscentaur.comtech.burialsatseasandiego.com
The system automatically generates posts from Claude session transcripts at the end of each development session, extracting file modifications, commands executed, and infrastructure changes into detailed technical narratives. This enables stakeholders like Sergio to see exactly what was built, why decisions were made, and how the system evolved—without exposing credentials or sensitive data.
Technical Architecture
Core Components
The system consists of three main pieces:
- Stop Hook Script (
/Users/cb/.claude/hooks/tech_blog_stop.sh): Executes at the end of each Claude session, extracts the session transcript, and triggers the blog generator - Blog Generator (
/Users/cb/Documents/repos/tools/tech_blog_generator.py): Parses Claude session transcripts (JSONL format), identifies which sites were modified, and generates granular technical posts - Infrastructure Initializer (
/Users/cb/Documents/repos/tools/tech_blog_init.py): Creates S3 buckets, CloudFront distributions, Route53 DNS records, and ACM certificates for each tech blog domain
Domain Architecture
Each tech blog is deployed as a static site on AWS with consistent infrastructure:
Domain S3 Bucket CloudFront Dist Route53 Zone
tech.queenofsandiego.com tech-qos-blog [Dist ID] queenofsandiego.com (Route53)
tech.sailjada.com tech-jada-blog [Dist ID] sailjada.com (Route53)
tech.dangerouscentaur.com dc-sites E2Q4UU71SRNTMB dangerouscentaur.com (Namecheap)
tech.burialsatseasandiego.com tech-bats-blog [Dist ID] burialsatseasandiego.com (GoDaddy)
DNS varies by registrar: queenofsandiego.com and sailjada.com use Route53 with existing wildcard certificates (*.queenofsandiego.com, *.sailjada.com). dangerouscentaur.com uses an existing wildcard CloudFront distribution on the dc-sites bucket. burialsatseasandiego.com, hosted at GoDaddy, required new ACM certificate validation via CNAME DNS records.
Infrastructure Implementation
S3 and CloudFront Setup
For each blog domain, we created:
- Private S3 bucket with versioning and website indexing disabled (CloudFront is the sole entry point)
- CloudFront distribution with origin pointing to the S3 bucket
- Index document configured as
index.html - HTTPS-only enforcement via CloudFront viewer policy
- Cache behavior: 300-second TTL for HTML, 86400-second TTL for static assets
DNS and Certificate Validation
For Route53-managed domains (queenofsandiego.com, sailjada.com), we leveraged existing wildcard ACM certificates. DNS CNAME records point tech.* subdomains to their respective CloudFront distributions.
For burialsatseasandiego.com (GoDaddy-hosted), we requested a new ACM certificate for tech.burialsatseasandiego.com, extracted the DNS validation CNAME record, and added it to GoDaddy's DNS via their API using stored credentials from /Users/cb/.claude/projects/memory/reference_godaddy_credentials.md.
Blog Generation Workflow
Session Transcript Parsing
Claude Code sessions store transcripts in JSONL format at ~/.claude/sessions/. Each line is a JSON object containing:
type: "tool_use", "tool_result", "text", etc.tool_name: e.g., "bash", "read_file", "write_file"content: input or output of the tool call
The blog generator extracts:
- File modifications: Paths from
write_fileandedit_filetool calls, filtered by site directory - Commands executed: Shell commands from
bashtool calls, scrubbed of credentials - Infrastructure changes: CloudFormation outputs, S3 bucket creation, Route53 changes from command results
Site Detection and Routing
The generator maps file paths to sites:
/Users/cb/Documents/repos/sites/queenofsandiego.com/ → tech.queenofsandiego.com
/Users/cb/Documents/repos/tools/jada_*.py → tech.sailjada.com
/Users/cb/Documents/repos/sites/dangerouscentaur/ → tech.dangerouscentaur.com
/Users/cb/.claude/projects/sops/bokun_viator_* → tech.burialsatseasandiego.com
If a session touches multiple sites, separate posts are generated for each.
Content Generation
The generator creates HTML posts with structure:
- Title: Derived from file paths and command patterns (e.g., "Updating Email Template Validation and Unsubscribe Monitoring for Blast Campaign Tooling")
- What Was Done: Bulleted list of files modified with brief context
- Technical Details: Command examples, function names, config changes
- Infrastructure Changes: S3 buckets, CloudFront dist IDs, Route53 records (no credentials)
- Key Decisions: Why certain paths were chosen (e.g., "Using CNAME validation for GoDaddy DNS to avoid manual record creation")
- What's Next: Inferred from TODOs or incomplete work
Sensitive data is filtered: API keys, passwords, tokens, secrets, and personal credentials are stripped from command examples and file content.
Integration with Ship's Papers Navigation
Each main site's Ship's Papers menu now includes a link to its technical blog. For queenofsandiego.com, the nav structure was updated from:
<li><a href="/ship-papers">Ship's Papers</a>
<ul>...existing items...<