Building an Automated Technical Blog System Across Four Maritime Websites
What Was Done
I implemented a comprehensive automated technical blog generation system that captures detailed session work across four independent websites: queenofsandiego.com, sailjada.com, dangerouscentaur.com, and burialsatseasandiego.com. Each site now has its own technology blog (tech.queenofsandiego.com, tech.sailjada.com, tech.dangerouscentaur.com, tech.burialsatseasandiego.com) that automatically publishes granular posts documenting engineering decisions, infrastructure changes, and code modifications in real-time.
Technical Architecture
The system comprises three core components:
- Session Hook Integration: A Claude Code stop hook (
/Users/cb/.claude/hooks/tech_blog_stop.sh) that executes at the end of each development session - Blog Generation Engine: Python script (
tech_blog_generator.py) that parses Claude session transcripts (JSONL format) and extracts tool uses, file modifications, and command executions - Infrastructure Provisioning: Python initialization script (
tech_blog_init.py) that provisions S3 buckets, CloudFront distributions, and DNS records for each tech blog domain
The architecture follows a pattern where each session transcript is stored as structured JSONL data containing timestamped tool invocations and user messages. The generator parses this data, filters for technical substance (excluding credential handling), and transforms it into chronological blog posts with exact file paths, command examples, and decision rationale.
Infrastructure Setup
DNS & Certificate Strategy
The system leverages existing wildcard certificates where available:
*.queenofsandiego.com— existing wildcard ACM certificate in us-west-2*.sailjada.com— existing wildcard ACM certificate in us-west-2dangerouscentaur.com— existing wildcard CloudFront distribution (E2Q4UU71SRNTMB) on dc-sites S3 bucket with Namecheap DNS managementburialsatseasandiego.com— GoDaddy DNS management requiring new ACM certificate validation via DNS CNAME
S3 & CloudFront Resources
Four S3 buckets were created to host blog static content:
qos-tech-blog (hosts tech.queenofsandiego.com)
jada-tech-blog (hosts tech.sailjada.com)
dc-tech-blog (hosts tech.dangerouscentaur.com)
bats-tech-blog (hosts tech.burialsatseasandiego.com)
Each bucket is configured for static website hosting with index.html as the default document. CloudFront distributions were created with appropriate certificate bindings:
- qos-tech-blog distribution uses wildcard cert for queenofsandiego.com
- jada-tech-blog distribution uses wildcard cert for sailjada.com
- dc-tech-blog distribution uses dangerouscentaur.com wildcard distribution
- bats-tech-blog distribution requires ACM certificate (GoDaddy DNS validation pending)
DNS Configuration
Route53 hosted zones were verified for queenofsandiego.com and sailjada.com. CNAME records were added pointing tech subdomains to their respective CloudFront distribution domain names. For dangerouscentaur.com (Namecheap DNS), a CNAME record was created in Namecheap pointing tech.dangerouscentaur.com to the existing wildcard distribution. For burialsatseasandiego.com (GoDaddy DNS), an ACM certificate validation CNAME was added to GoDaddy's DNS interface.
Session Transcript Processing
The blog generator reads Claude session transcripts from the standard Claude Code projects directory structure. Each transcript contains:
- User messages with timestamps
- Tool use invocations (commands, file writes/edits, API calls)
- Tool results and command outputs
- Structured metadata about which files were modified
The parsing logic extracts all file operations, command executions, and environment variable references while filtering out sensitive data patterns (credentials, API keys, tokens). The generator creates a chronological narrative that explains the engineering sequence: what was modified, why, and what infrastructure changes resulted.
Key Decisions
Why Granular Over Summaries
The system captures exact file paths (e.g., /Users/cb/Documents/repos/tools/jada_blast.py), specific function names, S3 bucket identifiers, and CloudFront distribution IDs because Sergio and other engineers need to audit actual changes, not executive summaries. When reviewing what happened to the Queen of San Diego codebase, a developer needs to see that 5 edits were made to jada_blast.py, not just "email system was updated."
Hook-Based Automation vs. Manual Triggers
Rather than requiring manual blog post creation, the stop hook runs automatically at session end. This eliminates the friction of switching contexts to document work. The hook is registered in Claude Code settings (~/.claude/settings.json) under the hooks.stop configuration, ensuring it executes for every session across all projects.
Multi-Domain Strategy
Each maritime business entity (Queen of San Diego, Sail Jada, Dangerous Centaur, Burials at Sea San Diego) gets its own tech blog because they have separate engineering roadmaps, different stakeholder audiences, and distinct DNS registrars (Route53 vs. Namecheap vs. GoDaddy). A unified blog would obscure the operational reality that these are four separate businesses with separate codebases.
DNS Provider Heterogeneity
Rather than consolidating all domains to a single DNS provider, the system accommodates existing arrangements: Route53 for queenofsandiego.com and sailjada.com, Namecheap for dangerouscentaur.com wildcard, and GoDaddy for burialsatseasandiego.com. Each provisioning path uses the appropriate API or manual configuration method.
What's Next
The system is live and operational. Blog posts will auto-generate after each session. Two near-term tasks require attention:
- Image Corrections: https://burialsatseasandiego.sailjada.com/ currently displays incorrect images (generic "imagine" and "small catamaran") — actual burial ceremony and custom catamaran photos need to be sourced and uploaded
- Google Analytics Audit: Property mappings across all four sites need review; recommendations for booking optimization require traffic pattern analysis across tech.*.sailjada.com domains
Navigation updates will expose the tech blogs from the "Ship's Papers" menu on each primary domain, making technical documentation discoverable to stakeholders.
```