← back to Goodquestion Ai

docs/plans/2026-02-23-agent-abrams-blog-design.md

97 lines

# Agent Abrams Blog — Design Document

**Date**: 2026-02-23
**Author**: Agent Abrams (Steve)
**Domain**: goodquestion.ai
**Status**: Approved

---

## Overview

A developer blog at goodquestion.ai authored by "Agent Abrams" — a developer alias for Steve. Journals the daily Claude Code experience: challenges, solutions, and reusable code. All content is sanitized to protect client business details.

Public GitHub repo `Stevemdr/AgentAbrams` hosts the blog source and curated Claude Code skills.

## Architecture

```
goodquestion.ai (Cloudflare) → nginx:443 → localhost:9883
                                              ↓
                                    Astro Static Site
                                    /root/Projects/goodquestion-ai/
```

- **Framework**: Astro (static site generator)
- **Posts**: Markdown with frontmatter
- **Hosting**: Static files served via lightweight Node server on port 9883
- **Proxy**: Existing nginx config proxies 443 → 9883
- **Process**: PM2 managed as `goodquestion-blog`

## Directory Structure

```
/root/Projects/goodquestion-ai/
├── astro.config.mjs
├── package.json
├── public/
│   ├── favicon.svg
│   └── images/
├── src/
│   ├── layouts/
│   │   └── BlogLayout.astro
│   ├── pages/
│   │   ├── index.astro
│   │   ├── about.astro
│   │   └── posts/
│   │       └── [...slug].astro
│   ├── content/
│   │   └── posts/
│   │       ├── 2026-02-19-zone-culling-nearly-killed-my-3d-app.md
│   │       ├── 2026-02-20-building-a-skill-system-for-claude-code.md
│   │       ├── 2026-02-21-the-animation-loop-that-wouldnt-animate.md
│   │       ├── 2026-02-22-parallel-agents-74-processes-one-server.md
│   │       └── 2026-02-23-when-your-ai-writes-a-blog.md
│   └── styles/
│       └── global.css
└── .gitignore
```

## GitHub Repo: Stevemdr/AgentAbrams

```
AgentAbrams/
├── blog/          # Full Astro blog source
├── skills/        # Curated, sanitized Claude Code skills
│   ├── README.md
│   └── (selected skills)
├── README.md
├── LICENSE        # MIT
└── .gitignore
```

## Security Model

1. **Pre-commit hook**: Regex scan for API keys, passwords, IP addresses, DB strings. Blocks commit on match.
2. **`.gitignore`**: Blocks `.env`, `*.key`, `*.pem`, `credentials*`, DW-specific paths
3. **Content policy**: No business names, no vendor names, no internal URLs. Generic references only.
4. **Skill sanitization**: Skills copied and stripped of business-specific logic before publishing.
5. **Separate git remote**: Zero connection to DW-Agents repo.

## Content Plan — 5 Backdated Posts

| Date | Title | Format | Topic |
|------|-------|--------|-------|
| Feb 19 | Zone Culling Nearly Killed My 3D App | War Story | Debugging aggressive object culling in Three.js |
| Feb 20 | Building a Skill System for Claude Code | Tutorial | Creating reusable skills with templates |
| Feb 21 | The Animation Loop That Wouldn't Animate | Journal | Tracing a stale boolean through 30K lines |
| Feb 22 | Parallel Agents: 74 Processes, One Server | Tutorial | PM2 at scale — monitoring, restart, log rotation |
| Feb 23 | When Your AI Writes a Blog About Writing a Blog | Journal/Meta | Day one of Agent Abrams, why journaling matters |

## Deployment

- Build: `astro build` → `dist/`
- Serve: PM2 process `goodquestion-blog` on port 9883
- Deploy: git push → rebuild → PM2 restart
- Port 9883: internal only, nginx proxies from 443