I wanted a way to share a curated weekly AI newsletter with colleagues. The idea: throughout the week, I come across interesting AI news (model releases, funding rounds, policy changes, papers) and I wanted to collect them casually and publish a polished newsletter every Monday.
I didn’t want to spend Sunday evenings formatting HTML. I wanted something I could feed news to from my phone, and have it generate a ready-to-publish newsletter on demand.
The flow is conversational:
- During the week: I spot interesting AI news and drop links into a WhatsApp self-chat
- Midweek: I can ask for a preview of what’s collected so far
- Sunday evening: I say “publish” and the agent combines my picks with web search results, generates the newsletter, and I push it to GitHub
- Monday morning: I review the PR, merge, and Netlify auto-deploys
No YAML files to edit. No scripts to run. Just WhatsApp messages.
Why OpenClaw?
I initially sketched out a custom Python pipeline: web search collectors, a Claude-powered curation layer, Jinja2 templates. Maybe 500 lines across a dozen files.
Then I looked at OpenClaw. It’s an open-source, self-hosted AI agent that connects to messaging apps and can run tools, remember context, and execute tasks. The key realization: OpenClaw could replace that entire pipeline with a single “skill”, a markdown file that teaches the agent what to do.
The tradeoff is maturity. OpenClaw is very new, and I hit plenty of rough edges. But for a personal project where I control the environment, the WhatsApp-native interaction model was worth it.
Setting Up AWS Lightsail
Why Not My Laptop?
OpenClaw runs with broad system permissions: file access, command execution, app interaction. Security researchers found over 30,000 exposed instances in a two-week scan, and there was a “ClawJacked” vulnerability where a malicious website could hijack a locally running agent. A cloud VM isolates all of that from my personal data.
Plus, the agent needs to be always-on to accept news items whenever I find them.
The Setup
AWS launched an OpenClaw blueprint for Lightsail in early March 2026, making this nearly one-click:
- Create instance: Lightsail console → Create instance → Linux/Unix → OpenClaw blueprint → 4 GB RAM plan (~$16/month)
- Pick a region: I chose
eu-west-1(Ireland), closest to Belgium - Enable Bedrock: Run the setup script from the Getting Started tab in AWS CloudShell. This creates the IAM role for Bedrock access
- Anthropic form: Bedrock requires a one-time use case submission for Anthropic models. Submit and wait ~15 minutes
One thing to watch: if you just created your AWS account, Lightsail might not be available immediately.
Security Choices
During SSH setup, OpenClaw asks about security. What I chose:
- File & folder protection: Enabled (default). Config and tokens only readable by my user
- Browser remote control: Disabled. No need for browser automation
- Exec host policy: Sandbox (default). All commands run inside an isolated Docker container
- Shell command approval: Allow, since the sandbox isolates everything anyway
The sandbox is the critical layer here. Even if the agent does something unexpected, it can’t touch the host.
Connecting WhatsApp
The setup itself is simple:
openclaw plugins enable whatsapp
openclaw gateway restart
openclaw channels login
Scan the QR code with WhatsApp → Settings → Linked Devices → Link a Device. Done.
The Self-Chat Safety
Here’s something I learned the hard way: by default, OpenClaw responds to messages in all your WhatsApp chats. It started replying on my behalf in conversations with friends and colleagues. Not great.
To fix this:
openclaw config set channels.whatsapp.selfChatMode true
openclaw config set channels.whatsapp.dmPolicy allowlist
openclaw config set channels.whatsapp.allowFrom '[]'
openclaw gateway restart
Now it only responds in the “Message yourself” chat. The docs actually recommend a separate phone number (WhatsApp Business on the same device works), which is probably the right long-term move.
Enable selfChatMode before anything else.
The Newsletter Skill
An OpenClaw skill is a folder with a SKILL.md file: YAML frontmatter plus markdown instructions. No SDK, no compilation. You’re writing a detailed playbook that teaches the agent how to do a job.
~/.openclaw/workspace/skills/ai-newsletter/
├── SKILL.md
├── collected_items.jsonl
├── output/
│ └── 2026-03-14.md
└── templates/
└── newsletter_template.html
Three Modes
Drop links into WhatsApp. The agent automatically parses metadata, extracts dates, and appends them to your collection.
Text "Generate newsletter" for an immediate text-based grouping of shared items. No web search delay, just a quick pulse check.
Triggers deep web search, AI-driven deduplication, and HTML/Markdown generation. Ready for a final review and git push.
Hugo Integration
My site runs on Hugo with Netlify deploys. I added a /newsletter/ section with a list page showing all weeks (latest first) and individual pages with categorized news cards in a dark theme matching the rest of the site.
Each newsletter is a markdown file with structured frontmatter:
---
title: "AI Weekly: OpenAI Acquires Promptfoo & Yann LeCun Raises $1B"
date: 2026-03-14
week_start: "2026-03-08"
week_end: "2026-03-14"
draft: false
highlights:
- "OpenAI snaps up AI security testing firm Promptfoo"
- "Yann LeCun's startup raises $1B for world-model AI"
news:
- category: "Models & Releases"
color: "#3b82f6"
items:
- title: "BitNet: 100B-Param Model Runs on Laptop CPUs"
summary:
- "Microsoft's 1-bit quantization enables 100B-param inference on consumer CPUs"
- "Open-sourced on GitHub with 330+ upvotes on Hacker News"
url: "https://github.com/microsoft/BitNet"
---
I have a custom css template that renders this into styled newsletter pages automatically.
The Git Push Problem
The biggest technical annoyance was getting the agent to push to GitHub. The sandbox isolates the agent from the host filesystem, so git credentials on the host aren’t accessible inside the container. Push commands fail with “could not read Username.”
I tried several approaches: bind-mounting credentials, a webhook-triggered push script, a file watcher with inotifywait. Each added complexity for marginal gain.
The solution I landed on was the simplest: the agent writes the markdown file to an output directory, and I run a one-line script via SSH.
~/push-newsletter.sh 2026-03-14 ~/.openclaw/workspace/skills/ai-newsletter/output/2026-03-14.md
Things I Learned
Writing a playbook for an agent is different from programming. You need to be explicit, add constraints, and include "Rules" for what not to do.
The Docker sandbox is critical for security but creates friction with host access like Git credentials. Plan for this isolation from day one.
Complex pipelines hit the 5-minute limit. Keep steps focused—dropping extra sources (Reddit/ArXiv) in favor of deep web search fixed it.
WhatsApp chats fill context windows quickly. Compaction helps, but using disk storage (JSONL) for raw data is more reliable than chat memory.
The most effective version is the simplest: share in, web search gap-fill, and markdown out. Complexity can wait for future iterations.
What’s Next
- Automated scheduling: use OpenClaw’s cron to trigger the publish pipeline every Sunday evening
- Separate WhatsApp number: cleaner separation from personal chats
- RSS feed integration: auto-ingest from specific newsletters and blogs
- Full automation: once the sandbox/git-push friction is resolved upstream
For now, the semi-automated flow works well. About 2 minutes during the week dropping items into WhatsApp, 5 minutes on Sunday reviewing and publishing. Good trade for a polished weekly newsletter.
You can see the result at deepakbaby.in/newsletter.
Discussion