```html

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.com
  • tech.sailjada.com
  • tech.dangerouscentaur.com
  • tech.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_file and edit_file tool calls, filtered by site directory
  • Commands executed: Shell commands from bash tool 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...<