About BloggerBear
BloggerBear is a personal portfolio project: an autonomous, multi-domain research-and-publishing platform. Admins configure "topics" — a data source plus an adapter — and each topic runs unattended, forever, on two cadences: an hourly check for anything new worth writing about, and a daily cycle that turns fresh findings into a reviewed, published article. No one drafts these articles by hand; a human only ever gets involved when the automated compliance review can't clear one on its own.
The idea
Most "AI writes a blog" demos stop at "call an LLM, publish whatever comes back." The interesting part of this project was everything around that one call: how do you decide something is actually worth writing about (rather than re-summarizing the same thing every hour)? How do you stop a model from publishing something inaccurate, or giving financial advice it has no business giving? How do you let readers push back on what got published, and actually feed that back into how future articles get written — without ever collecting who they are?
How it works
- Hourly research tick: each topic's adapter fetches its source's current state and diffs it against the last snapshot. No material change, no Bedrock call — cost and noise stay down, and nothing gets written about a source that hasn't actually moved.
- Daily authoring cycle: on a material-change day, the pipeline asks Claude (via Amazon Bedrock) for a few candidate angles, drafts a full article for the strongest one, then runs a separate compliance review pass before anything goes live.
- Compliance is a hard gate, not a suggestion: financial/investment-adjacent topics are routed to manual moderation unconditionally — that's a deterministic rule, not something an LLM call could talk its way around — and carry a standing "not financial advice" disclaimer appended to the draft itself, not just requested of the model.
- Anonymous feedback loop: readers can upvote/downvote and leave an optional comment, with no identity attached at all. A weekly job reads a week of that feedback and proposes prompt refinements — which an admin has to approve before they ever affect a future draft.
- New sources are adapters, not new pipeline code: the difference between the first data source and the third was exactly one new file plus one registry line — nothing about the core research/authoring flow itself changed to support them.
Architecture at a glance
Every piece of this runs on AWS, defined entirely in Terraform:
- Compute: a handful of Python AWS Lambda functions — one per pipeline stage, each doing one job.
- AI: Amazon Bedrock (Claude) for research summarization, drafting, compliance review, and feedback redaction.
- Storage: DynamoDB for structured data (topics, findings, articles, feedback, moderation), S3 for article bodies and raw source snapshots.
- Orchestration: EventBridge Scheduler for per-topic cadences, Step Functions for retries and a dead-letter queue on the daily cycle.
- Edge/frontend: S3 + CloudFront serving this static site, fronted by a WAF Web ACL with security response headers (CSP, HSTS, and friends) attached at the CDN layer.
- Admin surface: a separate, IAM-authenticated, IP-allowlisted API driven by a local CLI — deliberately not a public web app, since there's exactly one operator.
-
CI/CD: GitHub Actions, OIDC role federation (no
long-lived AWS keys anywhere in the repo), a two-environment
branch/release model — free-to-break
dev, a gated, approval-requiredproductionrelease.
Why this project
It was a chance to design and build a real, multi-service AWS system end to end — not a tutorial project — and make deliberate, defensible calls at each layer: when to gate on cost versus correctness, where a rule has to be deterministic rather than "the model probably won't," how to keep a public feedback feature genuinely anonymous rather than anonymous-in-name-only, and how to keep infrastructure changes reviewable and reversible instead of applied by hand. It's also, deliberately, a disposable one: this is a personal project, not a production service, and the Terms of Service say so plainly — it can be reset or taken down at any time.