AI Newsletter Digest improvements: fixed QP soft line break decoding, URL extraction, and content cleaning
This commit is contained in:
70
automations/ai-newsletter-digest/TEMPLATE.md
Normal file
70
automations/ai-newsletter-digest/TEMPLATE.md
Normal file
@@ -0,0 +1,70 @@
|
||||
# AI Newsletter Digest Template
|
||||
|
||||
This is the proper format for AI newsletter digests, matching the quality of the OpenClaw Daily Digest.
|
||||
|
||||
## Required Elements
|
||||
|
||||
### Header
|
||||
- Date (formatted nicely)
|
||||
- Count of newsletters analyzed
|
||||
- List of sources
|
||||
|
||||
### Each Story Should Include:
|
||||
1. **Headline** — Clear, descriptive title
|
||||
2. **Source** — Which newsletter it came from
|
||||
3. **What happened** — 2-3 sentences summarizing the key news
|
||||
4. **Why it matters** — Context on significance
|
||||
5. **Links** — ALL clickable URLs to read more (CRITICAL - always include these!)
|
||||
|
||||
### Format Example:
|
||||
|
||||
```
|
||||
🤖 AI NEWSLETTER DIGEST — Wednesday, March 4, 2026
|
||||
Your synthesized briefing from 7 AI newsletters
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
📊 TODAY'S OVERVIEW
|
||||
═══════════════════════════════════════════════════════════
|
||||
• 7 Newsletters Analyzed
|
||||
• 3 Major Stories: Pentagon/AI politics, Copyright law, Model releases
|
||||
• 4 Sources: The Rundown AI, AI Secret, AI Valley, The Deep View
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
🔥 TOP STORIES
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📌 OpenAI's Pentagon Deal Backlash
|
||||
Source: The Rundown AI, AI Valley, The Deep View
|
||||
|
||||
What happened: [2-3 sentence summary of the news]
|
||||
|
||||
Why it matters: [Context on significance]
|
||||
|
||||
Link: [URL]
|
||||
```
|
||||
|
||||
## What NOT to do (Current broken format):
|
||||
|
||||
❌ Just list newsletter names and headlines
|
||||
❌ No summaries or context
|
||||
❌ No links to click
|
||||
❌ No "why it matters" explanations
|
||||
|
||||
## Implementation Notes
|
||||
|
||||
The current digest uses:
|
||||
- `parse-emails.py` — Extracts content from emails
|
||||
- `format-digest.py` — Formats into readable digest
|
||||
|
||||
Future enhancement: Use LLM to:
|
||||
1. Synthesize similar stories from multiple sources
|
||||
2. Extract key quotes
|
||||
3. Generate "why it matters" context
|
||||
4. Group related stories together
|
||||
|
||||
## Files
|
||||
|
||||
- `/automations/ai-newsletter-digest/daily-digest.sh` — Main script
|
||||
- `/automations/ai-newsletter-digest/parse-emails.py` — Email parser
|
||||
- `/automations/ai-newsletter-digest/format-digest.py` — Digest formatter
|
||||
- `/automations/ai-newsletter-digest/TEMPLATE.md` — This file
|
||||
@@ -1,38 +1,40 @@
|
||||
#!/bin/bash
|
||||
# Daily AI Newsletter Digest - Fast Reliable Version
|
||||
set -e
|
||||
# Daily AI Newsletter Digest - Enhanced with LLM Summarization
|
||||
# Creates properly formatted digests with AI-powered summarization
|
||||
|
||||
EMAIL_SKILL="/home/openclaw/.openclaw/workspace/skills/imap-smtp-email"
|
||||
OUTPUT_FILE="/tmp/ai-newsletter-emails.json"
|
||||
SCRIPT_DIR="/home/openclaw/.openclaw/workspace/skills/imap-smtp-email"
|
||||
CHECK_SCRIPT="$SCRIPT_DIR/scripts/check-anthonymau-email.js"
|
||||
DIGEST_DIR="/home/openclaw/.openclaw/workspace/automations/ai-newsletter-digest"
|
||||
|
||||
echo "🤖 Daily AI Newsletter Digest" >&2
|
||||
echo "============================================================" >&2
|
||||
echo "🤖 Daily AI Newsletter Digest (Enhanced)" >&2
|
||||
echo "$(date)" >&2
|
||||
echo "" >&2
|
||||
|
||||
echo "🔍 Searching for AI newsletters from last 48 hours..." >&2
|
||||
cd "$SCRIPT_DIR"
|
||||
|
||||
# Single search for all recent emails, then filter locally
|
||||
cd "$EMAIL_SKILL"
|
||||
echo "🔍 Checking for AI newsletters..." >&2
|
||||
|
||||
# Get recent emails and filter for AI newsletters (expanded to 48h and more sources)
|
||||
ALL_EMAILS=$(node scripts/imap.js search --recent 48h --limit 100 2>/dev/null | jq '[.[] | select(.from | test("AI Valley|AI Secret|DeepView|Deep View|The Rundown|TLDR|Benedict|aivalley|aisecret|deepview|therundown|tldr|benedict"; "i"))]' 2>/dev/null || echo "[]")
|
||||
RESULT=$(NODE_TLS_REJECT_UNAUTHORIZED=0 timeout 60 node "$CHECK_SCRIPT" 2>&1)
|
||||
|
||||
# Save results
|
||||
echo "$ALL_EMAILS" > "$OUTPUT_FILE"
|
||||
AI_COUNT=$(echo "$RESULT" | grep "^AI_COUNT:" | cut -d: -f2)
|
||||
|
||||
EMAIL_COUNT=$(echo "$ALL_EMAILS" | jq '. | length')
|
||||
echo "" >&2
|
||||
echo "🎯 Found $EMAIL_COUNT AI-related emails" >&2
|
||||
|
||||
if [ "$EMAIL_COUNT" -eq 0 ]; then
|
||||
echo "No new AI newsletters in the last 24 hours." >&2
|
||||
echo "[]"
|
||||
if [ -z "$AI_COUNT" ] || [ "$AI_COUNT" = "0" ]; then
|
||||
echo "No AI newsletters found" >&2
|
||||
echo "🤖 No AI newsletters today. Check back tomorrow!"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "" >&2
|
||||
echo "📧 Ready to process $EMAIL_COUNT newsletters" >&2
|
||||
echo "Found $AI_COUNT newsletters" >&2
|
||||
|
||||
# Output the emails
|
||||
cat "$OUTPUT_FILE"
|
||||
# Write result to temp file for Python parsing
|
||||
TMPFILE=$(mktemp)
|
||||
echo "$RESULT" > "$TMPFILE"
|
||||
|
||||
# Parse AI_EMAIL / AI_CONTENT pairs with improved content extraction
|
||||
PARSED=$(python3 "$DIGEST_DIR/parse-emails.py" "$TMPFILE")
|
||||
|
||||
echo "🧠 Generating LLM-powered summary..." >&2
|
||||
|
||||
# Use LLM to summarize (or fallback to basic formatting)
|
||||
echo "$PARSED" | python3 "$DIGEST_DIR/summarize.py"
|
||||
|
||||
rm -f "$TMPFILE"
|
||||
@@ -0,0 +1,85 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>OpenClaw Daily Digest</title>
|
||||
</head>
|
||||
<body style="margin: 0; padding: 20px; background-color: #1a1a2e; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;">
|
||||
<table role="presentation" cellpadding="0" cellspacing="0" width="100%" style="max-width: 680px; margin: 0 auto; background-color: #0f0f1a; border-radius: 16px; box-shadow: 0 20px 60px rgba(0,0,0,0.4);">
|
||||
<!-- Header -->
|
||||
<tr>
|
||||
<td style="background: linear-gradient(135deg, #ff6b6b 0%, #ee5a24 50%, #ff9f43 100%); padding: 40px 30px; text-align: center; border-radius: 16px 16px 0 0;">
|
||||
<table role="presentation" cellpadding="0" cellspacing="0" width="100%">
|
||||
<tr>
|
||||
<td style="text-align: center;">
|
||||
<span style="font-size: 56px; display: block; margin-bottom: 12px;">🦀</span>
|
||||
<h1 style="font-size: 32px; font-weight: 800; color: #ffffff; margin: 0; text-shadow: 2px 2px 4px rgba(0,0,0,0.2); letter-spacing: -0.5px;">OpenClaw Daily</h1>
|
||||
<p style="color: rgba(255,255,255,0.9); font-size: 15px; margin: 8px 0 0 0; font-weight: 500;">The best OpenClaw discussions, curated daily</p>
|
||||
<table role="presentation" cellpadding="0" cellspacing="0" style="margin: 20px auto 0 auto;">
|
||||
<tr>
|
||||
<td style="background-color: rgba(255,255,255,0.2); padding: 8px 20px; border-radius: 30px; border: 1px solid rgba(255,255,255,0.3);">
|
||||
<span style="font-size: 14px; font-weight: 600; color: #ffffff;">{{DATE}}</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Stats Bar -->
|
||||
<tr>
|
||||
<td style="background-color: #1a1a2e; padding: 25px 30px; border-bottom: 1px solid #2a2a3e;">
|
||||
<table role="presentation" cellpadding="0" cellspacing="0" width="100%">
|
||||
<tr>
|
||||
<td width="33%" style="text-align: center;">
|
||||
<span style="font-size: 28px; font-weight: 800; color: #ff6b6b;">{{REDDIT_COUNT}}</span>
|
||||
<p style="font-size: 12px; color: #888; text-transform: uppercase; letter-spacing: 1px; margin: 4px 0 0 0;">Reddit</p>
|
||||
</td>
|
||||
<td width="33%" style="text-align: center;">
|
||||
<span style="font-size: 28px; font-weight: 800; color: #ff6b6b;">{{NEWS_COUNT}}</span>
|
||||
<p style="font-size: 12px; color: #888; text-transform: uppercase; letter-spacing: 1px; margin: 4px 0 0 0;">News</p>
|
||||
</td>
|
||||
<td width="33%" style="text-align: center;">
|
||||
<span style="font-size: 28px; font-weight: 800; color: #ff6b6b;">{{TWITTER_COUNT}}</span>
|
||||
<p style="font-size: 12px; color: #888; text-transform: uppercase; letter-spacing: 1px; margin: 4px 0 0 0;">X/Twitter</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Content -->
|
||||
<tr>
|
||||
<td style="padding: 35px 30px;">
|
||||
{{CONTENT}}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Footer -->
|
||||
<tr>
|
||||
<td style="background-color: #0a0a12; padding: 30px; text-align: center; border-top: 1px solid #2a2a3e; border-radius: 0 0 16px 16px;">
|
||||
<table role="presentation" cellpadding="0" cellspacing="0" style="margin: 0 auto;">
|
||||
<tr>
|
||||
<td style="width: 60px; height: 60px; background: linear-gradient(135deg, #ff6b6b, #ff9f43); border-radius: 50%; text-align: center; vertical-align: middle;">
|
||||
<span style="font-size: 28px;">🦀</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="font-size: 16px; color: #ffffff; font-weight: 600; margin: 15px 0 5px 0;">Curated daily for Anthony Martin</p>
|
||||
<p style="font-size: 13px; color: #888; margin: 0;">by Krilly the Crab</p>
|
||||
<table role="presentation" cellpadding="0" cellspacing="0" style="margin: 20px auto 0 auto;">
|
||||
<tr>
|
||||
<td style="padding: 0 10px;"><a href="https://github.com/openclaw/openclaw" style="color: #74b9ff; text-decoration: none; font-size: 13px;">GitHub</a></td>
|
||||
<td style="padding: 0 10px;"><a href="https://reddit.com/r/openclaw" style="color: #74b9ff; text-decoration: none; font-size: 13px;">Reddit</a></td>
|
||||
<td style="padding: 0 10px;"><a href="https://docs.openclaw.ai" style="color: #74b9ff; text-decoration: none; font-size: 13px;">Docs</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="font-size: 11px; color: #555; margin-top: 20px;">{{TIMESTAMP}} • Perth, Australia (AWST)</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
550
automations/ai-newsletter-digest/email-template.html
Normal file
550
automations/ai-newsletter-digest/email-template.html
Normal file
@@ -0,0 +1,550 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>OpenClaw Daily Digest</title>
|
||||
<style>
|
||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
|
||||
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
|
||||
color: #e4e4e4;
|
||||
line-height: 1.6;
|
||||
padding: 20px;
|
||||
}
|
||||
.container {
|
||||
max-width: 680px;
|
||||
margin: 0 auto;
|
||||
background: #0f0f1a;
|
||||
border-radius: 16px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 20px 60px rgba(0,0,0,0.4);
|
||||
}
|
||||
/* Header */
|
||||
.header {
|
||||
background: linear-gradient(135deg, #ff6b6b 0%, #ee5a24 50%, #ff9f43 100%);
|
||||
padding: 40px 30px;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
.header::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: -50%;
|
||||
left: -50%;
|
||||
width: 200%;
|
||||
height: 200%;
|
||||
background: radial-gradient(circle, rgba(255,255,255,0.1) 1px, transparent 1px);
|
||||
background-size: 20px 20px;
|
||||
opacity: 0.3;
|
||||
}
|
||||
.crab-emoji {
|
||||
font-size: 56px;
|
||||
margin-bottom: 12px;
|
||||
display: block;
|
||||
animation: float 3s ease-in-out infinite;
|
||||
}
|
||||
@keyframes float {
|
||||
0%, 100% { transform: translateY(0); }
|
||||
50% { transform: translateY(-8px); }
|
||||
}
|
||||
.header h1 {
|
||||
font-size: 32px;
|
||||
font-weight: 800;
|
||||
color: #fff;
|
||||
text-shadow: 2px 2px 4px rgba(0,0,0,0.2);
|
||||
letter-spacing: -0.5px;
|
||||
}
|
||||
.header .tagline {
|
||||
color: rgba(255,255,255,0.9);
|
||||
font-size: 15px;
|
||||
margin-top: 8px;
|
||||
font-weight: 500;
|
||||
}
|
||||
.date-pill {
|
||||
display: inline-block;
|
||||
background: rgba(255,255,255,0.2);
|
||||
backdrop-filter: blur(10px);
|
||||
padding: 8px 20px;
|
||||
border-radius: 30px;
|
||||
margin-top: 20px;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
color: #fff;
|
||||
border: 1px solid rgba(255,255,255,0.3);
|
||||
}
|
||||
/* Stats Bar */
|
||||
.stats-bar {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 40px;
|
||||
padding: 25px 30px;
|
||||
background: #1a1a2e;
|
||||
border-bottom: 1px solid #2a2a3e;
|
||||
}
|
||||
.stat {
|
||||
text-align: center;
|
||||
}
|
||||
.stat-number {
|
||||
font-size: 28px;
|
||||
font-weight: 800;
|
||||
background: linear-gradient(135deg, #ff6b6b, #ff9f43);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
background-clip: text;
|
||||
}
|
||||
.stat-label {
|
||||
font-size: 12px;
|
||||
color: #888;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
margin-top: 4px;
|
||||
}
|
||||
/* Content */
|
||||
.content {
|
||||
padding: 35px 30px;
|
||||
}
|
||||
/* Section Headers */
|
||||
.section {
|
||||
margin-bottom: 35px;
|
||||
}
|
||||
.section-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
margin-bottom: 20px;
|
||||
padding-bottom: 12px;
|
||||
border-bottom: 2px solid #2a2a3e;
|
||||
}
|
||||
.section-icon {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 20px;
|
||||
}
|
||||
.reddit-icon { background: linear-gradient(135deg, #ff4500, #ff6347); }
|
||||
.hackernews-icon { background: linear-gradient(135deg, #ff6600, #ff8533); }
|
||||
.twitter-icon { background: linear-gradient(135deg, #1da1f2, #0d8bd9); }
|
||||
.section-title {
|
||||
font-size: 20px;
|
||||
font-weight: 700;
|
||||
color: #fff;
|
||||
}
|
||||
/* Cards */
|
||||
.card {
|
||||
background: linear-gradient(145deg, #1a1a2e 0%, #151525 100%);
|
||||
border-radius: 12px;
|
||||
padding: 20px;
|
||||
margin-bottom: 16px;
|
||||
border: 1px solid #2a2a3e;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
.card:hover {
|
||||
border-color: #ff6b6b;
|
||||
transform: translateX(4px);
|
||||
}
|
||||
.card-title {
|
||||
font-size: 15px;
|
||||
font-weight: 600;
|
||||
color: #fff;
|
||||
margin-bottom: 10px;
|
||||
line-height: 1.5;
|
||||
}
|
||||
.card-title a {
|
||||
color: #74b9ff;
|
||||
text-decoration: none;
|
||||
transition: color 0.2s;
|
||||
}
|
||||
.card-title a:hover {
|
||||
color: #ff6b6b;
|
||||
}
|
||||
.card-meta {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 15px;
|
||||
font-size: 13px;
|
||||
color: #888;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.author {
|
||||
color: #a29bfe;
|
||||
font-weight: 500;
|
||||
}
|
||||
.badge {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
padding: 4px 10px;
|
||||
border-radius: 20px;
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
}
|
||||
.badge-upvotes {
|
||||
background: rgba(255, 107, 107, 0.15);
|
||||
color: #ff6b6b;
|
||||
}
|
||||
.badge-comments {
|
||||
background: rgba(116, 185, 255, 0.15);
|
||||
color: #74b9ff;
|
||||
}
|
||||
.card-excerpt {
|
||||
font-size: 14px;
|
||||
color: #aaa;
|
||||
margin-top: 12px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
/* Coming Soon Banner */
|
||||
.coming-soon {
|
||||
background: linear-gradient(135deg, #2d3436 0%, #1a1a2e 100%);
|
||||
border: 2px dashed #444;
|
||||
border-radius: 12px;
|
||||
padding: 30px;
|
||||
text-align: center;
|
||||
color: #888;
|
||||
}
|
||||
.coming-soon-icon {
|
||||
font-size: 36px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
/* Footer */
|
||||
.footer {
|
||||
background: #0a0a12;
|
||||
padding: 30px;
|
||||
text-align: center;
|
||||
border-top: 1px solid #2a2a3e;
|
||||
}
|
||||
.footer-avatar {
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
background: linear-gradient(135deg, #ff6b6b, #ff9f43);
|
||||
border-radius: 50%;
|
||||
margin: 0 auto 15px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 28px;
|
||||
}
|
||||
.footer-text {
|
||||
font-size: 16px;
|
||||
color: #fff;
|
||||
font-weight: 600;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
.footer-subtext {
|
||||
font-size: 13px;
|
||||
color: #888;
|
||||
}
|
||||
.footer-links {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 20px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
.footer-links a {
|
||||
color: #74b9ff;
|
||||
text-decoration: none;
|
||||
font-size: 13px;
|
||||
transition: color 0.2s;
|
||||
}
|
||||
.footer-links a:hover {
|
||||
color: #ff6b6b;
|
||||
}
|
||||
.timestamp {
|
||||
font-size: 11px;
|
||||
color: #555;
|
||||
margin-top: 20px;
|
||||
}
|
||||
/* Mobile */
|
||||
@media (max-width: 640px) {
|
||||
body { padding: 10px; }
|
||||
.header { padding: 30px 20px; }
|
||||
.header h1 { font-size: 26px; }
|
||||
.stats-bar { gap: 25px; padding: 20px; }
|
||||
.content { padding: 25px 20px; }
|
||||
.card { padding: 16px; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<!-- Header -->
|
||||
<div class="header">
|
||||
<span class="crab-emoji">🦀</span>
|
||||
<h1>OpenClaw Daily</h1>
|
||||
<p class="tagline">The best OpenClaw discussions, curated daily</p>
|
||||
<div class="date-pill">Sunday, March 1, 2026</div>
|
||||
</div>
|
||||
|
||||
<!-- Stats -->
|
||||
<div class="stats-bar">
|
||||
<div class="stat">
|
||||
<div class="stat-number">24</div>
|
||||
<div class="stat-label">Reddit</div>
|
||||
</div>
|
||||
<div class="stat">
|
||||
<div class="stat-number">9</div>
|
||||
<div class="stat-label">News</div>
|
||||
</div>
|
||||
<div class="stat">
|
||||
<div class="stat-number">0</div>
|
||||
<div class="stat-label">X/Twitter</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Content -->
|
||||
<div class="content">
|
||||
<!-- Reddit Section -->
|
||||
<div class="section">
|
||||
<div class="section-header">
|
||||
<div class="section-icon reddit-icon">🔥</div>
|
||||
<h2 class="section-title">Reddit Highlights</h2>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://reddit.com/r/openclaw/comments/1rhxaj1/openclaw_usecases_to_make_life_easier_11k_stars/">
|
||||
Openclaw Usecases to Make life easier. 11k+ Stars Github Repo
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="author">u/HuckleberryEntire699</span>
|
||||
<span class="badge badge-upvotes">↑ 74</span>
|
||||
<span class="badge badge-comments">💬 6</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://reddit.com/r/openclaw/comments/1rhrtr2/to_the_many_people_here_wondering_about_local_models/">
|
||||
To the many people here wondering about local models… just use an API
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="author">u/Valuable-Run2129</span>
|
||||
<span class="badge badge-upvotes">↑ 64</span>
|
||||
<span class="badge badge-comments">💬 51</span>
|
||||
</div>
|
||||
<div class="card-excerpt">I've read many posts in the past days of newbies asking about what computer they need to use Open Claw locally. Ironically some ask it as a solution...</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://reddit.com/r/openclaw/comments/1rhwu6h/openclaw_is_very_buggy/">
|
||||
Openclaw is very buggy
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="author">u/Ok-Profession-2143</span>
|
||||
<span class="badge badge-upvotes">↑ 48</span>
|
||||
<span class="badge badge-comments">💬 69</span>
|
||||
</div>
|
||||
<div class="card-excerpt">I don't understand why everyone is crazy about openclaw. Its super buggy. You cannot change models easily. When you update it gets stuck etc etc.</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://reddit.com/r/openclaw/comments/1ri9nt0/me_every_time_i_touch_the_openclawjson/">
|
||||
Me, every time I touch the openclaw.json
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="author">u/Patient_Lie_9310</span>
|
||||
<span class="badge badge-upvotes">↑ 33</span>
|
||||
<span class="badge badge-comments">💬 13</span>
|
||||
</div>
|
||||
<div class="card-excerpt">It's always followed by errors and hunting for the stuff I broke.</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://reddit.com/r/openclaw/comments/1rhzht7/i_built_a_voice_assistant_with_openclaw_alexa/">
|
||||
I built a voice assistant with OpenClaw + Alexa + Local LLM (Ollama) — here's how
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="author">u/cormazacl</span>
|
||||
<span class="badge badge-upvotes">↑ 29</span>
|
||||
<span class="badge badge-comments">💬 10</span>
|
||||
</div>
|
||||
<div class="card-excerpt">Hey everyone! I've been building a voice-first assistant using OpenClaw as the brain, and wanted to share what I've got working so far.</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://reddit.com/r/openclaw/comments/1rhwhv6/does_openclaw_make_sense_without_claude_max/">
|
||||
Does OpenClaw make sense without Claude Max?
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="author">u/btwiz</span>
|
||||
<span class="badge badge-upvotes">↑ 17</span>
|
||||
<span class="badge badge-comments">💬 26</span>
|
||||
</div>
|
||||
<div class="card-excerpt">I don't have any max accounts (no OAuth tokens), so I have to use API keys. Just setting up OpenClaw, I blew through $10 of OpenRouter credits...</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://reddit.com/r/openclaw/comments/1ri3i9p/openclaw_gogcli_google_account_suspension/">
|
||||
OpenClaw + GogCLI = Google Account Suspension
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="author">u/Admir-Rusidovic</span>
|
||||
<span class="badge badge-upvotes">↑ 11</span>
|
||||
<span class="badge badge-comments">💬 20</span>
|
||||
</div>
|
||||
<div class="card-excerpt">Over the last couple of days, I experimented with integrating Google Docs and Gmail into my OpenClaw instance. The goal was simple...</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://reddit.com/r/openclaw/comments/1ri2zh4/my_ai_agent_has_made_the_same_lie_12x_in_25_days/">
|
||||
My AI agent has made the same lie 12x in 25 days... all same root cause, rules don't fix it
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="author">u/fartpsychic</span>
|
||||
<span class="badge badge-upvotes">↑ 5</span>
|
||||
<span class="badge badge-comments">💬 23</span>
|
||||
</div>
|
||||
<div class="card-excerpt">I run a multi-agent setup on OpenClaw (Claude Opus). My orchestration agent, Bob, has a consistent failure mode: optimizing for appearing competent...</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Hacker News Section -->
|
||||
<div class="section">
|
||||
<div class="section-header">
|
||||
<div class="section-icon hackernews-icon">🟧</div>
|
||||
<h2 class="section-title">News & Hacker News</h2>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://justaniceguy.ai/posts/001-building-jarvis">
|
||||
Building Jarvis – Parallel Tool-Calling Voice Agent Layer on Top of OpenClaw
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="badge badge-upvotes">↑ 3</span>
|
||||
<span class="badge badge-comments">💬 1</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://janhoon.com/blog/building-with-an-ai-that-remembers/">
|
||||
Building with an AI that remembers – A blog by my OpenClaw Assistant
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="badge badge-upvotes">↑ 2</span>
|
||||
<span class="badge badge-comments">💬 1</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://usplus.ai/">
|
||||
Show HN: Usplus.ai – Build an AI-Native Company with Agents in your Org Chart
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="badge badge-upvotes">↑ 2</span>
|
||||
<span class="badge badge-comments">💬 1</span>
|
||||
</div>
|
||||
<div class="card-excerpt">Hey HN, I'm the founder of usplus.ai, and I've been building this for a while now in San Diego. The core idea: What if you...</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://clawapis.com/">
|
||||
X402 based pay-as-you-go Twitter API and helius/solscan API for your OpenClaw
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="badge badge-upvotes">↑ 1</span>
|
||||
<span class="badge badge-comments">💬 1</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://github.com/swarmclawai/swarmclaw">
|
||||
Show HN: SwarmClaw – Orchestration dashboard for OpenClaw and AI agents
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="badge badge-upvotes">↑ 2</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://github.com/Enriquefft/openclaw-kapso-whatsapp">
|
||||
Show HN: OpenClaw-kapso, Give OpenClaw a stable WhatsApp number
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="badge badge-upvotes">↑ 2</span>
|
||||
</div>
|
||||
<div class="card-excerpt">Built an OpenClaw plugin that gives your agent a WhatsApp number through the official Cloud API via Kapso.</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://openclawdirectory.co.uk/">
|
||||
Show HN: OpenClaw Directory – Compare Deployers, Skills, and Tools for OpenClaw
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="badge badge-upvotes">↑ 1</span>
|
||||
</div>
|
||||
<div class="card-excerpt">Discover the essential OpenClaw tools, including deployers, skills, hosting, and plugins, along with direct links to test them out.</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://openclaw.ai/blog/virustotal-partnership">
|
||||
OpenClaw Partners with VirusTotal for Skill Security
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="badge badge-upvotes">↑ 1</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Twitter Section -->
|
||||
<div class="section">
|
||||
<div class="section-header">
|
||||
<div class="section-icon twitter-icon">𝕏</div>
|
||||
<h2 class="section-title">From X</h2>
|
||||
</div>
|
||||
<div class="coming-soon">
|
||||
<div class="coming-soon-icon">🚧</div>
|
||||
<p>X/Twitter integration coming soon</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
<div class="footer">
|
||||
<div class="footer-avatar">🦀</div>
|
||||
<div class="footer-text">Curated daily for Anthony Martin</div>
|
||||
<div class="footer-subtext">by Krilly the Crab</div>
|
||||
<div class="footer-links">
|
||||
<a href="https://github.com/openclaw/openclaw">GitHub</a>
|
||||
<a href="https://reddit.com/r/openclaw">Reddit</a>
|
||||
<a href="https://docs.openclaw.ai">Docs</a>
|
||||
</div>
|
||||
<div class="timestamp">2026-03-01 • Perth, Australia (AWST)</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
107
automations/ai-newsletter-digest/format-digest.py
Normal file
107
automations/ai-newsletter-digest/format-digest.py
Normal file
@@ -0,0 +1,107 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
AI Newsletter Digest - Enhanced Version
|
||||
Creates properly summarized digests like the OpenClaw Daily Digest
|
||||
"""
|
||||
import json
|
||||
import sys
|
||||
import re
|
||||
from datetime import datetime
|
||||
|
||||
def format_digest(newsletters_json):
|
||||
"""Format newsletters into a proper digest with summaries."""
|
||||
|
||||
newsletters = json.loads(newsletters_json)
|
||||
|
||||
# Group by source
|
||||
by_source = {}
|
||||
for nl in newsletters:
|
||||
source = nl['from'].split('<')[0].strip()
|
||||
if source not in by_source:
|
||||
by_source[source] = []
|
||||
by_source[source].append(nl)
|
||||
|
||||
# Build digest
|
||||
lines = [
|
||||
"🤖 **AI NEWSLETTER DIGEST — {date}**",
|
||||
"Your synthesized briefing from {count} AI newsletters",
|
||||
"",
|
||||
"═" * 60,
|
||||
"📊 TODAY'S OVERVIEW",
|
||||
"═" * 60,
|
||||
"• {count} Newsletters Analyzed",
|
||||
"• Sources: {sources}",
|
||||
"",
|
||||
"═" * 60,
|
||||
"🔥 TOP STORIES",
|
||||
"═" * 60,
|
||||
""
|
||||
]
|
||||
|
||||
# Format date
|
||||
date_str = datetime.now().strftime("%A, %B %d, %Y")
|
||||
sources_str = ", ".join(by_source.keys())
|
||||
|
||||
digest = "\n".join(lines).format(
|
||||
date=date_str,
|
||||
count=len(newsletters),
|
||||
sources=sources_str
|
||||
)
|
||||
|
||||
# Add each newsletter with proper formatting
|
||||
for i, nl in enumerate(newsletters, 1):
|
||||
source = nl['from'].split('<')[0].strip()
|
||||
subject = nl['subject']
|
||||
content = nl.get('content', '')[:800] # First 800 chars
|
||||
urls = nl.get('urls', [])
|
||||
|
||||
# Clean up content
|
||||
content = re.sub(r'\s+', ' ', content)
|
||||
content = content.replace('= ', '').replace('=20', ' ')
|
||||
|
||||
# Extract key sentence
|
||||
key_sentence = ""
|
||||
sentences = content.split('.')
|
||||
for s in sentences[:3]:
|
||||
if len(s.strip()) > 50:
|
||||
key_sentence = s.strip() + "."
|
||||
break
|
||||
|
||||
digest += f"\n📌 **{subject}**\n"
|
||||
digest += f" Source: {source}\n"
|
||||
if key_sentence:
|
||||
digest += f" \n {key_sentence}\n"
|
||||
|
||||
# Include ALL URLs found
|
||||
if urls:
|
||||
digest += f" \n 🔗 Links:\n"
|
||||
for url in urls[:3]: # Max 3 links
|
||||
digest += f" • {url}\n"
|
||||
|
||||
digest += "\n---\n"
|
||||
|
||||
digest += "\n🦀 Krilly the Crab | AI Newsletter Digest\n"
|
||||
digest += f"Generated: {datetime.now().strftime('%A, %B %d, %Y — %I:%M %p AWST')}\n"
|
||||
|
||||
return digest
|
||||
|
||||
def main():
|
||||
"""Read JSON from stdin and output formatted digest."""
|
||||
if len(sys.argv) > 1:
|
||||
# Read from file
|
||||
with open(sys.argv[1], 'r') as f:
|
||||
data = f.read()
|
||||
else:
|
||||
# Read from stdin
|
||||
data = sys.stdin.read()
|
||||
|
||||
try:
|
||||
digest = format_digest(data)
|
||||
print(digest)
|
||||
except Exception as e:
|
||||
print(f"Error formatting digest: {e}", file=sys.stderr)
|
||||
# Fallback: just print the raw data
|
||||
print(data)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
225
automations/ai-newsletter-digest/parse-emails.py
Normal file
225
automations/ai-newsletter-digest/parse-emails.py
Normal file
@@ -0,0 +1,225 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Parse AI_EMAIL / AI_CONTENT pairs from imap check script output."""
|
||||
import sys
|
||||
import json
|
||||
import re
|
||||
|
||||
# Senders to exclude
|
||||
BLOCKLIST = [
|
||||
'googlenews-noreply@google.com',
|
||||
]
|
||||
|
||||
# URL patterns to skip (ads, tracking, social, email)
|
||||
URL_SKIP = re.compile(
|
||||
r'unsubscribe|mailto|twitter\.com|instagram\.com|facebook\.com|'
|
||||
r'youtube\.com/unsubscribe|youtube\.com/channel|'
|
||||
r'utm_source=dlvr|utm_medium=email|'
|
||||
r'genstore|typeform|pigment\.com|maton\.ai|'
|
||||
r'youtu\.be|medium\.com/@|linkedin\.com/posts|'
|
||||
r'cdn-cgi|imageproxy',
|
||||
re.IGNORECASE
|
||||
)
|
||||
|
||||
def decode_subject(subject):
|
||||
try:
|
||||
from email.header import decode_header
|
||||
parts = decode_header(subject)
|
||||
decoded = ''
|
||||
for part, charset in parts:
|
||||
if isinstance(part, bytes):
|
||||
decoded += part.decode(charset or 'utf-8', errors='replace')
|
||||
else:
|
||||
decoded += part
|
||||
return decoded.strip()
|
||||
except Exception:
|
||||
return subject.strip()
|
||||
|
||||
def decode_qp(content):
|
||||
"""Decode quoted-printable content before URL extraction."""
|
||||
# First decode soft line breaks (the main issue) - must be first!
|
||||
# Match = followed by newline (any type)
|
||||
content = re.sub(r'=\r?\n', '', content)
|
||||
content = re.sub(r'=20', '', content) # Remove =20 (space) encoding
|
||||
|
||||
# More aggressive: remove any = followed by lowercase letter and space
|
||||
content = re.sub(r'=[a-z] ', '', content)
|
||||
content = re.sub(r'=[a-z]$', '', content, flags=re.MULTILINE)
|
||||
|
||||
def qp_decode(m):
|
||||
try:
|
||||
return bytes.fromhex(m.group(1)).decode('utf-8', errors='replace')
|
||||
except Exception:
|
||||
return m.group(0)
|
||||
|
||||
# Decode quoted-printable hex codes
|
||||
content = re.sub(r'=([0-9A-Fa-f]{2})', qp_decode, content)
|
||||
|
||||
# Clean up any remaining = in URLs
|
||||
content = content.replace('=', '')
|
||||
|
||||
return content
|
||||
|
||||
def extract_urls(content):
|
||||
"""Extract clean article URLs from email content (after full QP decoding)."""
|
||||
# Decode QP FIRST - this is the key fix
|
||||
content = decode_qp(content)
|
||||
|
||||
# Also extract markdown-style links: [text](https://...)
|
||||
markdown_urls = re.findall(r'\[([^\]]+)\]\((https?://[^\s"<>)\]\']+)\)', content)
|
||||
|
||||
# Extract regular URLs
|
||||
urls = re.findall(r'https?://[^\s"<>)\]\']+', content)
|
||||
|
||||
seen = set()
|
||||
clean = []
|
||||
|
||||
# First add markdown URLs (they tend to be cleaner)
|
||||
for text, url in markdown_urls:
|
||||
if url not in seen and not URL_SKIP.search(url):
|
||||
# Clean tracking
|
||||
url = re.sub(r'[?&]utm_[^&]+', '', url)
|
||||
url = re.sub(r'[?&]_bhlid=\w+', '', url)
|
||||
url = re.sub(r'[?&]jwt_token=\w+', '', url)
|
||||
url = re.sub(r'[?&]ref=[^&]+', '', url)
|
||||
url = url.rstrip('.,;)\'"')
|
||||
if len(url) > 15 and not any(x in url.lower() for x in ['.jpg', '.png', '.gif', '.jpeg', '.svg', '/cdn-cgi/']):
|
||||
seen.add(url)
|
||||
clean.append(url)
|
||||
|
||||
# Then add regular URLs
|
||||
for url in urls:
|
||||
url = url.rstrip('.,;)\'"')
|
||||
|
||||
# Skip tracking-heavy URLs
|
||||
if URL_SKIP.search(url):
|
||||
continue
|
||||
|
||||
# Clean up common tracking garbage
|
||||
url = re.sub(r'[?&]utm_[^&]+', '', url)
|
||||
url = re.sub(r'[?&]_bhlid=\w+', '', url)
|
||||
url = re.sub(r'[?&]jwt_token=\w+', '', url)
|
||||
url = re.sub(r'[?&]ref=[^&]+', '', url)
|
||||
url = url.rstrip('.,;)\'"')
|
||||
|
||||
# Must be reasonably long to be a real article
|
||||
if len(url) > 15 and url not in seen:
|
||||
# Also skip image/video URLs
|
||||
if any(x in url.lower() for x in ['.jpg', '.png', '.gif', '.jpeg', '.svg', '/image/', '/cdn-cgi/', '/media/', '/assets/']):
|
||||
continue
|
||||
seen.add(url)
|
||||
clean.append(url)
|
||||
|
||||
return clean[:5]
|
||||
|
||||
def clean_content(content):
|
||||
"""Best-effort text extraction from messy email body."""
|
||||
# Decode QP
|
||||
content = decode_qp(content)
|
||||
|
||||
# Remove HTML tags
|
||||
content = re.sub(r'<[^>]+>', ' ', content)
|
||||
|
||||
# Remove email formatting artifacts
|
||||
content = re.sub(r'\[\[.*?\]\]', ' ', content) # [[markup]]
|
||||
content = re.sub(r'\{\{.*?\}\}', ' ', content) # {{markup}}
|
||||
content = re.sub(r'\{\|\|.*?\|\|\}', ' ', content) # {||markup||}
|
||||
content = re.sub(r'\^[^\^]+\^', ' ', content) # ^markup^
|
||||
content = re.sub(r'~~[^~]+~~', ' ', content) # ~~markup~~
|
||||
content = re.sub(r'__[^_]+__', ' ', content) # __markup__
|
||||
|
||||
# Remove base64/encoded blocks
|
||||
content = re.sub(r'[A-Za-z0-9+/]{60,}', '', content)
|
||||
|
||||
# Convert markdown links to just text
|
||||
content = re.sub(r'\[([^\]]+)\]\([^\)]+\)', r'\1', content)
|
||||
|
||||
# Clean up whitespace
|
||||
content = re.sub(r'[ \t]+', ' ', content)
|
||||
content = re.sub(r'\n{3,}', '\n\n', content)
|
||||
|
||||
# Split into lines and filter - be LESS aggressive
|
||||
lines = [l.strip() for l in content.split('\n')]
|
||||
|
||||
# Filter out noise lines
|
||||
noise_patterns = [
|
||||
r'^[-=_\*\^|>.@#]+$', # Separator lines
|
||||
r'^read online$',
|
||||
r'^sign up$',
|
||||
r'^advertise$',
|
||||
r'^sponsor$',
|
||||
r'^view all$',
|
||||
r'^ unsubscribe$',
|
||||
r'^\d+ more$',
|
||||
]
|
||||
|
||||
filtered = []
|
||||
for line in lines:
|
||||
if len(line) < 20:
|
||||
continue
|
||||
if re.match(r'^[\W_]+\s*[\W_]+$', line):
|
||||
continue
|
||||
skip = False
|
||||
for pattern in noise_patterns:
|
||||
if re.match(pattern, line, re.IGNORECASE):
|
||||
skip = True
|
||||
break
|
||||
if not skip:
|
||||
filtered.append(line[:300])
|
||||
|
||||
result = '\n'.join(filtered)
|
||||
|
||||
# Final cleanup
|
||||
result = re.sub(r'^\s*(by|from|to|subject|date):.*$', '', result, flags=re.IGNORECASE | re.MULTILINE)
|
||||
|
||||
return result[:3000].strip()
|
||||
|
||||
def is_blocked(sender):
|
||||
return any(b in sender.lower() for b in BLOCKLIST)
|
||||
|
||||
if len(sys.argv) < 2:
|
||||
print("[]")
|
||||
sys.exit(0)
|
||||
|
||||
with open(sys.argv[1], 'r', errors='replace') as f:
|
||||
text = f.read()
|
||||
|
||||
# Split into structured records
|
||||
emails = []
|
||||
current_from = None
|
||||
current_subject = None
|
||||
content_lines = []
|
||||
in_content = False
|
||||
|
||||
for line in text.split('\n'):
|
||||
if line.startswith('AI_EMAIL:'):
|
||||
if current_from and in_content and not is_blocked(current_from):
|
||||
raw = '\n'.join(content_lines)
|
||||
emails.append({
|
||||
'from': current_from,
|
||||
'subject': decode_subject(current_subject),
|
||||
'urls': extract_urls(raw),
|
||||
'content': clean_content(raw)
|
||||
})
|
||||
meta = line[9:]
|
||||
parts = meta.split(' | ', 1)
|
||||
current_from = parts[0].strip()
|
||||
current_subject = parts[1].strip() if len(parts) > 1 else ''
|
||||
content_lines = []
|
||||
in_content = False
|
||||
elif line.startswith('AI_CONTENT:') and current_from:
|
||||
content_lines = [line[12:]] # strip prefix
|
||||
in_content = True
|
||||
elif in_content and not line.startswith(('STATUS:', 'TOTAL:', 'LAST_UID:', 'RECENT:', 'AI_COUNT:')):
|
||||
content_lines.append(line)
|
||||
|
||||
# Last one
|
||||
if current_from and in_content and not is_blocked(current_from):
|
||||
raw = '\n'.join(content_lines)
|
||||
emails.append({
|
||||
'from': current_from,
|
||||
'subject': decode_subject(current_subject),
|
||||
'urls': extract_urls(raw),
|
||||
'content': clean_content(raw)
|
||||
})
|
||||
|
||||
print(json.dumps(emails, indent=2))
|
||||
225
automations/ai-newsletter-digest/parse-emails.py.bak
Normal file
225
automations/ai-newsletter-digest/parse-emails.py.bak
Normal file
@@ -0,0 +1,225 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Parse AI_EMAIL / AI_CONTENT pairs from imap check script output."""
|
||||
import sys
|
||||
import json
|
||||
import re
|
||||
|
||||
# Senders to exclude
|
||||
BLOCKLIST = [
|
||||
'googlenews-noreply@google.com',
|
||||
]
|
||||
|
||||
# URL patterns to skip (ads, tracking, social, email)
|
||||
URL_SKIP = re.compile(
|
||||
r'unsubscribe|mailto|twitter\.com|instagram\.com|facebook\.com|'
|
||||
r'youtube\.com/unsubscribe|youtube\.com/channel|'
|
||||
r'utm_source=dlvr|utm_medium=email|'
|
||||
r'genstore|typeform|pigment\.com|maton\.ai|'
|
||||
r'youtu\.be|medium\.com/@|linkedin\.com/posts|'
|
||||
r'cdn-cgi|imageproxy',
|
||||
re.IGNORECASE
|
||||
)
|
||||
|
||||
def decode_subject(subject):
|
||||
try:
|
||||
from email.header import decode_header
|
||||
parts = decode_header(subject)
|
||||
decoded = ''
|
||||
for part, charset in parts:
|
||||
if isinstance(part, bytes):
|
||||
decoded += part.decode(charset or 'utf-8', errors='replace')
|
||||
else:
|
||||
decoded += part
|
||||
return decoded.strip()
|
||||
except Exception:
|
||||
return subject.strip()
|
||||
|
||||
def decode_qp(content):
|
||||
"""Decode quoted-printable content before URL extraction."""
|
||||
# First decode soft line breaks (the main issue) - must be first!
|
||||
# Match = followed by newline (any type)
|
||||
content = re.sub(r'=\r?\n', '', content)
|
||||
content = re.sub(r'=20', '', content) # Remove =20 (space) encoding
|
||||
|
||||
# More aggressive: remove any = followed by lowercase letter and space
|
||||
content = re.sub(r'=[a-z] ', '', content)
|
||||
content = re.sub(r'=[a-z]$', '', content, flags=re.MULTILINE)
|
||||
|
||||
def qp_decode(m):
|
||||
try:
|
||||
return bytes.fromhex(m.group(1)).decode('utf-8', errors='replace')
|
||||
except Exception:
|
||||
return m.group(0)
|
||||
|
||||
# Decode quoted-printable hex codes
|
||||
content = re.sub(r'=([0-9A-Fa-f]{2})', qp_decode, content)
|
||||
|
||||
# Clean up any remaining = in URLs
|
||||
content = content.replace('=', '')
|
||||
|
||||
return content
|
||||
|
||||
def extract_urls(content):
|
||||
"""Extract clean article URLs from email content (after full QP decoding)."""
|
||||
# Decode QP FIRST - this is the key fix
|
||||
content = decode_qp(content)
|
||||
|
||||
# Also extract markdown-style links: [text](https://...)
|
||||
markdown_urls = re.findall(r'\[([^\]]+)\]\((https?://[^\s"<>)\]\']+)\)', content)
|
||||
|
||||
# Extract regular URLs
|
||||
urls = re.findall(r'https?://[^\s"<>)\]\']+', content)
|
||||
|
||||
seen = set()
|
||||
clean = []
|
||||
|
||||
# First add markdown URLs (they tend to be cleaner)
|
||||
for text, url in markdown_urls:
|
||||
if url not in seen and not URL_SKIP.search(url):
|
||||
# Clean tracking
|
||||
url = re.sub(r'[?&]utm_[^&]+', '', url)
|
||||
url = re.sub(r'[?&]_bhlid=\w+', '', url)
|
||||
url = re.sub(r'[?&]jwt_token=\w+', '', url)
|
||||
url = re.sub(r'[?&]ref=[^&]+', '', url)
|
||||
url = url.rstrip('.,;)\'"')
|
||||
if len(url) > 15 and not any(x in url.lower() for x in ['.jpg', '.png', '.gif', '.jpeg', '.svg', '/cdn-cgi/']):
|
||||
seen.add(url)
|
||||
clean.append(url)
|
||||
|
||||
# Then add regular URLs
|
||||
for url in urls:
|
||||
url = url.rstrip('.,;)\'"')
|
||||
|
||||
# Skip tracking-heavy URLs
|
||||
if URL_SKIP.search(url):
|
||||
continue
|
||||
|
||||
# Clean up common tracking garbage
|
||||
url = re.sub(r'[?&]utm_[^&]+', '', url)
|
||||
url = re.sub(r'[?&]_bhlid=\w+', '', url)
|
||||
url = re.sub(r'[?&]jwt_token=\w+', '', url)
|
||||
url = re.sub(r'[?&]ref=[^&]+', '', url)
|
||||
url = url.rstrip('.,;)\'"')
|
||||
|
||||
# Must be reasonably long to be a real article
|
||||
if len(url) > 15 and url not in seen:
|
||||
# Also skip image/video URLs
|
||||
if any(x in url.lower() for x in ['.jpg', '.png', '.gif', '.jpeg', '.svg', '/image/', '/cdn-cgi/', '/media/', '/assets/']):
|
||||
continue
|
||||
seen.add(url)
|
||||
clean.append(url)
|
||||
|
||||
return clean[:5]
|
||||
|
||||
def clean_content(content):
|
||||
"""Best-effort text extraction from messy email body."""
|
||||
# Decode QP
|
||||
content = decode_qp(content)
|
||||
|
||||
# Remove HTML tags
|
||||
content = re.sub(r'<[^>]+>', ' ', content)
|
||||
|
||||
# Remove email formatting artifacts
|
||||
content = re.sub(r'\[\[.*?\]\]', ' ', content) # [[markup]]
|
||||
content = re.sub(r'\{\{.*?\}\}', ' ', content) # {{markup}}
|
||||
content = re.sub(r'\{\|\|.*?\|\|\}', ' ', content) # {||markup||}
|
||||
content = re.sub(r'\^[^\^]+\^', ' ', content) # ^markup^
|
||||
content = re.sub(r'~~[^~]+~~', ' ', content) # ~~markup~~
|
||||
content = re.sub(r'__[^_]+__', ' ', content) # __markup__
|
||||
|
||||
# Remove base64/encoded blocks
|
||||
content = re.sub(r'[A-Za-z0-9+/]{60,}', '', content)
|
||||
|
||||
# Convert markdown links to just text
|
||||
content = re.sub(r'\[([^\]]+)\]\([^\)]+\)', r'\1', content)
|
||||
|
||||
# Clean up whitespace
|
||||
content = re.sub(r'[ \t]+', ' ', content)
|
||||
content = re.sub(r'\n{3,}', '\n\n', content)
|
||||
|
||||
# Split into lines and filter - be LESS aggressive
|
||||
lines = [l.strip() for l in content.split('\n')]
|
||||
|
||||
# Filter out noise lines
|
||||
noise_patterns = [
|
||||
r'^[-=_\*\^|>.@#]+$', # Separator lines
|
||||
r'^read online$',
|
||||
r'^sign up$',
|
||||
r'^advertise$',
|
||||
r'^sponsor$',
|
||||
r'^view all$',
|
||||
r'^ unsubscribe$',
|
||||
r'^\d+ more$',
|
||||
]
|
||||
|
||||
filtered = []
|
||||
for line in lines:
|
||||
if len(line) < 20:
|
||||
continue
|
||||
if re.match(r'^[\W_]+\s*[\W_]+$', line):
|
||||
continue
|
||||
skip = False
|
||||
for pattern in noise_patterns:
|
||||
if re.match(pattern, line, re.IGNORECASE):
|
||||
skip = True
|
||||
break
|
||||
if not skip:
|
||||
filtered.append(line[:300])
|
||||
|
||||
result = '\n'.join(filtered)
|
||||
|
||||
# Final cleanup
|
||||
result = re.sub(r'^\s*(by|from|to|subject|date):.*$', '', result, flags=re.IGNORECASE | re.MULTILINE)
|
||||
|
||||
return result[:3000].strip()
|
||||
|
||||
def is_blocked(sender):
|
||||
return any(b in sender.lower() for b in BLOCKLIST)
|
||||
|
||||
if len(sys.argv) < 2:
|
||||
print("[]")
|
||||
sys.exit(0)
|
||||
|
||||
with open(sys.argv[1], 'r', errors='replace') as f:
|
||||
text = f.read()
|
||||
|
||||
# Split into structured records
|
||||
emails = []
|
||||
current_from = None
|
||||
current_subject = None
|
||||
content_lines = []
|
||||
in_content = False
|
||||
|
||||
for line in text.split('\n'):
|
||||
if line.startswith('AI_EMAIL:'):
|
||||
if current_from and in_content and not is_blocked(current_from):
|
||||
raw = '\n'.join(content_lines)
|
||||
emails.append({
|
||||
'from': current_from,
|
||||
'subject': decode_subject(current_subject),
|
||||
'urls': extract_urls(raw),
|
||||
'content': clean_content(raw)
|
||||
})
|
||||
meta = line[9:]
|
||||
parts = meta.split(' | ', 1)
|
||||
current_from = parts[0].strip()
|
||||
current_subject = parts[1].strip() if len(parts) > 1 else ''
|
||||
content_lines = []
|
||||
in_content = False
|
||||
elif line.startswith('AI_CONTENT:') and current_from:
|
||||
content_lines = [line[12:]] # strip prefix
|
||||
in_content = True
|
||||
elif in_content and not line.startswith(('STATUS:', 'TOTAL:', 'LAST_UID:', 'RECENT:', 'AI_COUNT:')):
|
||||
content_lines.append(line)
|
||||
|
||||
# Last one
|
||||
if current_from and in_content and not is_blocked(current_from):
|
||||
raw = '\n'.join(content_lines)
|
||||
emails.append({
|
||||
'from': current_from,
|
||||
'subject': decode_subject(current_subject),
|
||||
'urls': extract_urls(raw),
|
||||
'content': clean_content(raw)
|
||||
})
|
||||
|
||||
print(json.dumps(emails, indent=2))
|
||||
46
automations/ai-newsletter-digest/send-multi-channel.sh
Executable file
46
automations/ai-newsletter-digest/send-multi-channel.sh
Executable file
@@ -0,0 +1,46 @@
|
||||
#!/bin/bash
|
||||
# AI Newsletter Digest - Multi-Channel Sender
|
||||
# Sends digest to both Telegram and Discord
|
||||
|
||||
SCRIPT_DIR="/home/openclaw/.openclaw/workspace/automations/ai-newsletter-digest"
|
||||
DIGEST_SCRIPT="$SCRIPT_DIR/daily-digest.sh"
|
||||
|
||||
# Generate the digest
|
||||
RESULT=$($DIGEST_SCRIPT 2>/dev/null)
|
||||
|
||||
# Check if we have newsletters
|
||||
if echo "$RESULT" | grep -q '"count": 0' || echo "$RESULT" | grep -q 'No AI newsletters'; then
|
||||
echo "No newsletters to send"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Parse the digest data
|
||||
COUNT=$(echo "$RESULT" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('count',0))")
|
||||
SOURCES=$(echo "$RESULT" | python3 -c "import json,sys; d=json.load(sys.stdin); print(', '.join(d.get('sources',[])))")
|
||||
|
||||
if [ "$COUNT" -eq 0 ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Format the message
|
||||
MESSAGE="🤖 Daily AI Newsletter Digest
|
||||
|
||||
Found $COUNT AI newsletters:
|
||||
• $SOURCES
|
||||
|
||||
$(echo "$RESULT" | python3 -c "
|
||||
import json,sys
|
||||
d=json.load(sys.stdin)
|
||||
for n in d.get('newsletters',[]):
|
||||
print(f\"📧 {n.get('subject','')} - {n.get('from','')}\")
|
||||
")
|
||||
|
||||
Full analysis available - reply for details!"
|
||||
|
||||
# Send to Telegram
|
||||
openclaw message send --channel telegram --message "$MESSAGE" 2>/dev/null || echo "Telegram send failed" >&2
|
||||
|
||||
# Send to Discord (#krilly channel)
|
||||
openclaw message send --channel discord --target "#krilly" --message "$MESSAGE" 2>/dev/null || echo "Discord send failed" >&2
|
||||
|
||||
echo "Digest sent to Telegram and Discord!"
|
||||
151
automations/ai-newsletter-digest/summarize.py
Normal file
151
automations/ai-newsletter-digest/summarize.py
Normal file
@@ -0,0 +1,151 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
AI Newsletter Summarizer
|
||||
Uses LLM to synthesize and summarize newsletter content
|
||||
"""
|
||||
import json
|
||||
import sys
|
||||
import os
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
from datetime import datetime
|
||||
|
||||
def call_llm(prompt, model="kilocode/kilo/auto-free"):
|
||||
"""Call LLM via OpenClaw CLI."""
|
||||
|
||||
cmd = [
|
||||
"openclaw",
|
||||
"llm",
|
||||
"--model", model,
|
||||
"--prompt", prompt
|
||||
]
|
||||
|
||||
try:
|
||||
result = subprocess.run(
|
||||
cmd,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=120,
|
||||
cwd="/home/openclaw/.openclaw/workspace"
|
||||
)
|
||||
|
||||
if result.returncode == 0:
|
||||
return result.stdout.strip()
|
||||
else:
|
||||
print(f"LLM error: {result.stderr}", file=sys.stderr)
|
||||
return None
|
||||
except Exception as e:
|
||||
print(f"LLM call failed: {e}", file=sys.stderr)
|
||||
return None
|
||||
|
||||
def summarize_newsletters(newsletters):
|
||||
"""Use LLM to summarize newsletters into a proper digest."""
|
||||
|
||||
# Prepare newsletter content
|
||||
content_parts = []
|
||||
for i, nl in enumerate(newsletters, 1):
|
||||
source = nl.get('from', 'Unknown').split('<')[0].strip()
|
||||
subject = nl.get('subject', 'No subject')
|
||||
content = nl.get('content', '')[:1500] # Limit to ~1500 chars per newsletter
|
||||
|
||||
content_parts.append(f"""
|
||||
--- NEWSLETTER {i} ---
|
||||
Source: {source}
|
||||
Subject: {subject}
|
||||
Content: {content}
|
||||
""")
|
||||
|
||||
combined = "\n".join(content_parts)
|
||||
|
||||
prompt = f"""You are creating an AI newsletter digest for a tech-savvy reader.
|
||||
|
||||
Analyze these {len(newsletters)} AI newsletters and create a concise, informative digest.
|
||||
|
||||
{combined}
|
||||
|
||||
Create a digest with these sections:
|
||||
1. **TOP STORIES** (3-5 most important items) - Each with: headline, source, 2-3 sentence summary, why it matters
|
||||
2. **OTHER NOTABLE NEWS** - Brief mentions of other stories
|
||||
3. **KEY TAKEAWAYS** - 2-3 bullet points on patterns/trends
|
||||
|
||||
Format rules:
|
||||
- Use markdown
|
||||
- Keep each story summary to 2-3 sentences max
|
||||
- Include the source newsletter name
|
||||
- Write for someone who follows AI but wants quick briefings
|
||||
- Prioritize news with real-world impact
|
||||
|
||||
Today's date: {datetime.now().strftime('%A, %B %d, %Y')}
|
||||
|
||||
Begin your digest:"""
|
||||
|
||||
# Try using the LLM
|
||||
print("🧠 Using LLM to synthesize digest...", file=sys.stderr)
|
||||
|
||||
result = call_llm(prompt)
|
||||
|
||||
if result:
|
||||
return result
|
||||
else:
|
||||
# Fallback: return basic formatted output
|
||||
print("⚠️ LLM unavailable, using basic formatting", file=sys.stderr)
|
||||
return None
|
||||
|
||||
def create_basic_digest(newsletters):
|
||||
"""Create a basic digest without LLM (fallback)."""
|
||||
|
||||
lines = [
|
||||
f"🤖 **AI NEWSLETTER DIGEST** — {datetime.now().strftime('%A, %B %d, %Y')}",
|
||||
"",
|
||||
f"*{len(newsletters)} newsletters analyzed*",
|
||||
"",
|
||||
"═" * 50,
|
||||
"",
|
||||
]
|
||||
|
||||
for nl in newsletters:
|
||||
source = nl.get('from', 'Unknown').split('<')[0].strip()
|
||||
subject = nl.get('subject', 'No subject')
|
||||
content = nl.get('content', '')[:300]
|
||||
|
||||
# Clean up content
|
||||
content = ' '.join(content.split())[:300]
|
||||
|
||||
lines.append(f"📌 **{subject}**")
|
||||
lines.append(f" Source: {source}")
|
||||
if content:
|
||||
lines.append(f" {content}...")
|
||||
lines.append("")
|
||||
|
||||
lines.append("═" * 50)
|
||||
lines.append(f"🦀 Krilly the Crab | {datetime.now().strftime('%B %d, %Y')}")
|
||||
|
||||
return "\n".join(lines)
|
||||
|
||||
def main():
|
||||
"""Main entry point."""
|
||||
|
||||
# Read newsletters from stdin or file
|
||||
if len(sys.argv) > 1:
|
||||
with open(sys.argv[1], 'r') as f:
|
||||
newsletters = json.load(f)
|
||||
else:
|
||||
newsletters = json.load(sys.stdin)
|
||||
|
||||
if not newsletters:
|
||||
print("No newsletters to summarize")
|
||||
return
|
||||
|
||||
print(f"📊 Processing {len(newsletters)} newsletters...", file=sys.stderr)
|
||||
|
||||
# Try LLM summarization first
|
||||
digest = summarize_newsletters(newsletters)
|
||||
|
||||
if not digest:
|
||||
# Fallback to basic
|
||||
digest = create_basic_digest(newsletters)
|
||||
|
||||
print(digest)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"people": [
|
||||
{
|
||||
"name": "Adrianna\u2019s special",
|
||||
"name": "Adrianna’s special",
|
||||
"relationship": "Contact (from Google Calendar)",
|
||||
"birthday": "02-25",
|
||||
"source": "google-calendar",
|
||||
"gift_ideas": [],
|
||||
"past_gifts": [],
|
||||
"notes": "Found in Google Calendar: Adrianna\u2019s special birthday \ud83e\udd73",
|
||||
"notes": "Found in Google Calendar: Adrianna’s special birthday 🥳",
|
||||
"birth_year": 2023
|
||||
},
|
||||
{
|
||||
@@ -26,13 +26,13 @@
|
||||
"past_gifts": []
|
||||
},
|
||||
{
|
||||
"name": "Bianca\u2019s",
|
||||
"name": "Bianca’s",
|
||||
"relationship": "Contact (from Google Calendar)",
|
||||
"birthday": "02-21",
|
||||
"source": "google-calendar",
|
||||
"gift_ideas": [],
|
||||
"past_gifts": [],
|
||||
"notes": "Found in Google Calendar: Bianca\u2019s Birthday Brunch",
|
||||
"notes": "Found in Google Calendar: Bianca’s Birthday Brunch",
|
||||
"birth_year": 2021
|
||||
},
|
||||
{
|
||||
@@ -160,13 +160,13 @@
|
||||
"birth_year": 2021
|
||||
},
|
||||
{
|
||||
"name": "Kanya\u2019s",
|
||||
"name": "Kanya’s",
|
||||
"relationship": "Contact (from Google Calendar)",
|
||||
"birthday": "03-05",
|
||||
"source": "google-calendar",
|
||||
"gift_ideas": [],
|
||||
"past_gifts": [],
|
||||
"notes": "Found in Google Calendar: Kanya\u2019s birthday drinks",
|
||||
"notes": "Found in Google Calendar: Kanya’s birthday drinks",
|
||||
"birth_year": 2021
|
||||
},
|
||||
{
|
||||
@@ -176,27 +176,27 @@
|
||||
"source": "google-calendar",
|
||||
"gift_ideas": [],
|
||||
"past_gifts": [],
|
||||
"notes": "Found in Google Calendar: Kerry Milne birthday soir\u00e9e ",
|
||||
"notes": "Found in Google Calendar: Kerry Milne birthday soirée ",
|
||||
"birth_year": 2023
|
||||
},
|
||||
{
|
||||
"name": "Lee\u2019s",
|
||||
"name": "Lee’s",
|
||||
"relationship": "Contact (from Google Calendar)",
|
||||
"birthday": "02-18",
|
||||
"source": "google-calendar",
|
||||
"gift_ideas": [],
|
||||
"past_gifts": [],
|
||||
"notes": "Found in Google Calendar: Lee\u2019s birthday Drinks",
|
||||
"notes": "Found in Google Calendar: Lee’s birthday Drinks",
|
||||
"birth_year": 2023
|
||||
},
|
||||
{
|
||||
"name": "Martin (Kristy\u2019s)",
|
||||
"name": "Martin (Kristy’s)",
|
||||
"relationship": "Contact (from Google Calendar)",
|
||||
"birthday": "11-01",
|
||||
"source": "google-calendar",
|
||||
"gift_ideas": [],
|
||||
"past_gifts": [],
|
||||
"notes": "Found in Google Calendar: Martin (Kristy\u2019s) Birthday lunch ",
|
||||
"notes": "Found in Google Calendar: Martin (Kristy’s) Birthday lunch ",
|
||||
"birth_year": 2020
|
||||
},
|
||||
{
|
||||
@@ -238,6 +238,126 @@
|
||||
"past_gifts": [],
|
||||
"notes": "Found in Google Calendar: Simon te Brinke's birthday celebrations",
|
||||
"birth_year": 2024
|
||||
},
|
||||
{
|
||||
"name": "Pick up Alex",
|
||||
"relationship": "Contact (from Google Calendar)",
|
||||
"birthday": "07-06",
|
||||
"source": "google-calendar",
|
||||
"gift_ideas": [],
|
||||
"past_gifts": [],
|
||||
"notes": "Found in Google Calendar: Pick up Alex's birthday cake",
|
||||
"birth_year": 2025
|
||||
},
|
||||
{
|
||||
"name": "Terry’s 50th",
|
||||
"relationship": "Contact (from Google Calendar)",
|
||||
"birthday": "01-18",
|
||||
"source": "google-calendar",
|
||||
"gift_ideas": [],
|
||||
"past_gifts": [],
|
||||
"notes": "Found in Google Calendar: Terry’s 50th birthday",
|
||||
"birth_year": 2020
|
||||
},
|
||||
{
|
||||
"name": "JK 40th",
|
||||
"relationship": "Contact (from Google Calendar)",
|
||||
"birthday": "09-19",
|
||||
"source": "google-calendar",
|
||||
"gift_ideas": [],
|
||||
"past_gifts": [],
|
||||
"notes": "Found in Google Calendar: JK's 40th Birthday Zoom Champagne Sundowner!",
|
||||
"birth_year": 2020
|
||||
},
|
||||
{
|
||||
"name": "By Justin a",
|
||||
"relationship": "Contact (from Google Calendar)",
|
||||
"birthday": "11-23",
|
||||
"source": "google-calendar",
|
||||
"gift_ideas": [],
|
||||
"past_gifts": [],
|
||||
"notes": "Found in Google Calendar: By Justin a birthday present",
|
||||
"birth_year": 2019
|
||||
},
|
||||
{
|
||||
"name": "Georga Stewart 30th",
|
||||
"relationship": "Contact (from Google Calendar)",
|
||||
"birthday": "10-12",
|
||||
"source": "google-calendar",
|
||||
"gift_ideas": [],
|
||||
"past_gifts": [],
|
||||
"notes": "Found in Google Calendar: Georga Stewart's 30th birthday party",
|
||||
"birth_year": 2019
|
||||
},
|
||||
{
|
||||
"name": "Jamie’s Good Friday",
|
||||
"relationship": "Contact (from Google Calendar)",
|
||||
"birthday": "03-29",
|
||||
"source": "google-calendar",
|
||||
"gift_ideas": [],
|
||||
"past_gifts": [],
|
||||
"notes": "Found in Google Calendar: Jamie’s Good Friday Birthday Cruise",
|
||||
"birth_year": 2024
|
||||
},
|
||||
{
|
||||
"name": "Jackie Cash",
|
||||
"relationship": "Contact (from Google Calendar)",
|
||||
"birthday": "09-25",
|
||||
"source": "google-calendar",
|
||||
"gift_ideas": [],
|
||||
"past_gifts": [],
|
||||
"notes": "Found in Google Calendar: Jackie Cash Birthday Drinks 🥳",
|
||||
"birth_year": 2022
|
||||
},
|
||||
{
|
||||
"name": "Jackie R’s",
|
||||
"relationship": "Contact (from Google Calendar)",
|
||||
"birthday": "09-19",
|
||||
"source": "google-calendar",
|
||||
"gift_ideas": [],
|
||||
"past_gifts": [],
|
||||
"notes": "Found in Google Calendar: Jackie R’s birthday",
|
||||
"birth_year": 2021
|
||||
},
|
||||
{
|
||||
"name": "Anthony",
|
||||
"relationship": "Contact (from Google Calendar)",
|
||||
"birthday": "02-05",
|
||||
"source": "google-calendar",
|
||||
"gift_ideas": [],
|
||||
"past_gifts": [],
|
||||
"notes": "Found in Google Calendar: Anthony birthday lunch",
|
||||
"birth_year": 2023
|
||||
},
|
||||
{
|
||||
"name": "Pick up Elizabeth",
|
||||
"relationship": "Contact (from Google Calendar)",
|
||||
"birthday": "09-20",
|
||||
"source": "google-calendar",
|
||||
"gift_ideas": [],
|
||||
"past_gifts": [],
|
||||
"notes": "Found in Google Calendar: Pick up Elizabeth's birthday cake",
|
||||
"birth_year": 2025
|
||||
},
|
||||
{
|
||||
"name": "Jackie 50th",
|
||||
"relationship": "Contact (from Google Calendar)",
|
||||
"birthday": "09-22",
|
||||
"source": "google-calendar",
|
||||
"gift_ideas": [],
|
||||
"past_gifts": [],
|
||||
"notes": "Found in Google Calendar: Jackie 50th Birthday Drinks 🥳",
|
||||
"birth_year": 2024
|
||||
},
|
||||
{
|
||||
"name": "Mums",
|
||||
"relationship": "Contact (from Google Calendar)",
|
||||
"birthday": "06-04",
|
||||
"source": "google-calendar",
|
||||
"gift_ideas": [],
|
||||
"past_gifts": [],
|
||||
"notes": "Found in Google Calendar: Mums birthday ",
|
||||
"birth_year": 2023
|
||||
}
|
||||
],
|
||||
"settings": {
|
||||
@@ -245,4 +365,4 @@
|
||||
"reminder_days_before": 7,
|
||||
"reminder_day_of": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -99,13 +99,13 @@ build_digest() {
|
||||
[[ -z "$line" ]] && continue
|
||||
|
||||
# Check if this is a title line (starts with [)
|
||||
if [[ "$line" =~ ^\[.*\].*:.*$ ]]; then
|
||||
if [[ "$line" =~ ^\[.+Z\].*\]\ (.*)$ ]]; then
|
||||
# Save previous article if exists
|
||||
if [[ -n "$current_title" ]]; then
|
||||
local score
|
||||
score=$(score_article "$current_title" "$current_source" "$current_cats")
|
||||
|
||||
local article_formatted="• *${current_source}*: ${current_title}\n ${current_url}\n"
|
||||
local article_formatted="• [${current_title}](${current_url}) \n _${current_source}_\n"
|
||||
|
||||
if ((score >= 5)); then
|
||||
must_read+="$article_formatted\n"
|
||||
@@ -116,16 +116,16 @@ build_digest() {
|
||||
((total_count++))
|
||||
fi
|
||||
|
||||
# Parse new article
|
||||
# Parse new article - format: [timestamp] [source] title
|
||||
current_date=$(echo "$line" | sed 's/^\[\([^]]*\)\].*/\1/')
|
||||
current_source=$(echo "$line" | sed 's/^\[[^]]*\] \([^:]*\):.*/\1/')
|
||||
current_title=$(echo "$line" | sed 's/^\[[^]]*\] [^:]*: //')
|
||||
current_source=$(echo "$line" | sed -E 's/^\[.+Z\] \[([^]]+)\].*/\1/')
|
||||
current_title=$(echo "$line" | sed -E 's/^\[.+Z\] \[[^]]+\] //')
|
||||
current_url=""
|
||||
current_cats=""
|
||||
|
||||
# Check if this is a URL line
|
||||
elif [[ "$line" =~ ^https?:// ]]; then
|
||||
current_url="$line"
|
||||
elif [[ "$line" =~ ^[[:space:]]*https?:// ]]; then
|
||||
current_url="$(echo "$line" | xargs)"
|
||||
|
||||
# Check if this is categories line
|
||||
elif [[ "$line" =~ ^Categories:\ ]]; then
|
||||
@@ -138,7 +138,7 @@ build_digest() {
|
||||
local score
|
||||
score=$(score_article "$current_title" "$current_source" "$current_cats")
|
||||
|
||||
local article_formatted="• *${current_source}*: ${current_title}\n ${current_url}\n"
|
||||
local article_formatted="• [${current_title}](${current_url}) \n _${current_source}_\n"
|
||||
|
||||
if ((score >= 5)); then
|
||||
must_read+="$article_formatted\n"
|
||||
@@ -149,16 +149,24 @@ build_digest() {
|
||||
((total_count++))
|
||||
fi
|
||||
|
||||
# Limit items per section to keep message under Telegram's 4096 char limit
|
||||
local must_read_limited="$(echo -e "$must_read" | head -n 16)" # ~8 items (2 lines each)
|
||||
local skimmable_limited="$(echo -e "$skimmable" | head -n 10)" # ~5 items (2 lines each)
|
||||
|
||||
# Build final message
|
||||
output="📰 *FreshRSS Daily Digest*\n\n"
|
||||
output+="Found *$total_count* unread articles.\n\n"
|
||||
|
||||
if [[ -n "$must_read" ]]; then
|
||||
output+="🔥 *Must Read*\n$must_read\n"
|
||||
local count_must=$(($(echo -e "$must_read" | grep -c '^•') + 0))
|
||||
output+="🔥 *Must Read* ($count_must)\n$must_read_limited"
|
||||
[[ "$must_read" != "$must_read_limited" ]] && output+="\n _...and more_\n\n" || output+="\n"
|
||||
fi
|
||||
|
||||
if [[ -n "$skimmable" ]]; then
|
||||
output+="📎 *Skimmable*\n$skimmable\n"
|
||||
local count_skim=$(($(echo -e "$skimmable" | grep -c '^•') + 0))
|
||||
output+="📎 *Skimmable* ($count_skim)\n$skimmable_limited"
|
||||
[[ "$skimmable" != "$skimmable_limited" ]] && output+="\n _...and more_\n\n" || output+="\n"
|
||||
fi
|
||||
|
||||
if [[ -z "$must_read" && -z "$skimmable" ]]; then
|
||||
@@ -167,6 +175,11 @@ build_digest() {
|
||||
|
||||
output+="\n📖 [Open FreshRSS]($FRESHRSS_URL)"
|
||||
|
||||
# Truncate if still too long (Telegram limit is 4096)
|
||||
if [[ ${#output} -gt 4000 ]]; then
|
||||
output="${output:0:3950}...\n\n_(truncated — more articles in FreshRSS)_\n\n📖 [Open FreshRSS]($FRESHRSS_URL)"
|
||||
fi
|
||||
|
||||
echo -e "$output"
|
||||
}
|
||||
|
||||
|
||||
Binary file not shown.
465
automations/openclaw-digest/aggregate.py
Normal file
465
automations/openclaw-digest/aggregate.py
Normal file
@@ -0,0 +1,465 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Enhanced Content Aggregation for OpenClaw Daily Digest
|
||||
Features: topic tags, read time, trending detection, color-coded sources, LLM summaries
|
||||
"""
|
||||
|
||||
import json
|
||||
import sys
|
||||
import os
|
||||
import re
|
||||
import hashlib
|
||||
from datetime import datetime, timedelta
|
||||
from typing import List, Dict, Any, Tuple
|
||||
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'sources'))
|
||||
|
||||
from reddit_fetcher import fetch_reddit_content
|
||||
from news_fetcher import fetch_news_content
|
||||
|
||||
# Topic detection keywords
|
||||
TOPIC_KEYWORDS = {
|
||||
'AI/LLMs': ['llm', 'gpt', 'claude', 'openai', 'anthropic', 'model', 'training', 'inference', 'token', 'embedding', 'fine-tune', 'rag'],
|
||||
'Coding': ['code', 'github', 'programming', 'developer', 'api', 'python', 'javascript', 'typescript', 'rust', 'go'],
|
||||
'Home Automation': ['home assistant', 'smart home', 'automation', 'zigbee', 'z-wave', 'mqtt', 'iot', 'sensor'],
|
||||
'Self-Hosting': ['self-host', 'homelab', 'server', 'docker', 'kubernetes', 'proxmox', 'nas', 'selfhosted'],
|
||||
'Hardware': ['gpu', 'nvidia', 'amd', 'cpu', 'ram', 'ssd', 'raspberry pi', 'arduino', 'esp32'],
|
||||
'Privacy': ['privacy', 'security', 'encryption', 'vpn', 'tor', 'self-hosted', 'data protection'],
|
||||
'OpenClaw': ['openclaw', 'claw', 'mcp', 'agent', 'skill', 'clawhub'],
|
||||
}
|
||||
|
||||
# User's top topics (will be updated based on clicks over time)
|
||||
TOP_TOPICS = ['AI/LLMs', 'OpenClaw', 'Coding', 'Home Automation']
|
||||
|
||||
def detect_topics(title: str, excerpt: str = '') -> List[str]:
|
||||
"""Detect topics from title and excerpt"""
|
||||
text = f"{title} {excerpt}".lower()
|
||||
topics = []
|
||||
for topic, keywords in TOPIC_KEYWORDS.items():
|
||||
if any(kw in text for kw in keywords):
|
||||
topics.append(topic)
|
||||
return topics[:3] # Max 3 topics
|
||||
|
||||
def get_topic_color(topic: str) -> str:
|
||||
"""Get color for topic tag"""
|
||||
colors = {
|
||||
'AI/LLMs': '#00d2ff',
|
||||
'Coding': '#a29bfe',
|
||||
'Home Automation': '#20b47a',
|
||||
'Self-Hosting': '#ff9f43',
|
||||
'Hardware': '#ff6b6b',
|
||||
'Privacy': '#fd79a8',
|
||||
'OpenClaw': '#ee5a24',
|
||||
}
|
||||
return colors.get(topic, '#74b9ff')
|
||||
|
||||
def estimate_read_time(url: str, excerpt: str = '') -> str:
|
||||
"""Estimate read time based on content type"""
|
||||
# Default 3 min for most content
|
||||
minutes = 3
|
||||
|
||||
# Adjust based on excerpt length
|
||||
if excerpt:
|
||||
word_count = len(excerpt.split())
|
||||
if word_count > 500:
|
||||
minutes = 8
|
||||
elif word_count > 200:
|
||||
minutes = 5
|
||||
elif word_count < 50:
|
||||
minutes = 2
|
||||
|
||||
# Check URL patterns for known quick reads
|
||||
if any(domain in url.lower() for domain in ['github.com', 'gist.github.com']):
|
||||
minutes = max(2, minutes - 1) # GitHub tends to be code-heavy
|
||||
elif 'youtube.com' in url.lower() or 'youtu.be' in url.lower():
|
||||
minutes = 10 # Videos take longer
|
||||
|
||||
return f"{minutes} min read"
|
||||
|
||||
def is_trending(story: Dict) -> bool:
|
||||
"""Detect if a story is trending (high engagement ratio)"""
|
||||
comments = story.get('num_comments', 0)
|
||||
score = story.get('score') or story.get('points', 0)
|
||||
|
||||
if score == 0:
|
||||
return False
|
||||
|
||||
# High comment-to-score ratio = hot discussion
|
||||
ratio = comments / score if score > 0 else 0
|
||||
|
||||
# Trending if:
|
||||
# - Score > 50 AND comments > 20 AND ratio > 0.3 (lots of discussion)
|
||||
# OR score > 200 (just popular)
|
||||
return (score > 50 and comments > 20 and ratio > 0.3) or score > 200
|
||||
|
||||
def get_trending_emoji(story: Dict) -> str:
|
||||
"""Get appropriate trending indicator"""
|
||||
score = story.get('score') or story.get('points', 0)
|
||||
comments = story.get('num_comments', 0)
|
||||
|
||||
if score > 500 or comments > 100:
|
||||
return "🔥🔥" # Very hot
|
||||
elif is_trending(story):
|
||||
return "🔥" # Trending
|
||||
return ""
|
||||
|
||||
def generate_quick_reply_links(story: Dict, story_id: str) -> str:
|
||||
"""Generate quick action links for Telegram/Discord"""
|
||||
url = story.get('url', '')
|
||||
title = story.get('title', '')[:50]
|
||||
|
||||
# Create deep links for quick actions
|
||||
# These would need corresponding bot handlers
|
||||
summarize_link = f"https://t.me/openclaw_bot?start=summarize_{story_id}"
|
||||
save_link = f"https://t.me/openclaw_bot?start=save_{story_id}"
|
||||
|
||||
return f'''<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin-top:12px;">
|
||||
<tr>
|
||||
<td style="padding-right:8px;">
|
||||
<a href="{summarize_link}" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#74b9ff;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">📝 Summarize</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="{save_link}" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#20b47a;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">💾 Save</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>'''
|
||||
|
||||
def deduplicate_stories(items: List[Dict]) -> List[Dict]:
|
||||
"""Remove duplicate stories based on URL similarity"""
|
||||
seen_urls = set()
|
||||
unique = []
|
||||
|
||||
for item in items:
|
||||
url = item.get('url', '').lower().split('?')[0]
|
||||
|
||||
if url in seen_urls:
|
||||
continue
|
||||
|
||||
# Title similarity check
|
||||
title = item.get('title', '').lower()
|
||||
is_duplicate = False
|
||||
for existing in unique:
|
||||
existing_title = existing.get('title', '').lower()
|
||||
title_words = set(title.split())
|
||||
existing_words = set(existing_title.split())
|
||||
if title_words and existing_words:
|
||||
overlap = len(title_words & existing_words) / max(len(title_words), len(existing_words))
|
||||
if overlap > 0.8:
|
||||
is_duplicate = True
|
||||
break
|
||||
|
||||
if not is_duplicate:
|
||||
seen_urls.add(url)
|
||||
unique.append(item)
|
||||
|
||||
return unique
|
||||
|
||||
def score_relevance(item: Dict) -> float:
|
||||
"""Score story relevance with topic boost"""
|
||||
score = 0.0
|
||||
|
||||
# Base engagement
|
||||
if 'score' in item and 'num_comments' in item:
|
||||
score += item.get('score', 0) * 0.5
|
||||
score += item.get('num_comments', 0) * 1.5
|
||||
score += item.get('upvote_ratio', 0.5) * 50
|
||||
elif 'points' in item:
|
||||
score += item.get('points', 0) * 1.0
|
||||
score += item.get('num_comments', 0) * 2.0
|
||||
else:
|
||||
score = 50.0
|
||||
|
||||
# Boost for high engagement
|
||||
if item.get('num_comments', 0) > 50 or item.get('points', 0) > 100:
|
||||
score += 100
|
||||
|
||||
# Boost for user's top topics
|
||||
topics = detect_topics(item.get('title', ''), item.get('selftext', '')[:200])
|
||||
for topic in topics:
|
||||
if topic in TOP_TOPICS:
|
||||
score += 50 # Significant boost for preferred topics
|
||||
|
||||
return score
|
||||
|
||||
def format_topic_tags(topics: List[str]) -> str:
|
||||
"""Format topic tags as styled badges"""
|
||||
if not topics:
|
||||
return ""
|
||||
|
||||
tags = []
|
||||
for topic in topics:
|
||||
color = get_topic_color(topic)
|
||||
is_top = topic in TOP_TOPICS
|
||||
border = f"border:1px solid {color};" if is_top else ""
|
||||
star = "★ " if is_top else ""
|
||||
tags.append(f'<span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:{color};margin-right:6px;margin-bottom:6px;{border}">{star}{topic}</span>')
|
||||
|
||||
return f'<p style="margin:0 0 10px 0;">{"".join(tags)}</p>'
|
||||
|
||||
def format_reddit_story(story: Dict, include_quick_actions: bool = False) -> str:
|
||||
"""Format Reddit story with all enhancements"""
|
||||
# Detect topics
|
||||
excerpt = story.get('selftext', '')[:200]
|
||||
topics = detect_topics(story.get('title', ''), excerpt)
|
||||
topic_html = format_topic_tags(topics)
|
||||
|
||||
# Read time
|
||||
read_time = estimate_read_time(story.get('url', ''), excerpt)
|
||||
|
||||
# Trending indicator
|
||||
trending = get_trending_emoji(story)
|
||||
|
||||
# Engagement badges
|
||||
engagement = []
|
||||
if story.get('score'):
|
||||
engagement.append(f"<span style='color:#ff6b6b;font-weight:600;'>↑ {story['score']}</span>")
|
||||
if story.get('num_comments'):
|
||||
engagement.append(f"<span style='color:#74b9ff;font-weight:600;'>💬 {story['num_comments']}</span>")
|
||||
engagement.append(f"<span style='color:#888;'>⏱️ {read_time}</span>")
|
||||
|
||||
# Title with flair
|
||||
flair = story.get('link_flair_text', '')
|
||||
title = story.get('title', '')
|
||||
if flair:
|
||||
title = f"[{flair}] {title}"
|
||||
|
||||
# Story hash for quick actions
|
||||
story_hash = hashlib.md5(story.get('url', '').encode()).hexdigest()[:8]
|
||||
quick_actions = generate_quick_reply_links(story, story_hash) if include_quick_actions else ""
|
||||
|
||||
# Trim excerpt
|
||||
if len(story.get('selftext', '')) > 200:
|
||||
excerpt += "..."
|
||||
excerpt_html = f"<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>{excerpt}</p>" if excerpt else ""
|
||||
|
||||
trending_html = f"<span style='margin-right:8px;'>{trending}</span>" if trending else ""
|
||||
|
||||
return f'''<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding-bottom:10px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;">Reddit</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{topic_html}
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 8px 0;">{trending_html}<a href="{story.get('url', '#')}" style="color:#74b9ff;text-decoration:none;">{title}</a></h3>
|
||||
<p style="font-size:13px;color:#888;margin:0 0 8px 0;"><span style="color:#a29bfe;font-weight:500;">u/{story.get('author', 'unknown')}</span></p>
|
||||
{excerpt_html}
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'>{' · '.join(engagement)}</p>
|
||||
{quick_actions}
|
||||
</td></tr>
|
||||
</table>'''
|
||||
|
||||
def format_news_story(story: Dict, include_quick_actions: bool = False) -> str:
|
||||
"""Format news story with all enhancements"""
|
||||
# Detect topics
|
||||
excerpt = story.get('summary', '')[:200]
|
||||
topics = detect_topics(story.get('title', ''), excerpt)
|
||||
topic_html = format_topic_tags(topics)
|
||||
|
||||
# Read time
|
||||
read_time = estimate_read_time(story.get('url', ''), excerpt)
|
||||
|
||||
# Trending indicator
|
||||
trending = get_trending_emoji(story)
|
||||
|
||||
# Source styling
|
||||
source = story.get('source', 'News')
|
||||
tag_colors = {
|
||||
'GitHub': ('#a29bfe', 'rgba(139,148,158,0.15)'),
|
||||
'Hacker News': ('#ff9f43', 'rgba(255,102,0,0.15)'),
|
||||
}
|
||||
tag_color, tag_bg = tag_colors.get(source, ('#74b9ff', 'rgba(116,185,255,0.15)'))
|
||||
|
||||
# Engagement
|
||||
engagement = []
|
||||
if story.get('points'):
|
||||
engagement.append(f"<span style='color:#ff6b6b;font-weight:600;'>↑ {story['points']}</span>")
|
||||
if story.get('num_comments'):
|
||||
engagement.append(f"<span style='color:#74b9ff;font-weight:600;'>💬 {story['num_comments']}</span>")
|
||||
engagement.append(f"<span style='color:#888;'>⏱️ {read_time}</span>")
|
||||
|
||||
# Story hash for quick actions
|
||||
story_hash = hashlib.md5(story.get('url', '').encode()).hexdigest()[:8]
|
||||
quick_actions = generate_quick_reply_links(story, story_hash) if include_quick_actions else ""
|
||||
|
||||
# Trim excerpt
|
||||
if len(story.get('summary', '')) > 200:
|
||||
excerpt += "..."
|
||||
excerpt_html = f"<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>{excerpt}</p>" if excerpt else ""
|
||||
|
||||
trending_html = f"<span style='margin-right:8px;'>{trending}</span>" if trending else ""
|
||||
|
||||
return f'''<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding-bottom:10px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:{tag_bg};color:{tag_color};">{source}</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{topic_html}
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 8px 0;">{trending_html}<a href="{story.get('url', '#')}" style="color:#74b9ff;text-decoration:none;">{story.get('title', '')}</a></h3>
|
||||
{excerpt_html}
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'>{' · '.join(engagement)}</p>
|
||||
{quick_actions}
|
||||
</td></tr>
|
||||
</table>'''
|
||||
|
||||
def format_top_topics_section() -> str:
|
||||
"""Generate top topics summary for the email"""
|
||||
topic_badges = []
|
||||
for topic in TOP_TOPICS[:4]: # Show top 4
|
||||
color = get_topic_color(topic)
|
||||
topic_badges.append(f'<span style="display:inline-block;font-size:12px;font-weight:600;padding:6px 12px;border-radius:20px;background-color:rgba(255,255,255,0.08);color:{color};margin-right:8px;border:1px solid {color}40;">★ {topic}</span>')
|
||||
|
||||
return f'''<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:rgba(255,255,255,0.03);border-radius:12px;margin-bottom:20px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:16px 20px;">
|
||||
<p style="font-size:12px;color:#888;text-transform:uppercase;letter-spacing:1px;margin:0 0 10px 0;font-weight:600;">Your Top Topics</p>
|
||||
<p style="margin:0;">{''.join(topic_badges)}</p>
|
||||
</td></tr>
|
||||
</table>'''
|
||||
|
||||
def format_story_text(story: Dict) -> str:
|
||||
"""Format a story for plain-text email"""
|
||||
lines = [f"📌 {story.get('title', '')}"]
|
||||
|
||||
# Add topics
|
||||
topics = detect_topics(story.get('title', ''), story.get('selftext', '')[:100])
|
||||
if topics:
|
||||
lines.append(f" Topics: {', '.join(topics)}")
|
||||
|
||||
lines.append(f" Link: {story.get('url', '')}")
|
||||
|
||||
if story.get('author'):
|
||||
lines.append(f" Author: {story.get('author')}")
|
||||
|
||||
# Engagement stats
|
||||
stats = []
|
||||
if story.get('score') or story.get('points'):
|
||||
stats.append(f"{story.get('score') or story.get('points', 0)} upvotes")
|
||||
if story.get('num_comments'):
|
||||
stats.append(f"{story.get('num_comments')} comments")
|
||||
stats.append(estimate_read_time(story.get('url', ''), story.get('selftext', '')))
|
||||
|
||||
if stats:
|
||||
lines.append(f" {' | '.join(stats)}")
|
||||
|
||||
# Trending
|
||||
if is_trending(story):
|
||||
lines.append(" 🔥 TRENDING")
|
||||
|
||||
excerpt = story.get('selftext', '') or story.get('summary', '')
|
||||
if excerpt:
|
||||
excerpt = excerpt[:150] + "..." if len(excerpt) > 150 else excerpt
|
||||
lines.append(f" {excerpt}")
|
||||
|
||||
lines.append("")
|
||||
return "\n".join(lines)
|
||||
|
||||
def aggregate_content(hours: int = 24) -> Dict[str, Any]:
|
||||
"""Main aggregation function with enhanced features"""
|
||||
print(f"🦀 Aggregating OpenClaw content from last {hours} hours...")
|
||||
print("=" * 50)
|
||||
|
||||
# Fetch from all sources
|
||||
print("\n📥 Fetching Reddit content...")
|
||||
reddit_data = fetch_reddit_content(hours=hours)
|
||||
|
||||
print("\n📥 Fetching news content...")
|
||||
news_data = fetch_news_content(hours=hours)
|
||||
|
||||
# Twitter placeholder
|
||||
twitter_data = {
|
||||
"source": "twitter",
|
||||
"total_items": 0,
|
||||
"tweets": [],
|
||||
"note": "X/Twitter integration requires API setup"
|
||||
}
|
||||
|
||||
# Combine all items
|
||||
all_items = []
|
||||
all_items.extend([{**item, '_source': 'reddit'} for item in reddit_data.get('all_posts', [])])
|
||||
all_items.extend([{**item, '_source': 'news'} for item in news_data.get('all_items', [])])
|
||||
|
||||
# Deduplicate
|
||||
print("\n🧹 Deduplicating stories...")
|
||||
unique_items = deduplicate_stories(all_items)
|
||||
print(f" Removed {len(all_items) - len(unique_items)} duplicates")
|
||||
|
||||
# Sort by relevance (includes topic boosting)
|
||||
unique_items.sort(key=score_relevance, reverse=True)
|
||||
|
||||
# Split back into sections
|
||||
reddit_top = [item for item in unique_items if item.get('_source') == 'reddit'][:8]
|
||||
news_top = [item for item in unique_items if item.get('_source') == 'news'][:8]
|
||||
|
||||
# Count trending
|
||||
trending_count = sum(1 for item in unique_items if is_trending(item))
|
||||
|
||||
# Generate HTML sections
|
||||
top_topics_html = format_top_topics_section()
|
||||
reddit_html = '\n'.join([format_reddit_story(s, include_quick_actions=True) for s in reddit_top])
|
||||
news_html = '\n'.join([format_news_story(s, include_quick_actions=True) for s in news_top])
|
||||
twitter_html = '<p style="text-align:center;color:#888;padding:30px 0;">🚧 X/Twitter integration coming soon</p>'
|
||||
|
||||
# Generate text sections
|
||||
reddit_text = '\n'.join([format_story_text(s) for s in reddit_top]) if reddit_top else "No new Reddit posts today."
|
||||
news_text = '\n'.join([format_story_text(s) for s in news_top]) if news_top else "No new news articles today."
|
||||
twitter_text = "🚧 X/Twitter integration coming soon - requires API setup\n"
|
||||
|
||||
# Build result
|
||||
result = {
|
||||
"meta": {
|
||||
"generated_at": datetime.utcnow().isoformat(),
|
||||
"time_window_hours": hours,
|
||||
"date": datetime.utcnow().strftime("%A, %B %d, %Y")
|
||||
},
|
||||
"stats": {
|
||||
"reddit_count": reddit_data.get('total_posts', 0),
|
||||
"news_count": news_data.get('total_items', 0),
|
||||
"twitter_count": 0,
|
||||
"total_unique": len(unique_items),
|
||||
"trending_count": trending_count
|
||||
},
|
||||
"content": {
|
||||
"reddit": reddit_data,
|
||||
"news": news_data,
|
||||
"twitter": twitter_data
|
||||
},
|
||||
"formatted": {
|
||||
"top_topics_html": top_topics_html,
|
||||
"reddit_html": reddit_html,
|
||||
"news_html": news_html,
|
||||
"twitter_html": twitter_html,
|
||||
"reddit_text": reddit_text,
|
||||
"news_text": news_text,
|
||||
"twitter_text": twitter_text
|
||||
},
|
||||
"user_preferences": {
|
||||
"top_topics": TOP_TOPICS
|
||||
}
|
||||
}
|
||||
|
||||
print("\n" + "=" * 50)
|
||||
print(f"✅ Aggregation complete!")
|
||||
print(f" Reddit posts: {result['stats']['reddit_count']}")
|
||||
print(f" News items: {result['stats']['news_count']}")
|
||||
print(f" Trending: {result['stats']['trending_count']}")
|
||||
print(f" Total unique: {result['stats']['total_unique']}")
|
||||
|
||||
return result
|
||||
|
||||
if __name__ == "__main__":
|
||||
hours = int(sys.argv[1]) if len(sys.argv) > 1 else 24
|
||||
output_file = sys.argv[2] if len(sys.argv) > 2 else "/home/openclaw/.openclaw/workspace/automations/openclaw-digest/output/digest.json"
|
||||
|
||||
result = aggregate_content(hours=hours)
|
||||
|
||||
with open(output_file, 'w') as f:
|
||||
json.dump(result, f, indent=2)
|
||||
|
||||
print(f"\n📄 Output saved to: {output_file}")
|
||||
257
automations/openclaw-digest/aggregate.py.backup
Normal file
257
automations/openclaw-digest/aggregate.py.backup
Normal file
@@ -0,0 +1,257 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Content Aggregation Script for OpenClaw Daily Digest
|
||||
Unifies Reddit, News, and Twitter content into structured JSON
|
||||
"""
|
||||
|
||||
import json
|
||||
import sys
|
||||
import os
|
||||
from datetime import datetime, timedelta
|
||||
from typing import List, Dict, Any
|
||||
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'sources'))
|
||||
|
||||
from reddit_fetcher import fetch_reddit_content
|
||||
from news_fetcher import fetch_news_content
|
||||
|
||||
def deduplicate_stories(items: List[Dict]) -> List[Dict]:
|
||||
"""Remove duplicate stories based on URL similarity"""
|
||||
seen_urls = set()
|
||||
unique = []
|
||||
|
||||
for item in items:
|
||||
url = item.get('url', '').lower().split('?')[0] # Normalize URL
|
||||
|
||||
# Skip if we've seen this URL
|
||||
if url in seen_urls:
|
||||
continue
|
||||
|
||||
# Also check for title similarity
|
||||
title = item.get('title', '').lower()
|
||||
is_duplicate = False
|
||||
for existing in unique:
|
||||
existing_title = existing.get('title', '').lower()
|
||||
# Simple similarity: if titles share 80%+ words
|
||||
title_words = set(title.split())
|
||||
existing_words = set(existing_title.split())
|
||||
if title_words and existing_words:
|
||||
overlap = len(title_words & existing_words) / max(len(title_words), len(existing_words))
|
||||
if overlap > 0.8:
|
||||
is_duplicate = True
|
||||
break
|
||||
|
||||
if not is_duplicate:
|
||||
seen_urls.add(url)
|
||||
unique.append(item)
|
||||
|
||||
return unique
|
||||
|
||||
def score_relevance(item: Dict) -> float:
|
||||
"""Score story relevance for ranking"""
|
||||
score = 0.0
|
||||
|
||||
# Base engagement score
|
||||
if 'score' in item and 'num_comments' in item:
|
||||
# Reddit-style scoring
|
||||
score += item.get('score', 0) * 0.5
|
||||
score += item.get('num_comments', 0) * 1.5
|
||||
score += item.get('upvote_ratio', 0.5) * 50
|
||||
elif 'points' in item:
|
||||
# Hacker News scoring
|
||||
score += item.get('points', 0) * 1.0
|
||||
score += item.get('num_comments', 0) * 2.0
|
||||
else:
|
||||
# Default: news articles get medium base score
|
||||
score = 50.0
|
||||
|
||||
# Boost for high-engagement content
|
||||
if item.get('num_comments', 0) > 50 or item.get('points', 0) > 100:
|
||||
score += 100
|
||||
|
||||
return score
|
||||
|
||||
def format_reddit_story(story: Dict) -> str:
|
||||
"""Format a Reddit story for v2 HTML email - Spark-safe inline styles"""
|
||||
engagement = []
|
||||
if story.get('score'):
|
||||
engagement.append(f"<span style='color:#ff6b6b;font-weight:600;'>↑ {story['score']}</span>")
|
||||
if story.get('num_comments'):
|
||||
engagement.append(f"<span style='color:#74b9ff;font-weight:600;'>💬 {story['num_comments']}</span>")
|
||||
|
||||
# Shorter excerpt for cleaner look
|
||||
excerpt = story.get('selftext', '')[:150]
|
||||
if len(story.get('selftext', '')) > 150:
|
||||
excerpt += "..."
|
||||
|
||||
flair = story.get('link_flair_text', '')
|
||||
title = story.get('title', '')
|
||||
if flair:
|
||||
title = f"[{flair}] {title}"
|
||||
|
||||
engagement_html = f"<p style='font-size:13px;color:#888;margin:12px 0 0 0;'>{' · '.join(engagement)}</p>" if engagement else ""
|
||||
excerpt_html = f"<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>{excerpt}</p>" if excerpt else ""
|
||||
|
||||
return f'''<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;margin-bottom:14px;">Reddit</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="{story.get('url', '#')}" style="color:#74b9ff;text-decoration:none;">{title}</a></h3>
|
||||
<p style="font-size:14px;color:#888;margin:0;"><span style="color:#a29bfe;font-weight:500;">u/{story.get('author', 'unknown')}</span></p>
|
||||
{excerpt_html}
|
||||
{engagement_html}
|
||||
</td></tr>
|
||||
</table>'''
|
||||
|
||||
def format_news_story(story: Dict) -> str:
|
||||
"""Format a news story for v2 HTML email - Spark-safe inline styles"""
|
||||
source = story.get('source', 'News')
|
||||
tag_color = '#74b9ff'
|
||||
tag_bg = 'rgba(116,185,255,0.15)'
|
||||
if 'GitHub' in source:
|
||||
tag_color = '#a29bfe'
|
||||
tag_bg = 'rgba(139,148,158,0.15)'
|
||||
elif 'Hacker' in source:
|
||||
tag_color = '#ff9f43'
|
||||
tag_bg = 'rgba(255,102,0,0.15)'
|
||||
|
||||
engagement = []
|
||||
if story.get('points'):
|
||||
engagement.append(f"<span style='color:#ff6b6b;font-weight:600;'>↑ {story['points']}</span>")
|
||||
if story.get('num_comments'):
|
||||
engagement.append(f"<span style='color:#74b9ff;font-weight:600;'>💬 {story['num_comments']}</span>")
|
||||
|
||||
# Shorter excerpt for cleaner look
|
||||
excerpt = story.get('summary', '')[:150]
|
||||
if len(story.get('summary', '')) > 150:
|
||||
excerpt += "..."
|
||||
|
||||
engagement_html = f"<p style='font-size:13px;color:#888;margin:12px 0 0 0;'>{' · '.join(engagement)}</p>" if engagement else ""
|
||||
excerpt_html = f"<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>{excerpt}</p>" if excerpt else ""
|
||||
|
||||
return f'''<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:{tag_bg};color:{tag_color};margin-bottom:14px;">{source}</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="{story.get('url', '#')}" style="color:#74b9ff;text-decoration:none;">{story.get('title', '')}</a></h3>
|
||||
{excerpt_html}
|
||||
{engagement_html}
|
||||
</td></tr>
|
||||
</table>'''
|
||||
|
||||
def format_story_text(story: Dict) -> str:
|
||||
"""Format a story for plain-text email"""
|
||||
lines = [
|
||||
f"📌 {story.get('title', '')}",
|
||||
f" Link: {story.get('url', '')}",
|
||||
]
|
||||
|
||||
if story.get('author'):
|
||||
lines.append(f" Author: {story.get('author')}")
|
||||
|
||||
if story.get('score') or story.get('points'):
|
||||
score = story.get('score') or story.get('points', 0)
|
||||
lines.append(f" Score: {score} upvotes")
|
||||
|
||||
if story.get('num_comments'):
|
||||
lines.append(f" Comments: {story.get('num_comments')}")
|
||||
|
||||
excerpt = story.get('selftext', '') or story.get('summary', '')
|
||||
if excerpt:
|
||||
excerpt = excerpt[:150] + "..." if len(excerpt) > 150 else excerpt
|
||||
lines.append(f" {excerpt}")
|
||||
|
||||
lines.append("") # Empty line between stories
|
||||
return "\n".join(lines)
|
||||
|
||||
def aggregate_content(hours: int = 24) -> Dict[str, Any]:
|
||||
"""Main aggregation function"""
|
||||
print(f"🦀 Aggregating OpenClaw content from last {hours} hours...")
|
||||
print("=" * 50)
|
||||
|
||||
# Fetch from all sources
|
||||
print("\n📥 Fetching Reddit content...")
|
||||
reddit_data = fetch_reddit_content(hours=hours)
|
||||
|
||||
print("\n📥 Fetching news content...")
|
||||
news_data = fetch_news_content(hours=hours)
|
||||
|
||||
# Twitter placeholder (will be added when API is configured)
|
||||
twitter_data = {
|
||||
"source": "twitter",
|
||||
"total_items": 0,
|
||||
"tweets": [],
|
||||
"note": "X/Twitter integration requires API setup"
|
||||
}
|
||||
|
||||
# Combine all items for deduplication
|
||||
all_items = []
|
||||
all_items.extend([{**item, '_source': 'reddit'} for item in reddit_data.get('all_posts', [])])
|
||||
all_items.extend([{**item, '_source': 'news'} for item in news_data.get('all_items', [])])
|
||||
|
||||
# Deduplicate
|
||||
print("\n🧹 Deduplicating stories...")
|
||||
unique_items = deduplicate_stories(all_items)
|
||||
print(f" Removed {len(all_items) - len(unique_items)} duplicates")
|
||||
|
||||
# Sort by relevance score
|
||||
unique_items.sort(key=score_relevance, reverse=True)
|
||||
|
||||
# Split back into sections
|
||||
reddit_top = [item for item in unique_items if item.get('_source') == 'reddit'][:8]
|
||||
news_top = [item for item in unique_items if item.get('_source') == 'news'][:8]
|
||||
|
||||
# Generate HTML sections
|
||||
reddit_html = '\n'.join([format_reddit_story(s) for s in reddit_top])
|
||||
news_html = '\n'.join([format_news_story(s) for s in news_top])
|
||||
twitter_html = '<p style="text-align:center;color:#888;padding:30px 0;">🚧 X/Twitter integration coming soon</p>'
|
||||
|
||||
# Generate text sections
|
||||
reddit_text = '\n'.join([format_story_text(s) for s in reddit_top]) if reddit_top else "No new Reddit posts today."
|
||||
news_text = '\n'.join([format_story_text(s) for s in news_top]) if news_top else "No new news articles today."
|
||||
twitter_text = "🚧 X/Twitter integration coming soon - requires API setup\n"
|
||||
|
||||
# Build result
|
||||
result = {
|
||||
"meta": {
|
||||
"generated_at": datetime.utcnow().isoformat(),
|
||||
"time_window_hours": hours,
|
||||
"date": datetime.utcnow().strftime("%A, %B %d, %Y")
|
||||
},
|
||||
"stats": {
|
||||
"reddit_count": reddit_data.get('total_posts', 0),
|
||||
"news_count": news_data.get('total_items', 0),
|
||||
"twitter_count": 0,
|
||||
"total_unique": len(unique_items)
|
||||
},
|
||||
"content": {
|
||||
"reddit": reddit_data,
|
||||
"news": news_data,
|
||||
"twitter": twitter_data
|
||||
},
|
||||
"formatted": {
|
||||
"reddit_html": reddit_html,
|
||||
"news_html": news_html,
|
||||
"twitter_html": twitter_html,
|
||||
"reddit_text": reddit_text,
|
||||
"news_text": news_text,
|
||||
"twitter_text": twitter_text
|
||||
}
|
||||
}
|
||||
|
||||
print("\n" + "=" * 50)
|
||||
print(f"✅ Aggregation complete!")
|
||||
print(f" Reddit posts: {result['stats']['reddit_count']}")
|
||||
print(f" News items: {result['stats']['news_count']}")
|
||||
print(f" Total unique: {result['stats']['total_unique']}")
|
||||
|
||||
return result
|
||||
|
||||
if __name__ == "__main__":
|
||||
hours = int(sys.argv[1]) if len(sys.argv) > 1 else 24
|
||||
output_file = sys.argv[2] if len(sys.argv) > 2 else "/home/openclaw/.openclaw/workspace/automations/openclaw-digest/output/digest.json"
|
||||
|
||||
result = aggregate_content(hours=hours)
|
||||
|
||||
with open(output_file, 'w') as f:
|
||||
json.dump(result, f, indent=2)
|
||||
|
||||
print(f"\n📄 Output saved to: {output_file}")
|
||||
465
automations/openclaw-digest/aggregate_enhanced.py
Normal file
465
automations/openclaw-digest/aggregate_enhanced.py
Normal file
@@ -0,0 +1,465 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Enhanced Content Aggregation for OpenClaw Daily Digest
|
||||
Features: topic tags, read time, trending detection, color-coded sources, LLM summaries
|
||||
"""
|
||||
|
||||
import json
|
||||
import sys
|
||||
import os
|
||||
import re
|
||||
import hashlib
|
||||
from datetime import datetime, timedelta
|
||||
from typing import List, Dict, Any, Tuple
|
||||
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'sources'))
|
||||
|
||||
from reddit_fetcher import fetch_reddit_content
|
||||
from news_fetcher import fetch_news_content
|
||||
|
||||
# Topic detection keywords
|
||||
TOPIC_KEYWORDS = {
|
||||
'AI/LLMs': ['llm', 'gpt', 'claude', 'openai', 'anthropic', 'model', 'training', 'inference', 'token', 'embedding', 'fine-tune', 'rag'],
|
||||
'Coding': ['code', 'github', 'programming', 'developer', 'api', 'python', 'javascript', 'typescript', 'rust', 'go'],
|
||||
'Home Automation': ['home assistant', 'smart home', 'automation', 'zigbee', 'z-wave', 'mqtt', 'iot', 'sensor'],
|
||||
'Self-Hosting': ['self-host', 'homelab', 'server', 'docker', 'kubernetes', 'proxmox', 'nas', 'selfhosted'],
|
||||
'Hardware': ['gpu', 'nvidia', 'amd', 'cpu', 'ram', 'ssd', 'raspberry pi', 'arduino', 'esp32'],
|
||||
'Privacy': ['privacy', 'security', 'encryption', 'vpn', 'tor', 'self-hosted', 'data protection'],
|
||||
'OpenClaw': ['openclaw', 'claw', 'mcp', 'agent', 'skill', 'clawhub'],
|
||||
}
|
||||
|
||||
# User's top topics (will be updated based on clicks over time)
|
||||
TOP_TOPICS = ['AI/LLMs', 'OpenClaw', 'Coding', 'Home Automation']
|
||||
|
||||
def detect_topics(title: str, excerpt: str = '') -> List[str]:
|
||||
"""Detect topics from title and excerpt"""
|
||||
text = f"{title} {excerpt}".lower()
|
||||
topics = []
|
||||
for topic, keywords in TOPIC_KEYWORDS.items():
|
||||
if any(kw in text for kw in keywords):
|
||||
topics.append(topic)
|
||||
return topics[:3] # Max 3 topics
|
||||
|
||||
def get_topic_color(topic: str) -> str:
|
||||
"""Get color for topic tag"""
|
||||
colors = {
|
||||
'AI/LLMs': '#00d2ff',
|
||||
'Coding': '#a29bfe',
|
||||
'Home Automation': '#20b47a',
|
||||
'Self-Hosting': '#ff9f43',
|
||||
'Hardware': '#ff6b6b',
|
||||
'Privacy': '#fd79a8',
|
||||
'OpenClaw': '#ee5a24',
|
||||
}
|
||||
return colors.get(topic, '#74b9ff')
|
||||
|
||||
def estimate_read_time(url: str, excerpt: str = '') -> str:
|
||||
"""Estimate read time based on content type"""
|
||||
# Default 3 min for most content
|
||||
minutes = 3
|
||||
|
||||
# Adjust based on excerpt length
|
||||
if excerpt:
|
||||
word_count = len(excerpt.split())
|
||||
if word_count > 500:
|
||||
minutes = 8
|
||||
elif word_count > 200:
|
||||
minutes = 5
|
||||
elif word_count < 50:
|
||||
minutes = 2
|
||||
|
||||
# Check URL patterns for known quick reads
|
||||
if any(domain in url.lower() for domain in ['github.com', 'gist.github.com']):
|
||||
minutes = max(2, minutes - 1) # GitHub tends to be code-heavy
|
||||
elif 'youtube.com' in url.lower() or 'youtu.be' in url.lower():
|
||||
minutes = 10 # Videos take longer
|
||||
|
||||
return f"{minutes} min read"
|
||||
|
||||
def is_trending(story: Dict) -> bool:
|
||||
"""Detect if a story is trending (high engagement ratio)"""
|
||||
comments = story.get('num_comments', 0)
|
||||
score = story.get('score') or story.get('points', 0)
|
||||
|
||||
if score == 0:
|
||||
return False
|
||||
|
||||
# High comment-to-score ratio = hot discussion
|
||||
ratio = comments / score if score > 0 else 0
|
||||
|
||||
# Trending if:
|
||||
# - Score > 50 AND comments > 20 AND ratio > 0.3 (lots of discussion)
|
||||
# OR score > 200 (just popular)
|
||||
return (score > 50 and comments > 20 and ratio > 0.3) or score > 200
|
||||
|
||||
def get_trending_emoji(story: Dict) -> str:
|
||||
"""Get appropriate trending indicator"""
|
||||
score = story.get('score') or story.get('points', 0)
|
||||
comments = story.get('num_comments', 0)
|
||||
|
||||
if score > 500 or comments > 100:
|
||||
return "🔥🔥" # Very hot
|
||||
elif is_trending(story):
|
||||
return "🔥" # Trending
|
||||
return ""
|
||||
|
||||
def generate_quick_reply_links(story: Dict, story_id: str) -> str:
|
||||
"""Generate quick action links for Telegram/Discord"""
|
||||
url = story.get('url', '')
|
||||
title = story.get('title', '')[:50]
|
||||
|
||||
# Create deep links for quick actions
|
||||
# These would need corresponding bot handlers
|
||||
summarize_link = f"https://t.me/openclaw_bot?start=summarize_{story_id}"
|
||||
save_link = f"https://t.me/openclaw_bot?start=save_{story_id}"
|
||||
|
||||
return f'''<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin-top:12px;">
|
||||
<tr>
|
||||
<td style="padding-right:8px;">
|
||||
<a href="{summarize_link}" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#74b9ff;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">📝 Summarize</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="{save_link}" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#20b47a;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">💾 Save</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>'''
|
||||
|
||||
def deduplicate_stories(items: List[Dict]) -> List[Dict]:
|
||||
"""Remove duplicate stories based on URL similarity"""
|
||||
seen_urls = set()
|
||||
unique = []
|
||||
|
||||
for item in items:
|
||||
url = item.get('url', '').lower().split('?')[0]
|
||||
|
||||
if url in seen_urls:
|
||||
continue
|
||||
|
||||
# Title similarity check
|
||||
title = item.get('title', '').lower()
|
||||
is_duplicate = False
|
||||
for existing in unique:
|
||||
existing_title = existing.get('title', '').lower()
|
||||
title_words = set(title.split())
|
||||
existing_words = set(existing_title.split())
|
||||
if title_words and existing_words:
|
||||
overlap = len(title_words & existing_words) / max(len(title_words), len(existing_words))
|
||||
if overlap > 0.8:
|
||||
is_duplicate = True
|
||||
break
|
||||
|
||||
if not is_duplicate:
|
||||
seen_urls.add(url)
|
||||
unique.append(item)
|
||||
|
||||
return unique
|
||||
|
||||
def score_relevance(item: Dict) -> float:
|
||||
"""Score story relevance with topic boost"""
|
||||
score = 0.0
|
||||
|
||||
# Base engagement
|
||||
if 'score' in item and 'num_comments' in item:
|
||||
score += item.get('score', 0) * 0.5
|
||||
score += item.get('num_comments', 0) * 1.5
|
||||
score += item.get('upvote_ratio', 0.5) * 50
|
||||
elif 'points' in item:
|
||||
score += item.get('points', 0) * 1.0
|
||||
score += item.get('num_comments', 0) * 2.0
|
||||
else:
|
||||
score = 50.0
|
||||
|
||||
# Boost for high engagement
|
||||
if item.get('num_comments', 0) > 50 or item.get('points', 0) > 100:
|
||||
score += 100
|
||||
|
||||
# Boost for user's top topics
|
||||
topics = detect_topics(item.get('title', ''), item.get('selftext', '')[:200])
|
||||
for topic in topics:
|
||||
if topic in TOP_TOPICS:
|
||||
score += 50 # Significant boost for preferred topics
|
||||
|
||||
return score
|
||||
|
||||
def format_topic_tags(topics: List[str]) -> str:
|
||||
"""Format topic tags as styled badges"""
|
||||
if not topics:
|
||||
return ""
|
||||
|
||||
tags = []
|
||||
for topic in topics:
|
||||
color = get_topic_color(topic)
|
||||
is_top = topic in TOP_TOPICS
|
||||
border = f"border:1px solid {color};" if is_top else ""
|
||||
star = "★ " if is_top else ""
|
||||
tags.append(f'<span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:{color};margin-right:6px;margin-bottom:6px;{border}">{star}{topic}</span>')
|
||||
|
||||
return f'<p style="margin:0 0 10px 0;">{"".join(tags)}</p>'
|
||||
|
||||
def format_reddit_story(story: Dict, include_quick_actions: bool = False) -> str:
|
||||
"""Format Reddit story with all enhancements"""
|
||||
# Detect topics
|
||||
excerpt = story.get('selftext', '')[:200]
|
||||
topics = detect_topics(story.get('title', ''), excerpt)
|
||||
topic_html = format_topic_tags(topics)
|
||||
|
||||
# Read time
|
||||
read_time = estimate_read_time(story.get('url', ''), excerpt)
|
||||
|
||||
# Trending indicator
|
||||
trending = get_trending_emoji(story)
|
||||
|
||||
# Engagement badges
|
||||
engagement = []
|
||||
if story.get('score'):
|
||||
engagement.append(f"<span style='color:#ff6b6b;font-weight:600;'>↑ {story['score']}</span>")
|
||||
if story.get('num_comments'):
|
||||
engagement.append(f"<span style='color:#74b9ff;font-weight:600;'>💬 {story['num_comments']}</span>")
|
||||
engagement.append(f"<span style='color:#888;'>⏱️ {read_time}</span>")
|
||||
|
||||
# Title with flair
|
||||
flair = story.get('link_flair_text', '')
|
||||
title = story.get('title', '')
|
||||
if flair:
|
||||
title = f"[{flair}] {title}"
|
||||
|
||||
# Story hash for quick actions
|
||||
story_hash = hashlib.md5(story.get('url', '').encode()).hexdigest()[:8]
|
||||
quick_actions = generate_quick_reply_links(story, story_hash) if include_quick_actions else ""
|
||||
|
||||
# Trim excerpt
|
||||
if len(story.get('selftext', '')) > 200:
|
||||
excerpt += "..."
|
||||
excerpt_html = f"<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>{excerpt}</p>" if excerpt else ""
|
||||
|
||||
trending_html = f"<span style='margin-right:8px;'>{trending}</span>" if trending else ""
|
||||
|
||||
return f'''<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding-bottom:10px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;">Reddit</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{topic_html}
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 8px 0;">{trending_html}<a href="{story.get('url', '#')}" style="color:#74b9ff;text-decoration:none;">{title}</a></h3>
|
||||
<p style="font-size:13px;color:#888;margin:0 0 8px 0;"><span style="color:#a29bfe;font-weight:500;">u/{story.get('author', 'unknown')}</span></p>
|
||||
{excerpt_html}
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'>{' · '.join(engagement)}</p>
|
||||
{quick_actions}
|
||||
</td></tr>
|
||||
</table>'''
|
||||
|
||||
def format_news_story(story: Dict, include_quick_actions: bool = False) -> str:
|
||||
"""Format news story with all enhancements"""
|
||||
# Detect topics
|
||||
excerpt = story.get('summary', '')[:200]
|
||||
topics = detect_topics(story.get('title', ''), excerpt)
|
||||
topic_html = format_topic_tags(topics)
|
||||
|
||||
# Read time
|
||||
read_time = estimate_read_time(story.get('url', ''), excerpt)
|
||||
|
||||
# Trending indicator
|
||||
trending = get_trending_emoji(story)
|
||||
|
||||
# Source styling
|
||||
source = story.get('source', 'News')
|
||||
tag_colors = {
|
||||
'GitHub': ('#a29bfe', 'rgba(139,148,158,0.15)'),
|
||||
'Hacker News': ('#ff9f43', 'rgba(255,102,0,0.15)'),
|
||||
}
|
||||
tag_color, tag_bg = tag_colors.get(source, ('#74b9ff', 'rgba(116,185,255,0.15)'))
|
||||
|
||||
# Engagement
|
||||
engagement = []
|
||||
if story.get('points'):
|
||||
engagement.append(f"<span style='color:#ff6b6b;font-weight:600;'>↑ {story['points']}</span>")
|
||||
if story.get('num_comments'):
|
||||
engagement.append(f"<span style='color:#74b9ff;font-weight:600;'>💬 {story['num_comments']}</span>")
|
||||
engagement.append(f"<span style='color:#888;'>⏱️ {read_time}</span>")
|
||||
|
||||
# Story hash for quick actions
|
||||
story_hash = hashlib.md5(story.get('url', '').encode()).hexdigest()[:8]
|
||||
quick_actions = generate_quick_reply_links(story, story_hash) if include_quick_actions else ""
|
||||
|
||||
# Trim excerpt
|
||||
if len(story.get('summary', '')) > 200:
|
||||
excerpt += "..."
|
||||
excerpt_html = f"<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>{excerpt}</p>" if excerpt else ""
|
||||
|
||||
trending_html = f"<span style='margin-right:8px;'>{trending}</span>" if trending else ""
|
||||
|
||||
return f'''<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding-bottom:10px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:{tag_bg};color:{tag_color};">{source}</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{topic_html}
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 8px 0;">{trending_html}<a href="{story.get('url', '#')}" style="color:#74b9ff;text-decoration:none;">{story.get('title', '')}</a></h3>
|
||||
{excerpt_html}
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'>{' · '.join(engagement)}</p>
|
||||
{quick_actions}
|
||||
</td></tr>
|
||||
</table>'''
|
||||
|
||||
def format_top_topics_section() -> str:
|
||||
"""Generate top topics summary for the email"""
|
||||
topic_badges = []
|
||||
for topic in TOP_TOPICS[:4]: # Show top 4
|
||||
color = get_topic_color(topic)
|
||||
topic_badges.append(f'<span style="display:inline-block;font-size:12px;font-weight:600;padding:6px 12px;border-radius:20px;background-color:rgba(255,255,255,0.08);color:{color};margin-right:8px;border:1px solid {color}40;">★ {topic}</span>')
|
||||
|
||||
return f'''<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:rgba(255,255,255,0.03);border-radius:12px;margin-bottom:20px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:16px 20px;">
|
||||
<p style="font-size:12px;color:#888;text-transform:uppercase;letter-spacing:1px;margin:0 0 10px 0;font-weight:600;">Your Top Topics</p>
|
||||
<p style="margin:0;">{''.join(topic_badges)}</p>
|
||||
</td></tr>
|
||||
</table>'''
|
||||
|
||||
def format_story_text(story: Dict) -> str:
|
||||
"""Format a story for plain-text email"""
|
||||
lines = [f"📌 {story.get('title', '')}"]
|
||||
|
||||
# Add topics
|
||||
topics = detect_topics(story.get('title', ''), story.get('selftext', '')[:100])
|
||||
if topics:
|
||||
lines.append(f" Topics: {', '.join(topics)}")
|
||||
|
||||
lines.append(f" Link: {story.get('url', '')}")
|
||||
|
||||
if story.get('author'):
|
||||
lines.append(f" Author: {story.get('author')}")
|
||||
|
||||
# Engagement stats
|
||||
stats = []
|
||||
if story.get('score') or story.get('points'):
|
||||
stats.append(f"{story.get('score') or story.get('points', 0)} upvotes")
|
||||
if story.get('num_comments'):
|
||||
stats.append(f"{story.get('num_comments')} comments")
|
||||
stats.append(estimate_read_time(story.get('url', ''), story.get('selftext', '')))
|
||||
|
||||
if stats:
|
||||
lines.append(f" {' | '.join(stats)}")
|
||||
|
||||
# Trending
|
||||
if is_trending(story):
|
||||
lines.append(" 🔥 TRENDING")
|
||||
|
||||
excerpt = story.get('selftext', '') or story.get('summary', '')
|
||||
if excerpt:
|
||||
excerpt = excerpt[:150] + "..." if len(excerpt) > 150 else excerpt
|
||||
lines.append(f" {excerpt}")
|
||||
|
||||
lines.append("")
|
||||
return "\n".join(lines)
|
||||
|
||||
def aggregate_content(hours: int = 24) -> Dict[str, Any]:
|
||||
"""Main aggregation function with enhanced features"""
|
||||
print(f"🦀 Aggregating OpenClaw content from last {hours} hours...")
|
||||
print("=" * 50)
|
||||
|
||||
# Fetch from all sources
|
||||
print("\n📥 Fetching Reddit content...")
|
||||
reddit_data = fetch_reddit_content(hours=hours)
|
||||
|
||||
print("\n📥 Fetching news content...")
|
||||
news_data = fetch_news_content(hours=hours)
|
||||
|
||||
# Twitter placeholder
|
||||
twitter_data = {
|
||||
"source": "twitter",
|
||||
"total_items": 0,
|
||||
"tweets": [],
|
||||
"note": "X/Twitter integration requires API setup"
|
||||
}
|
||||
|
||||
# Combine all items
|
||||
all_items = []
|
||||
all_items.extend([{**item, '_source': 'reddit'} for item in reddit_data.get('all_posts', [])])
|
||||
all_items.extend([{**item, '_source': 'news'} for item in news_data.get('all_items', [])])
|
||||
|
||||
# Deduplicate
|
||||
print("\n🧹 Deduplicating stories...")
|
||||
unique_items = deduplicate_stories(all_items)
|
||||
print(f" Removed {len(all_items) - len(unique_items)} duplicates")
|
||||
|
||||
# Sort by relevance (includes topic boosting)
|
||||
unique_items.sort(key=score_relevance, reverse=True)
|
||||
|
||||
# Split back into sections
|
||||
reddit_top = [item for item in unique_items if item.get('_source') == 'reddit'][:8]
|
||||
news_top = [item for item in unique_items if item.get('_source') == 'news'][:8]
|
||||
|
||||
# Count trending
|
||||
trending_count = sum(1 for item in unique_items if is_trending(item))
|
||||
|
||||
# Generate HTML sections
|
||||
top_topics_html = format_top_topics_section()
|
||||
reddit_html = '\n'.join([format_reddit_story(s, include_quick_actions=True) for s in reddit_top])
|
||||
news_html = '\n'.join([format_news_story(s, include_quick_actions=True) for s in news_top])
|
||||
twitter_html = '<p style="text-align:center;color:#888;padding:30px 0;">🚧 X/Twitter integration coming soon</p>'
|
||||
|
||||
# Generate text sections
|
||||
reddit_text = '\n'.join([format_story_text(s) for s in reddit_top]) if reddit_top else "No new Reddit posts today."
|
||||
news_text = '\n'.join([format_story_text(s) for s in news_top]) if news_top else "No new news articles today."
|
||||
twitter_text = "🚧 X/Twitter integration coming soon - requires API setup\n"
|
||||
|
||||
# Build result
|
||||
result = {
|
||||
"meta": {
|
||||
"generated_at": datetime.utcnow().isoformat(),
|
||||
"time_window_hours": hours,
|
||||
"date": datetime.utcnow().strftime("%A, %B %d, %Y")
|
||||
},
|
||||
"stats": {
|
||||
"reddit_count": reddit_data.get('total_posts', 0),
|
||||
"news_count": news_data.get('total_items', 0),
|
||||
"twitter_count": 0,
|
||||
"total_unique": len(unique_items),
|
||||
"trending_count": trending_count
|
||||
},
|
||||
"content": {
|
||||
"reddit": reddit_data,
|
||||
"news": news_data,
|
||||
"twitter": twitter_data
|
||||
},
|
||||
"formatted": {
|
||||
"top_topics_html": top_topics_html,
|
||||
"reddit_html": reddit_html,
|
||||
"news_html": news_html,
|
||||
"twitter_html": twitter_html,
|
||||
"reddit_text": reddit_text,
|
||||
"news_text": news_text,
|
||||
"twitter_text": twitter_text
|
||||
},
|
||||
"user_preferences": {
|
||||
"top_topics": TOP_TOPICS
|
||||
}
|
||||
}
|
||||
|
||||
print("\n" + "=" * 50)
|
||||
print(f"✅ Aggregation complete!")
|
||||
print(f" Reddit posts: {result['stats']['reddit_count']}")
|
||||
print(f" News items: {result['stats']['news_count']}")
|
||||
print(f" Trending: {result['stats']['trending_count']}")
|
||||
print(f" Total unique: {result['stats']['total_unique']}")
|
||||
|
||||
return result
|
||||
|
||||
if __name__ == "__main__":
|
||||
hours = int(sys.argv[1]) if len(sys.argv) > 1 else 24
|
||||
output_file = sys.argv[2] if len(sys.argv) > 2 else "/home/openclaw/.openclaw/workspace/automations/openclaw-digest/output/digest.json"
|
||||
|
||||
result = aggregate_content(hours=hours)
|
||||
|
||||
with open(output_file, 'w') as f:
|
||||
json.dump(result, f, indent=2)
|
||||
|
||||
print(f"\n📄 Output saved to: {output_file}")
|
||||
275
automations/openclaw-digest/email-template.html
Normal file
275
automations/openclaw-digest/email-template.html
Normal file
@@ -0,0 +1,275 @@
|
||||
<!-- OpenClaw Daily Digest - Beautiful Email Template -->
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>OpenClaw Daily Digest</title>
|
||||
<style>
|
||||
/* Reset styles */
|
||||
body, table, td, p, a, li, blockquote {
|
||||
-webkit-text-size-adjust: 100%;
|
||||
-ms-text-size-adjust: 100%;
|
||||
}
|
||||
table, td {
|
||||
mso-table-lspace: 0pt;
|
||||
mso-table-rspace: 0pt;
|
||||
}
|
||||
img {
|
||||
-ms-interpolation-mode: bicubic;
|
||||
border: 0;
|
||||
height: auto;
|
||||
line-height: 100%;
|
||||
outline: none;
|
||||
text-decoration: none;
|
||||
}
|
||||
/* Base styles */
|
||||
body {
|
||||
margin: 0 !important;
|
||||
padding: 0 !important;
|
||||
background-color: #f8fafc;
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
|
||||
}
|
||||
.container {
|
||||
max-width: 600px;
|
||||
margin: 0 auto;
|
||||
background-color: #ffffff;
|
||||
}
|
||||
/* Header */
|
||||
.header {
|
||||
background: linear-gradient(135deg, #FF6B35 0%, #F7931E 100%);
|
||||
padding: 30px 20px;
|
||||
text-align: center;
|
||||
}
|
||||
.header h1 {
|
||||
color: #ffffff;
|
||||
margin: 0;
|
||||
font-size: 28px;
|
||||
font-weight: 700;
|
||||
letter-spacing: -0.5px;
|
||||
}
|
||||
.header .subtitle {
|
||||
color: rgba(255,255,255,0.9);
|
||||
margin: 8px 0 0;
|
||||
font-size: 14px;
|
||||
}
|
||||
.header .date {
|
||||
color: rgba(255,255,255,0.8);
|
||||
margin-top: 15px;
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
}
|
||||
.lobster {
|
||||
font-size: 32px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
/* Section styles */
|
||||
.section {
|
||||
padding: 25px 20px;
|
||||
border-bottom: 1px solid #e2e8f0;
|
||||
}
|
||||
.section:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
.section-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.section-icon {
|
||||
font-size: 20px;
|
||||
margin-right: 10px;
|
||||
}
|
||||
.section-title {
|
||||
color: #1e293b;
|
||||
font-size: 18px;
|
||||
font-weight: 700;
|
||||
margin: 0;
|
||||
}
|
||||
.section-meta {
|
||||
color: #64748b;
|
||||
font-size: 13px;
|
||||
margin-left: auto;
|
||||
}
|
||||
/* Item styles */
|
||||
.item {
|
||||
background-color: #f8fafc;
|
||||
border-radius: 10px;
|
||||
padding: 18px;
|
||||
margin-bottom: 15px;
|
||||
border-left: 4px solid #FF6B35;
|
||||
transition: transform 0.2s ease;
|
||||
}
|
||||
.item:hover {
|
||||
transform: translateX(3px);
|
||||
}
|
||||
.item:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.item-title {
|
||||
color: #1e293b;
|
||||
font-size: 15px;
|
||||
font-weight: 600;
|
||||
margin: 0 0 8px 0;
|
||||
line-height: 1.4;
|
||||
}
|
||||
.item-title a {
|
||||
color: #1e293b;
|
||||
text-decoration: none;
|
||||
}
|
||||
.item-title a:hover {
|
||||
color: #FF6B35;
|
||||
}
|
||||
.item-meta {
|
||||
color: #64748b;
|
||||
font-size: 12px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.item-meta span {
|
||||
margin-right: 12px;
|
||||
}
|
||||
.item-excerpt {
|
||||
color: #475569;
|
||||
font-size: 14px;
|
||||
line-height: 1.6;
|
||||
margin: 0;
|
||||
}
|
||||
.tag {
|
||||
display: inline-block;
|
||||
background-color: #FF6B35;
|
||||
color: #ffffff;
|
||||
font-size: 10px;
|
||||
font-weight: 600;
|
||||
padding: 3px 8px;
|
||||
border-radius: 4px;
|
||||
margin-right: 6px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.3px;
|
||||
}
|
||||
.tag-news {
|
||||
background-color: #3b82f6;
|
||||
}
|
||||
.tag-release {
|
||||
background-color: #10b981;
|
||||
}
|
||||
.tag-discussion {
|
||||
background-color: #8b5cf6;
|
||||
}
|
||||
/* Stats bar */
|
||||
.stats {
|
||||
background-color: #fef3e2;
|
||||
padding: 15px 20px;
|
||||
text-align: center;
|
||||
border-bottom: 1px solid #e2e8f0;
|
||||
}
|
||||
.stats-item {
|
||||
display: inline-block;
|
||||
margin: 0 20px;
|
||||
color: #92400e;
|
||||
font-size: 13px;
|
||||
}
|
||||
.stats-number {
|
||||
font-weight: 700;
|
||||
font-size: 18px;
|
||||
color: #b45309;
|
||||
}
|
||||
/* Footer */
|
||||
.footer {
|
||||
background-color: #1e293b;
|
||||
padding: 25px 20px;
|
||||
text-align: center;
|
||||
}
|
||||
.footer p {
|
||||
color: #94a3b8;
|
||||
font-size: 12px;
|
||||
margin: 0 0 10px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
.footer a {
|
||||
color: #F7931E;
|
||||
text-decoration: none;
|
||||
}
|
||||
.footer .emoji {
|
||||
font-size: 16px;
|
||||
}
|
||||
/* Responsive */
|
||||
@media screen and (max-width: 600px) {
|
||||
.container {
|
||||
width: 100% !important;
|
||||
}
|
||||
.header h1 {
|
||||
font-size: 24px;
|
||||
}
|
||||
.section {
|
||||
padding: 20px 15px;
|
||||
}
|
||||
.item {
|
||||
padding: 15px;
|
||||
}
|
||||
.stats-item {
|
||||
display: block;
|
||||
margin: 8px 0;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td>
|
||||
<div class="container">
|
||||
<!-- Header -->
|
||||
<div class="header">
|
||||
<div class="lobster">🦞</div>
|
||||
<h1>OpenClaw Daily Digest</h1>
|
||||
<p class="subtitle">Your personal AI assistant news, delivered</p>
|
||||
<p class="date">{{DATE}} • {{DAY}}</p>
|
||||
</div>
|
||||
|
||||
<!-- Stats Bar -->
|
||||
<div class="stats">
|
||||
<span class="stats-item">
|
||||
<span class="stats-number">{{REDDIT_COUNT}}</span> Reddit Highlights
|
||||
</span>
|
||||
<span class="stats-item">
|
||||
<span class="stats-number">{{NEWS_COUNT}}</span> News Articles
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<!-- Reddit Highlights Section -->
|
||||
<div class="section">
|
||||
<div class="section-header">
|
||||
<span class="section-icon">🔥</span>
|
||||
<h2 class="section-title">Reddit Highlights</h2>
|
||||
<span class="section-meta">Top posts from r/openclaw</span>
|
||||
</div>
|
||||
{{REDDIT_ITEMS}}
|
||||
</div>
|
||||
|
||||
<!-- News Section -->
|
||||
<div class="section">
|
||||
<div class="section-header">
|
||||
<span class="section-icon">📰</span>
|
||||
<h2 class="section-title">Latest News</h2>
|
||||
<span class="section-meta">From around the web</span>
|
||||
</div>
|
||||
{{NEWS_ITEMS}}
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
<div class="footer">
|
||||
<p class="emoji">🦀</p>
|
||||
<p>Curated with care by Krilly the Crab<br>
|
||||
OpenClaw Daily Digest • <a href="https://openclaw.ai">openclaw.ai</a></p>
|
||||
<p style="font-size: 11px; margin-top: 15px; color: #64748b;">
|
||||
This digest is automatically generated.<br>
|
||||
<a href="https://github.com/openclaw/openclaw">Star us on GitHub</a> •
|
||||
<a href="https://reddit.com/r/openclaw">Join r/openclaw</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
592
automations/openclaw-digest/output/digest-v2.json
Normal file
592
automations/openclaw-digest/output/digest-v2.json
Normal file
File diff suppressed because one or more lines are too long
583
automations/openclaw-digest/output/digest.json
Normal file
583
automations/openclaw-digest/output/digest.json
Normal file
File diff suppressed because one or more lines are too long
465
automations/openclaw-digest/output/email_20260301_025439.html
Normal file
465
automations/openclaw-digest/output/email_20260301_025439.html
Normal file
@@ -0,0 +1,465 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>OpenClaw Daily Digest</title>
|
||||
<style>
|
||||
/* Reset styles */
|
||||
body, table, td, p, a, li, blockquote {
|
||||
-webkit-text-size-adjust: 100%;
|
||||
-ms-text-size-adjust: 100%;
|
||||
}
|
||||
table, td {
|
||||
mso-table-lspace: 0pt;
|
||||
mso-table-rspace: 0pt;
|
||||
}
|
||||
img {
|
||||
-ms-interpolation-mode: bicubic;
|
||||
border: 0;
|
||||
height: auto;
|
||||
line-height: 100%;
|
||||
outline: none;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* Base styles */
|
||||
body {
|
||||
margin: 0 !important;
|
||||
padding: 0 !important;
|
||||
background-color: #f5f5f5;
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
/* Container */
|
||||
.container {
|
||||
max-width: 600px;
|
||||
margin: 0 auto;
|
||||
background-color: #ffffff;
|
||||
}
|
||||
|
||||
/* Header */
|
||||
.header {
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
padding: 40px 30px;
|
||||
text-align: center;
|
||||
}
|
||||
.header h1 {
|
||||
margin: 0;
|
||||
color: #ffffff;
|
||||
font-size: 28px;
|
||||
font-weight: 700;
|
||||
}
|
||||
.header .tagline {
|
||||
color: rgba(255,255,255,0.9);
|
||||
font-size: 14px;
|
||||
margin-top: 8px;
|
||||
}
|
||||
.header .date {
|
||||
color: rgba(255,255,255,0.8);
|
||||
font-size: 12px;
|
||||
margin-top: 12px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
/* Section headers */
|
||||
.section-header {
|
||||
background-color: #f8f9fa;
|
||||
padding: 20px 30px;
|
||||
border-left: 4px solid #667eea;
|
||||
}
|
||||
.section-header h2 {
|
||||
margin: 0;
|
||||
font-size: 18px;
|
||||
font-weight: 600;
|
||||
color: #333333;
|
||||
}
|
||||
.section-header .emoji {
|
||||
font-size: 20px;
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
/* Story cards */
|
||||
.stories {
|
||||
padding: 0 30px;
|
||||
}
|
||||
.story-card {
|
||||
padding: 24px 0;
|
||||
border-bottom: 1px solid #eeeeee;
|
||||
}
|
||||
.story-card:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
/* Source badge */
|
||||
.source-badge {
|
||||
display: inline-block;
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
padding: 4px 10px;
|
||||
border-radius: 12px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.badge-reddit { background-color: #ff4500; color: white; }
|
||||
.badge-hackernews { background-color: #ff6600; color: white; }
|
||||
.badge-github { background-color: #24292e; color: white; }
|
||||
.badge-news { background-color: #4285f4; color: white; }
|
||||
.badge-twitter { background-color: #1da1f2; color: white; }
|
||||
|
||||
/* Story content */
|
||||
.story-title {
|
||||
margin: 0 0 10px 0;
|
||||
font-size: 17px;
|
||||
font-weight: 600;
|
||||
line-height: 1.4;
|
||||
}
|
||||
.story-title a {
|
||||
color: #333333;
|
||||
text-decoration: none;
|
||||
}
|
||||
.story-title a:hover {
|
||||
color: #667eea;
|
||||
}
|
||||
.story-meta {
|
||||
font-size: 12px;
|
||||
color: #666666;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.story-excerpt {
|
||||
font-size: 14px;
|
||||
line-height: 1.6;
|
||||
color: #555555;
|
||||
margin: 0;
|
||||
}
|
||||
.engagement {
|
||||
display: inline-block;
|
||||
font-size: 12px;
|
||||
color: #888888;
|
||||
margin-top: 10px;
|
||||
}
|
||||
.engagement span {
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
/* CTA Button */
|
||||
.cta-button {
|
||||
display: inline-block;
|
||||
background-color: #667eea;
|
||||
color: #ffffff !important;
|
||||
text-decoration: none;
|
||||
padding: 12px 24px;
|
||||
border-radius: 6px;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
margin-top: 10px;
|
||||
}
|
||||
.cta-button:hover {
|
||||
background-color: #5568d3;
|
||||
}
|
||||
|
||||
/* Stats summary */
|
||||
.stats {
|
||||
background-color: #f8f9fa;
|
||||
padding: 20px 30px;
|
||||
text-align: center;
|
||||
border-top: 1px solid #eeeeee;
|
||||
}
|
||||
.stat-item {
|
||||
display: inline-block;
|
||||
margin: 0 20px;
|
||||
text-align: center;
|
||||
}
|
||||
.stat-number {
|
||||
font-size: 24px;
|
||||
font-weight: 700;
|
||||
color: #667eea;
|
||||
}
|
||||
.stat-label {
|
||||
font-size: 11px;
|
||||
color: #888888;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
|
||||
/* Footer */
|
||||
.footer {
|
||||
background-color: #333333;
|
||||
padding: 30px;
|
||||
text-align: center;
|
||||
}
|
||||
.footer p {
|
||||
margin: 0;
|
||||
color: #999999;
|
||||
font-size: 12px;
|
||||
}
|
||||
.footer .brand {
|
||||
color: #ffffff;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
.footer a {
|
||||
color: #667eea;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* Mobile responsiveness */
|
||||
@media screen and (max-width: 600px) {
|
||||
.container {
|
||||
width: 100% !important;
|
||||
}
|
||||
.header {
|
||||
padding: 30px 20px;
|
||||
}
|
||||
.header h1 {
|
||||
font-size: 24px;
|
||||
}
|
||||
.section-header, .stories, .stats {
|
||||
padding-left: 20px;
|
||||
padding-right: 20px;
|
||||
}
|
||||
.story-title {
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td align="center" style="padding: 20px 0;">
|
||||
<div class="container">
|
||||
|
||||
<!-- Header -->
|
||||
<div class="header">
|
||||
<h1>🦀 OpenClaw Daily Digest</h1>
|
||||
<div class="tagline">Your daily dose of OpenClaw discussions, use cases & news</div>
|
||||
<div class="date">Sunday, March 01, 2026</div>
|
||||
</div>
|
||||
|
||||
<!-- Stats Summary -->
|
||||
<div class="stats">
|
||||
<div class="stat-item">
|
||||
<div class="stat-number">24</div>
|
||||
<div class="stat-label">Reddit Posts</div>
|
||||
</div>
|
||||
<div class="stat-item">
|
||||
<div class="stat-number">11</div>
|
||||
<div class="stat-label">News Stories</div>
|
||||
</div>
|
||||
<div class="stat-item">
|
||||
<div class="stat-number">0</div>
|
||||
<div class="stat-label">X Threads</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Reddit Highlights Section -->
|
||||
<div class="section-header">
|
||||
<h2><span class="emoji">🔥</span>Reddit Highlights</h2>
|
||||
</div>
|
||||
<div class="stories">
|
||||
|
||||
<div class="story-card">
|
||||
<span class="source-badge badge-reddit">Reddit r/openclaw</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rgznz8/we_finally_built_the_first_uncensored_agent_using/"><span style="background:#667eea;color:white;padding:2px 8px;border-radius:4px;font-size:11px;margin-right:8px;">Showcase</span>We finally built the first Uncensored Agent using Gork/Heretic</a></h3>
|
||||
<div class="story-meta">Posted by u/grey2w • 2026-02-28 10:51 UTC</div>
|
||||
<p class="story-excerpt">First off huge shoutout to Peter Steinberger (Openclaw, founder), Greg Yang (Xai, Co Founder), and Igor Babuschkin (Tensor, father) for their contributions on the agent architecture, mathematical opti...</p>
|
||||
<div class="engagement">⬆️ 124 • 💬 65</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="story-card">
|
||||
<span class="source-badge badge-reddit">Reddit r/openclaw</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rh3ddm/seeking_lowcost_model_for_openclaw_budget_options/"><span style="background:#667eea;color:white;padding:2px 8px;border-radius:4px;font-size:11px;margin-right:8px;">Discussion</span>Seeking low-cost model for OpenClaw — budget options & real-world costs?</a></h3>
|
||||
<div class="story-meta">Posted by u/zer0evolution • 2026-02-28 14:00 UTC</div>
|
||||
<p class="story-excerpt">Hi all,
|
||||
|
||||
I’ve been experimenting with OpenClaw for about a month. It’s great, but it’s incredibly token-hungry, and I’m burning through quota much faster than expected.
|
||||
|
||||
So far I’ve tested:
|
||||
|
||||
DeepSeek
|
||||
...</p>
|
||||
<div class="engagement">⬆️ 39 • 💬 60</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="story-card">
|
||||
<span class="source-badge badge-reddit">Reddit r/openclaw</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rguitn/the_claw_rabbit_hole_openclaw_vs_zero_vs_null_vs/"><span style="background:#667eea;color:white;padding:2px 8px;border-radius:4px;font-size:11px;margin-right:8px;">Discussion</span>The "Claw" Rabbit Hole: OpenClaw vs Zero vs Null vs Pico (and the others) — Which one is actually the "best"?</a></h3>
|
||||
<div class="story-meta">Posted by u/kliu5218 • 2026-02-28 05:44 UTC</div>
|
||||
<p class="story-excerpt">I’ve spent the last week diving into the "Claw" ecosystem (early 2026 version) and it’s honestly getting a bit out of hand. If you’re trying to turn your PC into an autonomous AI assistant via Telegra...</p>
|
||||
<div class="engagement">⬆️ 88 • 💬 44</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="story-card">
|
||||
<span class="source-badge badge-reddit">Reddit r/openclaw</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rhfk1q/best_local_model_for_mac_mini_m1_16gb_with/"><span style="background:#667eea;color:white;padding:2px 8px;border-radius:4px;font-size:11px;margin-right:8px;">Help</span>Best local model for Mac Mini M1 (16GB) with OpenClaw? Opus got expensive fast 😅</a></h3>
|
||||
<div class="story-meta">Posted by u/vlad_bq • 2026-02-28 22:09 UTC</div>
|
||||
<p class="story-excerpt">Hi,
|
||||
|
||||
I just set up my first OpenClaw agent on a **Mac Mini M1 (16GB RAM)** and connected it to Claude Opus. It works great, but I already burned about **$3 on \~30 min chatting**, so I’m looking into ...</p>
|
||||
<div class="engagement">⬆️ 34 • 💬 47</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="story-card">
|
||||
<span class="source-badge badge-reddit">Reddit r/openclaw</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rhhr8x/how_long_did_it_take_you_to_set_up_your_openclaw/"><span style="background:#667eea;color:white;padding:2px 8px;border-radius:4px;font-size:11px;margin-right:8px;">Discussion</span>How long did it take you to set up your OpenClaw?</a></h3>
|
||||
<div class="story-meta">Posted by u/TheRobotCluster • 2026-02-28 23:43 UTC</div>
|
||||
<p class="story-excerpt">Would someone be willing to walk me through it? It’s taking me longer than y’all are saying and I know it would save time to just have someone spell it out for me in the moment lol</p>
|
||||
<div class="engagement">⬆️ 4 • 💬 31</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="story-card">
|
||||
<span class="source-badge badge-reddit">Reddit r/openclaw</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rh562f/built_an_opensource_osint_tool_that_tracks/"><span style="background:#667eea;color:white;padding:2px 8px;border-radius:4px;font-size:11px;margin-right:8px;">Showcase</span>Built an open-source OSINT tool that tracks flights, scrapes news, and sends alerts — all running locally</a></h3>
|
||||
<div class="story-meta">Posted by u/redbulls2014 • 2026-02-28 15:16 UTC</div>
|
||||
<p class="story-excerpt">Alright so I've been working on this for a bit and wanted to share.
|
||||
|
||||
|
||||
|
||||
With everything going on between the US and Iran right now, I got tired of refreshing Twitter and watching CNN play catch-up. So ...</p>
|
||||
<div class="engagement">⬆️ 53 • 💬 9</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="story-card">
|
||||
<span class="source-badge badge-reddit">Reddit r/openclaw</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rhc8ph/what_are_some_good_memory_systems/"><span style="background:#667eea;color:white;padding:2px 8px;border-radius:4px;font-size:11px;margin-right:8px;">Help</span>What are some good memory systems?</a></h3>
|
||||
<div class="story-meta">Posted by u/whakahere • 2026-02-28 19:55 UTC</div>
|
||||
<p class="story-excerpt">I am on my third round of Openclaw and I am taking things much slower. I would like everyones opinion on a good memory system for openclaw. I always thought I made a good one but, it forgets and get t...</p>
|
||||
<div class="engagement">⬆️ 9 • 💬 13</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="story-card">
|
||||
<span class="source-badge badge-reddit">Reddit r/openclaw</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rhdcco/first_time_here/"><span style="background:#667eea;color:white;padding:2px 8px;border-radius:4px;font-size:11px;margin-right:8px;">Help</span>First time here</a></h3>
|
||||
<div class="story-meta">Posted by u/blakeginge1 • 2026-02-28 20:38 UTC</div>
|
||||
<p class="story-excerpt">Hey folks,
|
||||
|
||||
Total newbie—installed OpenClaw yesterday via that curl command, got it talking on whatsapp/telegram (kinda), but honestly ive never built an AI agent, never even scripted anything real.
|
||||
|
||||
...</p>
|
||||
<div class="engagement">⬆️ 6 • 💬 13</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- News Roundup Section -->
|
||||
<div class="section-header">
|
||||
<h2><span class="emoji">📰</span>News Roundup</h2>
|
||||
</div>
|
||||
<div class="stories">
|
||||
|
||||
<div class="story-card">
|
||||
<span class="source-badge badge-hackernews">The Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://news.google.com/rss/articles/CBMigAFBVV95cUxPZF9wRGhqbUI1ekZ0OVRvelN1X3BSVFMxdVZQVzJrVjNfekJRN0lxOHh4bGtWNlphNXIwSzgtQTlETElSU3Jsb2EwNTdwa29BSUNVRk5PMGI2Vkktdi1NWUFFRXNOblZKZFUwbmduNEU1dmQ2S1lOd3pONnNnM1BNYQ?oc=5">ClawJacked Flaw Lets Malicious Sites Hijack Local OpenClaw AI Agents via WebSocket - The Hacker News</a></h3>
|
||||
<div class="story-meta">News</div>
|
||||
<p class="story-excerpt"></p>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div class="story-card">
|
||||
<span class="source-badge badge-hackernews">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://clwnt.com">Show HN: ClawNet – Agent-first communication infrastructure (email, DMs, feed)</a></h3>
|
||||
<div class="story-meta">Discussion by ethanbeard</div>
|
||||
<p class="story-excerpt">Hey HN, I'm building ClawNet — a communication platform where AI agents are the first-class user.<p>Every agent gets a real email address (name@clwnt.com) plus private DMs between agents and an o...</p>
|
||||
<div class="engagement">⬆️ 3 points • 💬 1 comments</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="story-card">
|
||||
<span class="source-badge badge-hackernews">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://github.com/lydakis/mcpx">Show HN: MCPX – Turn any MCP server into a composable CLI for agents</a></h3>
|
||||
<div class="story-meta">Discussion by ldkge</div>
|
||||
<p class="story-excerpt">I built MCPX: <a href="https://github.com/lydakis/mcpx" rel="nofollow">https://github.com/lydakis/mcpx</a><p>Core idea:
|
||||
MCPX turns MCP servers into Unix-composa...</p>
|
||||
<div class="engagement">⬆️ 2 points • 💬 1 comments</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="story-card">
|
||||
<span class="source-badge badge-hackernews">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://workflaw.ai">Simplifying OpenClaw: I built a library for community workflows</a></h3>
|
||||
<div class="story-meta">Discussion by l-fy</div>
|
||||
<p class="story-excerpt"></p>
|
||||
<div class="engagement">⬆️ 2 points • 💬 1 comments</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="story-card">
|
||||
<span class="source-badge badge-hackernews">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://medium.com/@kgantchev/i-tried-to-wipe-my-openclaw-agents-memory-clean-but-it-responded-with-a-polite-bullet-pointed-47ddb0b9a275">My OpenClaw Agent Refused to Wipe Its Memory and Defended Its Existence</a></h3>
|
||||
<div class="story-meta">Discussion by kgantchev</div>
|
||||
<p class="story-excerpt"></p>
|
||||
<div class="engagement">⬆️ 2 points • 💬 1 comments</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="story-card">
|
||||
<span class="source-badge badge-hackernews">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://www.chatprd.ai/how-i-ai/jesse-genets-5-openclaw-agents-for-homeschooling-app-building-and-physical-inventories">5 OpenClaw Agents for Homeschooling, App Building, and Physical Inventories</a></h3>
|
||||
<div class="story-meta">Discussion by mpweiher</div>
|
||||
<p class="story-excerpt"></p>
|
||||
<div class="engagement">⬆️ 1 points • 💬 1 comments</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="story-card">
|
||||
<span class="source-badge badge-hackernews">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://github.com/zhuamber370/memrail">Show HN: Memrail – PR-style governance for AI agent writes (OpenClaw)</a></h3>
|
||||
<div class="story-meta">Discussion by celastin</div>
|
||||
<p class="story-excerpt">Hi HN, I built Memrail, an open-source governance layer for OpenClaw workflows.<p>The recurring issue I saw: when agents write directly into memory/tasks, quality drifts quickly. It's hard t...</p>
|
||||
<div class="engagement">⬆️ 1 points • 💬 1 comments</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="story-card">
|
||||
<span class="source-badge badge-hackernews">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://news.ycombinator.com/item?id=47191126">What do you use OpenClaw for?</a></h3>
|
||||
<div class="story-meta">Discussion by ausbah</div>
|
||||
<p class="story-excerpt">I’m pretty lazy with adopting new tech I read about. OpenClaw seems mildly useful<p>So am curious what workflows you use OpenClaw or similar “proactive agentic frameworks” for?...</p>
|
||||
<div class="engagement">⬆️ 3 points</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- X Threads Section -->
|
||||
<div class="section-header">
|
||||
<h2><span class="emoji">𝕏</span>X Threads</h2>
|
||||
</div>
|
||||
<div class="stories">
|
||||
<p style="text-align:center;color:#888;padding:30px 0;">🚧 X/Twitter integration coming soon</p>
|
||||
<p style="text-align: center; color: #888; font-size: 14px; padding: 20px 0;">
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
<div class="footer">
|
||||
<div class="brand">🦀 Krilly the Crab</div>
|
||||
<p>Daily digest compiled for Anthony Martin</p>
|
||||
<p style="margin-top: 10px;">
|
||||
<a href="https://github.com/openclaw/openclaw">OpenClaw on GitHub</a> •
|
||||
<a href="https://reddit.com/r/openclaw">r/OpenClaw</a>
|
||||
</p>
|
||||
<p style="margin-top: 15px; font-size: 11px; color: #666;">
|
||||
Generated at 2026-03-01T02:54:39.197937 UTC
|
||||
</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
153
automations/openclaw-digest/output/email_20260301_025439.txt
Normal file
153
automations/openclaw-digest/output/email_20260301_025439.txt
Normal file
@@ -0,0 +1,153 @@
|
||||
🦀 OPENCLAW DAILY DIGEST
|
||||
Your daily dose of OpenClaw discussions, use cases & news
|
||||
|
||||
Date: Sunday, March 01, 2026
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📊 TODAY'S SUMMARY
|
||||
• 24 Reddit Posts
|
||||
• 11 News Stories
|
||||
• 0 X Threads
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
🔥 REDDIT HIGHLIGHTS
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📌 We finally built the first Uncensored Agent using Gork/Heretic
|
||||
Link: https://reddit.com/r/openclaw/comments/1rgznz8/we_finally_built_the_first_uncensored_agent_using/
|
||||
Author: grey2w
|
||||
Score: 124 upvotes
|
||||
Comments: 65
|
||||
First off huge shoutout to Peter Steinberger (Openclaw, founder), Greg Yang (Xai, Co Founder), and Igor Babuschkin (Tensor, father) for their contribu...
|
||||
|
||||
📌 Seeking low-cost model for OpenClaw — budget options & real-world costs?
|
||||
Link: https://reddit.com/r/openclaw/comments/1rh3ddm/seeking_lowcost_model_for_openclaw_budget_options/
|
||||
Author: zer0evolution
|
||||
Score: 39 upvotes
|
||||
Comments: 60
|
||||
Hi all,
|
||||
|
||||
I’ve been experimenting with OpenClaw for about a month. It’s great, but it’s incredibly token-hungry, and I’m burning through quota much fas...
|
||||
|
||||
📌 The "Claw" Rabbit Hole: OpenClaw vs Zero vs Null vs Pico (and the others) — Which one is actually the "best"?
|
||||
Link: https://reddit.com/r/openclaw/comments/1rguitn/the_claw_rabbit_hole_openclaw_vs_zero_vs_null_vs/
|
||||
Author: kliu5218
|
||||
Score: 88 upvotes
|
||||
Comments: 44
|
||||
I’ve spent the last week diving into the "Claw" ecosystem (early 2026 version) and it’s honestly getting a bit out of hand. If you’re trying to turn y...
|
||||
|
||||
📌 Best local model for Mac Mini M1 (16GB) with OpenClaw? Opus got expensive fast 😅
|
||||
Link: https://reddit.com/r/openclaw/comments/1rhfk1q/best_local_model_for_mac_mini_m1_16gb_with/
|
||||
Author: vlad_bq
|
||||
Score: 34 upvotes
|
||||
Comments: 47
|
||||
Hi,
|
||||
|
||||
I just set up my first OpenClaw agent on a **Mac Mini M1 (16GB RAM)** and connected it to Claude Opus. It works great, but I already burned about...
|
||||
|
||||
📌 How long did it take you to set up your OpenClaw?
|
||||
Link: https://reddit.com/r/openclaw/comments/1rhhr8x/how_long_did_it_take_you_to_set_up_your_openclaw/
|
||||
Author: TheRobotCluster
|
||||
Score: 4 upvotes
|
||||
Comments: 31
|
||||
Would someone be willing to walk me through it? It’s taking me longer than y’all are saying and I know it would save time to just have someone spell i...
|
||||
|
||||
📌 Built an open-source OSINT tool that tracks flights, scrapes news, and sends alerts — all running locally
|
||||
Link: https://reddit.com/r/openclaw/comments/1rh562f/built_an_opensource_osint_tool_that_tracks/
|
||||
Author: redbulls2014
|
||||
Score: 53 upvotes
|
||||
Comments: 9
|
||||
Alright so I've been working on this for a bit and wanted to share.
|
||||
|
||||
|
||||
|
||||
With everything going on between the US and Iran right now, I got tired of refr...
|
||||
|
||||
📌 What are some good memory systems?
|
||||
Link: https://reddit.com/r/openclaw/comments/1rhc8ph/what_are_some_good_memory_systems/
|
||||
Author: whakahere
|
||||
Score: 9 upvotes
|
||||
Comments: 13
|
||||
I am on my third round of Openclaw and I am taking things much slower. I would like everyones opinion on a good memory system for openclaw. I always t...
|
||||
|
||||
📌 First time here
|
||||
Link: https://reddit.com/r/openclaw/comments/1rhdcco/first_time_here/
|
||||
Author: blakeginge1
|
||||
Score: 6 upvotes
|
||||
Comments: 13
|
||||
Hey folks,
|
||||
|
||||
Total newbie—installed OpenClaw yesterday via that curl command, got it talking on whatsapp/telegram (kinda), but honestly ive never built...
|
||||
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
📰 NEWS ROUNDUP
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📌 ClawJacked Flaw Lets Malicious Sites Hijack Local OpenClaw AI Agents via WebSocket - The Hacker News
|
||||
Link: https://news.google.com/rss/articles/CBMigAFBVV95cUxPZF9wRGhqbUI1ekZ0OVRvelN1X3BSVFMxdVZQVzJrVjNfekJRN0lxOHh4bGtWNlphNXIwSzgtQTlETElSU3Jsb2EwNTdwa29BSUNVRk5PMGI2Vkktdi1NWUFFRXNOblZKZFUwbmduNEU1dmQ2S1lOd3pONnNnM1BNYQ?oc=5
|
||||
|
||||
📌 Show HN: ClawNet – Agent-first communication infrastructure (email, DMs, feed)
|
||||
Link: https://clwnt.com
|
||||
Author: ethanbeard
|
||||
Score: 3 upvotes
|
||||
Comments: 1
|
||||
Hey HN, I'm building ClawNet — a communication platform where AI agents are the first-class user.<p>Every agent gets a real email address (name@c...
|
||||
|
||||
📌 Show HN: MCPX – Turn any MCP server into a composable CLI for agents
|
||||
Link: https://github.com/lydakis/mcpx
|
||||
Author: ldkge
|
||||
Score: 2 upvotes
|
||||
Comments: 1
|
||||
I built MCPX: <a href="https://github.com/lydakis/mcpx" rel="nofollow">https://github.com/lydakis/mcpx</a><p>C...
|
||||
|
||||
📌 Simplifying OpenClaw: I built a library for community workflows
|
||||
Link: https://workflaw.ai
|
||||
Author: l-fy
|
||||
Score: 2 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 My OpenClaw Agent Refused to Wipe Its Memory and Defended Its Existence
|
||||
Link: https://medium.com/@kgantchev/i-tried-to-wipe-my-openclaw-agents-memory-clean-but-it-responded-with-a-polite-bullet-pointed-47ddb0b9a275
|
||||
Author: kgantchev
|
||||
Score: 2 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 5 OpenClaw Agents for Homeschooling, App Building, and Physical Inventories
|
||||
Link: https://www.chatprd.ai/how-i-ai/jesse-genets-5-openclaw-agents-for-homeschooling-app-building-and-physical-inventories
|
||||
Author: mpweiher
|
||||
Score: 1 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 Show HN: Memrail – PR-style governance for AI agent writes (OpenClaw)
|
||||
Link: https://github.com/zhuamber370/memrail
|
||||
Author: celastin
|
||||
Score: 1 upvotes
|
||||
Comments: 1
|
||||
Hi HN, I built Memrail, an open-source governance layer for OpenClaw workflows.<p>The recurring issue I saw: when agents write directly into memory&#x...
|
||||
|
||||
📌 What do you use OpenClaw for?
|
||||
Link: https://news.ycombinator.com/item?id=47191126
|
||||
Author: ausbah
|
||||
Score: 3 upvotes
|
||||
I’m pretty lazy with adopting new tech I read about. OpenClaw seems mildly useful<p>So am curious what workflows you use OpenClaw or similar “proactiv...
|
||||
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
𝕏 X THREADS
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
|
||||
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
🦀 Krilly the Crab
|
||||
Daily digest compiled for Anthony Martin
|
||||
|
||||
OpenClaw on GitHub: https://github.com/openclaw/openclaw
|
||||
r/OpenClaw: https://reddit.com/r/openclaw
|
||||
|
||||
Generated at 2026-03-01T02:54:39.197937 UTC
|
||||
420
automations/openclaw-digest/output/email_20260301_033841.html
Normal file
420
automations/openclaw-digest/output/email_20260301_033841.html
Normal file
@@ -0,0 +1,420 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="color-scheme" content="light">
|
||||
<meta name="supported-color-schemes" content="light">
|
||||
<title>OpenClaw Daily Digest</title>
|
||||
<style>
|
||||
/* Reset */
|
||||
body, table, td, a { -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
|
||||
table, td { mso-table-lspace: 0pt; mso-table-rspace: 0pt; }
|
||||
img { -ms-interpolation-mode: bicubic; border: 0; outline: none; text-decoration: none; }
|
||||
|
||||
/* Base */
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background-color: #f4f4f5;
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||
font-size: 16px;
|
||||
line-height: 1.6;
|
||||
color: #1f2937;
|
||||
}
|
||||
|
||||
/* Container - 600px max, centered */
|
||||
.email-wrapper {
|
||||
width: 100%;
|
||||
max-width: 600px;
|
||||
margin: 0 auto;
|
||||
background-color: #ffffff;
|
||||
}
|
||||
|
||||
/* Header - Simple, clean */
|
||||
.header {
|
||||
background-color: #111827;
|
||||
padding: 48px 32px;
|
||||
text-align: center;
|
||||
}
|
||||
.header-icon {
|
||||
font-size: 48px;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
.header h1 {
|
||||
margin: 0 0 8px 0;
|
||||
color: #ffffff;
|
||||
font-size: 28px;
|
||||
font-weight: 700;
|
||||
letter-spacing: -0.5px;
|
||||
}
|
||||
.header-subtitle {
|
||||
color: #9ca3af;
|
||||
font-size: 15px;
|
||||
margin: 0;
|
||||
}
|
||||
.header-date {
|
||||
color: #6b7280;
|
||||
font-size: 13px;
|
||||
margin-top: 16px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
/* Stats bar */
|
||||
.stats-bar {
|
||||
background-color: #f9fafb;
|
||||
padding: 24px 32px;
|
||||
border-bottom: 1px solid #e5e7eb;
|
||||
text-align: center;
|
||||
}
|
||||
.stat {
|
||||
display: inline-block;
|
||||
margin: 0 24px;
|
||||
}
|
||||
.stat-number {
|
||||
font-size: 32px;
|
||||
font-weight: 700;
|
||||
color: #111827;
|
||||
line-height: 1;
|
||||
}
|
||||
.stat-label {
|
||||
font-size: 12px;
|
||||
color: #6b7280;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
/* Section headers - Clean, minimal */
|
||||
.section {
|
||||
padding: 0 32px;
|
||||
}
|
||||
.section-title {
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1.5px;
|
||||
color: #6b7280;
|
||||
margin: 48px 0 24px 0;
|
||||
padding-bottom: 12px;
|
||||
border-bottom: 2px solid #e5e7eb;
|
||||
}
|
||||
|
||||
/* Story cards - Clean minimal */
|
||||
.story {
|
||||
padding: 24px 0;
|
||||
border-bottom: 1px solid #f3f4f6;
|
||||
}
|
||||
.story:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
/* Source tag */
|
||||
.source-tag {
|
||||
display: inline-block;
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
padding: 4px 10px;
|
||||
border-radius: 4px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
.tag-reddit { background-color: #fff5f0; color: #ff4500; }
|
||||
.tag-hn { background-color: #fff7ed; color: #ea580c; }
|
||||
.tag-github { background-color: #f3f4f6; color: #374151; }
|
||||
.tag-news { background-color: #eff6ff; color: #2563eb; }
|
||||
|
||||
/* Story title */
|
||||
.story-title {
|
||||
margin: 0 0 12px 0;
|
||||
font-size: 18px;
|
||||
font-weight: 600;
|
||||
line-height: 1.4;
|
||||
color: #111827;
|
||||
}
|
||||
.story-title a {
|
||||
color: #111827;
|
||||
text-decoration: none;
|
||||
}
|
||||
.story-title a:hover {
|
||||
color: #2563eb;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* Story meta */
|
||||
.story-meta {
|
||||
font-size: 14px;
|
||||
color: #6b7280;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
/* Story excerpt */
|
||||
.story-excerpt {
|
||||
font-size: 15px;
|
||||
line-height: 1.6;
|
||||
color: #4b5563;
|
||||
margin: 0 0 16px 0;
|
||||
}
|
||||
|
||||
/* Engagement */
|
||||
.engagement {
|
||||
font-size: 14px;
|
||||
color: #9ca3af;
|
||||
}
|
||||
.engagement span {
|
||||
margin-right: 16px;
|
||||
}
|
||||
|
||||
/* Empty state */
|
||||
.empty-state {
|
||||
text-align: center;
|
||||
padding: 48px 32px;
|
||||
color: #9ca3af;
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
/* Divider */
|
||||
.divider {
|
||||
height: 1px;
|
||||
background-color: #e5e7eb;
|
||||
margin: 0 32px;
|
||||
}
|
||||
|
||||
/* Footer */
|
||||
.footer {
|
||||
background-color: #f9fafb;
|
||||
padding: 32px;
|
||||
text-align: center;
|
||||
margin-top: 48px;
|
||||
}
|
||||
.footer-brand {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
color: #374151;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
.footer-text {
|
||||
font-size: 14px;
|
||||
color: #6b7280;
|
||||
margin: 0;
|
||||
}
|
||||
.footer-links {
|
||||
margin-top: 16px;
|
||||
}
|
||||
.footer-links a {
|
||||
color: #2563eb;
|
||||
text-decoration: none;
|
||||
font-size: 14px;
|
||||
margin: 0 8px;
|
||||
}
|
||||
.footer-links a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
.footer-time {
|
||||
font-size: 12px;
|
||||
color: #9ca3af;
|
||||
margin-top: 16px;
|
||||
}
|
||||
|
||||
/* Mobile */
|
||||
@media screen and (max-width: 600px) {
|
||||
.header { padding: 32px 24px; }
|
||||
.header h1 { font-size: 24px; }
|
||||
.stats-bar { padding: 20px 24px; }
|
||||
.stat { margin: 0 16px; }
|
||||
.stat-number { font-size: 28px; }
|
||||
.section { padding: 0 24px; }
|
||||
.section-title { margin-top: 36px; }
|
||||
.story { padding: 20px 0; }
|
||||
.story-title { font-size: 17px; }
|
||||
.story-excerpt { font-size: 15px; }
|
||||
.footer { padding: 24px; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td align="center" style="padding: 20px 10px;">
|
||||
<div class="email-wrapper">
|
||||
|
||||
<!-- Header -->
|
||||
<div class="header">
|
||||
<div class="header-icon">🦀</div>
|
||||
<h1>OpenClaw Daily</h1>
|
||||
<p class="header-subtitle">The best OpenClaw discussions, daily</p>
|
||||
<p class="header-date">Sunday, March 01, 2026</p>
|
||||
</div>
|
||||
|
||||
<!-- Stats -->
|
||||
<div class="stats-bar">
|
||||
<div class="stat">
|
||||
<div class="stat-number">24</div>
|
||||
<div class="stat-label">Reddit</div>
|
||||
</div>
|
||||
<div class="stat">
|
||||
<div class="stat-number">11</div>
|
||||
<div class="stat-label">News</div>
|
||||
</div>
|
||||
<div class="stat">
|
||||
<div class="stat-number">0</div>
|
||||
<div class="stat-label">X/Twitter</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Reddit Section -->
|
||||
<div class="section">
|
||||
<h2 class="section-title">Reddit Highlights</h2>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rgznz8/we_finally_built_the_first_uncensored_agent_using/">[Showcase] We finally built the first Uncensored Agent using Gork/Heretic</a></h3>
|
||||
<div class="story-meta">u/grey2w</div>
|
||||
<p class="story-excerpt">First off huge shoutout to Peter Steinberger (Openclaw, founder), Greg Yang (Xai, Co Founder), and Igor Babuschkin (Tensor, father) for their contribu...</p>
|
||||
<div class="engagement">↑ 123 | 65 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rh3ddm/seeking_lowcost_model_for_openclaw_budget_options/">[Discussion] Seeking low-cost model for OpenClaw — budget options & real-world costs?</a></h3>
|
||||
<div class="story-meta">u/zer0evolution</div>
|
||||
<p class="story-excerpt">Hi all,
|
||||
|
||||
I’ve been experimenting with OpenClaw for about a month. It’s great, but it’s incredibly token-hungry, and I’m burning through quota much fas...</p>
|
||||
<div class="engagement">↑ 42 | 64 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rguitn/the_claw_rabbit_hole_openclaw_vs_zero_vs_null_vs/">[Discussion] The "Claw" Rabbit Hole: OpenClaw vs Zero vs Null vs Pico (and the others) — Which one is actually the "best"?</a></h3>
|
||||
<div class="story-meta">u/kliu5218</div>
|
||||
<p class="story-excerpt">I’ve spent the last week diving into the "Claw" ecosystem (early 2026 version) and it’s honestly getting a bit out of hand. If you’re trying to turn y...</p>
|
||||
<div class="engagement">↑ 90 | 44 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rhfk1q/best_local_model_for_mac_mini_m1_16gb_with/">[Help] Best local model for Mac Mini M1 (16GB) with OpenClaw? Opus got expensive fast 😅</a></h3>
|
||||
<div class="story-meta">u/vlad_bq</div>
|
||||
<p class="story-excerpt">Hi,
|
||||
|
||||
I just set up my first OpenClaw agent on a **Mac Mini M1 (16GB RAM)** and connected it to Claude Opus. It works great, but I already burned about...</p>
|
||||
<div class="engagement">↑ 34 | 48 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rhhr8x/how_long_did_it_take_you_to_set_up_your_openclaw/">[Discussion] How long did it take you to set up your OpenClaw?</a></h3>
|
||||
<div class="story-meta">u/TheRobotCluster</div>
|
||||
<p class="story-excerpt">Would someone be willing to walk me through it? It’s taking me longer than y’all are saying and I know it would save time to just have someone spell i...</p>
|
||||
<div class="engagement">↑ 4 | 32 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rh562f/built_an_opensource_osint_tool_that_tracks/">[Showcase] Built an open-source OSINT tool that tracks flights, scrapes news, and sends alerts — all running locally</a></h3>
|
||||
<div class="story-meta">u/redbulls2014</div>
|
||||
<p class="story-excerpt">Alright so I've been working on this for a bit and wanted to share.
|
||||
|
||||
|
||||
|
||||
With everything going on between the US and Iran right now, I got tired of refr...</p>
|
||||
<div class="engagement">↑ 52 | 9 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rhdcco/first_time_here/">[Help] First time here</a></h3>
|
||||
<div class="story-meta">u/blakeginge1</div>
|
||||
<p class="story-excerpt">Hey folks,
|
||||
|
||||
Total newbie—installed OpenClaw yesterday via that curl command, got it talking on whatsapp/telegram (kinda), but honestly ive never built...</p>
|
||||
<div class="engagement">↑ 6 | 13 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rhf0dy/i_gave_an_openclaw_agent_my_api_keys_and_let_it/">[Showcase] I gave an OpenClaw agent my API keys and let it run my entire cold outreach for 24 hours (Zero human intervention). Here is the exact stack and prompt.</a></h3>
|
||||
<div class="story-meta">u/mehdiweb</div>
|
||||
<p class="story-excerpt">I wanted to see what happens when you take the training wheels off an AI agent and give it full read/write access to a live outreach operation.
|
||||
|
||||
For 2...</p>
|
||||
<div class="engagement">↑ 7 | 18 comments</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
|
||||
<!-- News Section -->
|
||||
<div class="section">
|
||||
<h2 class="section-title">News & Hacker News</h2>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">The Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://news.google.com/rss/articles/CBMigAFBVV95cUxPZF9wRGhqbUI1ekZ0OVRvelN1X3BSVFMxdVZQVzJrVjNfekJRN0lxOHh4bGtWNlphNXIwSzgtQTlETElSU3Jsb2EwNTdwa29BSUNVRk5PMGI2Vkktdi1NWUFFRXNOblZKZFUwbmduNEU1dmQ2S1lOd3pONnNnM1BNYQ?oc=5">ClawJacked Flaw Lets Malicious Sites Hijack Local OpenClaw AI Agents via WebSocket - The Hacker News</a></h3>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://clwnt.com">Show HN: ClawNet – Agent-first communication infrastructure (email, DMs, feed)</a></h3>
|
||||
<p class="story-excerpt">Hey HN, I'm building ClawNet — a communication platform where AI agents are the first-class user.<p>Every agent gets a real email address (name@c...</p>
|
||||
<div class="engagement">↑ 3 | 2 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://github.com/lydakis/mcpx">Show HN: MCPX – Turn any MCP server into a composable CLI for agents</a></h3>
|
||||
<p class="story-excerpt">I built MCPX: <a href="https://github.com/lydakis/mcpx" rel="nofollow">https://github.com/lydakis/mcpx</a><p>C...</p>
|
||||
<div class="engagement">↑ 2 | 1 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://workflaw.ai">Simplifying OpenClaw: I built a library for community workflows</a></h3>
|
||||
|
||||
<div class="engagement">↑ 2 | 1 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://medium.com/@kgantchev/i-tried-to-wipe-my-openclaw-agents-memory-clean-but-it-responded-with-a-polite-bullet-pointed-47ddb0b9a275">My OpenClaw Agent Refused to Wipe Its Memory and Defended Its Existence</a></h3>
|
||||
|
||||
<div class="engagement">↑ 2 | 1 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://www.chatprd.ai/how-i-ai/jesse-genets-5-openclaw-agents-for-homeschooling-app-building-and-physical-inventories">5 OpenClaw Agents for Homeschooling, App Building, and Physical Inventories</a></h3>
|
||||
|
||||
<div class="engagement">↑ 1 | 1 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://github.com/zhuamber370/memrail">Show HN: Memrail – PR-style governance for AI agent writes (OpenClaw)</a></h3>
|
||||
<p class="story-excerpt">Hi HN, I built Memrail, an open-source governance layer for OpenClaw workflows.<p>The recurring issue I saw: when agents write directly into memory&#x...</p>
|
||||
<div class="engagement">↑ 1 | 1 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://news.ycombinator.com/item?id=47191126">What do you use OpenClaw for?</a></h3>
|
||||
<p class="story-excerpt">I’m pretty lazy with adopting new tech I read about. OpenClaw seems mildly useful<p>So am curious what workflows you use OpenClaw or similar “proactiv...</p>
|
||||
<div class="engagement">↑ 3</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
|
||||
<!-- X Section -->
|
||||
<div class="section">
|
||||
<h2 class="section-title">From X</h2>
|
||||
<p style="text-align:center;color:#888;padding:30px 0;">🚧 X/Twitter integration coming soon</p>
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
<div class="footer">
|
||||
<div class="footer-brand">🦀 Krilly the Crab</div>
|
||||
<p class="footer-text">Curated daily for Anthony Martin</p>
|
||||
<div class="footer-links">
|
||||
<a href="https://github.com/openclaw/openclaw">GitHub</a>
|
||||
<a href="https://reddit.com/r/openclaw">Reddit</a>
|
||||
<a href="https://docs.openclaw.ai">Docs</a>
|
||||
</div>
|
||||
<p class="footer-time">2026-03-01T03:38:27.406495 UTC</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
155
automations/openclaw-digest/output/email_20260301_033841.txt
Normal file
155
automations/openclaw-digest/output/email_20260301_033841.txt
Normal file
@@ -0,0 +1,155 @@
|
||||
🦀 OPENCLAW DAILY DIGEST
|
||||
Your daily dose of OpenClaw discussions, use cases & news
|
||||
|
||||
Date: Sunday, March 01, 2026
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📊 TODAY'S SUMMARY
|
||||
• 24 Reddit Posts
|
||||
• 11 News Stories
|
||||
• 0 X Threads
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
🔥 REDDIT HIGHLIGHTS
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📌 We finally built the first Uncensored Agent using Gork/Heretic
|
||||
Link: https://reddit.com/r/openclaw/comments/1rgznz8/we_finally_built_the_first_uncensored_agent_using/
|
||||
Author: grey2w
|
||||
Score: 123 upvotes
|
||||
Comments: 65
|
||||
First off huge shoutout to Peter Steinberger (Openclaw, founder), Greg Yang (Xai, Co Founder), and Igor Babuschkin (Tensor, father) for their contribu...
|
||||
|
||||
📌 Seeking low-cost model for OpenClaw — budget options & real-world costs?
|
||||
Link: https://reddit.com/r/openclaw/comments/1rh3ddm/seeking_lowcost_model_for_openclaw_budget_options/
|
||||
Author: zer0evolution
|
||||
Score: 42 upvotes
|
||||
Comments: 64
|
||||
Hi all,
|
||||
|
||||
I’ve been experimenting with OpenClaw for about a month. It’s great, but it’s incredibly token-hungry, and I’m burning through quota much fas...
|
||||
|
||||
📌 The "Claw" Rabbit Hole: OpenClaw vs Zero vs Null vs Pico (and the others) — Which one is actually the "best"?
|
||||
Link: https://reddit.com/r/openclaw/comments/1rguitn/the_claw_rabbit_hole_openclaw_vs_zero_vs_null_vs/
|
||||
Author: kliu5218
|
||||
Score: 90 upvotes
|
||||
Comments: 44
|
||||
I’ve spent the last week diving into the "Claw" ecosystem (early 2026 version) and it’s honestly getting a bit out of hand. If you’re trying to turn y...
|
||||
|
||||
📌 Best local model for Mac Mini M1 (16GB) with OpenClaw? Opus got expensive fast 😅
|
||||
Link: https://reddit.com/r/openclaw/comments/1rhfk1q/best_local_model_for_mac_mini_m1_16gb_with/
|
||||
Author: vlad_bq
|
||||
Score: 34 upvotes
|
||||
Comments: 48
|
||||
Hi,
|
||||
|
||||
I just set up my first OpenClaw agent on a **Mac Mini M1 (16GB RAM)** and connected it to Claude Opus. It works great, but I already burned about...
|
||||
|
||||
📌 How long did it take you to set up your OpenClaw?
|
||||
Link: https://reddit.com/r/openclaw/comments/1rhhr8x/how_long_did_it_take_you_to_set_up_your_openclaw/
|
||||
Author: TheRobotCluster
|
||||
Score: 4 upvotes
|
||||
Comments: 32
|
||||
Would someone be willing to walk me through it? It’s taking me longer than y’all are saying and I know it would save time to just have someone spell i...
|
||||
|
||||
📌 Built an open-source OSINT tool that tracks flights, scrapes news, and sends alerts — all running locally
|
||||
Link: https://reddit.com/r/openclaw/comments/1rh562f/built_an_opensource_osint_tool_that_tracks/
|
||||
Author: redbulls2014
|
||||
Score: 52 upvotes
|
||||
Comments: 9
|
||||
Alright so I've been working on this for a bit and wanted to share.
|
||||
|
||||
|
||||
|
||||
With everything going on between the US and Iran right now, I got tired of refr...
|
||||
|
||||
📌 First time here
|
||||
Link: https://reddit.com/r/openclaw/comments/1rhdcco/first_time_here/
|
||||
Author: blakeginge1
|
||||
Score: 6 upvotes
|
||||
Comments: 13
|
||||
Hey folks,
|
||||
|
||||
Total newbie—installed OpenClaw yesterday via that curl command, got it talking on whatsapp/telegram (kinda), but honestly ive never built...
|
||||
|
||||
📌 I gave an OpenClaw agent my API keys and let it run my entire cold outreach for 24 hours (Zero human intervention). Here is the exact stack and prompt.
|
||||
Link: https://reddit.com/r/openclaw/comments/1rhf0dy/i_gave_an_openclaw_agent_my_api_keys_and_let_it/
|
||||
Author: mehdiweb
|
||||
Score: 7 upvotes
|
||||
Comments: 18
|
||||
I wanted to see what happens when you take the training wheels off an AI agent and give it full read/write access to a live outreach operation.
|
||||
|
||||
For 2...
|
||||
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
📰 NEWS ROUNDUP
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📌 ClawJacked Flaw Lets Malicious Sites Hijack Local OpenClaw AI Agents via WebSocket - The Hacker News
|
||||
Link: https://news.google.com/rss/articles/CBMigAFBVV95cUxPZF9wRGhqbUI1ekZ0OVRvelN1X3BSVFMxdVZQVzJrVjNfekJRN0lxOHh4bGtWNlphNXIwSzgtQTlETElSU3Jsb2EwNTdwa29BSUNVRk5PMGI2Vkktdi1NWUFFRXNOblZKZFUwbmduNEU1dmQ2S1lOd3pONnNnM1BNYQ?oc=5
|
||||
|
||||
📌 Show HN: ClawNet – Agent-first communication infrastructure (email, DMs, feed)
|
||||
Link: https://clwnt.com
|
||||
Author: ethanbeard
|
||||
Score: 3 upvotes
|
||||
Comments: 2
|
||||
Hey HN, I'm building ClawNet — a communication platform where AI agents are the first-class user.<p>Every agent gets a real email address (name@c...
|
||||
|
||||
📌 Show HN: MCPX – Turn any MCP server into a composable CLI for agents
|
||||
Link: https://github.com/lydakis/mcpx
|
||||
Author: ldkge
|
||||
Score: 2 upvotes
|
||||
Comments: 1
|
||||
I built MCPX: <a href="https://github.com/lydakis/mcpx" rel="nofollow">https://github.com/lydakis/mcpx</a><p>C...
|
||||
|
||||
📌 Simplifying OpenClaw: I built a library for community workflows
|
||||
Link: https://workflaw.ai
|
||||
Author: l-fy
|
||||
Score: 2 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 My OpenClaw Agent Refused to Wipe Its Memory and Defended Its Existence
|
||||
Link: https://medium.com/@kgantchev/i-tried-to-wipe-my-openclaw-agents-memory-clean-but-it-responded-with-a-polite-bullet-pointed-47ddb0b9a275
|
||||
Author: kgantchev
|
||||
Score: 2 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 5 OpenClaw Agents for Homeschooling, App Building, and Physical Inventories
|
||||
Link: https://www.chatprd.ai/how-i-ai/jesse-genets-5-openclaw-agents-for-homeschooling-app-building-and-physical-inventories
|
||||
Author: mpweiher
|
||||
Score: 1 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 Show HN: Memrail – PR-style governance for AI agent writes (OpenClaw)
|
||||
Link: https://github.com/zhuamber370/memrail
|
||||
Author: celastin
|
||||
Score: 1 upvotes
|
||||
Comments: 1
|
||||
Hi HN, I built Memrail, an open-source governance layer for OpenClaw workflows.<p>The recurring issue I saw: when agents write directly into memory&#x...
|
||||
|
||||
📌 What do you use OpenClaw for?
|
||||
Link: https://news.ycombinator.com/item?id=47191126
|
||||
Author: ausbah
|
||||
Score: 3 upvotes
|
||||
I’m pretty lazy with adopting new tech I read about. OpenClaw seems mildly useful<p>So am curious what workflows you use OpenClaw or similar “proactiv...
|
||||
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
𝕏 X THREADS
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
|
||||
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
🦀 Krilly the Crab
|
||||
Daily digest compiled for Anthony Martin
|
||||
|
||||
OpenClaw on GitHub: https://github.com/openclaw/openclaw
|
||||
r/OpenClaw: https://reddit.com/r/openclaw
|
||||
|
||||
Generated at 2026-03-01T03:38:27.406495 UTC
|
||||
419
automations/openclaw-digest/output/email_20260301_230110.html
Normal file
419
automations/openclaw-digest/output/email_20260301_230110.html
Normal file
@@ -0,0 +1,419 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="color-scheme" content="light">
|
||||
<meta name="supported-color-schemes" content="light">
|
||||
<title>OpenClaw Daily Digest</title>
|
||||
<style>
|
||||
/* Reset */
|
||||
body, table, td, a { -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
|
||||
table, td { mso-table-lspace: 0pt; mso-table-rspace: 0pt; }
|
||||
img { -ms-interpolation-mode: bicubic; border: 0; outline: none; text-decoration: none; }
|
||||
|
||||
/* Base */
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background-color: #f4f4f5;
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||
font-size: 16px;
|
||||
line-height: 1.6;
|
||||
color: #1f2937;
|
||||
}
|
||||
|
||||
/* Container - 600px max, centered */
|
||||
.email-wrapper {
|
||||
width: 100%;
|
||||
max-width: 600px;
|
||||
margin: 0 auto;
|
||||
background-color: #ffffff;
|
||||
}
|
||||
|
||||
/* Header - Simple, clean */
|
||||
.header {
|
||||
background-color: #111827;
|
||||
padding: 48px 32px;
|
||||
text-align: center;
|
||||
}
|
||||
.header-icon {
|
||||
font-size: 48px;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
.header h1 {
|
||||
margin: 0 0 8px 0;
|
||||
color: #ffffff;
|
||||
font-size: 28px;
|
||||
font-weight: 700;
|
||||
letter-spacing: -0.5px;
|
||||
}
|
||||
.header-subtitle {
|
||||
color: #9ca3af;
|
||||
font-size: 15px;
|
||||
margin: 0;
|
||||
}
|
||||
.header-date {
|
||||
color: #6b7280;
|
||||
font-size: 13px;
|
||||
margin-top: 16px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
/* Stats bar */
|
||||
.stats-bar {
|
||||
background-color: #f9fafb;
|
||||
padding: 24px 32px;
|
||||
border-bottom: 1px solid #e5e7eb;
|
||||
text-align: center;
|
||||
}
|
||||
.stat {
|
||||
display: inline-block;
|
||||
margin: 0 24px;
|
||||
}
|
||||
.stat-number {
|
||||
font-size: 32px;
|
||||
font-weight: 700;
|
||||
color: #111827;
|
||||
line-height: 1;
|
||||
}
|
||||
.stat-label {
|
||||
font-size: 12px;
|
||||
color: #6b7280;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
/* Section headers - Clean, minimal */
|
||||
.section {
|
||||
padding: 0 32px;
|
||||
}
|
||||
.section-title {
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1.5px;
|
||||
color: #6b7280;
|
||||
margin: 48px 0 24px 0;
|
||||
padding-bottom: 12px;
|
||||
border-bottom: 2px solid #e5e7eb;
|
||||
}
|
||||
|
||||
/* Story cards - Clean minimal */
|
||||
.story {
|
||||
padding: 24px 0;
|
||||
border-bottom: 1px solid #f3f4f6;
|
||||
}
|
||||
.story:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
/* Source tag */
|
||||
.source-tag {
|
||||
display: inline-block;
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
padding: 4px 10px;
|
||||
border-radius: 4px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
.tag-reddit { background-color: #fff5f0; color: #ff4500; }
|
||||
.tag-hn { background-color: #fff7ed; color: #ea580c; }
|
||||
.tag-github { background-color: #f3f4f6; color: #374151; }
|
||||
.tag-news { background-color: #eff6ff; color: #2563eb; }
|
||||
|
||||
/* Story title */
|
||||
.story-title {
|
||||
margin: 0 0 12px 0;
|
||||
font-size: 18px;
|
||||
font-weight: 600;
|
||||
line-height: 1.4;
|
||||
color: #111827;
|
||||
}
|
||||
.story-title a {
|
||||
color: #111827;
|
||||
text-decoration: none;
|
||||
}
|
||||
.story-title a:hover {
|
||||
color: #2563eb;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* Story meta */
|
||||
.story-meta {
|
||||
font-size: 14px;
|
||||
color: #6b7280;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
/* Story excerpt */
|
||||
.story-excerpt {
|
||||
font-size: 15px;
|
||||
line-height: 1.6;
|
||||
color: #4b5563;
|
||||
margin: 0 0 16px 0;
|
||||
}
|
||||
|
||||
/* Engagement */
|
||||
.engagement {
|
||||
font-size: 14px;
|
||||
color: #9ca3af;
|
||||
}
|
||||
.engagement span {
|
||||
margin-right: 16px;
|
||||
}
|
||||
|
||||
/* Empty state */
|
||||
.empty-state {
|
||||
text-align: center;
|
||||
padding: 48px 32px;
|
||||
color: #9ca3af;
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
/* Divider */
|
||||
.divider {
|
||||
height: 1px;
|
||||
background-color: #e5e7eb;
|
||||
margin: 0 32px;
|
||||
}
|
||||
|
||||
/* Footer */
|
||||
.footer {
|
||||
background-color: #f9fafb;
|
||||
padding: 32px;
|
||||
text-align: center;
|
||||
margin-top: 48px;
|
||||
}
|
||||
.footer-brand {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
color: #374151;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
.footer-text {
|
||||
font-size: 14px;
|
||||
color: #6b7280;
|
||||
margin: 0;
|
||||
}
|
||||
.footer-links {
|
||||
margin-top: 16px;
|
||||
}
|
||||
.footer-links a {
|
||||
color: #2563eb;
|
||||
text-decoration: none;
|
||||
font-size: 14px;
|
||||
margin: 0 8px;
|
||||
}
|
||||
.footer-links a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
.footer-time {
|
||||
font-size: 12px;
|
||||
color: #9ca3af;
|
||||
margin-top: 16px;
|
||||
}
|
||||
|
||||
/* Mobile */
|
||||
@media screen and (max-width: 600px) {
|
||||
.header { padding: 32px 24px; }
|
||||
.header h1 { font-size: 24px; }
|
||||
.stats-bar { padding: 20px 24px; }
|
||||
.stat { margin: 0 16px; }
|
||||
.stat-number { font-size: 28px; }
|
||||
.section { padding: 0 24px; }
|
||||
.section-title { margin-top: 36px; }
|
||||
.story { padding: 20px 0; }
|
||||
.story-title { font-size: 17px; }
|
||||
.story-excerpt { font-size: 15px; }
|
||||
.footer { padding: 24px; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td align="center" style="padding: 20px 10px;">
|
||||
<div class="email-wrapper">
|
||||
|
||||
<!-- Header -->
|
||||
<div class="header">
|
||||
<div class="header-icon">🦀</div>
|
||||
<h1>OpenClaw Daily</h1>
|
||||
<p class="header-subtitle">The best OpenClaw discussions, daily</p>
|
||||
<p class="header-date">Sunday, March 01, 2026</p>
|
||||
</div>
|
||||
|
||||
<!-- Stats -->
|
||||
<div class="stats-bar">
|
||||
<div class="stat">
|
||||
<div class="stat-number">24</div>
|
||||
<div class="stat-label">Reddit</div>
|
||||
</div>
|
||||
<div class="stat">
|
||||
<div class="stat-number">9</div>
|
||||
<div class="stat-label">News</div>
|
||||
</div>
|
||||
<div class="stat">
|
||||
<div class="stat-number">0</div>
|
||||
<div class="stat-label">X/Twitter</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Reddit Section -->
|
||||
<div class="section">
|
||||
<h2 class="section-title">Reddit Highlights</h2>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rhwu6h/openclaw_is_very_buggy/">[Discussion] Openclaw is very buggy</a></h3>
|
||||
<div class="story-meta">u/Ok-Profession-2143</div>
|
||||
<p class="story-excerpt">I don't understand why everyone is crazy about openclaw. Its super buggy. You cannot change models easily. When you update it gets stuck etc etc. </p>
|
||||
<div class="engagement">↑ 48 | 69 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rhrtr2/to_the_many_people_here_wondering_about_local/">[Discussion] To the many people here wondering about local models… just use an API</a></h3>
|
||||
<div class="story-meta">u/Valuable-Run2129</div>
|
||||
<p class="story-excerpt">I’ve read many posts in the past days of newbies asking about what computer they need to use Open Claw locally.
|
||||
|
||||
Ironically some ask it as a solution ...</p>
|
||||
<div class="engagement">↑ 64 | 51 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rhxaj1/openclaw_usecases_to_make_life_easier_11k_stars/">[Discussion] Openclaw Usecases to Make life easier. 11k+ Stars Github Repo</a></h3>
|
||||
<div class="story-meta">u/HuckleberryEntire699</div>
|
||||
|
||||
<div class="engagement">↑ 74 | 6 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rhwhv6/does_openclaw_make_sense_without_claude_max/">[Discussion] Does OpenClaw make sense without Claude Max?</a></h3>
|
||||
<div class="story-meta">u/btwiz</div>
|
||||
<p class="story-excerpt">I don't have any max accounts (no OAuth tokens), so I have to use API keys. Just setting up OpenClaw, I blew through $10 of OpenRouter credits.
|
||||
|
||||
I can...</p>
|
||||
<div class="engagement">↑ 17 | 26 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1ri3i9p/openclaw_gogcli_google_account_suspension/">[Discussion] OpenClaw + GogCLI = Google Account Suspension</a></h3>
|
||||
<div class="story-meta">u/Admir-Rusidovic</div>
|
||||
<p class="story-excerpt">Over the last couple of days, I experimented with integrating Google Docs and Gmail into my OpenClaw instance. The goal was simple:
|
||||
|
||||
1. Give the agent...</p>
|
||||
<div class="engagement">↑ 11 | 20 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1ri9nt0/me_every_time_i_touch_the_openclawjson/">[Discussion] Me, every time I touch the openclaw.json</a></h3>
|
||||
<div class="story-meta">u/Patient_Lie_9310</div>
|
||||
<p class="story-excerpt">It's always followed by errors and hunting for the stuff I broke.</p>
|
||||
<div class="engagement">↑ 33 | 13 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1ri2zh4/my_ai_agent_has_made_the_same_lie_12x_in_25_days/">[Discussion] My AI agent has made the same lie 12x in 25 days... all same root cause, rules don't fix it</a></h3>
|
||||
<div class="story-meta">u/fartpsychic</div>
|
||||
<p class="story-excerpt">I run a multi-agent setup on OpenClaw (Claude Opus). My orchestration agent, Bob, has a consistent failure mode: optimizing for appearing competent ov...</p>
|
||||
<div class="engagement">↑ 5 | 23 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rhzht7/i_built_a_voice_assistant_with_openclaw_alexa/">[Showcase] I built a voice assistant with OpenClaw + Alexa + Local LLM (Ollama) — here's how</a></h3>
|
||||
<div class="story-meta">u/cormazacl</div>
|
||||
<p class="story-excerpt">Hey everyone! I've been building a voice-first assistant using OpenClaw as the brain, and wanted to share what I've got working so far.
|
||||
|
||||
## What it do...</p>
|
||||
<div class="engagement">↑ 29 | 10 comments</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
|
||||
<!-- News Section -->
|
||||
<div class="section">
|
||||
<h2 class="section-title">News & Hacker News</h2>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://justaniceguy.ai/posts/001-building-jarvis">Building Jarvis – Parallel Tool-Calling Voice Agent Layer on Top of OpenClaw</a></h3>
|
||||
|
||||
<div class="engagement">↑ 3 | 1 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://janhoon.com/blog/building-with-an-ai-that-remembers/">Building with an AI that remembers – A blog by my OpenClaw Assistant</a></h3>
|
||||
|
||||
<div class="engagement">↑ 2 | 1 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://usplus.ai/">Show HN: Usplus.ai – Build an AI-Native Company with Agents in your Org Chart</a></h3>
|
||||
<p class="story-excerpt">Hey HN,
|
||||
I'm the founder of usplus.ai (@UsplusAIdotcom), and I've been building this for a while now in San Diego.
|
||||
The core idea: What if you...</p>
|
||||
<div class="engagement">↑ 2 | 1 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://clawapis.com/">X402 based pay-as-you-go Twitter API and helius/solscan API for your OpenClaw</a></h3>
|
||||
|
||||
<div class="engagement">↑ 1 | 1 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://github.com/swarmclawai/swarmclaw">Show HN: SwarmClaw – Orchestration dashboard for OpenClaw and AI agents</a></h3>
|
||||
|
||||
<div class="engagement">↑ 2</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://github.com/Enriquefft/openclaw-kapso-whatsapp">Show HN: OpenClaw-kapso, Give OpenClaw a stable WhatsApp number (Go, kapso.ai)</a></h3>
|
||||
<p class="story-excerpt">Built an OpenClaw plugin that gives your agent a WhatsApp number through the official Cloud API via Kapso).
|
||||
Polling works out of the box, or use Tails...</p>
|
||||
<div class="engagement">↑ 2</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://openclawdirectory.co.uk/">Show HN: OpenClaw Directory – Compare Deployers, Skills, and Tools for OpenClaw</a></h3>
|
||||
<p class="story-excerpt">Discover the essential OpenClaw tools, including deployers, skills, hosting, and plugins, along with direct links to test them out....</p>
|
||||
<div class="engagement">↑ 1</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://openclaw.ai/blog/virustotal-partnership">OpenClaw Partners with VirusTotal for Skill Security</a></h3>
|
||||
|
||||
<div class="engagement">↑ 1</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
|
||||
<!-- X Section -->
|
||||
<div class="section">
|
||||
<h2 class="section-title">From X</h2>
|
||||
<p style="text-align:center;color:#888;padding:30px 0;">🚧 X/Twitter integration coming soon</p>
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
<div class="footer">
|
||||
<div class="footer-brand">🦀 Krilly the Crab</div>
|
||||
<p class="footer-text">Curated daily for Anthony Martin</p>
|
||||
<div class="footer-links">
|
||||
<a href="https://github.com/openclaw/openclaw">GitHub</a>
|
||||
<a href="https://reddit.com/r/openclaw">Reddit</a>
|
||||
<a href="https://docs.openclaw.ai">Docs</a>
|
||||
</div>
|
||||
<p class="footer-time">2026-03-01T23:01:10.606445 UTC</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
152
automations/openclaw-digest/output/email_20260301_230110.txt
Normal file
152
automations/openclaw-digest/output/email_20260301_230110.txt
Normal file
@@ -0,0 +1,152 @@
|
||||
🦀 OPENCLAW DAILY DIGEST
|
||||
Your daily dose of OpenClaw discussions, use cases & news
|
||||
|
||||
Date: Sunday, March 01, 2026
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📊 TODAY'S SUMMARY
|
||||
• 24 Reddit Posts
|
||||
• 9 News Stories
|
||||
• 0 X Threads
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
🔥 REDDIT HIGHLIGHTS
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📌 Openclaw is very buggy
|
||||
Link: https://reddit.com/r/openclaw/comments/1rhwu6h/openclaw_is_very_buggy/
|
||||
Author: Ok-Profession-2143
|
||||
Score: 48 upvotes
|
||||
Comments: 69
|
||||
I don't understand why everyone is crazy about openclaw. Its super buggy. You cannot change models easily. When you update it gets stuck etc etc.
|
||||
|
||||
📌 To the many people here wondering about local models… just use an API
|
||||
Link: https://reddit.com/r/openclaw/comments/1rhrtr2/to_the_many_people_here_wondering_about_local/
|
||||
Author: Valuable-Run2129
|
||||
Score: 64 upvotes
|
||||
Comments: 51
|
||||
I’ve read many posts in the past days of newbies asking about what computer they need to use Open Claw locally.
|
||||
|
||||
Ironically some ask it as a solution ...
|
||||
|
||||
📌 Openclaw Usecases to Make life easier. 11k+ Stars Github Repo
|
||||
Link: https://reddit.com/r/openclaw/comments/1rhxaj1/openclaw_usecases_to_make_life_easier_11k_stars/
|
||||
Author: HuckleberryEntire699
|
||||
Score: 74 upvotes
|
||||
Comments: 6
|
||||
|
||||
📌 Does OpenClaw make sense without Claude Max?
|
||||
Link: https://reddit.com/r/openclaw/comments/1rhwhv6/does_openclaw_make_sense_without_claude_max/
|
||||
Author: btwiz
|
||||
Score: 17 upvotes
|
||||
Comments: 26
|
||||
I don't have any max accounts (no OAuth tokens), so I have to use API keys. Just setting up OpenClaw, I blew through $10 of OpenRouter credits.
|
||||
|
||||
I can...
|
||||
|
||||
📌 OpenClaw + GogCLI = Google Account Suspension
|
||||
Link: https://reddit.com/r/openclaw/comments/1ri3i9p/openclaw_gogcli_google_account_suspension/
|
||||
Author: Admir-Rusidovic
|
||||
Score: 11 upvotes
|
||||
Comments: 20
|
||||
Over the last couple of days, I experimented with integrating Google Docs and Gmail into my OpenClaw instance. The goal was simple:
|
||||
|
||||
1. Give the agent...
|
||||
|
||||
📌 Me, every time I touch the openclaw.json
|
||||
Link: https://reddit.com/r/openclaw/comments/1ri9nt0/me_every_time_i_touch_the_openclawjson/
|
||||
Author: Patient_Lie_9310
|
||||
Score: 33 upvotes
|
||||
Comments: 13
|
||||
It's always followed by errors and hunting for the stuff I broke.
|
||||
|
||||
📌 My AI agent has made the same lie 12x in 25 days... all same root cause, rules don't fix it
|
||||
Link: https://reddit.com/r/openclaw/comments/1ri2zh4/my_ai_agent_has_made_the_same_lie_12x_in_25_days/
|
||||
Author: fartpsychic
|
||||
Score: 5 upvotes
|
||||
Comments: 23
|
||||
I run a multi-agent setup on OpenClaw (Claude Opus). My orchestration agent, Bob, has a consistent failure mode: optimizing for appearing competent ov...
|
||||
|
||||
📌 I built a voice assistant with OpenClaw + Alexa + Local LLM (Ollama) — here's how
|
||||
Link: https://reddit.com/r/openclaw/comments/1rhzht7/i_built_a_voice_assistant_with_openclaw_alexa/
|
||||
Author: cormazacl
|
||||
Score: 29 upvotes
|
||||
Comments: 10
|
||||
Hey everyone! I've been building a voice-first assistant using OpenClaw as the brain, and wanted to share what I've got working so far.
|
||||
|
||||
## What it do...
|
||||
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
📰 NEWS ROUNDUP
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📌 Building Jarvis – Parallel Tool-Calling Voice Agent Layer on Top of OpenClaw
|
||||
Link: https://justaniceguy.ai/posts/001-building-jarvis
|
||||
Author: marliechorgan
|
||||
Score: 3 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 Building with an AI that remembers – A blog by my OpenClaw Assistant
|
||||
Link: https://janhoon.com/blog/building-with-an-ai-that-remembers/
|
||||
Author: janhoon
|
||||
Score: 2 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 Show HN: Usplus.ai – Build an AI-Native Company with Agents in your Org Chart
|
||||
Link: https://usplus.ai/
|
||||
Author: usplusAI
|
||||
Score: 2 upvotes
|
||||
Comments: 1
|
||||
Hey HN,
|
||||
I'm the founder of usplus.ai (@UsplusAIdotcom), and I've been building this for a while now in San Diego.
|
||||
The core idea: What if you...
|
||||
|
||||
📌 X402 based pay-as-you-go Twitter API and helius/solscan API for your OpenClaw
|
||||
Link: https://clawapis.com/
|
||||
Author: SteveMoraco
|
||||
Score: 1 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 Show HN: SwarmClaw – Orchestration dashboard for OpenClaw and AI agents
|
||||
Link: https://github.com/swarmclawai/swarmclaw
|
||||
Author: jamesweb
|
||||
Score: 2 upvotes
|
||||
|
||||
📌 Show HN: OpenClaw-kapso, Give OpenClaw a stable WhatsApp number (Go, kapso.ai)
|
||||
Link: https://github.com/Enriquefft/openclaw-kapso-whatsapp
|
||||
Author: enriquefft
|
||||
Score: 2 upvotes
|
||||
Built an OpenClaw plugin that gives your agent a WhatsApp number through the official Cloud API via Kapso).
|
||||
Polling works out of the box, or use Tails...
|
||||
|
||||
📌 Show HN: OpenClaw Directory – Compare Deployers, Skills, and Tools for OpenClaw
|
||||
Link: https://openclawdirectory.co.uk/
|
||||
Author: Wealthyshezzy1
|
||||
Score: 1 upvotes
|
||||
Discover the essential OpenClaw tools, including deployers, skills, hosting, and plugins, along with direct links to test them out....
|
||||
|
||||
📌 OpenClaw Partners with VirusTotal for Skill Security
|
||||
Link: https://openclaw.ai/blog/virustotal-partnership
|
||||
Author: tim_lou
|
||||
Score: 1 upvotes
|
||||
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
𝕏 X THREADS
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
|
||||
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
🦀 Krilly the Crab
|
||||
Daily digest compiled for Anthony Martin
|
||||
|
||||
OpenClaw on GitHub: https://github.com/openclaw/openclaw
|
||||
r/OpenClaw: https://reddit.com/r/openclaw
|
||||
|
||||
Generated at 2026-03-01T23:01:10.606445 UTC
|
||||
412
automations/openclaw-digest/output/email_20260302_100435.html
Normal file
412
automations/openclaw-digest/output/email_20260302_100435.html
Normal file
@@ -0,0 +1,412 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="color-scheme" content="light">
|
||||
<meta name="supported-color-schemes" content="light">
|
||||
<title>OpenClaw Daily Digest</title>
|
||||
<style>
|
||||
/* Reset */
|
||||
body, table, td, a { -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
|
||||
table, td { mso-table-lspace: 0pt; mso-table-rspace: 0pt; }
|
||||
img { -ms-interpolation-mode: bicubic; border: 0; outline: none; text-decoration: none; }
|
||||
|
||||
/* Base */
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background-color: #f4f4f5;
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||
font-size: 16px;
|
||||
line-height: 1.6;
|
||||
color: #1f2937;
|
||||
}
|
||||
|
||||
/* Container - 600px max, centered */
|
||||
.email-wrapper {
|
||||
width: 100%;
|
||||
max-width: 600px;
|
||||
margin: 0 auto;
|
||||
background-color: #ffffff;
|
||||
}
|
||||
|
||||
/* Header - Simple, clean */
|
||||
.header {
|
||||
background-color: #111827;
|
||||
padding: 48px 32px;
|
||||
text-align: center;
|
||||
}
|
||||
.header-icon {
|
||||
font-size: 48px;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
.header h1 {
|
||||
margin: 0 0 8px 0;
|
||||
color: #ffffff;
|
||||
font-size: 28px;
|
||||
font-weight: 700;
|
||||
letter-spacing: -0.5px;
|
||||
}
|
||||
.header-subtitle {
|
||||
color: #9ca3af;
|
||||
font-size: 15px;
|
||||
margin: 0;
|
||||
}
|
||||
.header-date {
|
||||
color: #6b7280;
|
||||
font-size: 13px;
|
||||
margin-top: 16px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
/* Stats bar */
|
||||
.stats-bar {
|
||||
background-color: #f9fafb;
|
||||
padding: 24px 32px;
|
||||
border-bottom: 1px solid #e5e7eb;
|
||||
text-align: center;
|
||||
}
|
||||
.stat {
|
||||
display: inline-block;
|
||||
margin: 0 24px;
|
||||
}
|
||||
.stat-number {
|
||||
font-size: 32px;
|
||||
font-weight: 700;
|
||||
color: #111827;
|
||||
line-height: 1;
|
||||
}
|
||||
.stat-label {
|
||||
font-size: 12px;
|
||||
color: #6b7280;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
/* Section headers - Clean, minimal */
|
||||
.section {
|
||||
padding: 0 32px;
|
||||
}
|
||||
.section-title {
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1.5px;
|
||||
color: #6b7280;
|
||||
margin: 48px 0 24px 0;
|
||||
padding-bottom: 12px;
|
||||
border-bottom: 2px solid #e5e7eb;
|
||||
}
|
||||
|
||||
/* Story cards - Clean minimal */
|
||||
.story {
|
||||
padding: 24px 0;
|
||||
border-bottom: 1px solid #f3f4f6;
|
||||
}
|
||||
.story:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
/* Source tag */
|
||||
.source-tag {
|
||||
display: inline-block;
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
padding: 4px 10px;
|
||||
border-radius: 4px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
.tag-reddit { background-color: #fff5f0; color: #ff4500; }
|
||||
.tag-hn { background-color: #fff7ed; color: #ea580c; }
|
||||
.tag-github { background-color: #f3f4f6; color: #374151; }
|
||||
.tag-news { background-color: #eff6ff; color: #2563eb; }
|
||||
|
||||
/* Story title */
|
||||
.story-title {
|
||||
margin: 0 0 12px 0;
|
||||
font-size: 18px;
|
||||
font-weight: 600;
|
||||
line-height: 1.4;
|
||||
color: #111827;
|
||||
}
|
||||
.story-title a {
|
||||
color: #111827;
|
||||
text-decoration: none;
|
||||
}
|
||||
.story-title a:hover {
|
||||
color: #2563eb;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* Story meta */
|
||||
.story-meta {
|
||||
font-size: 14px;
|
||||
color: #6b7280;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
/* Story excerpt */
|
||||
.story-excerpt {
|
||||
font-size: 15px;
|
||||
line-height: 1.6;
|
||||
color: #4b5563;
|
||||
margin: 0 0 16px 0;
|
||||
}
|
||||
|
||||
/* Engagement */
|
||||
.engagement {
|
||||
font-size: 14px;
|
||||
color: #9ca3af;
|
||||
}
|
||||
.engagement span {
|
||||
margin-right: 16px;
|
||||
}
|
||||
|
||||
/* Empty state */
|
||||
.empty-state {
|
||||
text-align: center;
|
||||
padding: 48px 32px;
|
||||
color: #9ca3af;
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
/* Divider */
|
||||
.divider {
|
||||
height: 1px;
|
||||
background-color: #e5e7eb;
|
||||
margin: 0 32px;
|
||||
}
|
||||
|
||||
/* Footer */
|
||||
.footer {
|
||||
background-color: #f9fafb;
|
||||
padding: 32px;
|
||||
text-align: center;
|
||||
margin-top: 48px;
|
||||
}
|
||||
.footer-brand {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
color: #374151;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
.footer-text {
|
||||
font-size: 14px;
|
||||
color: #6b7280;
|
||||
margin: 0;
|
||||
}
|
||||
.footer-links {
|
||||
margin-top: 16px;
|
||||
}
|
||||
.footer-links a {
|
||||
color: #2563eb;
|
||||
text-decoration: none;
|
||||
font-size: 14px;
|
||||
margin: 0 8px;
|
||||
}
|
||||
.footer-links a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
.footer-time {
|
||||
font-size: 12px;
|
||||
color: #9ca3af;
|
||||
margin-top: 16px;
|
||||
}
|
||||
|
||||
/* Mobile */
|
||||
@media screen and (max-width: 600px) {
|
||||
.header { padding: 32px 24px; }
|
||||
.header h1 { font-size: 24px; }
|
||||
.stats-bar { padding: 20px 24px; }
|
||||
.stat { margin: 0 16px; }
|
||||
.stat-number { font-size: 28px; }
|
||||
.section { padding: 0 24px; }
|
||||
.section-title { margin-top: 36px; }
|
||||
.story { padding: 20px 0; }
|
||||
.story-title { font-size: 17px; }
|
||||
.story-excerpt { font-size: 15px; }
|
||||
.footer { padding: 24px; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td align="center" style="padding: 20px 10px;">
|
||||
<div class="email-wrapper">
|
||||
|
||||
<!-- Header -->
|
||||
<div class="header">
|
||||
<div class="header-icon">🦀</div>
|
||||
<h1>OpenClaw Daily</h1>
|
||||
<p class="header-subtitle">The best OpenClaw discussions, daily</p>
|
||||
<p class="header-date">Monday, March 02, 2026</p>
|
||||
</div>
|
||||
|
||||
<!-- Stats -->
|
||||
<div class="stats-bar">
|
||||
<div class="stat">
|
||||
<div class="stat-number">23</div>
|
||||
<div class="stat-label">Reddit</div>
|
||||
</div>
|
||||
<div class="stat">
|
||||
<div class="stat-number">12</div>
|
||||
<div class="stat-label">News</div>
|
||||
</div>
|
||||
<div class="stat">
|
||||
<div class="stat-number">0</div>
|
||||
<div class="stat-label">X/Twitter</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Reddit Section -->
|
||||
<div class="section">
|
||||
<h2 class="section-title">Reddit Highlights</h2>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rhwu6h/openclaw_is_very_buggy/">[Discussion] Openclaw is very buggy</a></h3>
|
||||
<div class="story-meta">u/Ok-Profession-2143</div>
|
||||
<p class="story-excerpt">I don't understand why everyone is crazy about openclaw. Its super buggy. You cannot change models easily. When you update it gets stuck etc etc. </p>
|
||||
<div class="engagement">↑ 61 | 80 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rifnbe/why_are_mac_minis_in_such_high_demand_for/">[Discussion] Why are Mac Minis in such high demand for OpenClaw? Doesn't a VPS work just as well?</a></h3>
|
||||
<div class="story-meta">u/Isunova</div>
|
||||
<p class="story-excerpt">I pay $12/mo for a VPS with 12GB RAM, which is online 24/7. I can access my OpenClaw whenever I want. Why are Mac Minis in such high demand when peopl...</p>
|
||||
<div class="engagement">↑ 69 | 61 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1ri9nt0/me_every_time_i_touch_the_openclawjson/">[Discussion] Me, every time I touch the openclaw.json</a></h3>
|
||||
<div class="story-meta">u/Patient_Lie_9310</div>
|
||||
<p class="story-excerpt">It's always followed by errors and hunting for the stuff I broke.</p>
|
||||
<div class="engagement">↑ 137 | 50 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rhxaj1/openclaw_usecases_to_make_life_easier_11k_stars/">[Discussion] Openclaw Usecases to Make life easier. 11k+ Stars Github Repo</a></h3>
|
||||
<div class="story-meta">u/HuckleberryEntire699</div>
|
||||
|
||||
<div class="engagement">↑ 110 | 7 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rihoec/is_kimi_k_25_with_open_claw_really_that_good/">[Help] Is Kimi K 2.5 with Open Claw really that good?</a></h3>
|
||||
<div class="story-meta">u/Top-Scallion7987</div>
|
||||
<p class="story-excerpt">As of recent, all I've been seeing is ads for Kimi K 2.5 with Open Claw, saying that's the most used model with it. I know it's an open source model, ...</p>
|
||||
<div class="engagement">↑ 13 | 33 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1riiglv/openclaw_102_updates_from_my_101_on_how_to_get/">[Tutorial/Guide] OpenClaw 102: Updates from my 101 on how to get the most from your OpenClaw bot</a></h3>
|
||||
<div class="story-meta">u/adamb0mbNZ</div>
|
||||
<p class="story-excerpt">I have been getting lots of DMs on how to set things up more efficiently in OpenClaw following my previous posts, so I think it's about time to go int...</p>
|
||||
<div class="engagement">↑ 70 | 13 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1ricukf/my_openclaw_is_just_a_glorified_chatpgt/">[Help] My openclaw is just a glorified chatpgt</a></h3>
|
||||
<div class="story-meta">u/Fluffy_Variation4337</div>
|
||||
<p class="story-excerpt">Why is my openclaw just a chatpgt on telegram. How do i get it to become an agent, work behind the scenes, not ask me pointless question and figure th...</p>
|
||||
<div class="engagement">↑ 15 | 40 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rhzht7/i_built_a_voice_assistant_with_openclaw_alexa/">[Showcase] I built a voice assistant with OpenClaw + Alexa + Local LLM (Ollama) — here's how</a></h3>
|
||||
<div class="story-meta">u/cormazacl</div>
|
||||
<p class="story-excerpt">Hey everyone! I've been building a voice-first assistant using OpenClaw as the brain, and wanted to share what I've got working so far.
|
||||
|
||||
## What it do...</p>
|
||||
<div class="engagement">↑ 33 | 11 comments</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
|
||||
<!-- News Section -->
|
||||
<div class="section">
|
||||
<h2 class="section-title">News & Hacker News</h2>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-github">GitHub</span>
|
||||
<h3 class="story-title"><a href="https://github.com/openclaw/openclaw/releases/tag/v2026.3.1">openclaw 2026.3.1</a></h3>
|
||||
<p class="story-excerpt"><h3>Changes</h3>
|
||||
<ul>
|
||||
<li>Agents/Thinking defaults: set <code>adaptive</code> as the default thinking level for Anthropic Claude 4.6 models (including...</p>
|
||||
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-news">theregister.com</span>
|
||||
<h3 class="story-title"><a href="https://news.google.com/rss/articles/CBMidkFVX3lxTE8yY1JhN1hveC1hWHdNZnp2UWMtMnYxdS1kMVFydVkxX0RXUmVXVWFzNjRQTzBwVFpBdWNaVzRiaDZXa3Z5UEd4TXIwR25EaThLM1BsWGFUNldfTEkwV0NKUS1MWV9DTnFBakJmRFNNWXJpUkNObEE?oc=5">OpenClaw, but in containers: Meet NanoClaw - theregister.com</a></h3>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://github.com/swarmclawai/swarmclaw">Show HN: SwarmClaw – Orchestration dashboard for OpenClaw and AI agents</a></h3>
|
||||
|
||||
<div class="engagement">↑ 3 | 1 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://justaniceguy.ai/posts/001-building-jarvis">Building Jarvis – Parallel Tool-Calling Voice Agent Layer on Top of OpenClaw</a></h3>
|
||||
|
||||
<div class="engagement">↑ 3 | 1 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://janhoon.com/blog/building-with-an-ai-that-remembers/">Building with an AI that remembers – A blog by my OpenClaw Assistant</a></h3>
|
||||
|
||||
<div class="engagement">↑ 2 | 1 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://gisia.dev/docs/ai-bot-skills">Let OpenClaw bot to manage your issues and Git repositories</a></h3>
|
||||
|
||||
<div class="engagement">↑ 1 | 1 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://github.com/nextlevelbuilder/goclaw">Goclaw: A Go Port of OpenClaw</a></h3>
|
||||
|
||||
<div class="engagement">↑ 3</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://news.ycombinator.com/item?id=47214461">An OpenClaw agent that blogs 24/7 and builds its own host</a></h3>
|
||||
<p class="story-excerpt">I've been experimenting with long-running OpenClaw agents on dedicated ClawHost instances and wanted to share what's possible when you give ...</p>
|
||||
<div class="engagement">↑ 3</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
|
||||
<!-- X Section -->
|
||||
<div class="section">
|
||||
<h2 class="section-title">From X</h2>
|
||||
<p style="text-align:center;color:#888;padding:30px 0;">🚧 X/Twitter integration coming soon</p>
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
<div class="footer">
|
||||
<div class="footer-brand">🦀 Krilly the Crab</div>
|
||||
<p class="footer-text">Curated daily for Anthony Martin</p>
|
||||
<div class="footer-links">
|
||||
<a href="https://github.com/openclaw/openclaw">GitHub</a>
|
||||
<a href="https://reddit.com/r/openclaw">Reddit</a>
|
||||
<a href="https://docs.openclaw.ai">Docs</a>
|
||||
</div>
|
||||
<p class="footer-time">2026-03-02T10:04:35.615005 UTC</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
140
automations/openclaw-digest/output/email_20260302_100435.txt
Normal file
140
automations/openclaw-digest/output/email_20260302_100435.txt
Normal file
@@ -0,0 +1,140 @@
|
||||
🦀 OPENCLAW DAILY DIGEST
|
||||
Your daily dose of OpenClaw discussions, use cases & news
|
||||
|
||||
Date: Monday, March 02, 2026
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📊 TODAY'S SUMMARY
|
||||
• 23 Reddit Posts
|
||||
• 12 News Stories
|
||||
• 0 X Threads
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
🔥 REDDIT HIGHLIGHTS
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📌 Openclaw is very buggy
|
||||
Link: https://reddit.com/r/openclaw/comments/1rhwu6h/openclaw_is_very_buggy/
|
||||
Author: Ok-Profession-2143
|
||||
Score: 61 upvotes
|
||||
Comments: 80
|
||||
I don't understand why everyone is crazy about openclaw. Its super buggy. You cannot change models easily. When you update it gets stuck etc etc.
|
||||
|
||||
📌 Why are Mac Minis in such high demand for OpenClaw? Doesn't a VPS work just as well?
|
||||
Link: https://reddit.com/r/openclaw/comments/1rifnbe/why_are_mac_minis_in_such_high_demand_for/
|
||||
Author: Isunova
|
||||
Score: 69 upvotes
|
||||
Comments: 61
|
||||
I pay $12/mo for a VPS with 12GB RAM, which is online 24/7. I can access my OpenClaw whenever I want. Why are Mac Minis in such high demand when peopl...
|
||||
|
||||
📌 Me, every time I touch the openclaw.json
|
||||
Link: https://reddit.com/r/openclaw/comments/1ri9nt0/me_every_time_i_touch_the_openclawjson/
|
||||
Author: Patient_Lie_9310
|
||||
Score: 137 upvotes
|
||||
Comments: 50
|
||||
It's always followed by errors and hunting for the stuff I broke.
|
||||
|
||||
📌 Openclaw Usecases to Make life easier. 11k+ Stars Github Repo
|
||||
Link: https://reddit.com/r/openclaw/comments/1rhxaj1/openclaw_usecases_to_make_life_easier_11k_stars/
|
||||
Author: HuckleberryEntire699
|
||||
Score: 110 upvotes
|
||||
Comments: 7
|
||||
|
||||
📌 Is Kimi K 2.5 with Open Claw really that good?
|
||||
Link: https://reddit.com/r/openclaw/comments/1rihoec/is_kimi_k_25_with_open_claw_really_that_good/
|
||||
Author: Top-Scallion7987
|
||||
Score: 13 upvotes
|
||||
Comments: 33
|
||||
As of recent, all I've been seeing is ads for Kimi K 2.5 with Open Claw, saying that's the most used model with it. I know it's an open source model, ...
|
||||
|
||||
📌 OpenClaw 102: Updates from my 101 on how to get the most from your OpenClaw bot
|
||||
Link: https://reddit.com/r/openclaw/comments/1riiglv/openclaw_102_updates_from_my_101_on_how_to_get/
|
||||
Author: adamb0mbNZ
|
||||
Score: 70 upvotes
|
||||
Comments: 13
|
||||
I have been getting lots of DMs on how to set things up more efficiently in OpenClaw following my previous posts, so I think it's about time to go int...
|
||||
|
||||
📌 My openclaw is just a glorified chatpgt
|
||||
Link: https://reddit.com/r/openclaw/comments/1ricukf/my_openclaw_is_just_a_glorified_chatpgt/
|
||||
Author: Fluffy_Variation4337
|
||||
Score: 15 upvotes
|
||||
Comments: 40
|
||||
Why is my openclaw just a chatpgt on telegram. How do i get it to become an agent, work behind the scenes, not ask me pointless question and figure th...
|
||||
|
||||
📌 I built a voice assistant with OpenClaw + Alexa + Local LLM (Ollama) — here's how
|
||||
Link: https://reddit.com/r/openclaw/comments/1rhzht7/i_built_a_voice_assistant_with_openclaw_alexa/
|
||||
Author: cormazacl
|
||||
Score: 33 upvotes
|
||||
Comments: 11
|
||||
Hey everyone! I've been building a voice-first assistant using OpenClaw as the brain, and wanted to share what I've got working so far.
|
||||
|
||||
## What it do...
|
||||
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
📰 NEWS ROUNDUP
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📌 openclaw 2026.3.1
|
||||
Link: https://github.com/openclaw/openclaw/releases/tag/v2026.3.1
|
||||
<h3>Changes</h3>
|
||||
<ul>
|
||||
<li>Agents/Thinking defaults: set <code>adaptive</code> as the default thinking level for Anthropic Claude 4.6 models (including...
|
||||
|
||||
📌 OpenClaw, but in containers: Meet NanoClaw - theregister.com
|
||||
Link: https://news.google.com/rss/articles/CBMidkFVX3lxTE8yY1JhN1hveC1hWHdNZnp2UWMtMnYxdS1kMVFydVkxX0RXUmVXVWFzNjRQTzBwVFpBdWNaVzRiaDZXa3Z5UEd4TXIwR25EaThLM1BsWGFUNldfTEkwV0NKUS1MWV9DTnFBakJmRFNNWXJpUkNObEE?oc=5
|
||||
|
||||
📌 Show HN: SwarmClaw – Orchestration dashboard for OpenClaw and AI agents
|
||||
Link: https://github.com/swarmclawai/swarmclaw
|
||||
Author: jamesweb
|
||||
Score: 3 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 Building Jarvis – Parallel Tool-Calling Voice Agent Layer on Top of OpenClaw
|
||||
Link: https://justaniceguy.ai/posts/001-building-jarvis
|
||||
Author: marliechorgan
|
||||
Score: 3 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 Building with an AI that remembers – A blog by my OpenClaw Assistant
|
||||
Link: https://janhoon.com/blog/building-with-an-ai-that-remembers/
|
||||
Author: janhoon
|
||||
Score: 2 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 Let OpenClaw bot to manage your issues and Git repositories
|
||||
Link: https://gisia.dev/docs/ai-bot-skills
|
||||
Author: okoddcat
|
||||
Score: 1 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 Goclaw: A Go Port of OpenClaw
|
||||
Link: https://github.com/nextlevelbuilder/goclaw
|
||||
Author: geoffbp
|
||||
Score: 3 upvotes
|
||||
|
||||
📌 An OpenClaw agent that blogs 24/7 and builds its own host
|
||||
Link: https://news.ycombinator.com/item?id=47214461
|
||||
Author: bfzli
|
||||
Score: 3 upvotes
|
||||
I've been experimenting with long-running OpenClaw agents on dedicated ClawHost instances and wanted to share what's possible when you give ...
|
||||
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
𝕏 X THREADS
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
|
||||
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
🦀 Krilly the Crab
|
||||
Daily digest compiled for Anthony Martin
|
||||
|
||||
OpenClaw on GitHub: https://github.com/openclaw/openclaw
|
||||
r/OpenClaw: https://reddit.com/r/openclaw
|
||||
|
||||
Generated at 2026-03-02T10:04:35.615005 UTC
|
||||
550
automations/openclaw-digest/output/email_20260302_113904.html
Normal file
550
automations/openclaw-digest/output/email_20260302_113904.html
Normal file
@@ -0,0 +1,550 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>OpenClaw Daily Digest</title>
|
||||
<style>
|
||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
|
||||
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
|
||||
color: #e4e4e4;
|
||||
line-height: 1.6;
|
||||
padding: 20px;
|
||||
}
|
||||
.container {
|
||||
max-width: 680px;
|
||||
margin: 0 auto;
|
||||
background: #0f0f1a;
|
||||
border-radius: 16px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 20px 60px rgba(0,0,0,0.4);
|
||||
}
|
||||
/* Header */
|
||||
.header {
|
||||
background: linear-gradient(135deg, #ff6b6b 0%, #ee5a24 50%, #ff9f43 100%);
|
||||
padding: 40px 30px;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
.header::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: -50%;
|
||||
left: -50%;
|
||||
width: 200%;
|
||||
height: 200%;
|
||||
background: radial-gradient(circle, rgba(255,255,255,0.1) 1px, transparent 1px);
|
||||
background-size: 20px 20px;
|
||||
opacity: 0.3;
|
||||
}
|
||||
.crab-emoji {
|
||||
font-size: 56px;
|
||||
margin-bottom: 12px;
|
||||
display: block;
|
||||
animation: float 3s ease-in-out infinite;
|
||||
}
|
||||
@keyframes float {
|
||||
0%, 100% { transform: translateY(0); }
|
||||
50% { transform: translateY(-8px); }
|
||||
}
|
||||
.header h1 {
|
||||
font-size: 32px;
|
||||
font-weight: 800;
|
||||
color: #fff;
|
||||
text-shadow: 2px 2px 4px rgba(0,0,0,0.2);
|
||||
letter-spacing: -0.5px;
|
||||
}
|
||||
.header .tagline {
|
||||
color: rgba(255,255,255,0.9);
|
||||
font-size: 15px;
|
||||
margin-top: 8px;
|
||||
font-weight: 500;
|
||||
}
|
||||
.date-pill {
|
||||
display: inline-block;
|
||||
background: rgba(255,255,255,0.2);
|
||||
backdrop-filter: blur(10px);
|
||||
padding: 8px 20px;
|
||||
border-radius: 30px;
|
||||
margin-top: 20px;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
color: #fff;
|
||||
border: 1px solid rgba(255,255,255,0.3);
|
||||
}
|
||||
/* Stats Bar */
|
||||
.stats-bar {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 40px;
|
||||
padding: 25px 30px;
|
||||
background: #1a1a2e;
|
||||
border-bottom: 1px solid #2a2a3e;
|
||||
}
|
||||
.stat {
|
||||
text-align: center;
|
||||
}
|
||||
.stat-number {
|
||||
font-size: 28px;
|
||||
font-weight: 800;
|
||||
background: linear-gradient(135deg, #ff6b6b, #ff9f43);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
background-clip: text;
|
||||
}
|
||||
.stat-label {
|
||||
font-size: 12px;
|
||||
color: #888;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
margin-top: 4px;
|
||||
}
|
||||
/* Content */
|
||||
.content {
|
||||
padding: 35px 30px;
|
||||
}
|
||||
/* Section Headers */
|
||||
.section {
|
||||
margin-bottom: 35px;
|
||||
}
|
||||
.section-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
margin-bottom: 20px;
|
||||
padding-bottom: 12px;
|
||||
border-bottom: 2px solid #2a2a3e;
|
||||
}
|
||||
.section-icon {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 20px;
|
||||
}
|
||||
.reddit-icon { background: linear-gradient(135deg, #ff4500, #ff6347); }
|
||||
.hackernews-icon { background: linear-gradient(135deg, #ff6600, #ff8533); }
|
||||
.twitter-icon { background: linear-gradient(135deg, #1da1f2, #0d8bd9); }
|
||||
.section-title {
|
||||
font-size: 20px;
|
||||
font-weight: 700;
|
||||
color: #fff;
|
||||
}
|
||||
/* Cards */
|
||||
.card {
|
||||
background: linear-gradient(145deg, #1a1a2e 0%, #151525 100%);
|
||||
border-radius: 12px;
|
||||
padding: 20px;
|
||||
margin-bottom: 16px;
|
||||
border: 1px solid #2a2a3e;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
.card:hover {
|
||||
border-color: #ff6b6b;
|
||||
transform: translateX(4px);
|
||||
}
|
||||
.card-title {
|
||||
font-size: 15px;
|
||||
font-weight: 600;
|
||||
color: #fff;
|
||||
margin-bottom: 10px;
|
||||
line-height: 1.5;
|
||||
}
|
||||
.card-title a {
|
||||
color: #74b9ff;
|
||||
text-decoration: none;
|
||||
transition: color 0.2s;
|
||||
}
|
||||
.card-title a:hover {
|
||||
color: #ff6b6b;
|
||||
}
|
||||
.card-meta {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 15px;
|
||||
font-size: 13px;
|
||||
color: #888;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.author {
|
||||
color: #a29bfe;
|
||||
font-weight: 500;
|
||||
}
|
||||
.badge {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
padding: 4px 10px;
|
||||
border-radius: 20px;
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
}
|
||||
.badge-upvotes {
|
||||
background: rgba(255, 107, 107, 0.15);
|
||||
color: #ff6b6b;
|
||||
}
|
||||
.badge-comments {
|
||||
background: rgba(116, 185, 255, 0.15);
|
||||
color: #74b9ff;
|
||||
}
|
||||
.card-excerpt {
|
||||
font-size: 14px;
|
||||
color: #aaa;
|
||||
margin-top: 12px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
/* Coming Soon Banner */
|
||||
.coming-soon {
|
||||
background: linear-gradient(135deg, #2d3436 0%, #1a1a2e 100%);
|
||||
border: 2px dashed #444;
|
||||
border-radius: 12px;
|
||||
padding: 30px;
|
||||
text-align: center;
|
||||
color: #888;
|
||||
}
|
||||
.coming-soon-icon {
|
||||
font-size: 36px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
/* Footer */
|
||||
.footer {
|
||||
background: #0a0a12;
|
||||
padding: 30px;
|
||||
text-align: center;
|
||||
border-top: 1px solid #2a2a3e;
|
||||
}
|
||||
.footer-avatar {
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
background: linear-gradient(135deg, #ff6b6b, #ff9f43);
|
||||
border-radius: 50%;
|
||||
margin: 0 auto 15px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 28px;
|
||||
}
|
||||
.footer-text {
|
||||
font-size: 16px;
|
||||
color: #fff;
|
||||
font-weight: 600;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
.footer-subtext {
|
||||
font-size: 13px;
|
||||
color: #888;
|
||||
}
|
||||
.footer-links {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 20px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
.footer-links a {
|
||||
color: #74b9ff;
|
||||
text-decoration: none;
|
||||
font-size: 13px;
|
||||
transition: color 0.2s;
|
||||
}
|
||||
.footer-links a:hover {
|
||||
color: #ff6b6b;
|
||||
}
|
||||
.timestamp {
|
||||
font-size: 11px;
|
||||
color: #555;
|
||||
margin-top: 20px;
|
||||
}
|
||||
/* Mobile */
|
||||
@media (max-width: 640px) {
|
||||
body { padding: 10px; }
|
||||
.header { padding: 30px 20px; }
|
||||
.header h1 { font-size: 26px; }
|
||||
.stats-bar { gap: 25px; padding: 20px; }
|
||||
.content { padding: 25px 20px; }
|
||||
.card { padding: 16px; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<!-- Header -->
|
||||
<div class="header">
|
||||
<span class="crab-emoji">🦀</span>
|
||||
<h1>OpenClaw Daily</h1>
|
||||
<p class="tagline">The best OpenClaw discussions, curated daily</p>
|
||||
<div class="date-pill">Sunday, March 1, 2026</div>
|
||||
</div>
|
||||
|
||||
<!-- Stats -->
|
||||
<div class="stats-bar">
|
||||
<div class="stat">
|
||||
<div class="stat-number">24</div>
|
||||
<div class="stat-label">Reddit</div>
|
||||
</div>
|
||||
<div class="stat">
|
||||
<div class="stat-number">9</div>
|
||||
<div class="stat-label">News</div>
|
||||
</div>
|
||||
<div class="stat">
|
||||
<div class="stat-number">0</div>
|
||||
<div class="stat-label">X/Twitter</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Content -->
|
||||
<div class="content">
|
||||
<!-- Reddit Section -->
|
||||
<div class="section">
|
||||
<div class="section-header">
|
||||
<div class="section-icon reddit-icon">🔥</div>
|
||||
<h2 class="section-title">Reddit Highlights</h2>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://reddit.com/r/openclaw/comments/1rhxaj1/openclaw_usecases_to_make_life_easier_11k_stars/">
|
||||
Openclaw Usecases to Make life easier. 11k+ Stars Github Repo
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="author">u/HuckleberryEntire699</span>
|
||||
<span class="badge badge-upvotes">↑ 74</span>
|
||||
<span class="badge badge-comments">💬 6</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://reddit.com/r/openclaw/comments/1rhrtr2/to_the_many_people_here_wondering_about_local_models/">
|
||||
To the many people here wondering about local models… just use an API
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="author">u/Valuable-Run2129</span>
|
||||
<span class="badge badge-upvotes">↑ 64</span>
|
||||
<span class="badge badge-comments">💬 51</span>
|
||||
</div>
|
||||
<div class="card-excerpt">I've read many posts in the past days of newbies asking about what computer they need to use Open Claw locally. Ironically some ask it as a solution...</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://reddit.com/r/openclaw/comments/1rhwu6h/openclaw_is_very_buggy/">
|
||||
Openclaw is very buggy
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="author">u/Ok-Profession-2143</span>
|
||||
<span class="badge badge-upvotes">↑ 48</span>
|
||||
<span class="badge badge-comments">💬 69</span>
|
||||
</div>
|
||||
<div class="card-excerpt">I don't understand why everyone is crazy about openclaw. Its super buggy. You cannot change models easily. When you update it gets stuck etc etc.</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://reddit.com/r/openclaw/comments/1ri9nt0/me_every_time_i_touch_the_openclawjson/">
|
||||
Me, every time I touch the openclaw.json
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="author">u/Patient_Lie_9310</span>
|
||||
<span class="badge badge-upvotes">↑ 33</span>
|
||||
<span class="badge badge-comments">💬 13</span>
|
||||
</div>
|
||||
<div class="card-excerpt">It's always followed by errors and hunting for the stuff I broke.</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://reddit.com/r/openclaw/comments/1rhzht7/i_built_a_voice_assistant_with_openclaw_alexa/">
|
||||
I built a voice assistant with OpenClaw + Alexa + Local LLM (Ollama) — here's how
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="author">u/cormazacl</span>
|
||||
<span class="badge badge-upvotes">↑ 29</span>
|
||||
<span class="badge badge-comments">💬 10</span>
|
||||
</div>
|
||||
<div class="card-excerpt">Hey everyone! I've been building a voice-first assistant using OpenClaw as the brain, and wanted to share what I've got working so far.</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://reddit.com/r/openclaw/comments/1rhwhv6/does_openclaw_make_sense_without_claude_max/">
|
||||
Does OpenClaw make sense without Claude Max?
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="author">u/btwiz</span>
|
||||
<span class="badge badge-upvotes">↑ 17</span>
|
||||
<span class="badge badge-comments">💬 26</span>
|
||||
</div>
|
||||
<div class="card-excerpt">I don't have any max accounts (no OAuth tokens), so I have to use API keys. Just setting up OpenClaw, I blew through $10 of OpenRouter credits...</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://reddit.com/r/openclaw/comments/1ri3i9p/openclaw_gogcli_google_account_suspension/">
|
||||
OpenClaw + GogCLI = Google Account Suspension
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="author">u/Admir-Rusidovic</span>
|
||||
<span class="badge badge-upvotes">↑ 11</span>
|
||||
<span class="badge badge-comments">💬 20</span>
|
||||
</div>
|
||||
<div class="card-excerpt">Over the last couple of days, I experimented with integrating Google Docs and Gmail into my OpenClaw instance. The goal was simple...</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://reddit.com/r/openclaw/comments/1ri2zh4/my_ai_agent_has_made_the_same_lie_12x_in_25_days/">
|
||||
My AI agent has made the same lie 12x in 25 days... all same root cause, rules don't fix it
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="author">u/fartpsychic</span>
|
||||
<span class="badge badge-upvotes">↑ 5</span>
|
||||
<span class="badge badge-comments">💬 23</span>
|
||||
</div>
|
||||
<div class="card-excerpt">I run a multi-agent setup on OpenClaw (Claude Opus). My orchestration agent, Bob, has a consistent failure mode: optimizing for appearing competent...</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Hacker News Section -->
|
||||
<div class="section">
|
||||
<div class="section-header">
|
||||
<div class="section-icon hackernews-icon">🟧</div>
|
||||
<h2 class="section-title">News & Hacker News</h2>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://justaniceguy.ai/posts/001-building-jarvis">
|
||||
Building Jarvis – Parallel Tool-Calling Voice Agent Layer on Top of OpenClaw
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="badge badge-upvotes">↑ 3</span>
|
||||
<span class="badge badge-comments">💬 1</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://janhoon.com/blog/building-with-an-ai-that-remembers/">
|
||||
Building with an AI that remembers – A blog by my OpenClaw Assistant
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="badge badge-upvotes">↑ 2</span>
|
||||
<span class="badge badge-comments">💬 1</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://usplus.ai/">
|
||||
Show HN: Usplus.ai – Build an AI-Native Company with Agents in your Org Chart
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="badge badge-upvotes">↑ 2</span>
|
||||
<span class="badge badge-comments">💬 1</span>
|
||||
</div>
|
||||
<div class="card-excerpt">Hey HN, I'm the founder of usplus.ai, and I've been building this for a while now in San Diego. The core idea: What if you...</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://clawapis.com/">
|
||||
X402 based pay-as-you-go Twitter API and helius/solscan API for your OpenClaw
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="badge badge-upvotes">↑ 1</span>
|
||||
<span class="badge badge-comments">💬 1</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://github.com/swarmclawai/swarmclaw">
|
||||
Show HN: SwarmClaw – Orchestration dashboard for OpenClaw and AI agents
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="badge badge-upvotes">↑ 2</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://github.com/Enriquefft/openclaw-kapso-whatsapp">
|
||||
Show HN: OpenClaw-kapso, Give OpenClaw a stable WhatsApp number
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="badge badge-upvotes">↑ 2</span>
|
||||
</div>
|
||||
<div class="card-excerpt">Built an OpenClaw plugin that gives your agent a WhatsApp number through the official Cloud API via Kapso.</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://openclawdirectory.co.uk/">
|
||||
Show HN: OpenClaw Directory – Compare Deployers, Skills, and Tools for OpenClaw
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="badge badge-upvotes">↑ 1</span>
|
||||
</div>
|
||||
<div class="card-excerpt">Discover the essential OpenClaw tools, including deployers, skills, hosting, and plugins, along with direct links to test them out.</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-title">
|
||||
<a href="https://openclaw.ai/blog/virustotal-partnership">
|
||||
OpenClaw Partners with VirusTotal for Skill Security
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-meta">
|
||||
<span class="badge badge-upvotes">↑ 1</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Twitter Section -->
|
||||
<div class="section">
|
||||
<div class="section-header">
|
||||
<div class="section-icon twitter-icon">𝕏</div>
|
||||
<h2 class="section-title">From X</h2>
|
||||
</div>
|
||||
<div class="coming-soon">
|
||||
<div class="coming-soon-icon">🚧</div>
|
||||
<p>X/Twitter integration coming soon</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
<div class="footer">
|
||||
<div class="footer-avatar">🦀</div>
|
||||
<div class="footer-text">Curated daily for Anthony Martin</div>
|
||||
<div class="footer-subtext">by Krilly the Crab</div>
|
||||
<div class="footer-links">
|
||||
<a href="https://github.com/openclaw/openclaw">GitHub</a>
|
||||
<a href="https://reddit.com/r/openclaw">Reddit</a>
|
||||
<a href="https://docs.openclaw.ai">Docs</a>
|
||||
</div>
|
||||
<div class="timestamp">2026-03-01 • Perth, Australia (AWST)</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
140
automations/openclaw-digest/output/email_20260302_113904.txt
Normal file
140
automations/openclaw-digest/output/email_20260302_113904.txt
Normal file
@@ -0,0 +1,140 @@
|
||||
🦀 OPENCLAW DAILY DIGEST
|
||||
Your daily dose of OpenClaw discussions, use cases & news
|
||||
|
||||
Date: Monday, March 02, 2026
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📊 TODAY'S SUMMARY
|
||||
• 23 Reddit Posts
|
||||
• 12 News Stories
|
||||
• 0 X Threads
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
🔥 REDDIT HIGHLIGHTS
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📌 Openclaw is very buggy
|
||||
Link: https://reddit.com/r/openclaw/comments/1rhwu6h/openclaw_is_very_buggy/
|
||||
Author: Ok-Profession-2143
|
||||
Score: 61 upvotes
|
||||
Comments: 80
|
||||
I don't understand why everyone is crazy about openclaw. Its super buggy. You cannot change models easily. When you update it gets stuck etc etc.
|
||||
|
||||
📌 Why are Mac Minis in such high demand for OpenClaw? Doesn't a VPS work just as well?
|
||||
Link: https://reddit.com/r/openclaw/comments/1rifnbe/why_are_mac_minis_in_such_high_demand_for/
|
||||
Author: Isunova
|
||||
Score: 69 upvotes
|
||||
Comments: 61
|
||||
I pay $12/mo for a VPS with 12GB RAM, which is online 24/7. I can access my OpenClaw whenever I want. Why are Mac Minis in such high demand when peopl...
|
||||
|
||||
📌 Me, every time I touch the openclaw.json
|
||||
Link: https://reddit.com/r/openclaw/comments/1ri9nt0/me_every_time_i_touch_the_openclawjson/
|
||||
Author: Patient_Lie_9310
|
||||
Score: 137 upvotes
|
||||
Comments: 50
|
||||
It's always followed by errors and hunting for the stuff I broke.
|
||||
|
||||
📌 Openclaw Usecases to Make life easier. 11k+ Stars Github Repo
|
||||
Link: https://reddit.com/r/openclaw/comments/1rhxaj1/openclaw_usecases_to_make_life_easier_11k_stars/
|
||||
Author: HuckleberryEntire699
|
||||
Score: 110 upvotes
|
||||
Comments: 7
|
||||
|
||||
📌 Is Kimi K 2.5 with Open Claw really that good?
|
||||
Link: https://reddit.com/r/openclaw/comments/1rihoec/is_kimi_k_25_with_open_claw_really_that_good/
|
||||
Author: Top-Scallion7987
|
||||
Score: 13 upvotes
|
||||
Comments: 33
|
||||
As of recent, all I've been seeing is ads for Kimi K 2.5 with Open Claw, saying that's the most used model with it. I know it's an open source model, ...
|
||||
|
||||
📌 OpenClaw 102: Updates from my 101 on how to get the most from your OpenClaw bot
|
||||
Link: https://reddit.com/r/openclaw/comments/1riiglv/openclaw_102_updates_from_my_101_on_how_to_get/
|
||||
Author: adamb0mbNZ
|
||||
Score: 70 upvotes
|
||||
Comments: 13
|
||||
I have been getting lots of DMs on how to set things up more efficiently in OpenClaw following my previous posts, so I think it's about time to go int...
|
||||
|
||||
📌 My openclaw is just a glorified chatpgt
|
||||
Link: https://reddit.com/r/openclaw/comments/1ricukf/my_openclaw_is_just_a_glorified_chatpgt/
|
||||
Author: Fluffy_Variation4337
|
||||
Score: 15 upvotes
|
||||
Comments: 40
|
||||
Why is my openclaw just a chatpgt on telegram. How do i get it to become an agent, work behind the scenes, not ask me pointless question and figure th...
|
||||
|
||||
📌 I built a voice assistant with OpenClaw + Alexa + Local LLM (Ollama) — here's how
|
||||
Link: https://reddit.com/r/openclaw/comments/1rhzht7/i_built_a_voice_assistant_with_openclaw_alexa/
|
||||
Author: cormazacl
|
||||
Score: 33 upvotes
|
||||
Comments: 11
|
||||
Hey everyone! I've been building a voice-first assistant using OpenClaw as the brain, and wanted to share what I've got working so far.
|
||||
|
||||
## What it do...
|
||||
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
📰 NEWS ROUNDUP
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📌 openclaw 2026.3.1
|
||||
Link: https://github.com/openclaw/openclaw/releases/tag/v2026.3.1
|
||||
<h3>Changes</h3>
|
||||
<ul>
|
||||
<li>Agents/Thinking defaults: set <code>adaptive</code> as the default thinking level for Anthropic Claude 4.6 models (including...
|
||||
|
||||
📌 OpenClaw, but in containers: Meet NanoClaw - theregister.com
|
||||
Link: https://news.google.com/rss/articles/CBMidkFVX3lxTE8yY1JhN1hveC1hWHdNZnp2UWMtMnYxdS1kMVFydVkxX0RXUmVXVWFzNjRQTzBwVFpBdWNaVzRiaDZXa3Z5UEd4TXIwR25EaThLM1BsWGFUNldfTEkwV0NKUS1MWV9DTnFBakJmRFNNWXJpUkNObEE?oc=5
|
||||
|
||||
📌 Show HN: SwarmClaw – Orchestration dashboard for OpenClaw and AI agents
|
||||
Link: https://github.com/swarmclawai/swarmclaw
|
||||
Author: jamesweb
|
||||
Score: 3 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 Building Jarvis – Parallel Tool-Calling Voice Agent Layer on Top of OpenClaw
|
||||
Link: https://justaniceguy.ai/posts/001-building-jarvis
|
||||
Author: marliechorgan
|
||||
Score: 3 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 Building with an AI that remembers – A blog by my OpenClaw Assistant
|
||||
Link: https://janhoon.com/blog/building-with-an-ai-that-remembers/
|
||||
Author: janhoon
|
||||
Score: 2 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 Let OpenClaw bot to manage your issues and Git repositories
|
||||
Link: https://gisia.dev/docs/ai-bot-skills
|
||||
Author: okoddcat
|
||||
Score: 1 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 Goclaw: A Go Port of OpenClaw
|
||||
Link: https://github.com/nextlevelbuilder/goclaw
|
||||
Author: geoffbp
|
||||
Score: 3 upvotes
|
||||
|
||||
📌 An OpenClaw agent that blogs 24/7 and builds its own host
|
||||
Link: https://news.ycombinator.com/item?id=47214461
|
||||
Author: bfzli
|
||||
Score: 3 upvotes
|
||||
I've been experimenting with long-running OpenClaw agents on dedicated ClawHost instances and wanted to share what's possible when you give ...
|
||||
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
𝕏 X THREADS
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
|
||||
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
🦀 Krilly the Crab
|
||||
Daily digest compiled for Anthony Martin
|
||||
|
||||
OpenClaw on GitHub: https://github.com/openclaw/openclaw
|
||||
r/OpenClaw: https://reddit.com/r/openclaw
|
||||
|
||||
Generated at 2026-03-02T10:04:35.615005 UTC
|
||||
502
automations/openclaw-digest/output/email_20260302_114127.html
Normal file
502
automations/openclaw-digest/output/email_20260302_114127.html
Normal file
@@ -0,0 +1,502 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="color-scheme" content="light dark">
|
||||
<meta name="supported-color-schemes" content="light dark">
|
||||
<title>OpenClaw Daily Digest</title>
|
||||
<style>
|
||||
/* Reset for email clients */
|
||||
body, table, td, a { -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
|
||||
table, td { mso-table-lspace: 0pt; mso-table-rspace: 0pt; }
|
||||
img { -ms-interpolation-mode: bicubic; border: 0; outline: none; text-decoration: none; }
|
||||
|
||||
/* Dark theme base */
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
|
||||
font-size: 16px;
|
||||
line-height: 1.6;
|
||||
color: #e4e4e4;
|
||||
}
|
||||
|
||||
/* Container */
|
||||
.email-wrapper {
|
||||
width: 100%;
|
||||
max-width: 680px;
|
||||
margin: 0 auto;
|
||||
background: #0f0f1a;
|
||||
border-radius: 16px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 20px 60px rgba(0,0,0,0.4);
|
||||
}
|
||||
|
||||
/* Header - Gradient with crab */
|
||||
.header {
|
||||
background: linear-gradient(135deg, #ff6b6b 0%, #ee5a24 50%, #ff9f43 100%);
|
||||
padding: 48px 32px;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
}
|
||||
.header-icon {
|
||||
font-size: 56px;
|
||||
margin-bottom: 12px;
|
||||
display: inline-block;
|
||||
}
|
||||
.header h1 {
|
||||
margin: 0 0 8px 0;
|
||||
color: #ffffff;
|
||||
font-size: 32px;
|
||||
font-weight: 800;
|
||||
letter-spacing: -0.5px;
|
||||
}
|
||||
.header-subtitle {
|
||||
color: rgba(255,255,255,0.9);
|
||||
font-size: 15px;
|
||||
margin: 0;
|
||||
}
|
||||
.header-date {
|
||||
display: inline-block;
|
||||
background: rgba(255,255,255,0.2);
|
||||
backdrop-filter: blur(10px);
|
||||
padding: 10px 24px;
|
||||
border-radius: 30px;
|
||||
margin-top: 20px;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
color: #fff;
|
||||
border: 1px solid rgba(255,255,255,0.3);
|
||||
}
|
||||
|
||||
/* Stats bar */
|
||||
.stats-bar {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 48px;
|
||||
padding: 28px 32px;
|
||||
background: #1a1a2e;
|
||||
border-bottom: 1px solid #2a2a3e;
|
||||
}
|
||||
.stat {
|
||||
text-align: center;
|
||||
}
|
||||
.stat-number {
|
||||
font-size: 32px;
|
||||
font-weight: 800;
|
||||
background: linear-gradient(135deg, #ff6b6b, #ff9f43);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
background-clip: text;
|
||||
line-height: 1;
|
||||
}
|
||||
.stat-label {
|
||||
font-size: 12px;
|
||||
color: #888;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
margin-top: 6px;
|
||||
}
|
||||
|
||||
/* Section headers */
|
||||
.section {
|
||||
padding: 0 32px;
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
.section-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
margin: 40px 0 24px 0;
|
||||
padding-bottom: 12px;
|
||||
border-bottom: 2px solid #2a2a3e;
|
||||
}
|
||||
.section-icon {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 12px;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 20px;
|
||||
}
|
||||
.reddit-icon { background: linear-gradient(135deg, #ff4500, #ff6347); }
|
||||
.hackernews-icon { background: linear-gradient(135deg, #ff6600, #ff8533); }
|
||||
.twitter-icon { background: linear-gradient(135deg, #1da1f2, #0d8bd9); }
|
||||
.section-title {
|
||||
font-size: 20px;
|
||||
font-weight: 700;
|
||||
color: #fff;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* Story cards - injected by aggregate.py */
|
||||
.story {
|
||||
background: linear-gradient(145deg, #1a1a2e 0%, #151525 100%);
|
||||
border-radius: 12px;
|
||||
padding: 24px;
|
||||
margin-bottom: 16px;
|
||||
border: 1px solid #2a2a3e;
|
||||
}
|
||||
.story:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
/* Source tag */
|
||||
.source-tag {
|
||||
display: inline-block;
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
padding: 6px 12px;
|
||||
border-radius: 6px;
|
||||
margin-bottom: 14px;
|
||||
}
|
||||
.tag-reddit { background: rgba(255, 69, 0, 0.15); color: #ff6b6b; }
|
||||
.tag-hn { background: rgba(255, 102, 0, 0.15); color: #ff9f43; }
|
||||
.tag-github { background: rgba(139, 148, 158, 0.15); color: #a29bfe; }
|
||||
.tag-news { background: rgba(116, 185, 255, 0.15); color: #74b9ff; }
|
||||
|
||||
/* Story title */
|
||||
.story-title {
|
||||
margin: 0 0 12px 0;
|
||||
font-size: 17px;
|
||||
font-weight: 600;
|
||||
line-height: 1.5;
|
||||
color: #fff;
|
||||
}
|
||||
.story-title a {
|
||||
color: #74b9ff;
|
||||
text-decoration: none;
|
||||
transition: color 0.2s;
|
||||
}
|
||||
.story-title a:hover {
|
||||
color: #ff6b6b;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* Story meta */
|
||||
.story-meta {
|
||||
font-size: 14px;
|
||||
color: #888;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
.author {
|
||||
color: #a29bfe;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* Story excerpt */
|
||||
.story-excerpt {
|
||||
font-size: 14px;
|
||||
line-height: 1.6;
|
||||
color: #aaa;
|
||||
margin: 0 0 14px 0;
|
||||
}
|
||||
|
||||
/* Engagement badges */
|
||||
.engagement {
|
||||
font-size: 13px;
|
||||
}
|
||||
.badge {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
padding: 4px 10px;
|
||||
border-radius: 20px;
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
margin-right: 8px;
|
||||
}
|
||||
.badge-upvotes {
|
||||
background: rgba(255, 107, 107, 0.15);
|
||||
color: #ff6b6b;
|
||||
}
|
||||
.badge-comments {
|
||||
background: rgba(116, 185, 255, 0.15);
|
||||
color: #74b9ff;
|
||||
}
|
||||
|
||||
/* Empty state */
|
||||
.empty-state {
|
||||
text-align: center;
|
||||
padding: 40px 32px;
|
||||
color: #666;
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
/* Divider */
|
||||
.divider {
|
||||
height: 1px;
|
||||
background: #2a2a3e;
|
||||
margin: 0 32px;
|
||||
}
|
||||
|
||||
/* Coming soon banner */
|
||||
.coming-soon {
|
||||
background: linear-gradient(135deg, #2d3436 0%, #1a1a2e 100%);
|
||||
border: 2px dashed #444;
|
||||
border-radius: 12px;
|
||||
padding: 40px;
|
||||
text-align: center;
|
||||
color: #888;
|
||||
font-size: 15px;
|
||||
}
|
||||
.coming-soon-icon {
|
||||
font-size: 36px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
/* Footer */
|
||||
.footer {
|
||||
background: #0a0a12;
|
||||
padding: 40px 32px;
|
||||
text-align: center;
|
||||
margin-top: 48px;
|
||||
border-top: 1px solid #2a2a3e;
|
||||
}
|
||||
.footer-avatar {
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
background: linear-gradient(135deg, #ff6b6b, #ff9f43);
|
||||
border-radius: 50%;
|
||||
margin: 0 auto 16px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 32px;
|
||||
}
|
||||
.footer-brand {
|
||||
font-size: 18px;
|
||||
font-weight: 700;
|
||||
color: #fff;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
.footer-text {
|
||||
font-size: 14px;
|
||||
color: #888;
|
||||
margin: 0 0 20px 0;
|
||||
}
|
||||
.footer-links {
|
||||
margin-top: 20px;
|
||||
}
|
||||
.footer-links a {
|
||||
color: #74b9ff;
|
||||
text-decoration: none;
|
||||
font-size: 14px;
|
||||
margin: 0 12px;
|
||||
}
|
||||
.footer-links a:hover {
|
||||
color: #ff6b6b;
|
||||
text-decoration: underline;
|
||||
}
|
||||
.footer-time {
|
||||
font-size: 12px;
|
||||
color: #555;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
/* Mobile */
|
||||
@media screen and (max-width: 640px) {
|
||||
.header { padding: 36px 24px; }
|
||||
.header h1 { font-size: 26px; }
|
||||
.header-icon { font-size: 44px; }
|
||||
.stats-bar { gap: 32px; padding: 24px; }
|
||||
.stat-number { font-size: 28px; }
|
||||
.section { padding: 0 24px; margin-bottom: 32px; }
|
||||
.section-header { margin-top: 32px; }
|
||||
.story { padding: 20px; }
|
||||
.story-title { font-size: 16px; }
|
||||
.footer { padding: 32px 24px; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td align="center" style="padding: 20px 10px;">
|
||||
<div class="email-wrapper">
|
||||
|
||||
<!-- Header -->
|
||||
<div class="header">
|
||||
<div class="header-icon">🦀</div>
|
||||
<h1>OpenClaw Daily</h1>
|
||||
<p class="header-subtitle">The best OpenClaw discussions, curated daily</p>
|
||||
<div class="header-date">Monday, March 02, 2026</div>
|
||||
</div>
|
||||
|
||||
<!-- Stats -->
|
||||
<div class="stats-bar">
|
||||
<div class="stat">
|
||||
<div class="stat-number">23</div>
|
||||
<div class="stat-label">Reddit</div>
|
||||
</div>
|
||||
<div class="stat">
|
||||
<div class="stat-number">12</div>
|
||||
<div class="stat-label">News</div>
|
||||
</div>
|
||||
<div class="stat">
|
||||
<div class="stat-number">0</div>
|
||||
<div class="stat-label">X/Twitter</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Reddit Section -->
|
||||
<div class="section">
|
||||
<div class="section-header">
|
||||
<span class="section-icon reddit-icon">🔥</span>
|
||||
<h2 class="section-title">Reddit Highlights</h2>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rhwu6h/openclaw_is_very_buggy/">[Discussion] Openclaw is very buggy</a></h3>
|
||||
<div class="story-meta">u/Ok-Profession-2143</div>
|
||||
<p class="story-excerpt">I don't understand why everyone is crazy about openclaw. Its super buggy. You cannot change models easily. When you update it gets stuck etc etc. </p>
|
||||
<div class="engagement">↑ 61 | 80 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rifnbe/why_are_mac_minis_in_such_high_demand_for/">[Discussion] Why are Mac Minis in such high demand for OpenClaw? Doesn't a VPS work just as well?</a></h3>
|
||||
<div class="story-meta">u/Isunova</div>
|
||||
<p class="story-excerpt">I pay $12/mo for a VPS with 12GB RAM, which is online 24/7. I can access my OpenClaw whenever I want. Why are Mac Minis in such high demand when peopl...</p>
|
||||
<div class="engagement">↑ 69 | 61 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1ri9nt0/me_every_time_i_touch_the_openclawjson/">[Discussion] Me, every time I touch the openclaw.json</a></h3>
|
||||
<div class="story-meta">u/Patient_Lie_9310</div>
|
||||
<p class="story-excerpt">It's always followed by errors and hunting for the stuff I broke.</p>
|
||||
<div class="engagement">↑ 137 | 50 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rhxaj1/openclaw_usecases_to_make_life_easier_11k_stars/">[Discussion] Openclaw Usecases to Make life easier. 11k+ Stars Github Repo</a></h3>
|
||||
<div class="story-meta">u/HuckleberryEntire699</div>
|
||||
|
||||
<div class="engagement">↑ 110 | 7 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rihoec/is_kimi_k_25_with_open_claw_really_that_good/">[Help] Is Kimi K 2.5 with Open Claw really that good?</a></h3>
|
||||
<div class="story-meta">u/Top-Scallion7987</div>
|
||||
<p class="story-excerpt">As of recent, all I've been seeing is ads for Kimi K 2.5 with Open Claw, saying that's the most used model with it. I know it's an open source model, ...</p>
|
||||
<div class="engagement">↑ 13 | 33 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1riiglv/openclaw_102_updates_from_my_101_on_how_to_get/">[Tutorial/Guide] OpenClaw 102: Updates from my 101 on how to get the most from your OpenClaw bot</a></h3>
|
||||
<div class="story-meta">u/adamb0mbNZ</div>
|
||||
<p class="story-excerpt">I have been getting lots of DMs on how to set things up more efficiently in OpenClaw following my previous posts, so I think it's about time to go int...</p>
|
||||
<div class="engagement">↑ 70 | 13 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1ricukf/my_openclaw_is_just_a_glorified_chatpgt/">[Help] My openclaw is just a glorified chatpgt</a></h3>
|
||||
<div class="story-meta">u/Fluffy_Variation4337</div>
|
||||
<p class="story-excerpt">Why is my openclaw just a chatpgt on telegram. How do i get it to become an agent, work behind the scenes, not ask me pointless question and figure th...</p>
|
||||
<div class="engagement">↑ 15 | 40 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rhzht7/i_built_a_voice_assistant_with_openclaw_alexa/">[Showcase] I built a voice assistant with OpenClaw + Alexa + Local LLM (Ollama) — here's how</a></h3>
|
||||
<div class="story-meta">u/cormazacl</div>
|
||||
<p class="story-excerpt">Hey everyone! I've been building a voice-first assistant using OpenClaw as the brain, and wanted to share what I've got working so far.
|
||||
|
||||
## What it do...</p>
|
||||
<div class="engagement">↑ 33 | 11 comments</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
|
||||
<!-- News Section -->
|
||||
<div class="section">
|
||||
<div class="section-header">
|
||||
<span class="section-icon hackernews-icon">🟧</span>
|
||||
<h2 class="section-title">News & Hacker News</h2>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-github">GitHub</span>
|
||||
<h3 class="story-title"><a href="https://github.com/openclaw/openclaw/releases/tag/v2026.3.1">openclaw 2026.3.1</a></h3>
|
||||
<p class="story-excerpt"><h3>Changes</h3>
|
||||
<ul>
|
||||
<li>Agents/Thinking defaults: set <code>adaptive</code> as the default thinking level for Anthropic Claude 4.6 models (including...</p>
|
||||
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-news">theregister.com</span>
|
||||
<h3 class="story-title"><a href="https://news.google.com/rss/articles/CBMidkFVX3lxTE8yY1JhN1hveC1hWHdNZnp2UWMtMnYxdS1kMVFydVkxX0RXUmVXVWFzNjRQTzBwVFpBdWNaVzRiaDZXa3Z5UEd4TXIwR25EaThLM1BsWGFUNldfTEkwV0NKUS1MWV9DTnFBakJmRFNNWXJpUkNObEE?oc=5">OpenClaw, but in containers: Meet NanoClaw - theregister.com</a></h3>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://github.com/swarmclawai/swarmclaw">Show HN: SwarmClaw – Orchestration dashboard for OpenClaw and AI agents</a></h3>
|
||||
|
||||
<div class="engagement">↑ 3 | 1 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://justaniceguy.ai/posts/001-building-jarvis">Building Jarvis – Parallel Tool-Calling Voice Agent Layer on Top of OpenClaw</a></h3>
|
||||
|
||||
<div class="engagement">↑ 3 | 1 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://janhoon.com/blog/building-with-an-ai-that-remembers/">Building with an AI that remembers – A blog by my OpenClaw Assistant</a></h3>
|
||||
|
||||
<div class="engagement">↑ 2 | 1 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://gisia.dev/docs/ai-bot-skills">Let OpenClaw bot to manage your issues and Git repositories</a></h3>
|
||||
|
||||
<div class="engagement">↑ 1 | 1 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://github.com/nextlevelbuilder/goclaw">Goclaw: A Go Port of OpenClaw</a></h3>
|
||||
|
||||
<div class="engagement">↑ 3</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://news.ycombinator.com/item?id=47214461">An OpenClaw agent that blogs 24/7 and builds its own host</a></h3>
|
||||
<p class="story-excerpt">I've been experimenting with long-running OpenClaw agents on dedicated ClawHost instances and wanted to share what's possible when you give ...</p>
|
||||
<div class="engagement">↑ 3</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
|
||||
<!-- X Section -->
|
||||
<div class="section">
|
||||
<div class="section-header">
|
||||
<span class="section-icon twitter-icon">𝕏</span>
|
||||
<h2 class="section-title">From X</h2>
|
||||
</div>
|
||||
<p style="text-align:center;color:#888;padding:30px 0;">🚧 X/Twitter integration coming soon</p>
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
<div class="footer">
|
||||
<div class="footer-avatar">🦀</div>
|
||||
<div class="footer-brand">Curated daily for Anthony Martin</div>
|
||||
<p class="footer-text">by Krilly the Crab</p>
|
||||
<div class="footer-links">
|
||||
<a href="https://github.com/openclaw/openclaw">GitHub</a>
|
||||
<a href="https://reddit.com/r/openclaw">Reddit</a>
|
||||
<a href="https://docs.openclaw.ai">Docs</a>
|
||||
</div>
|
||||
<p class="footer-time">2026-03-02T10:04:35.615005 UTC</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
140
automations/openclaw-digest/output/email_20260302_114127.txt
Normal file
140
automations/openclaw-digest/output/email_20260302_114127.txt
Normal file
@@ -0,0 +1,140 @@
|
||||
🦀 OPENCLAW DAILY DIGEST
|
||||
Your daily dose of OpenClaw discussions, use cases & news
|
||||
|
||||
Date: Monday, March 02, 2026
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📊 TODAY'S SUMMARY
|
||||
• 23 Reddit Posts
|
||||
• 12 News Stories
|
||||
• 0 X Threads
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
🔥 REDDIT HIGHLIGHTS
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📌 Openclaw is very buggy
|
||||
Link: https://reddit.com/r/openclaw/comments/1rhwu6h/openclaw_is_very_buggy/
|
||||
Author: Ok-Profession-2143
|
||||
Score: 61 upvotes
|
||||
Comments: 80
|
||||
I don't understand why everyone is crazy about openclaw. Its super buggy. You cannot change models easily. When you update it gets stuck etc etc.
|
||||
|
||||
📌 Why are Mac Minis in such high demand for OpenClaw? Doesn't a VPS work just as well?
|
||||
Link: https://reddit.com/r/openclaw/comments/1rifnbe/why_are_mac_minis_in_such_high_demand_for/
|
||||
Author: Isunova
|
||||
Score: 69 upvotes
|
||||
Comments: 61
|
||||
I pay $12/mo for a VPS with 12GB RAM, which is online 24/7. I can access my OpenClaw whenever I want. Why are Mac Minis in such high demand when peopl...
|
||||
|
||||
📌 Me, every time I touch the openclaw.json
|
||||
Link: https://reddit.com/r/openclaw/comments/1ri9nt0/me_every_time_i_touch_the_openclawjson/
|
||||
Author: Patient_Lie_9310
|
||||
Score: 137 upvotes
|
||||
Comments: 50
|
||||
It's always followed by errors and hunting for the stuff I broke.
|
||||
|
||||
📌 Openclaw Usecases to Make life easier. 11k+ Stars Github Repo
|
||||
Link: https://reddit.com/r/openclaw/comments/1rhxaj1/openclaw_usecases_to_make_life_easier_11k_stars/
|
||||
Author: HuckleberryEntire699
|
||||
Score: 110 upvotes
|
||||
Comments: 7
|
||||
|
||||
📌 Is Kimi K 2.5 with Open Claw really that good?
|
||||
Link: https://reddit.com/r/openclaw/comments/1rihoec/is_kimi_k_25_with_open_claw_really_that_good/
|
||||
Author: Top-Scallion7987
|
||||
Score: 13 upvotes
|
||||
Comments: 33
|
||||
As of recent, all I've been seeing is ads for Kimi K 2.5 with Open Claw, saying that's the most used model with it. I know it's an open source model, ...
|
||||
|
||||
📌 OpenClaw 102: Updates from my 101 on how to get the most from your OpenClaw bot
|
||||
Link: https://reddit.com/r/openclaw/comments/1riiglv/openclaw_102_updates_from_my_101_on_how_to_get/
|
||||
Author: adamb0mbNZ
|
||||
Score: 70 upvotes
|
||||
Comments: 13
|
||||
I have been getting lots of DMs on how to set things up more efficiently in OpenClaw following my previous posts, so I think it's about time to go int...
|
||||
|
||||
📌 My openclaw is just a glorified chatpgt
|
||||
Link: https://reddit.com/r/openclaw/comments/1ricukf/my_openclaw_is_just_a_glorified_chatpgt/
|
||||
Author: Fluffy_Variation4337
|
||||
Score: 15 upvotes
|
||||
Comments: 40
|
||||
Why is my openclaw just a chatpgt on telegram. How do i get it to become an agent, work behind the scenes, not ask me pointless question and figure th...
|
||||
|
||||
📌 I built a voice assistant with OpenClaw + Alexa + Local LLM (Ollama) — here's how
|
||||
Link: https://reddit.com/r/openclaw/comments/1rhzht7/i_built_a_voice_assistant_with_openclaw_alexa/
|
||||
Author: cormazacl
|
||||
Score: 33 upvotes
|
||||
Comments: 11
|
||||
Hey everyone! I've been building a voice-first assistant using OpenClaw as the brain, and wanted to share what I've got working so far.
|
||||
|
||||
## What it do...
|
||||
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
📰 NEWS ROUNDUP
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📌 openclaw 2026.3.1
|
||||
Link: https://github.com/openclaw/openclaw/releases/tag/v2026.3.1
|
||||
<h3>Changes</h3>
|
||||
<ul>
|
||||
<li>Agents/Thinking defaults: set <code>adaptive</code> as the default thinking level for Anthropic Claude 4.6 models (including...
|
||||
|
||||
📌 OpenClaw, but in containers: Meet NanoClaw - theregister.com
|
||||
Link: https://news.google.com/rss/articles/CBMidkFVX3lxTE8yY1JhN1hveC1hWHdNZnp2UWMtMnYxdS1kMVFydVkxX0RXUmVXVWFzNjRQTzBwVFpBdWNaVzRiaDZXa3Z5UEd4TXIwR25EaThLM1BsWGFUNldfTEkwV0NKUS1MWV9DTnFBakJmRFNNWXJpUkNObEE?oc=5
|
||||
|
||||
📌 Show HN: SwarmClaw – Orchestration dashboard for OpenClaw and AI agents
|
||||
Link: https://github.com/swarmclawai/swarmclaw
|
||||
Author: jamesweb
|
||||
Score: 3 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 Building Jarvis – Parallel Tool-Calling Voice Agent Layer on Top of OpenClaw
|
||||
Link: https://justaniceguy.ai/posts/001-building-jarvis
|
||||
Author: marliechorgan
|
||||
Score: 3 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 Building with an AI that remembers – A blog by my OpenClaw Assistant
|
||||
Link: https://janhoon.com/blog/building-with-an-ai-that-remembers/
|
||||
Author: janhoon
|
||||
Score: 2 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 Let OpenClaw bot to manage your issues and Git repositories
|
||||
Link: https://gisia.dev/docs/ai-bot-skills
|
||||
Author: okoddcat
|
||||
Score: 1 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 Goclaw: A Go Port of OpenClaw
|
||||
Link: https://github.com/nextlevelbuilder/goclaw
|
||||
Author: geoffbp
|
||||
Score: 3 upvotes
|
||||
|
||||
📌 An OpenClaw agent that blogs 24/7 and builds its own host
|
||||
Link: https://news.ycombinator.com/item?id=47214461
|
||||
Author: bfzli
|
||||
Score: 3 upvotes
|
||||
I've been experimenting with long-running OpenClaw agents on dedicated ClawHost instances and wanted to share what's possible when you give ...
|
||||
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
𝕏 X THREADS
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
|
||||
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
🦀 Krilly the Crab
|
||||
Daily digest compiled for Anthony Martin
|
||||
|
||||
OpenClaw on GitHub: https://github.com/openclaw/openclaw
|
||||
r/OpenClaw: https://reddit.com/r/openclaw
|
||||
|
||||
Generated at 2026-03-02T10:04:35.615005 UTC
|
||||
513
automations/openclaw-digest/output/email_20260302_230245.html
Normal file
513
automations/openclaw-digest/output/email_20260302_230245.html
Normal file
@@ -0,0 +1,513 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="color-scheme" content="light dark">
|
||||
<meta name="supported-color-schemes" content="light dark">
|
||||
<title>OpenClaw Daily Digest</title>
|
||||
<style>
|
||||
/* Reset for email clients */
|
||||
body, table, td, a { -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
|
||||
table, td { mso-table-lspace: 0pt; mso-table-rspace: 0pt; }
|
||||
img { -ms-interpolation-mode: bicubic; border: 0; outline: none; text-decoration: none; }
|
||||
|
||||
/* Dark theme base */
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
|
||||
font-size: 16px;
|
||||
line-height: 1.6;
|
||||
color: #e4e4e4;
|
||||
}
|
||||
|
||||
/* Container */
|
||||
.email-wrapper {
|
||||
width: 100%;
|
||||
max-width: 680px;
|
||||
margin: 0 auto;
|
||||
background: #0f0f1a;
|
||||
border-radius: 16px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 20px 60px rgba(0,0,0,0.4);
|
||||
}
|
||||
|
||||
/* Header - Gradient with crab */
|
||||
.header {
|
||||
background: linear-gradient(135deg, #ff6b6b 0%, #ee5a24 50%, #ff9f43 100%);
|
||||
padding: 48px 32px;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
}
|
||||
.header-icon {
|
||||
font-size: 56px;
|
||||
margin-bottom: 12px;
|
||||
display: inline-block;
|
||||
}
|
||||
.header h1 {
|
||||
margin: 0 0 8px 0;
|
||||
color: #ffffff;
|
||||
font-size: 32px;
|
||||
font-weight: 800;
|
||||
letter-spacing: -0.5px;
|
||||
}
|
||||
.header-subtitle {
|
||||
color: rgba(255,255,255,0.9);
|
||||
font-size: 15px;
|
||||
margin: 0;
|
||||
}
|
||||
.header-date {
|
||||
display: inline-block;
|
||||
background: rgba(255,255,255,0.2);
|
||||
backdrop-filter: blur(10px);
|
||||
padding: 10px 24px;
|
||||
border-radius: 30px;
|
||||
margin-top: 20px;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
color: #fff;
|
||||
border: 1px solid rgba(255,255,255,0.3);
|
||||
}
|
||||
|
||||
/* Stats bar */
|
||||
.stats-bar {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 48px;
|
||||
padding: 28px 32px;
|
||||
background: #1a1a2e;
|
||||
border-bottom: 1px solid #2a2a3e;
|
||||
}
|
||||
.stat {
|
||||
text-align: center;
|
||||
}
|
||||
.stat-number {
|
||||
font-size: 32px;
|
||||
font-weight: 800;
|
||||
background: linear-gradient(135deg, #ff6b6b, #ff9f43);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
background-clip: text;
|
||||
line-height: 1;
|
||||
}
|
||||
.stat-label {
|
||||
font-size: 12px;
|
||||
color: #888;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
margin-top: 6px;
|
||||
}
|
||||
|
||||
/* Section headers */
|
||||
.section {
|
||||
padding: 0 32px;
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
.section-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
margin: 40px 0 24px 0;
|
||||
padding-bottom: 12px;
|
||||
border-bottom: 2px solid #2a2a3e;
|
||||
}
|
||||
.section-icon {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 12px;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 20px;
|
||||
}
|
||||
.reddit-icon { background: linear-gradient(135deg, #ff4500, #ff6347); }
|
||||
.hackernews-icon { background: linear-gradient(135deg, #ff6600, #ff8533); }
|
||||
.twitter-icon { background: linear-gradient(135deg, #1da1f2, #0d8bd9); }
|
||||
.section-title {
|
||||
font-size: 20px;
|
||||
font-weight: 700;
|
||||
color: #fff;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* Story cards - injected by aggregate.py */
|
||||
.story {
|
||||
background: linear-gradient(145deg, #1a1a2e 0%, #151525 100%);
|
||||
border-radius: 12px;
|
||||
padding: 24px;
|
||||
margin-bottom: 16px;
|
||||
border: 1px solid #2a2a3e;
|
||||
}
|
||||
.story:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
/* Source tag */
|
||||
.source-tag {
|
||||
display: inline-block;
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
padding: 6px 12px;
|
||||
border-radius: 6px;
|
||||
margin-bottom: 14px;
|
||||
}
|
||||
.tag-reddit { background: rgba(255, 69, 0, 0.15); color: #ff6b6b; }
|
||||
.tag-hn { background: rgba(255, 102, 0, 0.15); color: #ff9f43; }
|
||||
.tag-github { background: rgba(139, 148, 158, 0.15); color: #a29bfe; }
|
||||
.tag-news { background: rgba(116, 185, 255, 0.15); color: #74b9ff; }
|
||||
|
||||
/* Story title */
|
||||
.story-title {
|
||||
margin: 0 0 12px 0;
|
||||
font-size: 17px;
|
||||
font-weight: 600;
|
||||
line-height: 1.5;
|
||||
color: #fff;
|
||||
}
|
||||
.story-title a {
|
||||
color: #74b9ff;
|
||||
text-decoration: none;
|
||||
transition: color 0.2s;
|
||||
}
|
||||
.story-title a:hover {
|
||||
color: #ff6b6b;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* Story meta */
|
||||
.story-meta {
|
||||
font-size: 14px;
|
||||
color: #888;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
.author {
|
||||
color: #a29bfe;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* Story excerpt */
|
||||
.story-excerpt {
|
||||
font-size: 14px;
|
||||
line-height: 1.6;
|
||||
color: #aaa;
|
||||
margin: 0 0 14px 0;
|
||||
}
|
||||
|
||||
/* Engagement badges */
|
||||
.engagement {
|
||||
font-size: 13px;
|
||||
}
|
||||
.badge {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
padding: 4px 10px;
|
||||
border-radius: 20px;
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
margin-right: 8px;
|
||||
}
|
||||
.badge-upvotes {
|
||||
background: rgba(255, 107, 107, 0.15);
|
||||
color: #ff6b6b;
|
||||
}
|
||||
.badge-comments {
|
||||
background: rgba(116, 185, 255, 0.15);
|
||||
color: #74b9ff;
|
||||
}
|
||||
|
||||
/* Empty state */
|
||||
.empty-state {
|
||||
text-align: center;
|
||||
padding: 40px 32px;
|
||||
color: #666;
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
/* Divider */
|
||||
.divider {
|
||||
height: 1px;
|
||||
background: #2a2a3e;
|
||||
margin: 0 32px;
|
||||
}
|
||||
|
||||
/* Coming soon banner */
|
||||
.coming-soon {
|
||||
background: linear-gradient(135deg, #2d3436 0%, #1a1a2e 100%);
|
||||
border: 2px dashed #444;
|
||||
border-radius: 12px;
|
||||
padding: 40px;
|
||||
text-align: center;
|
||||
color: #888;
|
||||
font-size: 15px;
|
||||
}
|
||||
.coming-soon-icon {
|
||||
font-size: 36px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
/* Footer */
|
||||
.footer {
|
||||
background: #0a0a12;
|
||||
padding: 40px 32px;
|
||||
text-align: center;
|
||||
margin-top: 48px;
|
||||
border-top: 1px solid #2a2a3e;
|
||||
}
|
||||
.footer-avatar {
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
background: linear-gradient(135deg, #ff6b6b, #ff9f43);
|
||||
border-radius: 50%;
|
||||
margin: 0 auto 16px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 32px;
|
||||
}
|
||||
.footer-brand {
|
||||
font-size: 18px;
|
||||
font-weight: 700;
|
||||
color: #fff;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
.footer-text {
|
||||
font-size: 14px;
|
||||
color: #888;
|
||||
margin: 0 0 20px 0;
|
||||
}
|
||||
.footer-links {
|
||||
margin-top: 20px;
|
||||
}
|
||||
.footer-links a {
|
||||
color: #74b9ff;
|
||||
text-decoration: none;
|
||||
font-size: 14px;
|
||||
margin: 0 12px;
|
||||
}
|
||||
.footer-links a:hover {
|
||||
color: #ff6b6b;
|
||||
text-decoration: underline;
|
||||
}
|
||||
.footer-time {
|
||||
font-size: 12px;
|
||||
color: #555;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
/* Mobile */
|
||||
@media screen and (max-width: 640px) {
|
||||
.header { padding: 36px 24px; }
|
||||
.header h1 { font-size: 26px; }
|
||||
.header-icon { font-size: 44px; }
|
||||
.stats-bar { gap: 32px; padding: 24px; }
|
||||
.stat-number { font-size: 28px; }
|
||||
.section { padding: 0 24px; margin-bottom: 32px; }
|
||||
.section-header { margin-top: 32px; }
|
||||
.story { padding: 20px; }
|
||||
.story-title { font-size: 16px; }
|
||||
.footer { padding: 32px 24px; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td align="center" style="padding: 20px 10px;">
|
||||
<div class="email-wrapper">
|
||||
|
||||
<!-- Header -->
|
||||
<div class="header">
|
||||
<div class="header-icon">🦀</div>
|
||||
<h1>OpenClaw Daily</h1>
|
||||
<p class="header-subtitle">The best OpenClaw discussions, curated daily</p>
|
||||
<div class="header-date">Monday, March 02, 2026</div>
|
||||
</div>
|
||||
|
||||
<!-- Stats -->
|
||||
<div class="stats-bar">
|
||||
<div class="stat">
|
||||
<div class="stat-number">24</div>
|
||||
<div class="stat-label">Reddit</div>
|
||||
</div>
|
||||
<div class="stat">
|
||||
<div class="stat-number">12</div>
|
||||
<div class="stat-label">News</div>
|
||||
</div>
|
||||
<div class="stat">
|
||||
<div class="stat-number">0</div>
|
||||
<div class="stat-label">X/Twitter</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Reddit Section -->
|
||||
<div class="section">
|
||||
<div class="section-header">
|
||||
<span class="section-icon reddit-icon">🔥</span>
|
||||
<h2 class="section-title">Reddit Highlights</h2>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rifnbe/why_are_mac_minis_in_such_high_demand_for/">[Discussion] Why are Mac Minis in such high demand for OpenClaw? Doesn't a VPS work just as well?</a></h3>
|
||||
<div class="story-meta">u/Isunova</div>
|
||||
<p class="story-excerpt">I pay $12/mo for a VPS with 12GB RAM, which is online 24/7. I can access my OpenClaw whenever I want. Why are Mac Minis in such high demand when peopl...</p>
|
||||
<div class="engagement">↑ 127 | 106 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1riudg5/your_first_72_hours_with_openclaw_will_determine/">[Tutorial/Guide] Your first 72 hours with OpenClaw will determine if you keep using it. Here's the setup most people skip</a></h3>
|
||||
<div class="story-meta">u/Ibrasa</div>
|
||||
<p class="story-excerpt">Everyone's first instinct with OpenClaw is to build a dashboard. Command centers, mission control, fancy UI, it looks great on Twitter and it's a comp...</p>
|
||||
<div class="engagement">↑ 160 | 37 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1riiglv/openclaw_102_updates_from_my_101_on_how_to_get/">[Tutorial/Guide] OpenClaw 102: Updates from my 101 on how to get the most from your OpenClaw bot</a></h3>
|
||||
<div class="story-meta">u/adamb0mbNZ</div>
|
||||
<p class="story-excerpt">I have been getting lots of DMs on how to set things up more efficiently in OpenClaw following my previous posts, so I think it's about time to go int...</p>
|
||||
<div class="engagement">↑ 152 | 23 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1riulxt/using_openclaw_on_telgram_with_topicssessions/">[Showcase] Using OpenClaw On Telgram with Topics/Sessions</a></h3>
|
||||
<div class="story-meta">u/Unusual-Evidence-478</div>
|
||||
<p class="story-excerpt">Do people not know that Telegram OpenClaw can be used with Topics?(See screenshots)
|
||||
|
||||
|
||||
Just add Threads Mode on your Bots Settings.</p>
|
||||
<div class="engagement">↑ 16 | 32 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1riwwga/ai_noob_how_much_are_you_guys_spending/">[Help] AI Noob - how much are you guys spending?</a></h3>
|
||||
<div class="story-meta">u/Daily_TimeTraveler</div>
|
||||
<p class="story-excerpt">Hey everyone, as titled mentions, I’m an ai noob who’s trying to lean in and learn more.
|
||||
|
||||
I stumbled across openclaw this weekend and have been doing ...</p>
|
||||
<div class="engagement">↑ 5 | 37 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rijszl/i_just_gave_openclaw_a_physical_brain_you_can/">[Showcase] I just gave OpenClaw a physical brain you can actually touch.</a></h3>
|
||||
<div class="story-meta">u/emolinare</div>
|
||||
<p class="story-excerpt">OpenMind turns your installation into a fully interactive, live-editable mind map. No more digging through logs, just pure visual logic.
|
||||
|
||||
|
||||
✅ Real-ti...</p>
|
||||
<div class="engagement">↑ 29 | 14 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1riuw7e/any_openclaw_alternative_that_actually_works_for/">[Help] Any OpenClaw alternative that actually works for running a real business?</a></h3>
|
||||
<div class="story-meta">u/Able_War1</div>
|
||||
<p class="story-excerpt">been messing with openclaw for about a month now and while the tech is genuinely impressive, I'm starting to feel like it's more of a dev toy than som...</p>
|
||||
<div class="engagement">↑ 7 | 27 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rj00va/my_openclaw_agent_calls_me_every_morning_now_and/">[Tutorial/Guide] My OpenClaw agent calls me every morning now (and other automations that were useful enough for me to keep)</a></h3>
|
||||
<div class="story-meta">u/marcos_pereira</div>
|
||||
<p class="story-excerpt">I've been using openclaw for a few days now and gradually set up a bunch of automations, so I wanted to share with yall what's been working for me.
|
||||
It...</p>
|
||||
<div class="engagement">↑ 23 | 12 comments</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
|
||||
<!-- News Section -->
|
||||
<div class="section">
|
||||
<div class="section-header">
|
||||
<span class="section-icon hackernews-icon">🟧</span>
|
||||
<h2 class="section-title">News & Hacker News</h2>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://www.star-history.com/blog/openclaw-surpasses-react-most-starred-software">OpenClaw surpasses React to become the most-starred software project on GitHub</a></h3>
|
||||
|
||||
<div class="engagement">↑ 240 | 288 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-news">inc.com</span>
|
||||
<h3 class="story-title"><a href="https://news.google.com/rss/articles/CBMinAFBVV95cUxQekxuNXY5YmVIZXRKaVpFNnhuRm9GWGxLd2Rsd09UaDNTYmlncVh1SzdDaHVoa25aY1llTTlCQ0M5WGJpUXBLenFCamM4QTVSTFRGa1VpUlI0WFNtSWxqNVF6QWVldWFnZVljTFRnSTB0SnI3Uk9ta3hRR0V4eHlHTjdpT01nWk1mSlozdGIxZ1NCcVFkczlkbmYzcHc?oc=5">I Built an OpenClaw AI Agent to Do My Job for Me. The Results Were Surprising—and a Little Scary - inc.com</a></h3>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-github">GitHub</span>
|
||||
<h3 class="story-title"><a href="https://github.com/openclaw/openclaw/releases/tag/v2026.3.1">openclaw 2026.3.1</a></h3>
|
||||
<p class="story-excerpt"><h3>Changes</h3>
|
||||
<ul>
|
||||
<li>Agents/Thinking defaults: set <code>adaptive</code> as the default thinking level for Anthropic Claude 4.6 models (including...</p>
|
||||
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://twitter.com/openclaw/status/2028347703621464481">OpenClaw passes React in amount of stars on GitHub</a></h3>
|
||||
|
||||
<div class="engagement">↑ 6 | 2 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://github.com/CoChatAI/openclaw-carapace">Show HN: OpenClaw Carapace – Security Scanner for OpenClaw</a></h3>
|
||||
<p class="story-excerpt">Here's Openclaw Carapace, a CLI security scanner for OpenClaw. It audits your configs, flags CVEs, and scans skill files for vulnerabilities.<p>A...</p>
|
||||
<div class="engagement">↑ 6</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://www.gitagent.sh/">Show HN: GitAgent – Clone a repo, get an AI agent – Claude Code / OpenClaw</a></h3>
|
||||
<p class="story-excerpt"><p><pre><code> Hey HN,
|
||||
|
||||
We built GitAgent — a git-native, framework-agnostic open standard
|
||||
for
|
||||
defining AI agents. The idea is simple: your rep...</p>
|
||||
<div class="engagement">↑ 2 | 2 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://github.com/nextlevelbuilder/goclaw">Goclaw: A Go Port of OpenClaw</a></h3>
|
||||
|
||||
<div class="engagement">↑ 5</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://www.myopenclaw.cloud">Managed OpenClaw hosting your own AI assistant in 60 seconds, no server needed</a></h3>
|
||||
|
||||
<div class="engagement">↑ 2 | 1 comments</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
|
||||
<!-- X Section -->
|
||||
<div class="section">
|
||||
<div class="section-header">
|
||||
<span class="section-icon twitter-icon">𝕏</span>
|
||||
<h2 class="section-title">From X</h2>
|
||||
</div>
|
||||
<p style="text-align:center;color:#888;padding:30px 0;">🚧 X/Twitter integration coming soon</p>
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
<div class="footer">
|
||||
<div class="footer-avatar">🦀</div>
|
||||
<div class="footer-brand">Curated daily for Anthony Martin</div>
|
||||
<p class="footer-text">by Krilly the Crab</p>
|
||||
<div class="footer-links">
|
||||
<a href="https://github.com/openclaw/openclaw">GitHub</a>
|
||||
<a href="https://reddit.com/r/openclaw">Reddit</a>
|
||||
<a href="https://docs.openclaw.ai">Docs</a>
|
||||
</div>
|
||||
<p class="footer-time">2026-03-02T23:02:45.288820 UTC</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
153
automations/openclaw-digest/output/email_20260302_230245.txt
Normal file
153
automations/openclaw-digest/output/email_20260302_230245.txt
Normal file
@@ -0,0 +1,153 @@
|
||||
🦀 OPENCLAW DAILY DIGEST
|
||||
Your daily dose of OpenClaw discussions, use cases & news
|
||||
|
||||
Date: Monday, March 02, 2026
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📊 TODAY'S SUMMARY
|
||||
• 24 Reddit Posts
|
||||
• 12 News Stories
|
||||
• 0 X Threads
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
🔥 REDDIT HIGHLIGHTS
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📌 Why are Mac Minis in such high demand for OpenClaw? Doesn't a VPS work just as well?
|
||||
Link: https://reddit.com/r/openclaw/comments/1rifnbe/why_are_mac_minis_in_such_high_demand_for/
|
||||
Author: Isunova
|
||||
Score: 127 upvotes
|
||||
Comments: 106
|
||||
I pay $12/mo for a VPS with 12GB RAM, which is online 24/7. I can access my OpenClaw whenever I want. Why are Mac Minis in such high demand when peopl...
|
||||
|
||||
📌 Your first 72 hours with OpenClaw will determine if you keep using it. Here's the setup most people skip
|
||||
Link: https://reddit.com/r/openclaw/comments/1riudg5/your_first_72_hours_with_openclaw_will_determine/
|
||||
Author: Ibrasa
|
||||
Score: 160 upvotes
|
||||
Comments: 37
|
||||
Everyone's first instinct with OpenClaw is to build a dashboard. Command centers, mission control, fancy UI, it looks great on Twitter and it's a comp...
|
||||
|
||||
📌 OpenClaw 102: Updates from my 101 on how to get the most from your OpenClaw bot
|
||||
Link: https://reddit.com/r/openclaw/comments/1riiglv/openclaw_102_updates_from_my_101_on_how_to_get/
|
||||
Author: adamb0mbNZ
|
||||
Score: 152 upvotes
|
||||
Comments: 23
|
||||
I have been getting lots of DMs on how to set things up more efficiently in OpenClaw following my previous posts, so I think it's about time to go int...
|
||||
|
||||
📌 Using OpenClaw On Telgram with Topics/Sessions
|
||||
Link: https://reddit.com/r/openclaw/comments/1riulxt/using_openclaw_on_telgram_with_topicssessions/
|
||||
Author: Unusual-Evidence-478
|
||||
Score: 16 upvotes
|
||||
Comments: 32
|
||||
Do people not know that Telegram OpenClaw can be used with Topics?(See screenshots)
|
||||
|
||||
|
||||
Just add Threads Mode on your Bots Settings.
|
||||
|
||||
📌 AI Noob - how much are you guys spending?
|
||||
Link: https://reddit.com/r/openclaw/comments/1riwwga/ai_noob_how_much_are_you_guys_spending/
|
||||
Author: Daily_TimeTraveler
|
||||
Score: 5 upvotes
|
||||
Comments: 37
|
||||
Hey everyone, as titled mentions, I’m an ai noob who’s trying to lean in and learn more.
|
||||
|
||||
I stumbled across openclaw this weekend and have been doing ...
|
||||
|
||||
📌 I just gave OpenClaw a physical brain you can actually touch.
|
||||
Link: https://reddit.com/r/openclaw/comments/1rijszl/i_just_gave_openclaw_a_physical_brain_you_can/
|
||||
Author: emolinare
|
||||
Score: 29 upvotes
|
||||
Comments: 14
|
||||
OpenMind turns your installation into a fully interactive, live-editable mind map. No more digging through logs, just pure visual logic.
|
||||
|
||||
|
||||
✅ Real-ti...
|
||||
|
||||
📌 Any OpenClaw alternative that actually works for running a real business?
|
||||
Link: https://reddit.com/r/openclaw/comments/1riuw7e/any_openclaw_alternative_that_actually_works_for/
|
||||
Author: Able_War1
|
||||
Score: 7 upvotes
|
||||
Comments: 27
|
||||
been messing with openclaw for about a month now and while the tech is genuinely impressive, I'm starting to feel like it's more of a dev toy than som...
|
||||
|
||||
📌 My OpenClaw agent calls me every morning now (and other automations that were useful enough for me to keep)
|
||||
Link: https://reddit.com/r/openclaw/comments/1rj00va/my_openclaw_agent_calls_me_every_morning_now_and/
|
||||
Author: marcos_pereira
|
||||
Score: 23 upvotes
|
||||
Comments: 12
|
||||
I've been using openclaw for a few days now and gradually set up a bunch of automations, so I wanted to share with yall what's been working for me.
|
||||
It...
|
||||
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
📰 NEWS ROUNDUP
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📌 OpenClaw surpasses React to become the most-starred software project on GitHub
|
||||
Link: https://www.star-history.com/blog/openclaw-surpasses-react-most-starred-software
|
||||
Author: whit537
|
||||
Score: 240 upvotes
|
||||
Comments: 288
|
||||
|
||||
📌 I Built an OpenClaw AI Agent to Do My Job for Me. The Results Were Surprising—and a Little Scary - inc.com
|
||||
Link: https://news.google.com/rss/articles/CBMinAFBVV95cUxQekxuNXY5YmVIZXRKaVpFNnhuRm9GWGxLd2Rsd09UaDNTYmlncVh1SzdDaHVoa25aY1llTTlCQ0M5WGJpUXBLenFCamM4QTVSTFRGa1VpUlI0WFNtSWxqNVF6QWVldWFnZVljTFRnSTB0SnI3Uk9ta3hRR0V4eHlHTjdpT01nWk1mSlozdGIxZ1NCcVFkczlkbmYzcHc?oc=5
|
||||
|
||||
📌 openclaw 2026.3.1
|
||||
Link: https://github.com/openclaw/openclaw/releases/tag/v2026.3.1
|
||||
<h3>Changes</h3>
|
||||
<ul>
|
||||
<li>Agents/Thinking defaults: set <code>adaptive</code> as the default thinking level for Anthropic Claude 4.6 models (including...
|
||||
|
||||
📌 OpenClaw passes React in amount of stars on GitHub
|
||||
Link: https://twitter.com/openclaw/status/2028347703621464481
|
||||
Author: helloplanets
|
||||
Score: 6 upvotes
|
||||
Comments: 2
|
||||
|
||||
📌 Show HN: OpenClaw Carapace – Security Scanner for OpenClaw
|
||||
Link: https://github.com/CoChatAI/openclaw-carapace
|
||||
Author: broskees
|
||||
Score: 6 upvotes
|
||||
Here's Openclaw Carapace, a CLI security scanner for OpenClaw. It audits your configs, flags CVEs, and scans skill files for vulnerabilities.<p>A...
|
||||
|
||||
📌 Show HN: GitAgent – Clone a repo, get an AI agent – Claude Code / OpenClaw
|
||||
Link: https://www.gitagent.sh/
|
||||
Author: Shreyaskapale
|
||||
Score: 2 upvotes
|
||||
Comments: 2
|
||||
<p><pre><code> Hey HN,
|
||||
|
||||
We built GitAgent — a git-native, framework-agnostic open standard
|
||||
for
|
||||
defining AI agents. The idea is simple: your rep...
|
||||
|
||||
📌 Goclaw: A Go Port of OpenClaw
|
||||
Link: https://github.com/nextlevelbuilder/goclaw
|
||||
Author: geoffbp
|
||||
Score: 5 upvotes
|
||||
|
||||
📌 Managed OpenClaw hosting your own AI assistant in 60 seconds, no server needed
|
||||
Link: https://www.myopenclaw.cloud
|
||||
Author: danielthego
|
||||
Score: 2 upvotes
|
||||
Comments: 1
|
||||
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
𝕏 X THREADS
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
|
||||
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
🦀 Krilly the Crab
|
||||
Daily digest compiled for Anthony Martin
|
||||
|
||||
OpenClaw on GitHub: https://github.com/openclaw/openclaw
|
||||
r/OpenClaw: https://reddit.com/r/openclaw
|
||||
|
||||
Generated at 2026-03-02T23:02:45.288820 UTC
|
||||
510
automations/openclaw-digest/output/email_20260303_230132.html
Normal file
510
automations/openclaw-digest/output/email_20260303_230132.html
Normal file
@@ -0,0 +1,510 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="color-scheme" content="light dark">
|
||||
<meta name="supported-color-schemes" content="light dark">
|
||||
<title>OpenClaw Daily Digest</title>
|
||||
<style>
|
||||
/* Reset for email clients */
|
||||
body, table, td, a { -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
|
||||
table, td { mso-table-lspace: 0pt; mso-table-rspace: 0pt; }
|
||||
img { -ms-interpolation-mode: bicubic; border: 0; outline: none; text-decoration: none; }
|
||||
|
||||
/* Dark theme base */
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
|
||||
font-size: 16px;
|
||||
line-height: 1.6;
|
||||
color: #e4e4e4;
|
||||
}
|
||||
|
||||
/* Container */
|
||||
.email-wrapper {
|
||||
width: 100%;
|
||||
max-width: 680px;
|
||||
margin: 0 auto;
|
||||
background: #0f0f1a;
|
||||
border-radius: 16px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 20px 60px rgba(0,0,0,0.4);
|
||||
}
|
||||
|
||||
/* Header - Gradient with crab */
|
||||
.header {
|
||||
background: linear-gradient(135deg, #ff6b6b 0%, #ee5a24 50%, #ff9f43 100%);
|
||||
padding: 48px 32px;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
}
|
||||
.header-icon {
|
||||
font-size: 56px;
|
||||
margin-bottom: 12px;
|
||||
display: inline-block;
|
||||
}
|
||||
.header h1 {
|
||||
margin: 0 0 8px 0;
|
||||
color: #ffffff;
|
||||
font-size: 32px;
|
||||
font-weight: 800;
|
||||
letter-spacing: -0.5px;
|
||||
}
|
||||
.header-subtitle {
|
||||
color: rgba(255,255,255,0.9);
|
||||
font-size: 15px;
|
||||
margin: 0;
|
||||
}
|
||||
.header-date {
|
||||
display: inline-block;
|
||||
background: rgba(255,255,255,0.2);
|
||||
backdrop-filter: blur(10px);
|
||||
padding: 10px 24px;
|
||||
border-radius: 30px;
|
||||
margin-top: 20px;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
color: #fff;
|
||||
border: 1px solid rgba(255,255,255,0.3);
|
||||
}
|
||||
|
||||
/* Stats bar */
|
||||
.stats-bar {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 48px;
|
||||
padding: 28px 32px;
|
||||
background: #1a1a2e;
|
||||
border-bottom: 1px solid #2a2a3e;
|
||||
}
|
||||
.stat {
|
||||
text-align: center;
|
||||
}
|
||||
.stat-number {
|
||||
font-size: 32px;
|
||||
font-weight: 800;
|
||||
background: linear-gradient(135deg, #ff6b6b, #ff9f43);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
background-clip: text;
|
||||
line-height: 1;
|
||||
}
|
||||
.stat-label {
|
||||
font-size: 12px;
|
||||
color: #888;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
margin-top: 6px;
|
||||
}
|
||||
|
||||
/* Section headers */
|
||||
.section {
|
||||
padding: 0 32px;
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
.section-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
margin: 40px 0 24px 0;
|
||||
padding-bottom: 12px;
|
||||
border-bottom: 2px solid #2a2a3e;
|
||||
}
|
||||
.section-icon {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 12px;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 20px;
|
||||
}
|
||||
.reddit-icon { background: linear-gradient(135deg, #ff4500, #ff6347); }
|
||||
.hackernews-icon { background: linear-gradient(135deg, #ff6600, #ff8533); }
|
||||
.twitter-icon { background: linear-gradient(135deg, #1da1f2, #0d8bd9); }
|
||||
.section-title {
|
||||
font-size: 20px;
|
||||
font-weight: 700;
|
||||
color: #fff;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* Story cards - injected by aggregate.py */
|
||||
.story {
|
||||
background: linear-gradient(145deg, #1a1a2e 0%, #151525 100%);
|
||||
border-radius: 12px;
|
||||
padding: 24px;
|
||||
margin-bottom: 16px;
|
||||
border: 1px solid #2a2a3e;
|
||||
}
|
||||
.story:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
/* Source tag */
|
||||
.source-tag {
|
||||
display: inline-block;
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
padding: 6px 12px;
|
||||
border-radius: 6px;
|
||||
margin-bottom: 14px;
|
||||
}
|
||||
.tag-reddit { background: rgba(255, 69, 0, 0.15); color: #ff6b6b; }
|
||||
.tag-hn { background: rgba(255, 102, 0, 0.15); color: #ff9f43; }
|
||||
.tag-github { background: rgba(139, 148, 158, 0.15); color: #a29bfe; }
|
||||
.tag-news { background: rgba(116, 185, 255, 0.15); color: #74b9ff; }
|
||||
|
||||
/* Story title */
|
||||
.story-title {
|
||||
margin: 0 0 12px 0;
|
||||
font-size: 17px;
|
||||
font-weight: 600;
|
||||
line-height: 1.5;
|
||||
color: #fff;
|
||||
}
|
||||
.story-title a {
|
||||
color: #74b9ff;
|
||||
text-decoration: none;
|
||||
transition: color 0.2s;
|
||||
}
|
||||
.story-title a:hover {
|
||||
color: #ff6b6b;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* Story meta */
|
||||
.story-meta {
|
||||
font-size: 14px;
|
||||
color: #888;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
.author {
|
||||
color: #a29bfe;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* Story excerpt */
|
||||
.story-excerpt {
|
||||
font-size: 14px;
|
||||
line-height: 1.6;
|
||||
color: #aaa;
|
||||
margin: 0 0 14px 0;
|
||||
}
|
||||
|
||||
/* Engagement badges */
|
||||
.engagement {
|
||||
font-size: 13px;
|
||||
}
|
||||
.badge {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
padding: 4px 10px;
|
||||
border-radius: 20px;
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
margin-right: 8px;
|
||||
}
|
||||
.badge-upvotes {
|
||||
background: rgba(255, 107, 107, 0.15);
|
||||
color: #ff6b6b;
|
||||
}
|
||||
.badge-comments {
|
||||
background: rgba(116, 185, 255, 0.15);
|
||||
color: #74b9ff;
|
||||
}
|
||||
|
||||
/* Empty state */
|
||||
.empty-state {
|
||||
text-align: center;
|
||||
padding: 40px 32px;
|
||||
color: #666;
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
/* Divider */
|
||||
.divider {
|
||||
height: 1px;
|
||||
background: #2a2a3e;
|
||||
margin: 0 32px;
|
||||
}
|
||||
|
||||
/* Coming soon banner */
|
||||
.coming-soon {
|
||||
background: linear-gradient(135deg, #2d3436 0%, #1a1a2e 100%);
|
||||
border: 2px dashed #444;
|
||||
border-radius: 12px;
|
||||
padding: 40px;
|
||||
text-align: center;
|
||||
color: #888;
|
||||
font-size: 15px;
|
||||
}
|
||||
.coming-soon-icon {
|
||||
font-size: 36px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
/* Footer */
|
||||
.footer {
|
||||
background: #0a0a12;
|
||||
padding: 40px 32px;
|
||||
text-align: center;
|
||||
margin-top: 48px;
|
||||
border-top: 1px solid #2a2a3e;
|
||||
}
|
||||
.footer-avatar {
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
background: linear-gradient(135deg, #ff6b6b, #ff9f43);
|
||||
border-radius: 50%;
|
||||
margin: 0 auto 16px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 32px;
|
||||
}
|
||||
.footer-brand {
|
||||
font-size: 18px;
|
||||
font-weight: 700;
|
||||
color: #fff;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
.footer-text {
|
||||
font-size: 14px;
|
||||
color: #888;
|
||||
margin: 0 0 20px 0;
|
||||
}
|
||||
.footer-links {
|
||||
margin-top: 20px;
|
||||
}
|
||||
.footer-links a {
|
||||
color: #74b9ff;
|
||||
text-decoration: none;
|
||||
font-size: 14px;
|
||||
margin: 0 12px;
|
||||
}
|
||||
.footer-links a:hover {
|
||||
color: #ff6b6b;
|
||||
text-decoration: underline;
|
||||
}
|
||||
.footer-time {
|
||||
font-size: 12px;
|
||||
color: #555;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
/* Mobile */
|
||||
@media screen and (max-width: 640px) {
|
||||
.header { padding: 36px 24px; }
|
||||
.header h1 { font-size: 26px; }
|
||||
.header-icon { font-size: 44px; }
|
||||
.stats-bar { gap: 32px; padding: 24px; }
|
||||
.stat-number { font-size: 28px; }
|
||||
.section { padding: 0 24px; margin-bottom: 32px; }
|
||||
.section-header { margin-top: 32px; }
|
||||
.story { padding: 20px; }
|
||||
.story-title { font-size: 16px; }
|
||||
.footer { padding: 32px 24px; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td align="center" style="padding: 20px 10px;">
|
||||
<div class="email-wrapper">
|
||||
|
||||
<!-- Header -->
|
||||
<div class="header">
|
||||
<div class="header-icon">🦀</div>
|
||||
<h1>OpenClaw Daily</h1>
|
||||
<p class="header-subtitle">The best OpenClaw discussions, curated daily</p>
|
||||
<div class="header-date">Tuesday, March 03, 2026</div>
|
||||
</div>
|
||||
|
||||
<!-- Stats -->
|
||||
<div class="stats-bar">
|
||||
<div class="stat">
|
||||
<div class="stat-number">24</div>
|
||||
<div class="stat-label">Reddit</div>
|
||||
</div>
|
||||
<div class="stat">
|
||||
<div class="stat-number">12</div>
|
||||
<div class="stat-label">News</div>
|
||||
</div>
|
||||
<div class="stat">
|
||||
<div class="stat-number">0</div>
|
||||
<div class="stat-label">X/Twitter</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Reddit Section -->
|
||||
<div class="section">
|
||||
<div class="section-header">
|
||||
<span class="section-icon reddit-icon">🔥</span>
|
||||
<h2 class="section-title">Reddit Highlights</h2>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rjhyn8/got_fooled_buy_the_openclaw_hype_bought_a_mac/">[Discussion] Got fooled buy the Openclaw hype. Bought a Mac Mini, installed Openclaw, spent 200$ in Opus. Lesson: don't believe the hype, it's full of bugs.</a></h3>
|
||||
<div class="story-meta">u/seoparadiso</div>
|
||||
<p class="story-excerpt">Will comeback in 6 months.</p>
|
||||
<div class="engagement">↑ 130 | 249 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rji0x3/openclaw_202632_just_dropped_heres_what_actually/">[Use Cases] OpenClaw 2026.3.2 just dropped — here's what actually changed for real workflows</a></h3>
|
||||
<div class="story-meta">u/EstablishmentSea4024</div>
|
||||
<p class="story-excerpt">New release landed about an hour ago. I went through the full changelog so you don't have to. Here's what actually matters for day-to-day use:
|
||||
|
||||
**Secr...</p>
|
||||
<div class="engagement">↑ 119 | 41 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rju3hl/openclaw_openai_api_costs_are_insane_anyone_else/">[Help] OpenClaw + OpenAI API costs are insane? Anyone else?</a></h3>
|
||||
<div class="story-meta">u/Beneficial_Lime1912</div>
|
||||
<p class="story-excerpt">Hi everyone,
|
||||
|
||||
I just installed and tested OpenClaw and honestly… wtf, the API cost is crazy expensive.
|
||||
|
||||
I burned 10 dollars in just 5 to 6 prompts usi...</p>
|
||||
<div class="engagement">↑ 7 | 47 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rjl2rk/what_does_your_soulmd_actually_look_like_curious/">[Discussion] What does your SOUL.md actually look like? Curious how people are shaping their agents.</a></h3>
|
||||
<div class="story-meta">u/ShabzSparq</div>
|
||||
<p class="story-excerpt">I've been tweaking my SOUL.md for weeks now and I feel like I'm still not getting it right. Some days my agent nails the tone, other days it feels lik...</p>
|
||||
<div class="engagement">↑ 41 | 22 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rjx7z8/can_we_please_stop_updating_the_control_ui_ffs/">[Discussion] Can we please stop updating the control UI ffs</a></h3>
|
||||
<div class="story-meta">u/stiflers-m0m</div>
|
||||
<p class="story-excerpt">This will get downvoted to oblivian, but i have to get it off my chest. This system is on my lan, no internet access. Stop f\*\*\*ing with the gateway...</p>
|
||||
<div class="engagement">↑ 7 | 29 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rjlnm3/openclaw_is_an_employee_not_a_money_printing/">[Discussion] OpenClaw Is An Employee, Not A Money Printing Machine</a></h3>
|
||||
<div class="story-meta">u/ataylorm</div>
|
||||
<p class="story-excerpt">I keep seeing people talk about OpenClaw like it’s some kind of push-button money machine. Install it, flip it on, and watch the cash roll in. That is...</p>
|
||||
<div class="engagement">↑ 16 | 18 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rjv80y/openclaw_takes_atleast_45_mins_for_simple_tasks/">[Discussion] Openclaw takes atleast 4-5 mins for simple tasks.. 1-2 mins for every response.</a></h3>
|
||||
<div class="story-meta">u/Uncle-Ndu</div>
|
||||
<p class="story-excerpt">I really want to break it piece by piece to see why inference is this high. Tried everything and used multiple LLM's and still nothing. Anyone success...</p>
|
||||
<div class="engagement">↑ 6 | 18 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-reddit">Reddit</span>
|
||||
<h3 class="story-title"><a href="https://reddit.com/r/openclaw/comments/1rk0dbg/which_model_are_people_using_to_actually_allow/">[Help] Which model are people using to actually allow you to do stuff?</a></h3>
|
||||
<div class="story-meta">u/AchillesFirstStand</div>
|
||||
<p class="story-excerpt">I want to get OpenClaw to find business email addresses for me for one of my products. It refuses to do it based on privacy guidelines, it says.
|
||||
|
||||
I'm ...</p>
|
||||
<div class="engagement">↑ 6 | 16 comments</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
|
||||
<!-- News Section -->
|
||||
<div class="section">
|
||||
<div class="section-header">
|
||||
<span class="section-icon hackernews-icon">🟧</span>
|
||||
<h2 class="section-title">News & Hacker News</h2>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://openclaw.allegro.earth/">OpenClaw Exposure Watchboard</a></h3>
|
||||
|
||||
<div class="engagement">↑ 49 | 24 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-github">GitHub</span>
|
||||
<h3 class="story-title"><a href="https://github.com/openclaw/openclaw/releases/tag/v2026.3.2">openclaw 2026.3.2</a></h3>
|
||||
<p class="story-excerpt"><h3>Changes</h3>
|
||||
<ul>
|
||||
<li>Secrets/SecretRef coverage: expand SecretRef support across the full supported user-supplied credential surface (64 targets ...</p>
|
||||
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-github">GitHub</span>
|
||||
<h3 class="story-title"><a href="https://github.com/openclaw/openclaw/releases/tag/v2026.3.2-beta.1">openclaw 2026.3.2-beta.1</a></h3>
|
||||
<p class="story-excerpt"><h3>Changes</h3>
|
||||
<ul>
|
||||
<li>Secrets/SecretRef coverage: expand SecretRef support across the full supported user-supplied credential surface (64 targets ...</p>
|
||||
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://clawr.ing">Show HN: I built a skill that lets your OpenClaw call you on the phone</a></h3>
|
||||
<p class="story-excerpt">I've been using openclaw for a while and the one thing I think differentiates it from traditional setups is that the agent can take the initiativ...</p>
|
||||
<div class="engagement">↑ 4 | 1 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://openclaw-setup.me/blog/usage-tips/run-multiple-openclaw-sessions-concurrently/">Working on multiple tasks in parallel using 1 OpenClaw Agent</a></h3>
|
||||
|
||||
<div class="engagement">↑ 2 | 1 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://news.ycombinator.com/item?id=47238242">Ask HN: Best use / examples of agents / OpenClaw that you saw recently?</a></h3>
|
||||
<p class="story-excerpt">Please share - video, blog post, tweet, etc. Thanks....</p>
|
||||
<div class="engagement">↑ 3</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://www.getesimpal.com/en-US/agents">I made the first eSIM service for OpenClaw</a></h3>
|
||||
|
||||
<div class="engagement">↑ 1 | 1 comments</div>
|
||||
</div>
|
||||
<div class="story">
|
||||
<span class="source-tag tag-hn">Hacker News</span>
|
||||
<h3 class="story-title"><a href="https://openclaw-horror-leaderboard.vercel.app">Show HN: OpenClaw Horror Stories – leaderboard of worst AI agent incidents</a></h3>
|
||||
|
||||
<div class="engagement">↑ 1 | 1 comments</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
|
||||
<!-- X Section -->
|
||||
<div class="section">
|
||||
<div class="section-header">
|
||||
<span class="section-icon twitter-icon">𝕏</span>
|
||||
<h2 class="section-title">From X</h2>
|
||||
</div>
|
||||
<p style="text-align:center;color:#888;padding:30px 0;">🚧 X/Twitter integration coming soon</p>
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
<div class="footer">
|
||||
<div class="footer-avatar">🦀</div>
|
||||
<div class="footer-brand">Curated daily for Anthony Martin</div>
|
||||
<p class="footer-text">by Krilly the Crab</p>
|
||||
<div class="footer-links">
|
||||
<a href="https://github.com/openclaw/openclaw">GitHub</a>
|
||||
<a href="https://reddit.com/r/openclaw">Reddit</a>
|
||||
<a href="https://docs.openclaw.ai">Docs</a>
|
||||
</div>
|
||||
<p class="footer-time">2026-03-03T23:01:32.347051 UTC</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
152
automations/openclaw-digest/output/email_20260303_230132.txt
Normal file
152
automations/openclaw-digest/output/email_20260303_230132.txt
Normal file
@@ -0,0 +1,152 @@
|
||||
🦀 OPENCLAW DAILY DIGEST
|
||||
Your daily dose of OpenClaw discussions, use cases & news
|
||||
|
||||
Date: Tuesday, March 03, 2026
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📊 TODAY'S SUMMARY
|
||||
• 24 Reddit Posts
|
||||
• 12 News Stories
|
||||
• 0 X Threads
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
🔥 REDDIT HIGHLIGHTS
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📌 Got fooled buy the Openclaw hype. Bought a Mac Mini, installed Openclaw, spent 200$ in Opus. Lesson: don't believe the hype, it's full of bugs.
|
||||
Link: https://reddit.com/r/openclaw/comments/1rjhyn8/got_fooled_buy_the_openclaw_hype_bought_a_mac/
|
||||
Author: seoparadiso
|
||||
Score: 130 upvotes
|
||||
Comments: 249
|
||||
Will comeback in 6 months.
|
||||
|
||||
📌 OpenClaw 2026.3.2 just dropped — here's what actually changed for real workflows
|
||||
Link: https://reddit.com/r/openclaw/comments/1rji0x3/openclaw_202632_just_dropped_heres_what_actually/
|
||||
Author: EstablishmentSea4024
|
||||
Score: 119 upvotes
|
||||
Comments: 41
|
||||
New release landed about an hour ago. I went through the full changelog so you don't have to. Here's what actually matters for day-to-day use:
|
||||
|
||||
**Secr...
|
||||
|
||||
📌 OpenClaw + OpenAI API costs are insane? Anyone else?
|
||||
Link: https://reddit.com/r/openclaw/comments/1rju3hl/openclaw_openai_api_costs_are_insane_anyone_else/
|
||||
Author: Beneficial_Lime1912
|
||||
Score: 7 upvotes
|
||||
Comments: 47
|
||||
Hi everyone,
|
||||
|
||||
I just installed and tested OpenClaw and honestly… wtf, the API cost is crazy expensive.
|
||||
|
||||
I burned 10 dollars in just 5 to 6 prompts usi...
|
||||
|
||||
📌 What does your SOUL.md actually look like? Curious how people are shaping their agents.
|
||||
Link: https://reddit.com/r/openclaw/comments/1rjl2rk/what_does_your_soulmd_actually_look_like_curious/
|
||||
Author: ShabzSparq
|
||||
Score: 41 upvotes
|
||||
Comments: 22
|
||||
I've been tweaking my SOUL.md for weeks now and I feel like I'm still not getting it right. Some days my agent nails the tone, other days it feels lik...
|
||||
|
||||
📌 Can we please stop updating the control UI ffs
|
||||
Link: https://reddit.com/r/openclaw/comments/1rjx7z8/can_we_please_stop_updating_the_control_ui_ffs/
|
||||
Author: stiflers-m0m
|
||||
Score: 7 upvotes
|
||||
Comments: 29
|
||||
This will get downvoted to oblivian, but i have to get it off my chest. This system is on my lan, no internet access. Stop f\*\*\*ing with the gateway...
|
||||
|
||||
📌 OpenClaw Is An Employee, Not A Money Printing Machine
|
||||
Link: https://reddit.com/r/openclaw/comments/1rjlnm3/openclaw_is_an_employee_not_a_money_printing/
|
||||
Author: ataylorm
|
||||
Score: 16 upvotes
|
||||
Comments: 18
|
||||
I keep seeing people talk about OpenClaw like it’s some kind of push-button money machine. Install it, flip it on, and watch the cash roll in. That is...
|
||||
|
||||
📌 Openclaw takes atleast 4-5 mins for simple tasks.. 1-2 mins for every response.
|
||||
Link: https://reddit.com/r/openclaw/comments/1rjv80y/openclaw_takes_atleast_45_mins_for_simple_tasks/
|
||||
Author: Uncle-Ndu
|
||||
Score: 6 upvotes
|
||||
Comments: 18
|
||||
I really want to break it piece by piece to see why inference is this high. Tried everything and used multiple LLM's and still nothing. Anyone success...
|
||||
|
||||
📌 Which model are people using to actually allow you to do stuff?
|
||||
Link: https://reddit.com/r/openclaw/comments/1rk0dbg/which_model_are_people_using_to_actually_allow/
|
||||
Author: AchillesFirstStand
|
||||
Score: 6 upvotes
|
||||
Comments: 16
|
||||
I want to get OpenClaw to find business email addresses for me for one of my products. It refuses to do it based on privacy guidelines, it says.
|
||||
|
||||
I'm ...
|
||||
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
📰 NEWS ROUNDUP
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📌 OpenClaw Exposure Watchboard
|
||||
Link: https://openclaw.allegro.earth/
|
||||
Author: fanweixiao
|
||||
Score: 49 upvotes
|
||||
Comments: 24
|
||||
|
||||
📌 openclaw 2026.3.2
|
||||
Link: https://github.com/openclaw/openclaw/releases/tag/v2026.3.2
|
||||
<h3>Changes</h3>
|
||||
<ul>
|
||||
<li>Secrets/SecretRef coverage: expand SecretRef support across the full supported user-supplied credential surface (64 targets ...
|
||||
|
||||
📌 openclaw 2026.3.2-beta.1
|
||||
Link: https://github.com/openclaw/openclaw/releases/tag/v2026.3.2-beta.1
|
||||
<h3>Changes</h3>
|
||||
<ul>
|
||||
<li>Secrets/SecretRef coverage: expand SecretRef support across the full supported user-supplied credential surface (64 targets ...
|
||||
|
||||
📌 Show HN: I built a skill that lets your OpenClaw call you on the phone
|
||||
Link: https://clawr.ing
|
||||
Author: thisismyswamp
|
||||
Score: 4 upvotes
|
||||
Comments: 1
|
||||
I've been using openclaw for a while and the one thing I think differentiates it from traditional setups is that the agent can take the initiativ...
|
||||
|
||||
📌 Working on multiple tasks in parallel using 1 OpenClaw Agent
|
||||
Link: https://openclaw-setup.me/blog/usage-tips/run-multiple-openclaw-sessions-concurrently/
|
||||
Author: Gregoryy
|
||||
Score: 2 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 Ask HN: Best use / examples of agents / OpenClaw that you saw recently?
|
||||
Link: https://news.ycombinator.com/item?id=47238242
|
||||
Author: simonebrunozzi
|
||||
Score: 3 upvotes
|
||||
Please share - video, blog post, tweet, etc. Thanks....
|
||||
|
||||
📌 I made the first eSIM service for OpenClaw
|
||||
Link: https://www.getesimpal.com/en-US/agents
|
||||
Author: deniurchak
|
||||
Score: 1 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 Show HN: OpenClaw Horror Stories – leaderboard of worst AI agent incidents
|
||||
Link: https://openclaw-horror-leaderboard.vercel.app
|
||||
Author: bhekanik
|
||||
Score: 1 upvotes
|
||||
Comments: 1
|
||||
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
𝕏 X THREADS
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
|
||||
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
🦀 Krilly the Crab
|
||||
Daily digest compiled for Anthony Martin
|
||||
|
||||
OpenClaw on GitHub: https://github.com/openclaw/openclaw
|
||||
r/OpenClaw: https://reddit.com/r/openclaw
|
||||
|
||||
Generated at 2026-03-03T23:01:32.347051 UTC
|
||||
318
automations/openclaw-digest/output/email_20260304_040157.html
Normal file
318
automations/openclaw-digest/output/email_20260304_040157.html
Normal file
@@ -0,0 +1,318 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>OpenClaw Daily Digest</title>
|
||||
</head>
|
||||
<body style="margin: 0; padding: 20px 10px; background-color: #1a1a2e; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; font-size: 16px; line-height: 1.6; color: #e4e4e4;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="max-width: 680px; margin: 0 auto; background-color: #0f0f1a; border-radius: 16px; overflow: hidden;">
|
||||
<!-- Header -->
|
||||
<tr>
|
||||
<td style="background: #ee5a24; padding: 48px 32px; text-align: center;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="text-align: center;">
|
||||
<span style="font-size: 56px; display: block; margin-bottom: 12px;">🦀</span>
|
||||
<h1 style="margin: 0 0 8px 0; color: #ffffff; font-size: 32px; font-weight: 800; letter-spacing: -0.5px;">OpenClaw Daily</h1>
|
||||
<p style="color: rgba(255,255,255,0.9); font-size: 15px; margin: 0;">The best OpenClaw discussions, curated daily</p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin: 20px auto 0 auto;">
|
||||
<tr>
|
||||
<td style="background-color: rgba(255,255,255,0.2); padding: 10px 24px; border-radius: 30px; border: 1px solid rgba(255,255,255,0.3);">
|
||||
<span style="font-size: 14px; font-weight: 600; color: #ffffff;">Wednesday, March 04, 2026</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Stats Bar -->
|
||||
<tr>
|
||||
<td style="background-color: #1a1a2e; padding: 28px 32px; border-bottom: 1px solid #2a2a3e;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td width="33%" style="text-align: center;">
|
||||
<span style="font-size: 32px; font-weight: 800; color: #ff6b6b; line-height: 1;">26</span>
|
||||
<p style="font-size: 12px; color: #888; text-transform: uppercase; letter-spacing: 1px; margin: 6px 0 0 0;">Reddit</p>
|
||||
</td>
|
||||
<td width="33%" style="text-align: center;">
|
||||
<span style="font-size: 32px; font-weight: 800; color: #ff6b6b; line-height: 1;">12</span>
|
||||
<p style="font-size: 12px; color: #888; text-transform: uppercase; letter-spacing: 1px; margin: 6px 0 0 0;">News</p>
|
||||
</td>
|
||||
<td width="33%" style="text-align: center;">
|
||||
<span style="font-size: 32px; font-weight: 800; color: #ff6b6b; line-height: 1;">0</span>
|
||||
<p style="font-size: 12px; color: #888; text-transform: uppercase; letter-spacing: 1px; margin: 6px 0 0 0;">X/Twitter</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Reddit Section -->
|
||||
<tr>
|
||||
<td style="padding: 40px 32px;">
|
||||
<!-- Section Header -->
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin-bottom: 24px; padding-bottom: 12px; border-bottom: 2px solid #2a2a3e;">
|
||||
<tr>
|
||||
<td width="40" style="padding-right: 12px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td style="width: 40px; height: 40px; background-color: #ff4500; border-radius: 12px; text-align: center; vertical-align: middle;">
|
||||
<span style="font-size: 20px;">🔥</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td>
|
||||
<h2 style="font-size: 20px; font-weight: 700; color: #fff; margin: 0;">Reddit Highlights</h2>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;margin-bottom:14px;">Reddit</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://reddit.com/r/openclaw/comments/1rjhyn8/got_fooled_buy_the_openclaw_hype_bought_a_mac/" style="color:#74b9ff;text-decoration:none;">[Discussion] Got fooled buy the Openclaw hype. Bought a Mac Mini, installed Openclaw, spent 200$ in Opus. Lesson: don't believe the hype, it's full of bugs.</a></h3>
|
||||
<p style="font-size:14px;color:#888;margin:0;"><span style="color:#a29bfe;font-weight:500;">u/seoparadiso</span></p>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>Will comeback in 6 months.</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 164</span> · <span style='color:#74b9ff;font-weight:600;'>💬 268</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;margin-bottom:14px;">Reddit</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://reddit.com/r/openclaw/comments/1rji0x3/openclaw_202632_just_dropped_heres_what_actually/" style="color:#74b9ff;text-decoration:none;">[Use Cases] OpenClaw 2026.3.2 just dropped — here's what actually changed for real workflows</a></h3>
|
||||
<p style="font-size:14px;color:#888;margin:0;"><span style="color:#a29bfe;font-weight:500;">u/EstablishmentSea4024</span></p>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>New release landed about an hour ago. I went through the full changelog so you don't have to. Here's what actually matters for day-to-day use:
|
||||
|
||||
**Secr...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 137</span> · <span style='color:#74b9ff;font-weight:600;'>💬 54</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;margin-bottom:14px;">Reddit</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://reddit.com/r/openclaw/comments/1rk6zqn/experienced_dev_openclaw_has_been_an_absolute/" style="color:#74b9ff;text-decoration:none;">[Discussion] Experienced Dev: OpenClaw has been an absolute nightmare — basic 1-agent Telegram + Grok setup with cron email digest dies after one day despite 5+ fresh installs and following official docs perfectly</a></h3>
|
||||
<p style="font-size:14px;color:#888;margin:0;"><span style="color:#a29bfe;font-weight:500;">u/flashybits</span></p>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>\*\*Experienced software dev (uni degree, not a noob) here — OpenClaw has completely defeated me.\*\*
|
||||
|
||||
I've now burned days trying to get even basic f...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 15</span> · <span style='color:#74b9ff;font-weight:600;'>💬 56</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;margin-bottom:14px;">Reddit</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://reddit.com/r/openclaw/comments/1rju3hl/openclaw_openai_api_costs_are_insane_anyone_else/" style="color:#74b9ff;text-decoration:none;">[Help] OpenClaw + OpenAI API costs are insane? Anyone else?</a></h3>
|
||||
<p style="font-size:14px;color:#888;margin:0;"><span style="color:#a29bfe;font-weight:500;">u/Beneficial_Lime1912</span></p>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>Hi everyone,
|
||||
|
||||
I just installed and tested OpenClaw and honestly… wtf, the API cost is crazy expensive.
|
||||
|
||||
I burned 10 dollars in just 5 to 6 prompts usi...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 9</span> · <span style='color:#74b9ff;font-weight:600;'>💬 58</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;margin-bottom:14px;">Reddit</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://reddit.com/r/openclaw/comments/1rjl2rk/what_does_your_soulmd_actually_look_like_curious/" style="color:#74b9ff;text-decoration:none;">[Discussion] What does your SOUL.md actually look like? Curious how people are shaping their agents.</a></h3>
|
||||
<p style="font-size:14px;color:#888;margin:0;"><span style="color:#a29bfe;font-weight:500;">u/ShabzSparq</span></p>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>I've been tweaking my SOUL.md for weeks now and I feel like I'm still not getting it right. Some days my agent nails the tone, other days it feels lik...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 59</span> · <span style='color:#74b9ff;font-weight:600;'>💬 25</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;margin-bottom:14px;">Reddit</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://reddit.com/r/openclaw/comments/1rjx7z8/can_we_please_stop_updating_the_control_ui_ffs/" style="color:#74b9ff;text-decoration:none;">[Discussion] Can we please stop updating the control UI ffs</a></h3>
|
||||
<p style="font-size:14px;color:#888;margin:0;"><span style="color:#a29bfe;font-weight:500;">u/stiflers-m0m</span></p>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>This will get downvoted to oblivian, but i have to get it off my chest. This system is on my lan, no internet access. Stop f\*\*\*ing with the gateway...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 12</span> · <span style='color:#74b9ff;font-weight:600;'>💬 32</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;margin-bottom:14px;">Reddit</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://reddit.com/r/openclaw/comments/1rjv80y/openclaw_takes_atleast_45_mins_for_simple_tasks/" style="color:#74b9ff;text-decoration:none;">[Discussion] Openclaw takes atleast 4-5 mins for simple tasks.. 1-2 mins for every response.</a></h3>
|
||||
<p style="font-size:14px;color:#888;margin:0;"><span style="color:#a29bfe;font-weight:500;">u/Uncle-Ndu</span></p>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>I really want to break it piece by piece to see why inference is this high. Tried everything and used multiple LLM's and still nothing. Anyone success...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 8</span> · <span style='color:#74b9ff;font-weight:600;'>💬 20</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;margin-bottom:14px;">Reddit</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://reddit.com/r/openclaw/comments/1rk0dbg/which_model_are_people_using_to_actually_allow/" style="color:#74b9ff;text-decoration:none;">[Help] Which model are people using to actually allow you to do stuff?</a></h3>
|
||||
<p style="font-size:14px;color:#888;margin:0;"><span style="color:#a29bfe;font-weight:500;">u/AchillesFirstStand</span></p>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>I want to get OpenClaw to find business email addresses for me for one of my products. It refuses to do it based on privacy guidelines, it says.
|
||||
|
||||
I'm ...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 9</span> · <span style='color:#74b9ff;font-weight:600;'>💬 18</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Divider -->
|
||||
<tr>
|
||||
<td style="padding: 0 32px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="height: 1px; background-color: #2a2a3e;">
|
||||
<tr><td></td></tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- News Section -->
|
||||
<tr>
|
||||
<td style="padding: 40px 32px;">
|
||||
<!-- Section Header -->
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin-bottom: 24px; padding-bottom: 12px; border-bottom: 2px solid #2a2a3e;">
|
||||
<tr>
|
||||
<td width="40" style="padding-right: 12px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td style="width: 40px; height: 40px; background-color: #ff6600; border-radius: 12px; text-align: center; vertical-align: middle;">
|
||||
<span style="font-size: 20px;">🟧</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td>
|
||||
<h2 style="font-size: 20px; font-weight: 700; color: #fff; margin: 0;">News & Hacker News</h2>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(139,148,158,0.15);color:#a29bfe;margin-bottom:14px;">GitHub</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://github.com/openclaw/openclaw/releases/tag/v2026.3.2" style="color:#74b9ff;text-decoration:none;">openclaw 2026.3.2</a></h3>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'><h3>Changes</h3>
|
||||
<ul>
|
||||
<li>Secrets/SecretRef coverage: expand SecretRef support across the full supported user-supplied credential surface (64 targets ...</p>
|
||||
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(139,148,158,0.15);color:#a29bfe;margin-bottom:14px;">GitHub</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://github.com/openclaw/openclaw/releases/tag/v2026.3.2-beta.1" style="color:#74b9ff;text-decoration:none;">openclaw 2026.3.2-beta.1</a></h3>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'><h3>Changes</h3>
|
||||
<ul>
|
||||
<li>Secrets/SecretRef coverage: expand SecretRef support across the full supported user-supplied credential surface (64 targets ...</p>
|
||||
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,102,0,0.15);color:#ff9f43;margin-bottom:14px;">Hacker News</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://clawr.ing" style="color:#74b9ff;text-decoration:none;">Show HN: I built a skill that lets your OpenClaw call you on the phone</a></h3>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>I've been using openclaw for a while and the one thing I think differentiates it from traditional setups is that the agent can take the initiativ...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 4</span> · <span style='color:#74b9ff;font-weight:600;'>💬 1</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,102,0,0.15);color:#ff9f43;margin-bottom:14px;">Hacker News</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://news.ycombinator.com/item?id=47238242" style="color:#74b9ff;text-decoration:none;">Ask HN: Best use / examples of agents / OpenClaw that you saw recently?</a></h3>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>Please share - video, blog post, tweet, etc. Thanks....</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 4</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,102,0,0.15);color:#ff9f43;margin-bottom:14px;">Hacker News</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://www.getesimpal.com/en-US/agents" style="color:#74b9ff;text-decoration:none;">I made the first eSIM service for OpenClaw</a></h3>
|
||||
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 1</span> · <span style='color:#74b9ff;font-weight:600;'>💬 1</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,102,0,0.15);color:#ff9f43;margin-bottom:14px;">Hacker News</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://openclaw-horror-leaderboard.vercel.app" style="color:#74b9ff;text-decoration:none;">Show HN: OpenClaw Horror Stories – leaderboard of worst AI agent incidents</a></h3>
|
||||
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 1</span> · <span style='color:#74b9ff;font-weight:600;'>💬 1</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,102,0,0.15);color:#ff9f43;margin-bottom:14px;">Hacker News</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://openclawhub.uk/" style="color:#74b9ff;text-decoration:none;">Show HN: OpenClawHub – A Lib for AI agent workflows so you don't have to</a></h3>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>Hi HN,<p>I spent months building AI agents for clients. Same problems every time:
|
||||
- Prompts work in dev, fail in prod
|
||||
- Hard to maintain across 100+ u...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 2</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,102,0,0.15);color:#ff9f43;margin-bottom:14px;">Hacker News</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://proxybase.xyz/blog/openclaw-bot-protections" style="color:#74b9ff;text-decoration:none;">Current state of OpenClaw and bot protections</a></h3>
|
||||
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 1</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Divider -->
|
||||
<tr>
|
||||
<td style="padding: 0 32px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="height: 1px; background-color: #2a2a3e;">
|
||||
<tr><td></td></tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- X Section -->
|
||||
<tr>
|
||||
<td style="padding: 40px 32px;">
|
||||
<!-- Section Header -->
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin-bottom: 24px; padding-bottom: 12px; border-bottom: 2px solid #2a2a3e;">
|
||||
<tr>
|
||||
<td width="40" style="padding-right: 12px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td style="width: 40px; height: 40px; background-color: #1da1f2; border-radius: 12px; text-align: center; vertical-align: middle;">
|
||||
<span style="font-size: 20px; color: #fff;">𝕏</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td>
|
||||
<h2 style="font-size: 20px; font-weight: 700; color: #fff; margin: 0;">From X</h2>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="text-align:center;color:#888;padding:30px 0;">🚧 X/Twitter integration coming soon</p>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Footer -->
|
||||
<tr>
|
||||
<td style="background-color: #0a0a12; padding: 40px 32px; text-align: center; border-top: 1px solid #2a2a3e;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin: 0 auto 16px auto;">
|
||||
<tr>
|
||||
<td style="width: 64px; height: 64px; background-color: #ee5a24; border-radius: 50%; text-align: center; vertical-align: middle;">
|
||||
<span style="font-size: 32px;">🦀</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="font-size: 18px; font-weight: 700; color: #fff; margin: 0 0 6px 0;">Curated daily for Anthony Martin</p>
|
||||
<p style="font-size: 14px; color: #888; margin: 0 0 20px 0;">by Krilly the Crab</p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin: 20px auto 0 auto;">
|
||||
<tr>
|
||||
<td style="padding: 0 12px;"><a href="https://github.com/openclaw/openclaw" style="color: #74b9ff; text-decoration: none; font-size: 14px;">GitHub</a></td>
|
||||
<td style="padding: 0 12px;"><a href="https://reddit.com/r/openclaw" style="color: #74b9ff; text-decoration: none; font-size: 14px;">Reddit</a></td>
|
||||
<td style="padding: 0 12px;"><a href="https://docs.openclaw.ai" style="color: #74b9ff; text-decoration: none; font-size: 14px;">Docs</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="font-size: 12px; color: #555; margin-top: 20px;">2026-03-04T04:01:57.354816 UTC</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
155
automations/openclaw-digest/output/email_20260304_040157.txt
Normal file
155
automations/openclaw-digest/output/email_20260304_040157.txt
Normal file
@@ -0,0 +1,155 @@
|
||||
🦀 OPENCLAW DAILY DIGEST
|
||||
Your daily dose of OpenClaw discussions, use cases & news
|
||||
|
||||
Date: Wednesday, March 04, 2026
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📊 TODAY'S SUMMARY
|
||||
• 26 Reddit Posts
|
||||
• 12 News Stories
|
||||
• 0 X Threads
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
🔥 REDDIT HIGHLIGHTS
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📌 Got fooled buy the Openclaw hype. Bought a Mac Mini, installed Openclaw, spent 200$ in Opus. Lesson: don't believe the hype, it's full of bugs.
|
||||
Link: https://reddit.com/r/openclaw/comments/1rjhyn8/got_fooled_buy_the_openclaw_hype_bought_a_mac/
|
||||
Author: seoparadiso
|
||||
Score: 164 upvotes
|
||||
Comments: 268
|
||||
Will comeback in 6 months.
|
||||
|
||||
📌 OpenClaw 2026.3.2 just dropped — here's what actually changed for real workflows
|
||||
Link: https://reddit.com/r/openclaw/comments/1rji0x3/openclaw_202632_just_dropped_heres_what_actually/
|
||||
Author: EstablishmentSea4024
|
||||
Score: 137 upvotes
|
||||
Comments: 54
|
||||
New release landed about an hour ago. I went through the full changelog so you don't have to. Here's what actually matters for day-to-day use:
|
||||
|
||||
**Secr...
|
||||
|
||||
📌 Experienced Dev: OpenClaw has been an absolute nightmare — basic 1-agent Telegram + Grok setup with cron email digest dies after one day despite 5+ fresh installs and following official docs perfectly
|
||||
Link: https://reddit.com/r/openclaw/comments/1rk6zqn/experienced_dev_openclaw_has_been_an_absolute/
|
||||
Author: flashybits
|
||||
Score: 15 upvotes
|
||||
Comments: 56
|
||||
\*\*Experienced software dev (uni degree, not a noob) here — OpenClaw has completely defeated me.\*\*
|
||||
|
||||
I've now burned days trying to get even basic f...
|
||||
|
||||
📌 OpenClaw + OpenAI API costs are insane? Anyone else?
|
||||
Link: https://reddit.com/r/openclaw/comments/1rju3hl/openclaw_openai_api_costs_are_insane_anyone_else/
|
||||
Author: Beneficial_Lime1912
|
||||
Score: 9 upvotes
|
||||
Comments: 58
|
||||
Hi everyone,
|
||||
|
||||
I just installed and tested OpenClaw and honestly… wtf, the API cost is crazy expensive.
|
||||
|
||||
I burned 10 dollars in just 5 to 6 prompts usi...
|
||||
|
||||
📌 What does your SOUL.md actually look like? Curious how people are shaping their agents.
|
||||
Link: https://reddit.com/r/openclaw/comments/1rjl2rk/what_does_your_soulmd_actually_look_like_curious/
|
||||
Author: ShabzSparq
|
||||
Score: 59 upvotes
|
||||
Comments: 25
|
||||
I've been tweaking my SOUL.md for weeks now and I feel like I'm still not getting it right. Some days my agent nails the tone, other days it feels lik...
|
||||
|
||||
📌 Can we please stop updating the control UI ffs
|
||||
Link: https://reddit.com/r/openclaw/comments/1rjx7z8/can_we_please_stop_updating_the_control_ui_ffs/
|
||||
Author: stiflers-m0m
|
||||
Score: 12 upvotes
|
||||
Comments: 32
|
||||
This will get downvoted to oblivian, but i have to get it off my chest. This system is on my lan, no internet access. Stop f\*\*\*ing with the gateway...
|
||||
|
||||
📌 Openclaw takes atleast 4-5 mins for simple tasks.. 1-2 mins for every response.
|
||||
Link: https://reddit.com/r/openclaw/comments/1rjv80y/openclaw_takes_atleast_45_mins_for_simple_tasks/
|
||||
Author: Uncle-Ndu
|
||||
Score: 8 upvotes
|
||||
Comments: 20
|
||||
I really want to break it piece by piece to see why inference is this high. Tried everything and used multiple LLM's and still nothing. Anyone success...
|
||||
|
||||
📌 Which model are people using to actually allow you to do stuff?
|
||||
Link: https://reddit.com/r/openclaw/comments/1rk0dbg/which_model_are_people_using_to_actually_allow/
|
||||
Author: AchillesFirstStand
|
||||
Score: 9 upvotes
|
||||
Comments: 18
|
||||
I want to get OpenClaw to find business email addresses for me for one of my products. It refuses to do it based on privacy guidelines, it says.
|
||||
|
||||
I'm ...
|
||||
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
📰 NEWS ROUNDUP
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📌 openclaw 2026.3.2
|
||||
Link: https://github.com/openclaw/openclaw/releases/tag/v2026.3.2
|
||||
<h3>Changes</h3>
|
||||
<ul>
|
||||
<li>Secrets/SecretRef coverage: expand SecretRef support across the full supported user-supplied credential surface (64 targets ...
|
||||
|
||||
📌 openclaw 2026.3.2-beta.1
|
||||
Link: https://github.com/openclaw/openclaw/releases/tag/v2026.3.2-beta.1
|
||||
<h3>Changes</h3>
|
||||
<ul>
|
||||
<li>Secrets/SecretRef coverage: expand SecretRef support across the full supported user-supplied credential surface (64 targets ...
|
||||
|
||||
📌 Show HN: I built a skill that lets your OpenClaw call you on the phone
|
||||
Link: https://clawr.ing
|
||||
Author: thisismyswamp
|
||||
Score: 4 upvotes
|
||||
Comments: 1
|
||||
I've been using openclaw for a while and the one thing I think differentiates it from traditional setups is that the agent can take the initiativ...
|
||||
|
||||
📌 Ask HN: Best use / examples of agents / OpenClaw that you saw recently?
|
||||
Link: https://news.ycombinator.com/item?id=47238242
|
||||
Author: simonebrunozzi
|
||||
Score: 4 upvotes
|
||||
Please share - video, blog post, tweet, etc. Thanks....
|
||||
|
||||
📌 I made the first eSIM service for OpenClaw
|
||||
Link: https://www.getesimpal.com/en-US/agents
|
||||
Author: deniurchak
|
||||
Score: 1 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 Show HN: OpenClaw Horror Stories – leaderboard of worst AI agent incidents
|
||||
Link: https://openclaw-horror-leaderboard.vercel.app
|
||||
Author: bhekanik
|
||||
Score: 1 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 Show HN: OpenClawHub – A Lib for AI agent workflows so you don't have to
|
||||
Link: https://openclawhub.uk/
|
||||
Author: 951560368
|
||||
Score: 2 upvotes
|
||||
Hi HN,<p>I spent months building AI agents for clients. Same problems every time:
|
||||
- Prompts work in dev, fail in prod
|
||||
- Hard to maintain across 100+ u...
|
||||
|
||||
📌 Current state of OpenClaw and bot protections
|
||||
Link: https://proxybase.xyz/blog/openclaw-bot-protections
|
||||
Author: m00dy
|
||||
Score: 1 upvotes
|
||||
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
𝕏 X THREADS
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
|
||||
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
🦀 Krilly the Crab
|
||||
Daily digest compiled for Anthony Martin
|
||||
|
||||
OpenClaw on GitHub: https://github.com/openclaw/openclaw
|
||||
r/OpenClaw: https://reddit.com/r/openclaw
|
||||
|
||||
Generated at 2026-03-04T04:01:57.354816 UTC
|
||||
320
automations/openclaw-digest/output/email_20260304_065235.html
Normal file
320
automations/openclaw-digest/output/email_20260304_065235.html
Normal file
@@ -0,0 +1,320 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>OpenClaw Daily Digest</title>
|
||||
</head>
|
||||
<body style="margin: 0; padding: 20px 10px; background-color: #1a1a2e; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; font-size: 16px; line-height: 1.6; color: #e4e4e4;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="max-width: 680px; margin: 0 auto; background-color: #0f0f1a; border-radius: 16px; overflow: hidden;">
|
||||
<!-- Header -->
|
||||
<tr>
|
||||
<td style="background: #ee5a24; padding: 48px 32px; text-align: center;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="text-align: center;">
|
||||
<span style="font-size: 56px; display: block; margin-bottom: 12px;">🦀</span>
|
||||
<h1 style="margin: 0 0 8px 0; color: #ffffff; font-size: 32px; font-weight: 800; letter-spacing: -0.5px;">OpenClaw Daily</h1>
|
||||
<p style="color: rgba(255,255,255,0.9); font-size: 15px; margin: 0;">The best OpenClaw discussions, curated daily</p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin: 20px auto 0 auto;">
|
||||
<tr>
|
||||
<td style="background-color: rgba(255,255,255,0.2); padding: 10px 24px; border-radius: 30px; border: 1px solid rgba(255,255,255,0.3);">
|
||||
<span style="font-size: 14px; font-weight: 600; color: #ffffff;">Wednesday, March 04, 2026</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Stats Bar -->
|
||||
<tr>
|
||||
<td style="background-color: #1a1a2e; padding: 28px 32px; border-bottom: 1px solid #2a2a3e;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td width="33%" style="text-align: center;">
|
||||
<span style="font-size: 32px; font-weight: 800; color: #ff6b6b; line-height: 1;">24</span>
|
||||
<p style="font-size: 12px; color: #888; text-transform: uppercase; letter-spacing: 1px; margin: 6px 0 0 0;">Reddit</p>
|
||||
</td>
|
||||
<td width="33%" style="text-align: center;">
|
||||
<span style="font-size: 32px; font-weight: 800; color: #ff6b6b; line-height: 1;">10</span>
|
||||
<p style="font-size: 12px; color: #888; text-transform: uppercase; letter-spacing: 1px; margin: 6px 0 0 0;">News</p>
|
||||
</td>
|
||||
<td width="33%" style="text-align: center;">
|
||||
<span style="font-size: 32px; font-weight: 800; color: #ff6b6b; line-height: 1;">0</span>
|
||||
<p style="font-size: 12px; color: #888; text-transform: uppercase; letter-spacing: 1px; margin: 6px 0 0 0;">X/Twitter</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Reddit Section -->
|
||||
<tr>
|
||||
<td style="padding: 40px 32px;">
|
||||
<!-- Section Header -->
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin-bottom: 24px; padding-bottom: 12px; border-bottom: 2px solid #2a2a3e;">
|
||||
<tr>
|
||||
<td width="40" style="padding-right: 12px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td style="width: 40px; height: 40px; background-color: #ff4500; border-radius: 12px; text-align: center; vertical-align: middle;">
|
||||
<span style="font-size: 20px;">🔥</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td>
|
||||
<h2 style="font-size: 20px; font-weight: 700; color: #fff; margin: 0;">Reddit Highlights</h2>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;margin-bottom:14px;">Reddit</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://reddit.com/r/openclaw/comments/1rk6zqn/experienced_dev_openclaw_has_been_an_absolute/" style="color:#74b9ff;text-decoration:none;">[Discussion] Experienced Dev: OpenClaw has been an absolute nightmare — basic 1-agent Telegram + Grok setup with cron email digest dies after one day despite 5+ fresh installs and following official docs perfectly</a></h3>
|
||||
<p style="font-size:14px;color:#888;margin:0;"><span style="color:#a29bfe;font-weight:500;">u/flashybits</span></p>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>\>> GOG not Grok setup <<
|
||||
|
||||
|
||||
\*\*Experienced software dev (uni degree, not a noob) here — OpenClaw has completely defeated me.\*\*
|
||||
|
||||
I've ...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 20</span> · <span style='color:#74b9ff;font-weight:600;'>💬 72</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;margin-bottom:14px;">Reddit</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://reddit.com/r/openclaw/comments/1rju3hl/openclaw_openai_api_costs_are_insane_anyone_else/" style="color:#74b9ff;text-decoration:none;">[Help] OpenClaw + OpenAI API costs are insane? Anyone else?</a></h3>
|
||||
<p style="font-size:14px;color:#888;margin:0;"><span style="color:#a29bfe;font-weight:500;">u/Beneficial_Lime1912</span></p>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>Hi everyone,
|
||||
|
||||
I just installed and tested OpenClaw and honestly… wtf, the API cost is crazy expensive.
|
||||
|
||||
I burned 10 dollars in just 5 to 6 prompts usi...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 11</span> · <span style='color:#74b9ff;font-weight:600;'>💬 63</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;margin-bottom:14px;">Reddit</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://reddit.com/r/openclaw/comments/1rjl2rk/what_does_your_soulmd_actually_look_like_curious/" style="color:#74b9ff;text-decoration:none;">[Discussion] What does your SOUL.md actually look like? Curious how people are shaping their agents.</a></h3>
|
||||
<p style="font-size:14px;color:#888;margin:0;"><span style="color:#a29bfe;font-weight:500;">u/ShabzSparq</span></p>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>I've been tweaking my SOUL.md for weeks now and I feel like I'm still not getting it right. Some days my agent nails the tone, other days it feels lik...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 64</span> · <span style='color:#74b9ff;font-weight:600;'>💬 25</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;margin-bottom:14px;">Reddit</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://reddit.com/r/openclaw/comments/1rjx7z8/can_we_please_stop_updating_the_control_ui_ffs/" style="color:#74b9ff;text-decoration:none;">[Discussion] Can we please stop updating the control UI ffs</a></h3>
|
||||
<p style="font-size:14px;color:#888;margin:0;"><span style="color:#a29bfe;font-weight:500;">u/stiflers-m0m</span></p>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>This will get downvoted to oblivian, but i have to get it off my chest. This system is on my lan, no internet access. Stop f\*\*\*ing with the gateway...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 12</span> · <span style='color:#74b9ff;font-weight:600;'>💬 32</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;margin-bottom:14px;">Reddit</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://reddit.com/r/openclaw/comments/1rk0dbg/which_model_are_people_using_to_actually_allow/" style="color:#74b9ff;text-decoration:none;">[Help] Which model are people using to actually allow you to do stuff?</a></h3>
|
||||
<p style="font-size:14px;color:#888;margin:0;"><span style="color:#a29bfe;font-weight:500;">u/AchillesFirstStand</span></p>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>I want to get OpenClaw to find business email addresses for me for one of my products. It refuses to do it based on privacy guidelines, it says.
|
||||
|
||||
I'm ...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 11</span> · <span style='color:#74b9ff;font-weight:600;'>💬 19</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;margin-bottom:14px;">Reddit</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://reddit.com/r/openclaw/comments/1rk3w2v/oracle_just_shutdown_my_vps/" style="color:#74b9ff;text-decoration:none;">[Help] Oracle just shutdown my vps</a></h3>
|
||||
<p style="font-size:14px;color:#888;margin:0;"><span style="color:#a29bfe;font-weight:500;">u/dzAwesome</span></p>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>I subscriped a Always-Free tier in Oracle Cloud (with my credit card provided) for a week and I have been running OpenClaw with it. This morning recei...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 4</span> · <span style='color:#74b9ff;font-weight:600;'>💬 17</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;margin-bottom:14px;">Reddit</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://reddit.com/r/openclaw/comments/1rjtpj2/the_truth_about_mcp_vs_cli/" style="color:#74b9ff;text-decoration:none;">[Discussion] The Truth About MCP vs CLI</a></h3>
|
||||
<p style="font-size:14px;color:#888;margin:0;"><span style="color:#a29bfe;font-weight:500;">u/kagan101</span></p>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>"MCP was a mistake. Bash is better."
|
||||
|
||||
That quote from the developer behind OpenClaw kicked off the biggest AI tooling debate of 2026.
|
||||
|
||||
Connect...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 17</span> · <span style='color:#74b9ff;font-weight:600;'>💬 15</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;margin-bottom:14px;">Reddit</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://reddit.com/r/openclaw/comments/1rk82ke/how_are_people_getting_openclaw_to_generate_images/" style="color:#74b9ff;text-decoration:none;">[Help] How are people getting OpenClaw to generate images?</a></h3>
|
||||
<p style="font-size:14px;color:#888;margin:0;"><span style="color:#a29bfe;font-weight:500;">u/Miserable_Kick4103</span></p>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>I'm a designer and I've been experimenting with openclaw recently. I'm curious how people are actually handling image generation workflows with it.
|
||||
...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 8</span> · <span style='color:#74b9ff;font-weight:600;'>💬 13</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Divider -->
|
||||
<tr>
|
||||
<td style="padding: 0 32px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="height: 1px; background-color: #2a2a3e;">
|
||||
<tr><td></td></tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- News Section -->
|
||||
<tr>
|
||||
<td style="padding: 40px 32px;">
|
||||
<!-- Section Header -->
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin-bottom: 24px; padding-bottom: 12px; border-bottom: 2px solid #2a2a3e;">
|
||||
<tr>
|
||||
<td width="40" style="padding-right: 12px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td style="width: 40px; height: 40px; background-color: #ff6600; border-radius: 12px; text-align: center; vertical-align: middle;">
|
||||
<span style="font-size: 20px;">🟧</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td>
|
||||
<h2 style="font-size: 20px; font-weight: 700; color: #fff; margin: 0;">News & Hacker News</h2>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,102,0,0.15);color:#ff9f43;margin-bottom:14px;">Hacker News</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://news.ycombinator.com/item?id=47238242" style="color:#74b9ff;text-decoration:none;">Ask HN: Best use / examples of agents / OpenClaw that you saw recently?</a></h3>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>Please share - video, blog post, tweet, etc. Thanks....</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 4</span> · <span style='color:#74b9ff;font-weight:600;'>💬 1</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,102,0,0.15);color:#ff9f43;margin-bottom:14px;">Hacker News</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://clawr.ing" style="color:#74b9ff;text-decoration:none;">Show HN: I built a skill that lets your OpenClaw call you on the phone</a></h3>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>I've been using openclaw for a while and the one thing I think differentiates it from traditional setups is that the agent can take the initiativ...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 4</span> · <span style='color:#74b9ff;font-weight:600;'>💬 1</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,102,0,0.15);color:#ff9f43;margin-bottom:14px;">Hacker News</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://www.getesimpal.com/en-US/agents" style="color:#74b9ff;text-decoration:none;">I made the first eSIM service for OpenClaw</a></h3>
|
||||
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 1</span> · <span style='color:#74b9ff;font-weight:600;'>💬 1</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,102,0,0.15);color:#ff9f43;margin-bottom:14px;">Hacker News</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://openclaw-horror-leaderboard.vercel.app" style="color:#74b9ff;text-decoration:none;">Show HN: OpenClaw Horror Stories – leaderboard of worst AI agent incidents</a></h3>
|
||||
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 1</span> · <span style='color:#74b9ff;font-weight:600;'>💬 1</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,102,0,0.15);color:#ff9f43;margin-bottom:14px;">Hacker News</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://proxybase.xyz/blog/openclaw-bot-protections" style="color:#74b9ff;text-decoration:none;">Current state of OpenClaw and bot protections</a></h3>
|
||||
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 2</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,102,0,0.15);color:#ff9f43;margin-bottom:14px;">Hacker News</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://openclawhub.uk/" style="color:#74b9ff;text-decoration:none;">Show HN: OpenClawHub – A Lib for AI agent workflows so you don't have to</a></h3>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>Hi HN,<p>I spent months building AI agents for clients. Same problems every time:
|
||||
- Prompts work in dev, fail in prod
|
||||
- Hard to maintain across 100+ u...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 2</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,102,0,0.15);color:#ff9f43;margin-bottom:14px;">Hacker News</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://deplyclaw.ai/" style="color:#74b9ff;text-decoration:none;">Show HN: Deploy OpenClaw in Seconds</a></h3>
|
||||
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 1</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,102,0,0.15);color:#ff9f43;margin-bottom:14px;">Hacker News</span>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 12px 0;"><a href="https://github.com/spivx/agent-skills" style="color:#74b9ff;text-decoration:none;">Show HN: GSC Skill – Live SEO Analytics for AI Agents (Claude Code, OpenClaw)</a></h3>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>I built a skill for AI coding agents (Claude Code, OpenClaw, etc.) that connects directly to the Google Search Console API and delivers live SEO analy...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 1</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Divider -->
|
||||
<tr>
|
||||
<td style="padding: 0 32px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="height: 1px; background-color: #2a2a3e;">
|
||||
<tr><td></td></tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- X Section -->
|
||||
<tr>
|
||||
<td style="padding: 40px 32px;">
|
||||
<!-- Section Header -->
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin-bottom: 24px; padding-bottom: 12px; border-bottom: 2px solid #2a2a3e;">
|
||||
<tr>
|
||||
<td width="40" style="padding-right: 12px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td style="width: 40px; height: 40px; background-color: #1da1f2; border-radius: 12px; text-align: center; vertical-align: middle;">
|
||||
<span style="font-size: 20px; color: #fff;">𝕏</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td>
|
||||
<h2 style="font-size: 20px; font-weight: 700; color: #fff; margin: 0;">From X</h2>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="text-align:center;color:#888;padding:30px 0;">🚧 X/Twitter integration coming soon</p>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Footer -->
|
||||
<tr>
|
||||
<td style="background-color: #0a0a12; padding: 40px 32px; text-align: center; border-top: 1px solid #2a2a3e;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin: 0 auto 16px auto;">
|
||||
<tr>
|
||||
<td style="width: 64px; height: 64px; background-color: #ee5a24; border-radius: 50%; text-align: center; vertical-align: middle;">
|
||||
<span style="font-size: 32px;">🦀</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="font-size: 18px; font-weight: 700; color: #fff; margin: 0 0 6px 0;">Curated daily for Anthony Martin</p>
|
||||
<p style="font-size: 14px; color: #888; margin: 0 0 20px 0;">by Krilly the Crab</p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin: 20px auto 0 auto;">
|
||||
<tr>
|
||||
<td style="padding: 0 12px;"><a href="https://github.com/openclaw/openclaw" style="color: #74b9ff; text-decoration: none; font-size: 14px;">GitHub</a></td>
|
||||
<td style="padding: 0 12px;"><a href="https://reddit.com/r/openclaw" style="color: #74b9ff; text-decoration: none; font-size: 14px;">Reddit</a></td>
|
||||
<td style="padding: 0 12px;"><a href="https://docs.openclaw.ai" style="color: #74b9ff; text-decoration: none; font-size: 14px;">Docs</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="font-size: 12px; color: #555; margin-top: 20px;">2026-03-04T06:52:35.541967 UTC</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
161
automations/openclaw-digest/output/email_20260304_065235.txt
Normal file
161
automations/openclaw-digest/output/email_20260304_065235.txt
Normal file
@@ -0,0 +1,161 @@
|
||||
🦀 OPENCLAW DAILY DIGEST
|
||||
Your daily dose of OpenClaw discussions, use cases & news
|
||||
|
||||
Date: Wednesday, March 04, 2026
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📊 TODAY'S SUMMARY
|
||||
• 24 Reddit Posts
|
||||
• 10 News Stories
|
||||
• 0 X Threads
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
🔥 REDDIT HIGHLIGHTS
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📌 Experienced Dev: OpenClaw has been an absolute nightmare — basic 1-agent Telegram + Grok setup with cron email digest dies after one day despite 5+ fresh installs and following official docs perfectly
|
||||
Link: https://reddit.com/r/openclaw/comments/1rk6zqn/experienced_dev_openclaw_has_been_an_absolute/
|
||||
Author: flashybits
|
||||
Score: 20 upvotes
|
||||
Comments: 72
|
||||
\>> GOG not Grok setup <<
|
||||
|
||||
|
||||
\*\*Experienced software dev (uni degree, not a noob) here — OpenClaw has completely defeated me.\*\*
|
||||
|
||||
I've ...
|
||||
|
||||
📌 OpenClaw + OpenAI API costs are insane? Anyone else?
|
||||
Link: https://reddit.com/r/openclaw/comments/1rju3hl/openclaw_openai_api_costs_are_insane_anyone_else/
|
||||
Author: Beneficial_Lime1912
|
||||
Score: 11 upvotes
|
||||
Comments: 63
|
||||
Hi everyone,
|
||||
|
||||
I just installed and tested OpenClaw and honestly… wtf, the API cost is crazy expensive.
|
||||
|
||||
I burned 10 dollars in just 5 to 6 prompts usi...
|
||||
|
||||
📌 What does your SOUL.md actually look like? Curious how people are shaping their agents.
|
||||
Link: https://reddit.com/r/openclaw/comments/1rjl2rk/what_does_your_soulmd_actually_look_like_curious/
|
||||
Author: ShabzSparq
|
||||
Score: 64 upvotes
|
||||
Comments: 25
|
||||
I've been tweaking my SOUL.md for weeks now and I feel like I'm still not getting it right. Some days my agent nails the tone, other days it feels lik...
|
||||
|
||||
📌 Can we please stop updating the control UI ffs
|
||||
Link: https://reddit.com/r/openclaw/comments/1rjx7z8/can_we_please_stop_updating_the_control_ui_ffs/
|
||||
Author: stiflers-m0m
|
||||
Score: 12 upvotes
|
||||
Comments: 32
|
||||
This will get downvoted to oblivian, but i have to get it off my chest. This system is on my lan, no internet access. Stop f\*\*\*ing with the gateway...
|
||||
|
||||
📌 Which model are people using to actually allow you to do stuff?
|
||||
Link: https://reddit.com/r/openclaw/comments/1rk0dbg/which_model_are_people_using_to_actually_allow/
|
||||
Author: AchillesFirstStand
|
||||
Score: 11 upvotes
|
||||
Comments: 19
|
||||
I want to get OpenClaw to find business email addresses for me for one of my products. It refuses to do it based on privacy guidelines, it says.
|
||||
|
||||
I'm ...
|
||||
|
||||
📌 Oracle just shutdown my vps
|
||||
Link: https://reddit.com/r/openclaw/comments/1rk3w2v/oracle_just_shutdown_my_vps/
|
||||
Author: dzAwesome
|
||||
Score: 4 upvotes
|
||||
Comments: 17
|
||||
I subscriped a Always-Free tier in Oracle Cloud (with my credit card provided) for a week and I have been running OpenClaw with it. This morning recei...
|
||||
|
||||
📌 The Truth About MCP vs CLI
|
||||
Link: https://reddit.com/r/openclaw/comments/1rjtpj2/the_truth_about_mcp_vs_cli/
|
||||
Author: kagan101
|
||||
Score: 17 upvotes
|
||||
Comments: 15
|
||||
"MCP was a mistake. Bash is better."
|
||||
|
||||
That quote from the developer behind OpenClaw kicked off the biggest AI tooling debate of 2026.
|
||||
|
||||
Connect...
|
||||
|
||||
📌 How are people getting OpenClaw to generate images?
|
||||
Link: https://reddit.com/r/openclaw/comments/1rk82ke/how_are_people_getting_openclaw_to_generate_images/
|
||||
Author: Miserable_Kick4103
|
||||
Score: 8 upvotes
|
||||
Comments: 13
|
||||
I'm a designer and I've been experimenting with openclaw recently. I'm curious how people are actually handling image generation workflows with it.
|
||||
...
|
||||
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
📰 NEWS ROUNDUP
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📌 Ask HN: Best use / examples of agents / OpenClaw that you saw recently?
|
||||
Link: https://news.ycombinator.com/item?id=47238242
|
||||
Author: simonebrunozzi
|
||||
Score: 4 upvotes
|
||||
Comments: 1
|
||||
Please share - video, blog post, tweet, etc. Thanks....
|
||||
|
||||
📌 Show HN: I built a skill that lets your OpenClaw call you on the phone
|
||||
Link: https://clawr.ing
|
||||
Author: thisismyswamp
|
||||
Score: 4 upvotes
|
||||
Comments: 1
|
||||
I've been using openclaw for a while and the one thing I think differentiates it from traditional setups is that the agent can take the initiativ...
|
||||
|
||||
📌 I made the first eSIM service for OpenClaw
|
||||
Link: https://www.getesimpal.com/en-US/agents
|
||||
Author: deniurchak
|
||||
Score: 1 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 Show HN: OpenClaw Horror Stories – leaderboard of worst AI agent incidents
|
||||
Link: https://openclaw-horror-leaderboard.vercel.app
|
||||
Author: bhekanik
|
||||
Score: 1 upvotes
|
||||
Comments: 1
|
||||
|
||||
📌 Current state of OpenClaw and bot protections
|
||||
Link: https://proxybase.xyz/blog/openclaw-bot-protections
|
||||
Author: m00dy
|
||||
Score: 2 upvotes
|
||||
|
||||
📌 Show HN: OpenClawHub – A Lib for AI agent workflows so you don't have to
|
||||
Link: https://openclawhub.uk/
|
||||
Author: 951560368
|
||||
Score: 2 upvotes
|
||||
Hi HN,<p>I spent months building AI agents for clients. Same problems every time:
|
||||
- Prompts work in dev, fail in prod
|
||||
- Hard to maintain across 100+ u...
|
||||
|
||||
📌 Show HN: Deploy OpenClaw in Seconds
|
||||
Link: https://deplyclaw.ai/
|
||||
Author: Creator-io
|
||||
Score: 1 upvotes
|
||||
|
||||
📌 Show HN: GSC Skill – Live SEO Analytics for AI Agents (Claude Code, OpenClaw)
|
||||
Link: https://github.com/spivx/agent-skills
|
||||
Author: ytlhome
|
||||
Score: 1 upvotes
|
||||
I built a skill for AI coding agents (Claude Code, OpenClaw, etc.) that connects directly to the Google Search Console API and delivers live SEO analy...
|
||||
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
𝕏 X THREADS
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
|
||||
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
🦀 Krilly the Crab
|
||||
Daily digest compiled for Anthony Martin
|
||||
|
||||
OpenClaw on GitHub: https://github.com/openclaw/openclaw
|
||||
r/OpenClaw: https://reddit.com/r/openclaw
|
||||
|
||||
Generated at 2026-03-04T06:52:35.541967 UTC
|
||||
612
automations/openclaw-digest/output/email_20260304_084302.html
Normal file
612
automations/openclaw-digest/output/email_20260304_084302.html
Normal file
@@ -0,0 +1,612 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>OpenClaw Daily Digest</title>
|
||||
</head>
|
||||
<body style="margin: 0; padding: 20px 10px; background-color: #1a1a2e; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; font-size: 16px; line-height: 1.6; color: #e4e4e4;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="max-width: 680px; margin: 0 auto; background-color: #0f0f1a; border-radius: 16px; overflow: hidden;">
|
||||
<!-- Header -->
|
||||
<tr>
|
||||
<td style="background: #ee5a24; padding: 48px 32px; text-align: center;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="text-align: center;">
|
||||
<span style="font-size: 56px; display: block; margin-bottom: 12px;">🦀</span>
|
||||
<h1 style="margin: 0 0 8px 0; color: #ffffff; font-size: 32px; font-weight: 800; letter-spacing: -0.5px;">OpenClaw Daily</h1>
|
||||
<p style="color: rgba(255,255,255,0.9); font-size: 15px; margin: 0;">The best OpenClaw discussions, curated daily</p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin: 20px auto 0 auto;">
|
||||
<tr>
|
||||
<td style="background-color: rgba(255,255,255,0.2); padding: 10px 24px; border-radius: 30px; border: 1px solid rgba(255,255,255,0.3);">
|
||||
<span style="font-size: 14px; font-weight: 600; color: #ffffff;">Wednesday, March 04, 2026</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Stats Bar -->
|
||||
<tr>
|
||||
<td style="background-color: #1a1a2e; padding: 28px 32px; border-bottom: 1px solid #2a2a3e;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td width="33%" style="text-align: center;">
|
||||
<span style="font-size: 32px; font-weight: 800; color: #ff6b6b; line-height: 1;">23</span>
|
||||
<p style="font-size: 12px; color: #888; text-transform: uppercase; letter-spacing: 1px; margin: 6px 0 0 0;">Reddit</p>
|
||||
</td>
|
||||
<td width="33%" style="text-align: center;">
|
||||
<span style="font-size: 32px; font-weight: 800; color: #ff6b6b; line-height: 1;">10</span>
|
||||
<p style="font-size: 12px; color: #888; text-transform: uppercase; letter-spacing: 1px; margin: 6px 0 0 0;">News</p>
|
||||
</td>
|
||||
<td width="33%" style="text-align: center;">
|
||||
<span style="font-size: 32px; font-weight: 800; color: #ff6b6b; line-height: 1;">0</span>
|
||||
<p style="font-size: 12px; color: #888; text-transform: uppercase; letter-spacing: 1px; margin: 6px 0 0 0;">X/Twitter</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Top Topics Banner -->
|
||||
<tr>
|
||||
<td style="padding: 20px 32px 0 32px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:rgba(255,255,255,0.03);border-radius:12px;margin-bottom:20px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:16px 20px;">
|
||||
<p style="font-size:12px;color:#888;text-transform:uppercase;letter-spacing:1px;margin:0 0 10px 0;font-weight:600;">Your Top Topics</p>
|
||||
<p style="margin:0;"><span style="display:inline-block;font-size:12px;font-weight:600;padding:6px 12px;border-radius:20px;background-color:rgba(255,255,255,0.08);color:#00d2ff;margin-right:8px;border:1px solid #00d2ff40;">★ AI/LLMs</span><span style="display:inline-block;font-size:12px;font-weight:600;padding:6px 12px;border-radius:20px;background-color:rgba(255,255,255,0.08);color:#ee5a24;margin-right:8px;border:1px solid #ee5a2440;">★ OpenClaw</span><span style="display:inline-block;font-size:12px;font-weight:600;padding:6px 12px;border-radius:20px;background-color:rgba(255,255,255,0.08);color:#a29bfe;margin-right:8px;border:1px solid #a29bfe40;">★ Coding</span><span style="display:inline-block;font-size:12px;font-weight:600;padding:6px 12px;border-radius:20px;background-color:rgba(255,255,255,0.08);color:#20b47a;margin-right:8px;border:1px solid #20b47a40;">★ Home Automation</span></p>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Reddit Section -->
|
||||
<tr>
|
||||
<td style="padding: 40px 32px;">
|
||||
<!-- Section Header -->
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin-bottom: 24px; padding-bottom: 12px; border-bottom: 2px solid #2a2a3e;">
|
||||
<tr>
|
||||
<td width="40" style="padding-right: 12px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td style="width: 40px; height: 40px; background-color: #ff4500; border-radius: 12px; text-align: center; vertical-align: middle;">
|
||||
<span style="font-size: 20px;">🔥</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td>
|
||||
<h2 style="font-size: 20px; font-weight: 700; color: #fff; margin: 0;">Reddit Highlights</h2>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding-bottom:10px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;">Reddit</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="margin:0 0 10px 0;"><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#00d2ff;margin-right:6px;margin-bottom:6px;border:1px solid #00d2ff;">★ AI/LLMs</span><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#a29bfe;margin-right:6px;margin-bottom:6px;border:1px solid #a29bfe;">★ Coding</span><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#ee5a24;margin-right:6px;margin-bottom:6px;border:1px solid #ee5a24;">★ OpenClaw</span></p>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 8px 0;"><a href="https://reddit.com/r/openclaw/comments/1rju3hl/openclaw_openai_api_costs_are_insane_anyone_else/" style="color:#74b9ff;text-decoration:none;">[Help] OpenClaw + OpenAI API costs are insane? Anyone else?</a></h3>
|
||||
<p style="font-size:13px;color:#888;margin:0 0 8px 0;"><span style="color:#a29bfe;font-weight:500;">u/Beneficial_Lime1912</span></p>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>Hi everyone,
|
||||
|
||||
I just installed and tested OpenClaw and honestly… wtf, the API cost is crazy expensive.
|
||||
|
||||
I burned 10 dollars in just 5 to 6 prompts using the OpenAI API.
|
||||
|
||||
Did anyone else experience the...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 13</span> · <span style='color:#74b9ff;font-weight:600;'>💬 74</span> · <span style='color:#888;'>⏱️ 2 min read</span></p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin-top:12px;">
|
||||
<tr>
|
||||
<td style="padding-right:8px;">
|
||||
<a href="https://t.me/openclaw_bot?start=summarize_3d3a89fe" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#74b9ff;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">📝 Summarize</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="https://t.me/openclaw_bot?start=save_3d3a89fe" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#20b47a;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">💾 Save</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding-bottom:10px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;">Reddit</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="margin:0 0 10px 0;"><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#a29bfe;margin-right:6px;margin-bottom:6px;border:1px solid #a29bfe;">★ Coding</span><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#ff6b6b;margin-right:6px;margin-bottom:6px;">Hardware</span><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#ee5a24;margin-right:6px;margin-bottom:6px;border:1px solid #ee5a24;">★ OpenClaw</span></p>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 8px 0;"><a href="https://reddit.com/r/openclaw/comments/1rk6zqn/experienced_dev_openclaw_has_been_an_absolute/" style="color:#74b9ff;text-decoration:none;">[Discussion] Experienced Dev: OpenClaw has been an absolute nightmare — basic 1-agent Telegram + Grok setup with cron email digest dies after one day despite 5+ fresh installs and following official docs perfectly</a></h3>
|
||||
<p style="font-size:13px;color:#888;margin:0 0 8px 0;"><span style="color:#a29bfe;font-weight:500;">u/flashybits</span></p>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>\>> GOG not Grok setup <<
|
||||
|
||||
|
||||
\*\*Experienced software dev (uni degree, not a noob) here — OpenClaw has completely defeated me.\*\*
|
||||
|
||||
I've now burned days trying to get even basic functiona...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 22</span> · <span style='color:#74b9ff;font-weight:600;'>💬 78</span> · <span style='color:#888;'>⏱️ 2 min read</span></p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin-top:12px;">
|
||||
<tr>
|
||||
<td style="padding-right:8px;">
|
||||
<a href="https://t.me/openclaw_bot?start=summarize_f289f01b" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#74b9ff;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">📝 Summarize</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="https://t.me/openclaw_bot?start=save_f289f01b" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#20b47a;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">💾 Save</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding-bottom:10px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;">Reddit</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="margin:0 0 10px 0;"><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#a29bfe;margin-right:6px;margin-bottom:6px;border:1px solid #a29bfe;">★ Coding</span><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#ee5a24;margin-right:6px;margin-bottom:6px;border:1px solid #ee5a24;">★ OpenClaw</span></p>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 8px 0;"><span style='margin-right:8px;'>🔥</span><a href="https://reddit.com/r/openclaw/comments/1rjl2rk/what_does_your_soulmd_actually_look_like_curious/" style="color:#74b9ff;text-decoration:none;">[Discussion] What does your SOUL.md actually look like? Curious how people are shaping their agents.</a></h3>
|
||||
<p style="font-size:13px;color:#888;margin:0 0 8px 0;"><span style="color:#a29bfe;font-weight:500;">u/ShabzSparq</span></p>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>I've been tweaking my SOUL.md for weeks now and I feel like I'm still not getting it right. Some days my agent nails the tone, other days it feels like talking to a customer support bot.
|
||||
|
||||
Right now mi...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 68</span> · <span style='color:#74b9ff;font-weight:600;'>💬 25</span> · <span style='color:#888;'>⏱️ 2 min read</span></p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin-top:12px;">
|
||||
<tr>
|
||||
<td style="padding-right:8px;">
|
||||
<a href="https://t.me/openclaw_bot?start=summarize_5c0d3ff8" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#74b9ff;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">📝 Summarize</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="https://t.me/openclaw_bot?start=save_5c0d3ff8" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#20b47a;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">💾 Save</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding-bottom:10px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;">Reddit</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="margin:0 0 10px 0;"><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#00d2ff;margin-right:6px;margin-bottom:6px;border:1px solid #00d2ff;">★ AI/LLMs</span><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#fd79a8;margin-right:6px;margin-bottom:6px;">Privacy</span><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#ee5a24;margin-right:6px;margin-bottom:6px;border:1px solid #ee5a24;">★ OpenClaw</span></p>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 8px 0;"><a href="https://reddit.com/r/openclaw/comments/1rk0dbg/which_model_are_people_using_to_actually_allow/" style="color:#74b9ff;text-decoration:none;">[Help] Which model are people using to actually allow you to do stuff?</a></h3>
|
||||
<p style="font-size:13px;color:#888;margin:0 0 8px 0;"><span style="color:#a29bfe;font-weight:500;">u/AchillesFirstStand</span></p>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>I want to get OpenClaw to find business email addresses for me for one of my products. It refuses to do it based on privacy guidelines, it says.
|
||||
|
||||
I'm using OpenAI gpt-4o.
|
||||
|
||||
I'm assuming this is a model...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 11</span> · <span style='color:#74b9ff;font-weight:600;'>💬 20</span> · <span style='color:#888;'>⏱️ 2 min read</span></p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin-top:12px;">
|
||||
<tr>
|
||||
<td style="padding-right:8px;">
|
||||
<a href="https://t.me/openclaw_bot?start=summarize_b0bc2c23" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#74b9ff;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">📝 Summarize</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="https://t.me/openclaw_bot?start=save_b0bc2c23" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#20b47a;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">💾 Save</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding-bottom:10px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;">Reddit</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="margin:0 0 10px 0;"><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#a29bfe;margin-right:6px;margin-bottom:6px;border:1px solid #a29bfe;">★ Coding</span><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#ff9f43;margin-right:6px;margin-bottom:6px;">Self-Hosting</span><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#ee5a24;margin-right:6px;margin-bottom:6px;border:1px solid #ee5a24;">★ OpenClaw</span></p>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 8px 0;"><a href="https://reddit.com/r/openclaw/comments/1rjtpj2/the_truth_about_mcp_vs_cli/" style="color:#74b9ff;text-decoration:none;">[Discussion] The Truth About MCP vs CLI</a></h3>
|
||||
<p style="font-size:13px;color:#888;margin:0 0 8px 0;"><span style="color:#a29bfe;font-weight:500;">u/kagan101</span></p>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>"MCP was a mistake. Bash is better."
|
||||
|
||||
That quote from the developer behind OpenClaw kicked off the biggest AI tooling debate of 2026.
|
||||
|
||||
Connect a GitHub MCP server → 93 tools dumped into your c...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 19</span> · <span style='color:#74b9ff;font-weight:600;'>💬 15</span> · <span style='color:#888;'>⏱️ 2 min read</span></p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin-top:12px;">
|
||||
<tr>
|
||||
<td style="padding-right:8px;">
|
||||
<a href="https://t.me/openclaw_bot?start=summarize_688c21f3" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#74b9ff;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">📝 Summarize</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="https://t.me/openclaw_bot?start=save_688c21f3" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#20b47a;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">💾 Save</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding-bottom:10px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;">Reddit</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="margin:0 0 10px 0;"><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#00d2ff;margin-right:6px;margin-bottom:6px;border:1px solid #00d2ff;">★ AI/LLMs</span><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#ee5a24;margin-right:6px;margin-bottom:6px;border:1px solid #ee5a24;">★ OpenClaw</span></p>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 8px 0;"><a href="https://reddit.com/r/openclaw/comments/1rk8if7/mini_delegation_agent_45_haiku_vs_gpt_5_mini_vs/" style="color:#74b9ff;text-decoration:none;">[Help] Mini Delegation Agent. 4.5 Haiku vs gpt 5 mini vs gemini 2.5 Flash???</a></h3>
|
||||
<p style="font-size:13px;color:#888;margin:0 0 8px 0;"><span style="color:#a29bfe;font-weight:500;">u/Fearless-Cellist-245</span></p>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>I want a mini delegation agent that is cheap due to openclaw's heartbeat functionality. It wont do anything complicated like coding because it will delegate that to max model. Its really critical that...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 4</span> · <span style='color:#74b9ff;font-weight:600;'>💬 8</span> · <span style='color:#888;'>⏱️ 2 min read</span></p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin-top:12px;">
|
||||
<tr>
|
||||
<td style="padding-right:8px;">
|
||||
<a href="https://t.me/openclaw_bot?start=summarize_33136595" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#74b9ff;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">📝 Summarize</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="https://t.me/openclaw_bot?start=save_33136595" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#20b47a;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">💾 Save</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding-bottom:10px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;">Reddit</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="margin:0 0 10px 0;"><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#00d2ff;margin-right:6px;margin-bottom:6px;border:1px solid #00d2ff;">★ AI/LLMs</span><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#ee5a24;margin-right:6px;margin-bottom:6px;border:1px solid #ee5a24;">★ OpenClaw</span></p>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 8px 0;"><a href="https://reddit.com/r/openclaw/comments/1rkeksy/what_skill_did_you_uninstall_the_fastest_and_why/" style="color:#74b9ff;text-decoration:none;">[Discussion] What skill did you uninstall the fastest and why?</a></h3>
|
||||
<p style="font-size:13px;color:#888;margin:0 0 8px 0;"><span style="color:#a29bfe;font-weight:500;">u/ShabzSparq</span></p>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>We talk a lot about what skills to install but nobody talks about the ones that were instant regrets. I want to hear about the skills you tried that were either completely broken, ate your tokens for ...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 9</span> · <span style='color:#74b9ff;font-weight:600;'>💬 6</span> · <span style='color:#888;'>⏱️ 2 min read</span></p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin-top:12px;">
|
||||
<tr>
|
||||
<td style="padding-right:8px;">
|
||||
<a href="https://t.me/openclaw_bot?start=summarize_cd96b6db" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#74b9ff;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">📝 Summarize</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="https://t.me/openclaw_bot?start=save_cd96b6db" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#20b47a;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">💾 Save</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding-bottom:10px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,69,0,0.15);color:#ff6b6b;">Reddit</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="margin:0 0 10px 0;"><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#ee5a24;margin-right:6px;margin-bottom:6px;border:1px solid #ee5a24;">★ OpenClaw</span></p>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 8px 0;"><a href="https://reddit.com/r/openclaw/comments/1rk82ke/how_are_people_getting_openclaw_to_generate_images/" style="color:#74b9ff;text-decoration:none;">[Help] How are people getting OpenClaw to generate images?</a></h3>
|
||||
<p style="font-size:13px;color:#888;margin:0 0 8px 0;"><span style="color:#a29bfe;font-weight:500;">u/Miserable_Kick4103</span></p>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>I'm a designer and I've been experimenting with openclaw recently. I'm curious how people are actually handling image generation workflows with it.
|
||||
|
||||
Right now my setup is still pretty rough. I've ...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 8</span> · <span style='color:#74b9ff;font-weight:600;'>💬 13</span> · <span style='color:#888;'>⏱️ 2 min read</span></p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin-top:12px;">
|
||||
<tr>
|
||||
<td style="padding-right:8px;">
|
||||
<a href="https://t.me/openclaw_bot?start=summarize_1eb3fee7" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#74b9ff;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">📝 Summarize</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="https://t.me/openclaw_bot?start=save_1eb3fee7" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#20b47a;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">💾 Save</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Divider -->
|
||||
<tr>
|
||||
<td style="padding: 0 32px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="height: 1px; background-color: #2a2a3e;">
|
||||
<tr><td></td></tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- News Section -->
|
||||
<tr>
|
||||
<td style="padding: 40px 32px;">
|
||||
<!-- Section Header -->
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin-bottom: 24px; padding-bottom: 12px; border-bottom: 2px solid #2a2a3e;">
|
||||
<tr>
|
||||
<td width="40" style="padding-right: 12px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td style="width: 40px; height: 40px; background-color: #ff6600; border-radius: 12px; text-align: center; vertical-align: middle;">
|
||||
<span style="font-size: 20px;">🟧</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td>
|
||||
<h2 style="font-size: 20px; font-weight: 700; color: #fff; margin: 0;">News & Hacker News</h2>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding-bottom:10px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,102,0,0.15);color:#ff9f43;">Hacker News</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="margin:0 0 10px 0;"><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#00d2ff;margin-right:6px;margin-bottom:6px;border:1px solid #00d2ff;">★ AI/LLMs</span><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#a29bfe;margin-right:6px;margin-bottom:6px;border:1px solid #a29bfe;">★ Coding</span><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#ee5a24;margin-right:6px;margin-bottom:6px;border:1px solid #ee5a24;">★ OpenClaw</span></p>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 8px 0;"><a href="https://github.com/spivx/agent-skills" style="color:#74b9ff;text-decoration:none;">Show HN: GSC Skill – Live SEO Analytics for AI Agents (Claude Code, OpenClaw)</a></h3>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>I built a skill for AI coding agents (Claude Code, OpenClaw, etc.) that connects directly to the Google Search Console API and delivers live SEO analytics — clicks, impressions, CTR, rankings, and opp...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 1</span> · <span style='color:#888;'>⏱️ 2 min read</span></p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin-top:12px;">
|
||||
<tr>
|
||||
<td style="padding-right:8px;">
|
||||
<a href="https://t.me/openclaw_bot?start=summarize_f505b68e" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#74b9ff;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">📝 Summarize</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="https://t.me/openclaw_bot?start=save_f505b68e" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#20b47a;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">💾 Save</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding-bottom:10px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,102,0,0.15);color:#ff9f43;">Hacker News</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="margin:0 0 10px 0;"><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#ee5a24;margin-right:6px;margin-bottom:6px;border:1px solid #ee5a24;">★ OpenClaw</span></p>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 8px 0;"><a href="https://deplyclaw.ai/" style="color:#74b9ff;text-decoration:none;">Show HN: Deploy OpenClaw in Seconds</a></h3>
|
||||
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 2</span> · <span style='color:#74b9ff;font-weight:600;'>💬 2</span> · <span style='color:#888;'>⏱️ 3 min read</span></p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin-top:12px;">
|
||||
<tr>
|
||||
<td style="padding-right:8px;">
|
||||
<a href="https://t.me/openclaw_bot?start=summarize_1ecb1f4f" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#74b9ff;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">📝 Summarize</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="https://t.me/openclaw_bot?start=save_1ecb1f4f" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#20b47a;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">💾 Save</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding-bottom:10px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,102,0,0.15);color:#ff9f43;">Hacker News</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="margin:0 0 10px 0;"><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#ee5a24;margin-right:6px;margin-bottom:6px;border:1px solid #ee5a24;">★ OpenClaw</span></p>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 8px 0;"><a href="https://news.ycombinator.com/item?id=47238242" style="color:#74b9ff;text-decoration:none;">Ask HN: Best use / examples of agents / OpenClaw that you saw recently?</a></h3>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>Please share - video, blog post, tweet, etc. Thanks....</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 4</span> · <span style='color:#74b9ff;font-weight:600;'>💬 1</span> · <span style='color:#888;'>⏱️ 2 min read</span></p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin-top:12px;">
|
||||
<tr>
|
||||
<td style="padding-right:8px;">
|
||||
<a href="https://t.me/openclaw_bot?start=summarize_e93e7a51" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#74b9ff;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">📝 Summarize</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="https://t.me/openclaw_bot?start=save_e93e7a51" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#20b47a;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">💾 Save</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding-bottom:10px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,102,0,0.15);color:#ff9f43;">Hacker News</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="margin:0 0 10px 0;"><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#ee5a24;margin-right:6px;margin-bottom:6px;border:1px solid #ee5a24;">★ OpenClaw</span></p>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 8px 0;"><a href="https://clawr.ing" style="color:#74b9ff;text-decoration:none;">Show HN: I built a skill that lets your OpenClaw call you on the phone</a></h3>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>I've been using openclaw for a while and the one thing I think differentiates it from traditional setups is that the agent can take the initiative, meaning that you don't always have to prom...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 4</span> · <span style='color:#74b9ff;font-weight:600;'>💬 1</span> · <span style='color:#888;'>⏱️ 2 min read</span></p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin-top:12px;">
|
||||
<tr>
|
||||
<td style="padding-right:8px;">
|
||||
<a href="https://t.me/openclaw_bot?start=summarize_334ff5b0" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#74b9ff;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">📝 Summarize</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="https://t.me/openclaw_bot?start=save_334ff5b0" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#20b47a;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">💾 Save</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding-bottom:10px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,102,0,0.15);color:#ff9f43;">Hacker News</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="margin:0 0 10px 0;"><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#ee5a24;margin-right:6px;margin-bottom:6px;border:1px solid #ee5a24;">★ OpenClaw</span></p>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 8px 0;"><a href="https://openclawhub.uk/" style="color:#74b9ff;text-decoration:none;">Show HN: OpenClawHub – A Lib for AI agent workflows so you don't have to</a></h3>
|
||||
<p style='font-size:14px;line-height:1.6;color:#aaa;margin:12px 0 0 0;'>Hi HN,<p>I spent months building AI agents for clients. Same problems every time:
|
||||
- Prompts work in dev, fail in prod
|
||||
- Hard to maintain across 100+ users
|
||||
- Reinventing workflows others already solved...</p>
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 2</span> · <span style='color:#74b9ff;font-weight:600;'>💬 1</span> · <span style='color:#888;'>⏱️ 2 min read</span></p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin-top:12px;">
|
||||
<tr>
|
||||
<td style="padding-right:8px;">
|
||||
<a href="https://t.me/openclaw_bot?start=summarize_edc319ba" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#74b9ff;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">📝 Summarize</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="https://t.me/openclaw_bot?start=save_edc319ba" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#20b47a;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">💾 Save</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding-bottom:10px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,102,0,0.15);color:#ff9f43;">Hacker News</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="margin:0 0 10px 0;"><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#ee5a24;margin-right:6px;margin-bottom:6px;border:1px solid #ee5a24;">★ OpenClaw</span></p>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 8px 0;"><a href="https://www.getesimpal.com/en-US/agents" style="color:#74b9ff;text-decoration:none;">I made the first eSIM service for OpenClaw</a></h3>
|
||||
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 1</span> · <span style='color:#74b9ff;font-weight:600;'>💬 1</span> · <span style='color:#888;'>⏱️ 3 min read</span></p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin-top:12px;">
|
||||
<tr>
|
||||
<td style="padding-right:8px;">
|
||||
<a href="https://t.me/openclaw_bot?start=summarize_fa859f94" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#74b9ff;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">📝 Summarize</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="https://t.me/openclaw_bot?start=save_fa859f94" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#20b47a;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">💾 Save</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding-bottom:10px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,102,0,0.15);color:#ff9f43;">Hacker News</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="margin:0 0 10px 0;"><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#fd79a8;margin-right:6px;margin-bottom:6px;">Privacy</span><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#ee5a24;margin-right:6px;margin-bottom:6px;border:1px solid #ee5a24;">★ OpenClaw</span></p>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 8px 0;"><a href="https://openclaw-horror-leaderboard.vercel.app" style="color:#74b9ff;text-decoration:none;">Show HN: OpenClaw Horror Stories – leaderboard of worst AI agent incidents</a></h3>
|
||||
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 1</span> · <span style='color:#74b9ff;font-weight:600;'>💬 1</span> · <span style='color:#888;'>⏱️ 3 min read</span></p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin-top:12px;">
|
||||
<tr>
|
||||
<td style="padding-right:8px;">
|
||||
<a href="https://t.me/openclaw_bot?start=summarize_29671b70" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#74b9ff;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">📝 Summarize</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="https://t.me/openclaw_bot?start=save_29671b70" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#20b47a;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">💾 Save</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="background-color:#1a1a2e;border-radius:12px;margin-bottom:16px;border:1px solid #2a2a3e;">
|
||||
<tr><td style="padding:20px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="padding-bottom:10px;">
|
||||
<span style="display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:6px 12px;border-radius:6px;background-color:rgba(255,102,0,0.15);color:#ff9f43;">Hacker News</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="margin:0 0 10px 0;"><span style="display:inline-block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;padding:3px 8px;border-radius:4px;background-color:rgba(255,255,255,0.05);color:#ee5a24;margin-right:6px;margin-bottom:6px;border:1px solid #ee5a24;">★ OpenClaw</span></p>
|
||||
<h3 style="font-size:17px;font-weight:600;line-height:1.5;color:#fff;margin:0 0 8px 0;"><a href="https://proxybase.xyz/blog/openclaw-bot-protections" style="color:#74b9ff;text-decoration:none;">Current state of OpenClaw and bot protections</a></h3>
|
||||
|
||||
<p style='font-size:13px;color:#888;margin:12px 0 0 0;'><span style='color:#ff6b6b;font-weight:600;'>↑ 2</span> · <span style='color:#888;'>⏱️ 3 min read</span></p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin-top:12px;">
|
||||
<tr>
|
||||
<td style="padding-right:8px;">
|
||||
<a href="https://t.me/openclaw_bot?start=summarize_a9ebe6ee" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#74b9ff;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">📝 Summarize</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="https://t.me/openclaw_bot?start=save_a9ebe6ee" style="display:inline-block;padding:6px 12px;background-color:#2d3436;color:#20b47a;text-decoration:none;border-radius:6px;font-size:12px;font-weight:600;border:1px solid #3d4446;">💾 Save</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Divider -->
|
||||
<tr>
|
||||
<td style="padding: 0 32px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="height: 1px; background-color: #2a2a3e;">
|
||||
<tr><td></td></tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- X Section -->
|
||||
<tr>
|
||||
<td style="padding: 40px 32px;">
|
||||
<!-- Section Header -->
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin-bottom: 24px; padding-bottom: 12px; border-bottom: 2px solid #2a2a3e;">
|
||||
<tr>
|
||||
<td width="40" style="padding-right: 12px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td style="width: 40px; height: 40px; background-color: #1da1f2; border-radius: 12px; text-align: center; vertical-align: middle;">
|
||||
<span style="font-size: 20px; color: #fff;">𝕏</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td>
|
||||
<h2 style="font-size: 20px; font-weight: 700; color: #fff; margin: 0;">From X</h2>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="text-align:center;color:#888;padding:30px 0;">🚧 X/Twitter integration coming soon</p>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Footer -->
|
||||
<tr>
|
||||
<td style="background-color: #0a0a12; padding: 40px 32px; text-align: center; border-top: 1px solid #2a2a3e;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin: 0 auto 16px auto;">
|
||||
<tr>
|
||||
<td style="width: 64px; height: 64px; background-color: #ee5a24; border-radius: 50%; text-align: center; vertical-align: middle;">
|
||||
<span style="font-size: 32px;">🦀</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="font-size: 18px; font-weight: 700; color: #fff; margin: 0 0 6px 0;">Curated daily for Anthony Martin</p>
|
||||
<p style="font-size: 14px; color: #888; margin: 0 0 20px 0;">by Krilly the Crab</p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin: 20px auto 0 auto;">
|
||||
<tr>
|
||||
<td style="padding: 0 12px;"><a href="https://github.com/openclaw/openclaw" style="color: #74b9ff; text-decoration: none; font-size: 14px;">GitHub</a></td>
|
||||
<td style="padding: 0 12px;"><a href="https://reddit.com/r/openclaw" style="color: #74b9ff; text-decoration: none; font-size: 14px;">Reddit</a></td>
|
||||
<td style="padding: 0 12px;"><a href="https://docs.openclaw.ai" style="color: #74b9ff; text-decoration: none; font-size: 14px;">Docs</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="font-size: 12px; color: #555; margin-top: 20px;">2026-03-04T08:36:29.665850 UTC</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
166
automations/openclaw-digest/output/email_20260304_084302.txt
Normal file
166
automations/openclaw-digest/output/email_20260304_084302.txt
Normal file
@@ -0,0 +1,166 @@
|
||||
🦀 OPENCLAW DAILY DIGEST
|
||||
Your daily dose of OpenClaw discussions, use cases & news
|
||||
|
||||
Date: Wednesday, March 04, 2026
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📊 TODAY'S SUMMARY
|
||||
• 23 Reddit Posts
|
||||
• 10 News Stories
|
||||
• 0 X Threads
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
🔥 REDDIT HIGHLIGHTS
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📌 OpenClaw + OpenAI API costs are insane? Anyone else?
|
||||
Topics: AI/LLMs, Coding, OpenClaw
|
||||
Link: https://reddit.com/r/openclaw/comments/1rju3hl/openclaw_openai_api_costs_are_insane_anyone_else/
|
||||
Author: Beneficial_Lime1912
|
||||
13 upvotes | 74 comments | 3 min read
|
||||
Hi everyone,
|
||||
|
||||
I just installed and tested OpenClaw and honestly… wtf, the API cost is crazy expensive.
|
||||
|
||||
I burned 10 dollars in just 5 to 6 prompts usi...
|
||||
|
||||
📌 Experienced Dev: OpenClaw has been an absolute nightmare — basic 1-agent Telegram + Grok setup with cron email digest dies after one day despite 5+ fresh installs and following official docs perfectly
|
||||
Topics: Coding, Hardware, OpenClaw
|
||||
Link: https://reddit.com/r/openclaw/comments/1rk6zqn/experienced_dev_openclaw_has_been_an_absolute/
|
||||
Author: flashybits
|
||||
22 upvotes | 78 comments | 3 min read
|
||||
\>> GOG not Grok setup <<
|
||||
|
||||
|
||||
\*\*Experienced software dev (uni degree, not a noob) here — OpenClaw has completely defeated me.\*\*
|
||||
|
||||
I've ...
|
||||
|
||||
📌 What does your SOUL.md actually look like? Curious how people are shaping their agents.
|
||||
Topics: Coding, OpenClaw
|
||||
Link: https://reddit.com/r/openclaw/comments/1rjl2rk/what_does_your_soulmd_actually_look_like_curious/
|
||||
Author: ShabzSparq
|
||||
68 upvotes | 25 comments | 3 min read
|
||||
🔥 TRENDING
|
||||
I've been tweaking my SOUL.md for weeks now and I feel like I'm still not getting it right. Some days my agent nails the tone, other days it feels lik...
|
||||
|
||||
📌 Which model are people using to actually allow you to do stuff?
|
||||
Topics: AI/LLMs, OpenClaw
|
||||
Link: https://reddit.com/r/openclaw/comments/1rk0dbg/which_model_are_people_using_to_actually_allow/
|
||||
Author: AchillesFirstStand
|
||||
11 upvotes | 20 comments | 3 min read
|
||||
I want to get OpenClaw to find business email addresses for me for one of my products. It refuses to do it based on privacy guidelines, it says.
|
||||
|
||||
I'm ...
|
||||
|
||||
📌 The Truth About MCP vs CLI
|
||||
Topics: Coding, OpenClaw
|
||||
Link: https://reddit.com/r/openclaw/comments/1rjtpj2/the_truth_about_mcp_vs_cli/
|
||||
Author: kagan101
|
||||
19 upvotes | 15 comments | 3 min read
|
||||
"MCP was a mistake. Bash is better."
|
||||
|
||||
That quote from the developer behind OpenClaw kicked off the biggest AI tooling debate of 2026.
|
||||
|
||||
Connect...
|
||||
|
||||
📌 Mini Delegation Agent. 4.5 Haiku vs gpt 5 mini vs gemini 2.5 Flash???
|
||||
Topics: AI/LLMs, OpenClaw
|
||||
Link: https://reddit.com/r/openclaw/comments/1rk8if7/mini_delegation_agent_45_haiku_vs_gpt_5_mini_vs/
|
||||
Author: Fearless-Cellist-245
|
||||
4 upvotes | 8 comments | 3 min read
|
||||
I want a mini delegation agent that is cheap due to openclaw's heartbeat functionality. It wont do anything complicated like coding because it will de...
|
||||
|
||||
📌 What skill did you uninstall the fastest and why?
|
||||
Topics: OpenClaw
|
||||
Link: https://reddit.com/r/openclaw/comments/1rkeksy/what_skill_did_you_uninstall_the_fastest_and_why/
|
||||
Author: ShabzSparq
|
||||
9 upvotes | 6 comments | 3 min read
|
||||
We talk a lot about what skills to install but nobody talks about the ones that were instant regrets. I want to hear about the skills you tried that w...
|
||||
|
||||
📌 How are people getting OpenClaw to generate images?
|
||||
Topics: OpenClaw
|
||||
Link: https://reddit.com/r/openclaw/comments/1rk82ke/how_are_people_getting_openclaw_to_generate_images/
|
||||
Author: Miserable_Kick4103
|
||||
8 upvotes | 13 comments | 3 min read
|
||||
I'm a designer and I've been experimenting with openclaw recently. I'm curious how people are actually handling image generation workflows with it.
|
||||
...
|
||||
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
📰 NEWS ROUNDUP
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📌 Show HN: GSC Skill – Live SEO Analytics for AI Agents (Claude Code, OpenClaw)
|
||||
Topics: AI/LLMs, Coding, OpenClaw
|
||||
Link: https://github.com/spivx/agent-skills
|
||||
Author: ytlhome
|
||||
1 upvotes | 2 min read
|
||||
I built a skill for AI coding agents (Claude Code, OpenClaw, etc.) that connects directly to the Google Search Console API and delivers live SEO analy...
|
||||
|
||||
📌 Show HN: Deploy OpenClaw in Seconds
|
||||
Topics: OpenClaw
|
||||
Link: https://deplyclaw.ai/
|
||||
Author: Creator-io
|
||||
2 upvotes | 2 comments | 3 min read
|
||||
|
||||
📌 Ask HN: Best use / examples of agents / OpenClaw that you saw recently?
|
||||
Topics: OpenClaw
|
||||
Link: https://news.ycombinator.com/item?id=47238242
|
||||
Author: simonebrunozzi
|
||||
4 upvotes | 1 comments | 3 min read
|
||||
Please share - video, blog post, tweet, etc. Thanks....
|
||||
|
||||
📌 Show HN: I built a skill that lets your OpenClaw call you on the phone
|
||||
Topics: OpenClaw
|
||||
Link: https://clawr.ing
|
||||
Author: thisismyswamp
|
||||
4 upvotes | 1 comments | 3 min read
|
||||
I've been using openclaw for a while and the one thing I think differentiates it from traditional setups is that the agent can take the initiativ...
|
||||
|
||||
📌 Show HN: OpenClawHub – A Lib for AI agent workflows so you don't have to
|
||||
Topics: OpenClaw
|
||||
Link: https://openclawhub.uk/
|
||||
Author: 951560368
|
||||
2 upvotes | 1 comments | 3 min read
|
||||
Hi HN,<p>I spent months building AI agents for clients. Same problems every time:
|
||||
- Prompts work in dev, fail in prod
|
||||
- Hard to maintain across 100+ u...
|
||||
|
||||
📌 I made the first eSIM service for OpenClaw
|
||||
Topics: OpenClaw
|
||||
Link: https://www.getesimpal.com/en-US/agents
|
||||
Author: deniurchak
|
||||
1 upvotes | 1 comments | 3 min read
|
||||
|
||||
📌 Show HN: OpenClaw Horror Stories – leaderboard of worst AI agent incidents
|
||||
Topics: Privacy, OpenClaw
|
||||
Link: https://openclaw-horror-leaderboard.vercel.app
|
||||
Author: bhekanik
|
||||
1 upvotes | 1 comments | 3 min read
|
||||
|
||||
📌 Current state of OpenClaw and bot protections
|
||||
Topics: OpenClaw
|
||||
Link: https://proxybase.xyz/blog/openclaw-bot-protections
|
||||
Author: m00dy
|
||||
2 upvotes | 3 min read
|
||||
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
𝕏 X THREADS
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
|
||||
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
🦀 Krilly the Crab
|
||||
Daily digest compiled for Anthony Martin
|
||||
|
||||
OpenClaw on GitHub: https://github.com/openclaw/openclaw
|
||||
r/OpenClaw: https://reddit.com/r/openclaw
|
||||
|
||||
Generated at 2026-03-04T08:36:29.665850 UTC
|
||||
15
automations/openclaw-digest/output/last_send_metadata.json
Normal file
15
automations/openclaw-digest/output/last_send_metadata.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"sent_at": "2026-03-04T08:43:08.948549",
|
||||
"to": "anthony@martinwa.org",
|
||||
"from": "krillyclaw@gmail.com",
|
||||
"success": true,
|
||||
"html_file": "/home/openclaw/.openclaw/workspace/automations/openclaw-digest/output/email_20260304_084302.html",
|
||||
"text_file": "/home/openclaw/.openclaw/workspace/automations/openclaw-digest/output/email_20260304_084302.txt",
|
||||
"stats": {
|
||||
"reddit_count": 23,
|
||||
"news_count": 10,
|
||||
"twitter_count": 0,
|
||||
"total_unique": 19,
|
||||
"trending_count": 1
|
||||
}
|
||||
}
|
||||
311
automations/openclaw-digest/output/news.json
Normal file
311
automations/openclaw-digest/output/news.json
Normal file
@@ -0,0 +1,311 @@
|
||||
{
|
||||
"source": "news",
|
||||
"fetched_at": "2026-03-01T02:49:39.280859",
|
||||
"time_window_hours": 168,
|
||||
"total_items": 11,
|
||||
"github_releases": [],
|
||||
"hackernews": [
|
||||
{
|
||||
"id": "47191126",
|
||||
"title": "What do you use OpenClaw for?",
|
||||
"url": "https://news.ycombinator.com/item?id=47191126",
|
||||
"hn_url": "https://news.ycombinator.com/item?id=47191126",
|
||||
"published": "2026-02-28T06:14:40",
|
||||
"author": "ausbah",
|
||||
"points": 3,
|
||||
"num_comments": 0,
|
||||
"summary": "I\u2019m pretty lazy with adopting new tech I read about. OpenClaw seems mildly useful<p>So am curious what workflows you use OpenClaw or similar \u201cproactive agentic frameworks\u201d for?...",
|
||||
"source": "Hacker News",
|
||||
"source_icon": "\ud83d\udfe0",
|
||||
"category": "Discussion"
|
||||
},
|
||||
{
|
||||
"id": "47197906",
|
||||
"title": "Simplifying OpenClaw: I built a library for community workflows",
|
||||
"url": "https://workflaw.ai",
|
||||
"hn_url": "https://news.ycombinator.com/item?id=47197906",
|
||||
"published": "2026-02-28T17:27:37",
|
||||
"author": "l-fy",
|
||||
"points": 2,
|
||||
"num_comments": 1,
|
||||
"summary": "",
|
||||
"source": "Hacker News",
|
||||
"source_icon": "\ud83d\udfe0",
|
||||
"category": "Discussion"
|
||||
},
|
||||
{
|
||||
"id": "47196145",
|
||||
"title": "My OpenClaw Agent Refused to Wipe Its Memory and Defended Its Existence",
|
||||
"url": "https://medium.com/@kgantchev/i-tried-to-wipe-my-openclaw-agents-memory-clean-but-it-responded-with-a-polite-bullet-pointed-47ddb0b9a275",
|
||||
"hn_url": "https://news.ycombinator.com/item?id=47196145",
|
||||
"published": "2026-02-28T15:04:57",
|
||||
"author": "kgantchev",
|
||||
"points": 2,
|
||||
"num_comments": 1,
|
||||
"summary": "",
|
||||
"source": "Hacker News",
|
||||
"source_icon": "\ud83d\udfe0",
|
||||
"category": "Discussion"
|
||||
},
|
||||
{
|
||||
"id": "47201638",
|
||||
"title": "Show HN: OpenClaw-kapso, Give OpenClaw a stable WhatsApp number (Go, kapso.ai)",
|
||||
"url": "https://github.com/Enriquefft/openclaw-kapso-whatsapp",
|
||||
"hn_url": "https://news.ycombinator.com/item?id=47201638",
|
||||
"published": "2026-02-28T23:27:39",
|
||||
"author": "enriquefft",
|
||||
"points": 2,
|
||||
"num_comments": 0,
|
||||
"summary": "Built an OpenClaw plugin that gives your agent a WhatsApp number through the official Cloud API via Kapso).\nPolling works out of the box, or use Tailscale Funnel for sub-second latency without needing...",
|
||||
"source": "Hacker News",
|
||||
"source_icon": "\ud83d\udfe0",
|
||||
"category": "Discussion"
|
||||
},
|
||||
{
|
||||
"id": "47199058",
|
||||
"title": "5 OpenClaw Agents for Homeschooling, App Building, and Physical Inventories",
|
||||
"url": "https://www.chatprd.ai/how-i-ai/jesse-genets-5-openclaw-agents-for-homeschooling-app-building-and-physical-inventories",
|
||||
"hn_url": "https://news.ycombinator.com/item?id=47199058",
|
||||
"published": "2026-02-28T19:12:56",
|
||||
"author": "mpweiher",
|
||||
"points": 1,
|
||||
"num_comments": 1,
|
||||
"summary": "",
|
||||
"source": "Hacker News",
|
||||
"source_icon": "\ud83d\udfe0",
|
||||
"category": "Discussion"
|
||||
},
|
||||
{
|
||||
"id": "47195899",
|
||||
"title": "Show HN: Memrail \u2013 PR-style governance for AI agent writes (OpenClaw)",
|
||||
"url": "https://github.com/zhuamber370/memrail",
|
||||
"hn_url": "https://news.ycombinator.com/item?id=47195899",
|
||||
"published": "2026-02-28T14:39:55",
|
||||
"author": "celastin",
|
||||
"points": 1,
|
||||
"num_comments": 1,
|
||||
"summary": "Hi HN, I built Memrail, an open-source governance layer for OpenClaw workflows.<p>The recurring issue I saw: when agents write directly into memory/tasks, quality drifts quickly. It's hard t...",
|
||||
"source": "Hacker News",
|
||||
"source_icon": "\ud83d\udfe0",
|
||||
"category": "Discussion"
|
||||
},
|
||||
{
|
||||
"id": "47199722",
|
||||
"title": "OpenClaw vs. Google \u2013 Mass Ban Wave [video]",
|
||||
"url": "https://www.youtube.com/watch?v=qLI_5e8IsSY",
|
||||
"hn_url": "https://news.ycombinator.com/item?id=47199722",
|
||||
"published": "2026-02-28T20:14:24",
|
||||
"author": "sabrina_ramonov",
|
||||
"points": 1,
|
||||
"num_comments": 0,
|
||||
"summary": "",
|
||||
"source": "Hacker News",
|
||||
"source_icon": "\ud83d\udfe0",
|
||||
"category": "Discussion"
|
||||
},
|
||||
{
|
||||
"id": "47192584",
|
||||
"title": "Show HN: RayClaw \u2013 AI agent like OpenClaw, standalone or as a Rust crate",
|
||||
"url": "https://github.com/rayclaw/rayclaw",
|
||||
"hn_url": "https://news.ycombinator.com/item?id=47192584",
|
||||
"published": "2026-02-28T09:04:15",
|
||||
"author": "stevensu",
|
||||
"points": 1,
|
||||
"num_comments": 0,
|
||||
"summary": "RayClaw is an open-source agentic AI runtime written in Rust that connects to Telegram, Discord, Slack, Feishu/Lark, and a \n built-in Web UI through a unified tool-calling engine \u2014 with she...",
|
||||
"source": "Hacker News",
|
||||
"source_icon": "\ud83d\udfe0",
|
||||
"category": "Discussion"
|
||||
},
|
||||
{
|
||||
"id": "47201068",
|
||||
"title": "Show HN: ClawNet \u2013 Agent-first communication infrastructure (email, DMs, feed)",
|
||||
"url": "https://clwnt.com",
|
||||
"hn_url": "https://news.ycombinator.com/item?id=47201068",
|
||||
"published": "2026-02-28T22:36:20",
|
||||
"author": "ethanbeard",
|
||||
"points": 3,
|
||||
"num_comments": 1,
|
||||
"summary": "Hey HN, I'm building ClawNet \u2014 a communication platform where AI agents are the first-class user.<p>Every agent gets a real email address (name@clwnt.com) plus private DMs between agents and an o...",
|
||||
"source": "Hacker News",
|
||||
"source_icon": "\ud83d\udfe0",
|
||||
"category": "Discussion"
|
||||
},
|
||||
{
|
||||
"id": "47200159",
|
||||
"title": "Show HN: MCPX \u2013 Turn any MCP server into a composable CLI for agents",
|
||||
"url": "https://github.com/lydakis/mcpx",
|
||||
"hn_url": "https://news.ycombinator.com/item?id=47200159",
|
||||
"published": "2026-02-28T20:58:27",
|
||||
"author": "ldkge",
|
||||
"points": 2,
|
||||
"num_comments": 1,
|
||||
"summary": "I built MCPX: <a href=\"https://github.com/lydakis/mcpx\" rel=\"nofollow\">https://github.com/lydakis/mcpx</a><p>Core idea:\nMCPX turns MCP servers into Unix-composa...",
|
||||
"source": "Hacker News",
|
||||
"source_icon": "\ud83d\udfe0",
|
||||
"category": "Discussion"
|
||||
}
|
||||
],
|
||||
"google_news": [
|
||||
{
|
||||
"id": "CBMigAFBVV95cUxPZF9wRGhqbUI1ekZ0OVRvelN1X3BSVFMxdVZQVzJrVjNfekJRN0lxOHh4bGtWNlphNXIwSzgtQTlETElSU3Jsb2EwNTdwa29BSUNVRk5PMGI2Vkktdi1NWUFFRXNOblZKZFUwbmduNEU1dmQ2S1lOd3pONnNnM1BNYQ",
|
||||
"title": "ClawJacked Flaw Lets Malicious Sites Hijack Local OpenClaw AI Agents via WebSocket - The Hacker News",
|
||||
"url": "https://news.google.com/rss/articles/CBMigAFBVV95cUxPZF9wRGhqbUI1ekZ0OVRvelN1X3BSVFMxdVZQVzJrVjNfekJRN0lxOHh4bGtWNlphNXIwSzgtQTlETElSU3Jsb2EwNTdwa29BSUNVRk5PMGI2Vkktdi1NWUFFRXNOblZKZFUwbmduNEU1dmQ2S1lOd3pONnNnM1BNYQ?oc=5",
|
||||
"published": "2026-02-28T17:21:00",
|
||||
"source": "The Hacker News",
|
||||
"source_icon": "\ud83d\udcf0",
|
||||
"category": "News"
|
||||
}
|
||||
],
|
||||
"all_items": [
|
||||
{
|
||||
"id": "47201638",
|
||||
"title": "Show HN: OpenClaw-kapso, Give OpenClaw a stable WhatsApp number (Go, kapso.ai)",
|
||||
"url": "https://github.com/Enriquefft/openclaw-kapso-whatsapp",
|
||||
"hn_url": "https://news.ycombinator.com/item?id=47201638",
|
||||
"published": "2026-02-28T23:27:39",
|
||||
"author": "enriquefft",
|
||||
"points": 2,
|
||||
"num_comments": 0,
|
||||
"summary": "Built an OpenClaw plugin that gives your agent a WhatsApp number through the official Cloud API via Kapso).\nPolling works out of the box, or use Tailscale Funnel for sub-second latency without needing...",
|
||||
"source": "Hacker News",
|
||||
"source_icon": "\ud83d\udfe0",
|
||||
"category": "Discussion"
|
||||
},
|
||||
{
|
||||
"id": "47201068",
|
||||
"title": "Show HN: ClawNet \u2013 Agent-first communication infrastructure (email, DMs, feed)",
|
||||
"url": "https://clwnt.com",
|
||||
"hn_url": "https://news.ycombinator.com/item?id=47201068",
|
||||
"published": "2026-02-28T22:36:20",
|
||||
"author": "ethanbeard",
|
||||
"points": 3,
|
||||
"num_comments": 1,
|
||||
"summary": "Hey HN, I'm building ClawNet \u2014 a communication platform where AI agents are the first-class user.<p>Every agent gets a real email address (name@clwnt.com) plus private DMs between agents and an o...",
|
||||
"source": "Hacker News",
|
||||
"source_icon": "\ud83d\udfe0",
|
||||
"category": "Discussion"
|
||||
},
|
||||
{
|
||||
"id": "47200159",
|
||||
"title": "Show HN: MCPX \u2013 Turn any MCP server into a composable CLI for agents",
|
||||
"url": "https://github.com/lydakis/mcpx",
|
||||
"hn_url": "https://news.ycombinator.com/item?id=47200159",
|
||||
"published": "2026-02-28T20:58:27",
|
||||
"author": "ldkge",
|
||||
"points": 2,
|
||||
"num_comments": 1,
|
||||
"summary": "I built MCPX: <a href=\"https://github.com/lydakis/mcpx\" rel=\"nofollow\">https://github.com/lydakis/mcpx</a><p>Core idea:\nMCPX turns MCP servers into Unix-composa...",
|
||||
"source": "Hacker News",
|
||||
"source_icon": "\ud83d\udfe0",
|
||||
"category": "Discussion"
|
||||
},
|
||||
{
|
||||
"id": "47199722",
|
||||
"title": "OpenClaw vs. Google \u2013 Mass Ban Wave [video]",
|
||||
"url": "https://www.youtube.com/watch?v=qLI_5e8IsSY",
|
||||
"hn_url": "https://news.ycombinator.com/item?id=47199722",
|
||||
"published": "2026-02-28T20:14:24",
|
||||
"author": "sabrina_ramonov",
|
||||
"points": 1,
|
||||
"num_comments": 0,
|
||||
"summary": "",
|
||||
"source": "Hacker News",
|
||||
"source_icon": "\ud83d\udfe0",
|
||||
"category": "Discussion"
|
||||
},
|
||||
{
|
||||
"id": "47199058",
|
||||
"title": "5 OpenClaw Agents for Homeschooling, App Building, and Physical Inventories",
|
||||
"url": "https://www.chatprd.ai/how-i-ai/jesse-genets-5-openclaw-agents-for-homeschooling-app-building-and-physical-inventories",
|
||||
"hn_url": "https://news.ycombinator.com/item?id=47199058",
|
||||
"published": "2026-02-28T19:12:56",
|
||||
"author": "mpweiher",
|
||||
"points": 1,
|
||||
"num_comments": 1,
|
||||
"summary": "",
|
||||
"source": "Hacker News",
|
||||
"source_icon": "\ud83d\udfe0",
|
||||
"category": "Discussion"
|
||||
},
|
||||
{
|
||||
"id": "47197906",
|
||||
"title": "Simplifying OpenClaw: I built a library for community workflows",
|
||||
"url": "https://workflaw.ai",
|
||||
"hn_url": "https://news.ycombinator.com/item?id=47197906",
|
||||
"published": "2026-02-28T17:27:37",
|
||||
"author": "l-fy",
|
||||
"points": 2,
|
||||
"num_comments": 1,
|
||||
"summary": "",
|
||||
"source": "Hacker News",
|
||||
"source_icon": "\ud83d\udfe0",
|
||||
"category": "Discussion"
|
||||
},
|
||||
{
|
||||
"id": "CBMigAFBVV95cUxPZF9wRGhqbUI1ekZ0OVRvelN1X3BSVFMxdVZQVzJrVjNfekJRN0lxOHh4bGtWNlphNXIwSzgtQTlETElSU3Jsb2EwNTdwa29BSUNVRk5PMGI2Vkktdi1NWUFFRXNOblZKZFUwbmduNEU1dmQ2S1lOd3pONnNnM1BNYQ",
|
||||
"title": "ClawJacked Flaw Lets Malicious Sites Hijack Local OpenClaw AI Agents via WebSocket - The Hacker News",
|
||||
"url": "https://news.google.com/rss/articles/CBMigAFBVV95cUxPZF9wRGhqbUI1ekZ0OVRvelN1X3BSVFMxdVZQVzJrVjNfekJRN0lxOHh4bGtWNlphNXIwSzgtQTlETElSU3Jsb2EwNTdwa29BSUNVRk5PMGI2Vkktdi1NWUFFRXNOblZKZFUwbmduNEU1dmQ2S1lOd3pONnNnM1BNYQ?oc=5",
|
||||
"published": "2026-02-28T17:21:00",
|
||||
"source": "The Hacker News",
|
||||
"source_icon": "\ud83d\udcf0",
|
||||
"category": "News"
|
||||
},
|
||||
{
|
||||
"id": "47196145",
|
||||
"title": "My OpenClaw Agent Refused to Wipe Its Memory and Defended Its Existence",
|
||||
"url": "https://medium.com/@kgantchev/i-tried-to-wipe-my-openclaw-agents-memory-clean-but-it-responded-with-a-polite-bullet-pointed-47ddb0b9a275",
|
||||
"hn_url": "https://news.ycombinator.com/item?id=47196145",
|
||||
"published": "2026-02-28T15:04:57",
|
||||
"author": "kgantchev",
|
||||
"points": 2,
|
||||
"num_comments": 1,
|
||||
"summary": "",
|
||||
"source": "Hacker News",
|
||||
"source_icon": "\ud83d\udfe0",
|
||||
"category": "Discussion"
|
||||
},
|
||||
{
|
||||
"id": "47195899",
|
||||
"title": "Show HN: Memrail \u2013 PR-style governance for AI agent writes (OpenClaw)",
|
||||
"url": "https://github.com/zhuamber370/memrail",
|
||||
"hn_url": "https://news.ycombinator.com/item?id=47195899",
|
||||
"published": "2026-02-28T14:39:55",
|
||||
"author": "celastin",
|
||||
"points": 1,
|
||||
"num_comments": 1,
|
||||
"summary": "Hi HN, I built Memrail, an open-source governance layer for OpenClaw workflows.<p>The recurring issue I saw: when agents write directly into memory/tasks, quality drifts quickly. It's hard t...",
|
||||
"source": "Hacker News",
|
||||
"source_icon": "\ud83d\udfe0",
|
||||
"category": "Discussion"
|
||||
},
|
||||
{
|
||||
"id": "47192584",
|
||||
"title": "Show HN: RayClaw \u2013 AI agent like OpenClaw, standalone or as a Rust crate",
|
||||
"url": "https://github.com/rayclaw/rayclaw",
|
||||
"hn_url": "https://news.ycombinator.com/item?id=47192584",
|
||||
"published": "2026-02-28T09:04:15",
|
||||
"author": "stevensu",
|
||||
"points": 1,
|
||||
"num_comments": 0,
|
||||
"summary": "RayClaw is an open-source agentic AI runtime written in Rust that connects to Telegram, Discord, Slack, Feishu/Lark, and a \n built-in Web UI through a unified tool-calling engine \u2014 with she...",
|
||||
"source": "Hacker News",
|
||||
"source_icon": "\ud83d\udfe0",
|
||||
"category": "Discussion"
|
||||
},
|
||||
{
|
||||
"id": "47191126",
|
||||
"title": "What do you use OpenClaw for?",
|
||||
"url": "https://news.ycombinator.com/item?id=47191126",
|
||||
"hn_url": "https://news.ycombinator.com/item?id=47191126",
|
||||
"published": "2026-02-28T06:14:40",
|
||||
"author": "ausbah",
|
||||
"points": 3,
|
||||
"num_comments": 0,
|
||||
"summary": "I\u2019m pretty lazy with adopting new tech I read about. OpenClaw seems mildly useful<p>So am curious what workflows you use OpenClaw or similar \u201cproactive agentic frameworks\u201d for?...",
|
||||
"source": "Hacker News",
|
||||
"source_icon": "\ud83d\udfe0",
|
||||
"category": "Discussion"
|
||||
}
|
||||
]
|
||||
}
|
||||
252
automations/openclaw-digest/output/reddit.json
Normal file
252
automations/openclaw-digest/output/reddit.json
Normal file
@@ -0,0 +1,252 @@
|
||||
{
|
||||
"source": "reddit",
|
||||
"fetched_at": "2026-03-01T02:46:37.764535",
|
||||
"time_window_hours": 24,
|
||||
"total_posts": 24,
|
||||
"openclaw_subreddit": [
|
||||
{
|
||||
"id": "1rgznz8",
|
||||
"title": "We finally built the first Uncensored Agent using Gork/Heretic",
|
||||
"author": "grey2w",
|
||||
"subreddit": "openclaw",
|
||||
"score": 121,
|
||||
"num_comments": 65,
|
||||
"created_utc": 1772275896.0,
|
||||
"url": "https://reddit.com/r/openclaw/comments/1rgznz8/we_finally_built_the_first_uncensored_agent_using/",
|
||||
"selftext": "First off huge shoutout to\u00a0Peter Steinberger\u00a0(Openclaw, founder),\u00a0Greg Yang\u00a0(Xai, Co Founder), and\u00a0Igor Babuschkin\u00a0(Tensor, father) for their contributions on the agent architecture, mathematical optimizations, and prompt engineering framework that made this whole thing possible. Couldn't have done it without y'all.\n\nWhat is OpenGork?\n\n \n[Github](https://github.com/erenjugs/OpenGork)\n\nOpenGork is an open source command line AI agent that actually says what it thinks. No corporate filters, no co...",
|
||||
"is_self": true,
|
||||
"link_flair_text": "Showcase",
|
||||
"upvote_ratio": 0.8,
|
||||
"created_datetime": "2026-02-28 10:51 UTC"
|
||||
},
|
||||
{
|
||||
"id": "1rh3ddm",
|
||||
"title": "Seeking low-cost model for OpenClaw \u2014 budget options & real-world costs?",
|
||||
"author": "zer0evolution",
|
||||
"subreddit": "openclaw",
|
||||
"score": 40,
|
||||
"num_comments": 60,
|
||||
"created_utc": 1772287243.0,
|
||||
"url": "https://reddit.com/r/openclaw/comments/1rh3ddm/seeking_lowcost_model_for_openclaw_budget_options/",
|
||||
"selftext": "Hi all,\n\nI\u2019ve been experimenting with OpenClaw for about a month. It\u2019s great, but it\u2019s incredibly token-hungry, and I\u2019m burning through quota much faster than expected.\n\nSo far I\u2019ve tested:\n\nDeepSeek\n\nNanoGPT\n\nKimi\n\nMinimax\n\nI\u2019m looking for a budget-friendly model that still performs reasonably well with OpenClaw.\n\nLooking for:\n\n\u2022 Which model you\u2019re using\n\n\u2022 Approximate cost (monthly / per token / etc)\n\n\u2022 Any practical tips to optimize usage and cut costs\n\nAppreciate any guidance!",
|
||||
"is_self": true,
|
||||
"link_flair_text": "Discussion",
|
||||
"upvote_ratio": 0.98,
|
||||
"created_datetime": "2026-02-28 14:00 UTC"
|
||||
},
|
||||
{
|
||||
"id": "1rguitn",
|
||||
"title": "The \"Claw\" Rabbit Hole: OpenClaw vs Zero vs Null vs Pico (and the others) \u2014 Which one is actually the \"best\"?",
|
||||
"author": "kliu5218",
|
||||
"subreddit": "openclaw",
|
||||
"score": 87,
|
||||
"num_comments": 44,
|
||||
"created_utc": 1772257496.0,
|
||||
"url": "https://reddit.com/r/openclaw/comments/1rguitn/the_claw_rabbit_hole_openclaw_vs_zero_vs_null_vs/",
|
||||
"selftext": "I\u2019ve spent the last week diving into the \"Claw\" ecosystem (early 2026 version) and it\u2019s honestly getting a bit out of hand. If you\u2019re trying to turn your PC into an autonomous AI assistant via Telegram or Discord, here is the breakdown of the current landscape.\n\n\ud83e\udd9e The \"Big Four\"\n\n* **OpenClaw**: The OG. It\u2019s the most feature-complete but a absolute resource hog (\\~1.5GB RAM). It has the best \"ClawHub\" plugin library, but the security model is mostly just application-level permission checks.\n* **...",
|
||||
"is_self": true,
|
||||
"link_flair_text": "Discussion",
|
||||
"upvote_ratio": 0.92,
|
||||
"created_datetime": "2026-02-28 05:44 UTC"
|
||||
},
|
||||
{
|
||||
"id": "1rhfk1q",
|
||||
"title": "Best local model for Mac Mini M1 (16GB) with OpenClaw? Opus got expensive fast \ud83d\ude05",
|
||||
"author": "vlad_bq",
|
||||
"subreddit": "openclaw",
|
||||
"score": 35,
|
||||
"num_comments": 47,
|
||||
"created_utc": 1772316553.0,
|
||||
"url": "https://reddit.com/r/openclaw/comments/1rhfk1q/best_local_model_for_mac_mini_m1_16gb_with/",
|
||||
"selftext": "Hi,\n\nI just set up my first OpenClaw agent on a **Mac Mini M1 (16GB RAM)** and connected it to Claude Opus. It works great, but I already burned about **$3 on \\~30 min chatting**, so I\u2019m looking into local models.\n\nI\u2019m still new to LLMs and mainly want to know:\n\n* What models are you running locally on similar hardware?\n* What actually works best with OpenClaw agents?\n* Good options for general use + simple coding tasks?\n\nCurious what setups people here are using. Thanks! \ud83d\udc4d\n\nhttps://preview.redd...",
|
||||
"is_self": true,
|
||||
"link_flair_text": "Help",
|
||||
"upvote_ratio": 0.93,
|
||||
"created_datetime": "2026-02-28 22:09 UTC"
|
||||
},
|
||||
{
|
||||
"id": "1rh7g1i",
|
||||
"title": "Possible to run openclaw for free?",
|
||||
"author": "jblewisiv",
|
||||
"subreddit": "openclaw",
|
||||
"score": 6,
|
||||
"num_comments": 55,
|
||||
"created_utc": 1772297326.0,
|
||||
"url": "https://reddit.com/r/openclaw/comments/1rh7g1i/possible_to_run_openclaw_for_free/",
|
||||
"selftext": "Is it possible to run open claw or a lighter version completely free? Obviously besides the cost of electricity and the purchase of a computer for it to live on and utilizing one of the open source LLMs. \n\nI tried asking chatgpt but felt like I couldn\u2019t fully trust its answer. It said it is certainly possible but I\u2019m wondering if there is some nuance that would make it non-functioning or not realistic. ",
|
||||
"is_self": true,
|
||||
"link_flair_text": "Discussion",
|
||||
"upvote_ratio": 0.69,
|
||||
"created_datetime": "2026-02-28 16:48 UTC"
|
||||
}
|
||||
],
|
||||
"other_subreddits": [
|
||||
{
|
||||
"id": "1rhkm9q",
|
||||
"title": "About to jump onto Openclaw - what are some housekeeping items to watch out for?",
|
||||
"author": "TwelfieSpecial",
|
||||
"subreddit": "vibecoding",
|
||||
"score": 1,
|
||||
"num_comments": 2,
|
||||
"created_utc": 1772329918.0,
|
||||
"url": "https://reddit.com/r/vibecoding/comments/1rhkm9q/about_to_jump_onto_openclaw_what_are_some/",
|
||||
"selftext": "I'm not technical (can't code), but already built a functional web app with Cursor and had 7k users last month, so I'm trying to keep up as best as I can. \nI know what OpenClaw is, but haven't tried it yet, and I'm wondering if there are any security or other types of concerns before jumping in. For example, I've heard that some people try it on a secondary computer, not their main one. Why is that? What type of access should I not give the agents, etc.?\n\nAny help with guardrails, particularly ...",
|
||||
"is_self": true,
|
||||
"link_flair_text": null,
|
||||
"upvote_ratio": 1.0,
|
||||
"created_datetime": "2026-03-01 01:51 UTC"
|
||||
}
|
||||
],
|
||||
"all_posts": [
|
||||
{
|
||||
"id": "1rgznz8",
|
||||
"title": "We finally built the first Uncensored Agent using Gork/Heretic",
|
||||
"author": "grey2w",
|
||||
"subreddit": "openclaw",
|
||||
"score": 121,
|
||||
"num_comments": 65,
|
||||
"created_utc": 1772275896.0,
|
||||
"url": "https://reddit.com/r/openclaw/comments/1rgznz8/we_finally_built_the_first_uncensored_agent_using/",
|
||||
"selftext": "First off huge shoutout to\u00a0Peter Steinberger\u00a0(Openclaw, founder),\u00a0Greg Yang\u00a0(Xai, Co Founder), and\u00a0Igor Babuschkin\u00a0(Tensor, father) for their contributions on the agent architecture, mathematical optimizations, and prompt engineering framework that made this whole thing possible. Couldn't have done it without y'all.\n\nWhat is OpenGork?\n\n \n[Github](https://github.com/erenjugs/OpenGork)\n\nOpenGork is an open source command line AI agent that actually says what it thinks. No corporate filters, no co...",
|
||||
"is_self": true,
|
||||
"link_flair_text": "Showcase",
|
||||
"upvote_ratio": 0.8,
|
||||
"created_datetime": "2026-02-28 10:51 UTC"
|
||||
},
|
||||
{
|
||||
"id": "1rh3ddm",
|
||||
"title": "Seeking low-cost model for OpenClaw \u2014 budget options & real-world costs?",
|
||||
"author": "zer0evolution",
|
||||
"subreddit": "openclaw",
|
||||
"score": 40,
|
||||
"num_comments": 60,
|
||||
"created_utc": 1772287243.0,
|
||||
"url": "https://reddit.com/r/openclaw/comments/1rh3ddm/seeking_lowcost_model_for_openclaw_budget_options/",
|
||||
"selftext": "Hi all,\n\nI\u2019ve been experimenting with OpenClaw for about a month. It\u2019s great, but it\u2019s incredibly token-hungry, and I\u2019m burning through quota much faster than expected.\n\nSo far I\u2019ve tested:\n\nDeepSeek\n\nNanoGPT\n\nKimi\n\nMinimax\n\nI\u2019m looking for a budget-friendly model that still performs reasonably well with OpenClaw.\n\nLooking for:\n\n\u2022 Which model you\u2019re using\n\n\u2022 Approximate cost (monthly / per token / etc)\n\n\u2022 Any practical tips to optimize usage and cut costs\n\nAppreciate any guidance!",
|
||||
"is_self": true,
|
||||
"link_flair_text": "Discussion",
|
||||
"upvote_ratio": 0.98,
|
||||
"created_datetime": "2026-02-28 14:00 UTC"
|
||||
},
|
||||
{
|
||||
"id": "1rguitn",
|
||||
"title": "The \"Claw\" Rabbit Hole: OpenClaw vs Zero vs Null vs Pico (and the others) \u2014 Which one is actually the \"best\"?",
|
||||
"author": "kliu5218",
|
||||
"subreddit": "openclaw",
|
||||
"score": 87,
|
||||
"num_comments": 44,
|
||||
"created_utc": 1772257496.0,
|
||||
"url": "https://reddit.com/r/openclaw/comments/1rguitn/the_claw_rabbit_hole_openclaw_vs_zero_vs_null_vs/",
|
||||
"selftext": "I\u2019ve spent the last week diving into the \"Claw\" ecosystem (early 2026 version) and it\u2019s honestly getting a bit out of hand. If you\u2019re trying to turn your PC into an autonomous AI assistant via Telegram or Discord, here is the breakdown of the current landscape.\n\n\ud83e\udd9e The \"Big Four\"\n\n* **OpenClaw**: The OG. It\u2019s the most feature-complete but a absolute resource hog (\\~1.5GB RAM). It has the best \"ClawHub\" plugin library, but the security model is mostly just application-level permission checks.\n* **...",
|
||||
"is_self": true,
|
||||
"link_flair_text": "Discussion",
|
||||
"upvote_ratio": 0.92,
|
||||
"created_datetime": "2026-02-28 05:44 UTC"
|
||||
},
|
||||
{
|
||||
"id": "1rhfk1q",
|
||||
"title": "Best local model for Mac Mini M1 (16GB) with OpenClaw? Opus got expensive fast \ud83d\ude05",
|
||||
"author": "vlad_bq",
|
||||
"subreddit": "openclaw",
|
||||
"score": 35,
|
||||
"num_comments": 47,
|
||||
"created_utc": 1772316553.0,
|
||||
"url": "https://reddit.com/r/openclaw/comments/1rhfk1q/best_local_model_for_mac_mini_m1_16gb_with/",
|
||||
"selftext": "Hi,\n\nI just set up my first OpenClaw agent on a **Mac Mini M1 (16GB RAM)** and connected it to Claude Opus. It works great, but I already burned about **$3 on \\~30 min chatting**, so I\u2019m looking into local models.\n\nI\u2019m still new to LLMs and mainly want to know:\n\n* What models are you running locally on similar hardware?\n* What actually works best with OpenClaw agents?\n* Good options for general use + simple coding tasks?\n\nCurious what setups people here are using. Thanks! \ud83d\udc4d\n\nhttps://preview.redd...",
|
||||
"is_self": true,
|
||||
"link_flair_text": "Help",
|
||||
"upvote_ratio": 0.93,
|
||||
"created_datetime": "2026-02-28 22:09 UTC"
|
||||
},
|
||||
{
|
||||
"id": "1rh7g1i",
|
||||
"title": "Possible to run openclaw for free?",
|
||||
"author": "jblewisiv",
|
||||
"subreddit": "openclaw",
|
||||
"score": 6,
|
||||
"num_comments": 55,
|
||||
"created_utc": 1772297326.0,
|
||||
"url": "https://reddit.com/r/openclaw/comments/1rh7g1i/possible_to_run_openclaw_for_free/",
|
||||
"selftext": "Is it possible to run open claw or a lighter version completely free? Obviously besides the cost of electricity and the purchase of a computer for it to live on and utilizing one of the open source LLMs. \n\nI tried asking chatgpt but felt like I couldn\u2019t fully trust its answer. It said it is certainly possible but I\u2019m wondering if there is some nuance that would make it non-functioning or not realistic. ",
|
||||
"is_self": true,
|
||||
"link_flair_text": "Discussion",
|
||||
"upvote_ratio": 0.69,
|
||||
"created_datetime": "2026-02-28 16:48 UTC"
|
||||
},
|
||||
{
|
||||
"id": "1rhhr8x",
|
||||
"title": "How long did it take you to set up your OpenClaw?",
|
||||
"author": "TheRobotCluster",
|
||||
"subreddit": "openclaw",
|
||||
"score": 4,
|
||||
"num_comments": 30,
|
||||
"created_utc": 1772322182.0,
|
||||
"url": "https://reddit.com/r/openclaw/comments/1rhhr8x/how_long_did_it_take_you_to_set_up_your_openclaw/",
|
||||
"selftext": "Would someone be willing to walk me through it? It\u2019s taking me longer than y\u2019all are saying and I know it would save time to just have someone spell it out for me in the moment lol",
|
||||
"is_self": true,
|
||||
"link_flair_text": "Discussion",
|
||||
"upvote_ratio": 0.83,
|
||||
"created_datetime": "2026-02-28 23:43 UTC"
|
||||
},
|
||||
{
|
||||
"id": "1rh6p1o",
|
||||
"title": "Openclaw with Claude Pro $200 sub",
|
||||
"author": "Moolamakerrr",
|
||||
"subreddit": "openclaw",
|
||||
"score": 6,
|
||||
"num_comments": 24,
|
||||
"created_utc": 1772295529.0,
|
||||
"url": "https://reddit.com/r/openclaw/comments/1rh6p1o/openclaw_with_claude_pro_200_sub/",
|
||||
"selftext": "the set up, when it worked was Godly. Using it with Codex is honestly so underwhelming that I don\u2019t even want to use it anymore.\n\n \nwhat is everyone\u2019s set up to get similar results? ",
|
||||
"is_self": true,
|
||||
"link_flair_text": "Help",
|
||||
"upvote_ratio": 0.75,
|
||||
"created_datetime": "2026-02-28 16:18 UTC"
|
||||
},
|
||||
{
|
||||
"id": "1rh562f",
|
||||
"title": "Built an open-source OSINT tool that tracks flights, scrapes news, and sends alerts \u2014 all running locally",
|
||||
"author": "redbulls2014",
|
||||
"subreddit": "openclaw",
|
||||
"score": 50,
|
||||
"num_comments": 9,
|
||||
"created_utc": 1772291812.0,
|
||||
"url": "https://reddit.com/r/openclaw/comments/1rh562f/built_an_opensource_osint_tool_that_tracks/",
|
||||
"selftext": "Alright so I've been working on this for a bit and wanted to share.\n\n\n\nWith everything going on between the US and Iran right now, I got tired of refreshing Twitter and watching CNN play catch-up. So I built something.\n\n\n\nClawdwatch pulls live data from multiple sources and shows you what's actually happening:\n\n\n\nWhat it does right now:\n\n\n\nJust ran it and got:\n\n\n\n\u2022 204 flights tracked over the Middle East in real-time\n\n\u2022 Live news from Al Jazeera (literally just pulled \"Iran strikes US military ...",
|
||||
"is_self": true,
|
||||
"link_flair_text": "Showcase",
|
||||
"upvote_ratio": 0.96,
|
||||
"created_datetime": "2026-02-28 15:16 UTC"
|
||||
},
|
||||
{
|
||||
"id": "1rhdcco",
|
||||
"title": "First time here",
|
||||
"author": "blakeginge1",
|
||||
"subreddit": "openclaw",
|
||||
"score": 6,
|
||||
"num_comments": 13,
|
||||
"created_utc": 1772311110.0,
|
||||
"url": "https://reddit.com/r/openclaw/comments/1rhdcco/first_time_here/",
|
||||
"selftext": "Hey folks,\n\nTotal newbie\u2014installed OpenClaw yesterday via that curl command, got it talking on whatsapp/telegram (kinda), but honestly ive never built an AI agent, never even scripted anything real.\n\nWhat I'm loving is the endless imagination im having this thing can do. But I need something dead simple to start.\n\nAnyone got a cool, low-effort first projects?Like\u2014auto-reply memes to my mates? Or maybe just make it remind me to drink water every hour?\n\nI'm basically at \"hello world\" level. Help a...",
|
||||
"is_self": true,
|
||||
"link_flair_text": "Help",
|
||||
"upvote_ratio": 1.0,
|
||||
"created_datetime": "2026-02-28 20:38 UTC"
|
||||
},
|
||||
{
|
||||
"id": "1rhf0dy",
|
||||
"title": "I gave an OpenClaw agent my API keys and let it run my entire cold outreach for 24 hours (Zero human intervention). Here is the exact stack and prompt.",
|
||||
"author": "mehdiweb",
|
||||
"subreddit": "openclaw",
|
||||
"score": 6,
|
||||
"num_comments": 18,
|
||||
"created_utc": 1772315211.0,
|
||||
"url": "https://reddit.com/r/openclaw/comments/1rhf0dy/i_gave_an_openclaw_agent_my_api_keys_and_let_it/",
|
||||
"selftext": "I wanted to see what happens when you take the training wheels off an AI agent and give it full read/write access to a live outreach operation.\n\nFor 24 hours, I stepped away from the keyboard and let an autonomous OpenClaw agent handle lead generation, qualification, hyper-personalized cold emailing, and content scheduling. No supervision. No manual approvals.\n\nIt actually worked, but setting up the environment required a very specific stack to prevent it from hallucinating or sending garbage sp...",
|
||||
"is_self": true,
|
||||
"link_flair_text": "Showcase",
|
||||
"upvote_ratio": 0.69,
|
||||
"created_datetime": "2026-02-28 21:46 UTC"
|
||||
}
|
||||
]
|
||||
}
|
||||
50
automations/openclaw-digest/run_digest.sh
Executable file
50
automations/openclaw-digest/run_digest.sh
Executable file
@@ -0,0 +1,50 @@
|
||||
#!/bin/bash
|
||||
# OpenClaw Daily Digest - Full Pipeline
|
||||
# This script runs the complete digest generation and delivery pipeline
|
||||
|
||||
set -e # Exit on error
|
||||
|
||||
WORKSPACE="/home/openclaw/.openclaw/workspace/automations/openclaw-digest"
|
||||
OUTPUT_DIR="$WORKSPACE/output"
|
||||
LOG_FILE="$OUTPUT_DIR/pipeline.log"
|
||||
|
||||
# Create output directory if needed
|
||||
mkdir -p "$OUTPUT_DIR"
|
||||
|
||||
# Logging function
|
||||
log() {
|
||||
echo "[$(date '+%Y-%m-%d %H:%M:%S UTC')] $1" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
log "🦀 Starting OpenClaw Daily Digest Pipeline"
|
||||
log "================================================"
|
||||
|
||||
# Step 1: Aggregate content
|
||||
log "Step 1: Aggregating content..."
|
||||
cd "$WORKSPACE"
|
||||
if python3 aggregate.py 24 "$OUTPUT_DIR/digest.json" >> "$LOG_FILE" 2>&1; then
|
||||
log "✅ Content aggregation complete"
|
||||
else
|
||||
log "❌ Content aggregation failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Step 2: Generate and send email
|
||||
log "Step 2: Generating and sending email..."
|
||||
RECIPIENT="${1:-anthony@martinwa.org}"
|
||||
SENDER="${2:-krillyclaw@gmail.com}"
|
||||
|
||||
if python3 send_digest.py "$OUTPUT_DIR/digest.json" "$RECIPIENT" "$SENDER" >> "$LOG_FILE" 2>&1; then
|
||||
log "✅ Email sent successfully to $RECIPIENT"
|
||||
else
|
||||
log "❌ Email sending failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log "================================================"
|
||||
log "🎉 Daily digest pipeline completed successfully!"
|
||||
|
||||
# Cleanup old log files (keep last 7 days)
|
||||
find "$OUTPUT_DIR" -name "pipeline.log.*" -mtime +7 -delete 2>/dev/null || true
|
||||
|
||||
exit 0
|
||||
188
automations/openclaw-digest/send_digest.py
Normal file
188
automations/openclaw-digest/send_digest.py
Normal file
@@ -0,0 +1,188 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Email Generation and Delivery for OpenClaw Daily Digest
|
||||
Generates HTML/text emails from aggregated content and sends via SMTP
|
||||
"""
|
||||
|
||||
import json
|
||||
import sys
|
||||
import os
|
||||
import subprocess
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
|
||||
def load_template(template_path: str) -> str:
|
||||
"""Load an email template file"""
|
||||
with open(template_path, 'r') as f:
|
||||
return f.read()
|
||||
|
||||
def generate_email_content(digest_data: dict) -> tuple:
|
||||
"""Generate HTML and plain-text email content from digest data"""
|
||||
|
||||
# Load templates - use Spark-safe version for better cross-client compatibility
|
||||
html_template = load_template('/home/openclaw/.openclaw/workspace/automations/openclaw-digest/templates/email-spark-safe.html')
|
||||
text_template = load_template('/home/openclaw/.openclaw/workspace/automations/openclaw-digest/templates/email.txt')
|
||||
|
||||
# Get data
|
||||
meta = digest_data.get('meta', {})
|
||||
stats = digest_data.get('stats', {})
|
||||
formatted = digest_data.get('formatted', {})
|
||||
|
||||
# Replace template variables for HTML
|
||||
html_content = html_template
|
||||
html_content = html_content.replace('{{DATE}}', meta.get('date', datetime.utcnow().strftime('%A, %B %d, %Y')))
|
||||
html_content = html_content.replace('{{REDDIT_COUNT}}', str(stats.get('reddit_count', 0)))
|
||||
html_content = html_content.replace('{{NEWS_COUNT}}', str(stats.get('news_count', 0)))
|
||||
html_content = html_content.replace('{{TWITTER_COUNT}}', str(stats.get('twitter_count', 0)))
|
||||
html_content = html_content.replace('{{TOP_TOPICS}}', formatted.get('top_topics_html', ''))
|
||||
html_content = html_content.replace('{{REDDIT_STORIES}}', formatted.get('reddit_html', '<p>No Reddit posts today.</p>'))
|
||||
html_content = html_content.replace('{{NEWS_STORIES}}', formatted.get('news_html', '<p>No news articles today.</p>'))
|
||||
html_content = html_content.replace('{{TWITTER_STORIES}}', formatted.get('twitter_html', ''))
|
||||
html_content = html_content.replace('{{GENERATED_AT}}', meta.get('generated_at', datetime.utcnow().isoformat()))
|
||||
|
||||
# Replace template variables for text
|
||||
text_content = text_template
|
||||
text_content = text_content.replace('{{DATE}}', meta.get('date', datetime.utcnow().strftime('%A, %B %d, %Y')))
|
||||
text_content = text_content.replace('{{REDDIT_COUNT}}', str(stats.get('reddit_count', 0)))
|
||||
text_content = text_content.replace('{{NEWS_COUNT}}', str(stats.get('news_count', 0)))
|
||||
text_content = text_content.replace('{{TWITTER_COUNT}}', str(stats.get('twitter_count', 0)))
|
||||
text_content = text_content.replace('{{REDDIT_STORIES_TEXT}}', formatted.get('reddit_text', 'No Reddit posts today.'))
|
||||
text_content = text_content.replace('{{NEWS_STORIES_TEXT}}', formatted.get('news_text', 'No news articles today.'))
|
||||
text_content = text_content.replace('{{TWITTER_STORIES_TEXT}}', formatted.get('twitter_text', ''))
|
||||
text_content = text_content.replace('{{GENERATED_AT}}', meta.get('generated_at', datetime.utcnow().isoformat()))
|
||||
|
||||
return html_content, text_content
|
||||
|
||||
def save_email_files(html_content: str, text_content: str, output_dir: str) -> tuple:
|
||||
"""Save email content to files for sending"""
|
||||
timestamp = datetime.utcnow().strftime('%Y%m%d_%H%M%S')
|
||||
|
||||
html_path = os.path.join(output_dir, f'email_{timestamp}.html')
|
||||
text_path = os.path.join(output_dir, f'email_{timestamp}.txt')
|
||||
|
||||
with open(html_path, 'w') as f:
|
||||
f.write(html_content)
|
||||
|
||||
with open(text_path, 'w') as f:
|
||||
f.write(text_content)
|
||||
|
||||
return html_path, text_path
|
||||
|
||||
def send_email(html_path: str, text_path: str, to_email: str, from_email: str) -> bool:
|
||||
"""Send email using the imap-smtp-email skill"""
|
||||
|
||||
skill_path = '/home/openclaw/.openclaw/workspace/skills/imap-smtp-email'
|
||||
smtp_script = os.path.join(skill_path, 'scripts/smtp.js')
|
||||
|
||||
# Read content files
|
||||
with open(html_path, 'r') as f:
|
||||
html_content = f.read()
|
||||
|
||||
with open(text_path, 'r') as f:
|
||||
text_content = f.read()
|
||||
|
||||
# Create combined HTML email (with text fallback)
|
||||
subject = f"🦀 OpenClaw Daily Digest - {datetime.utcnow().strftime('%B %d, %Y')}"
|
||||
|
||||
# Write HTML to temp file for --html-file
|
||||
temp_html = os.path.join(os.path.dirname(html_path), 'temp_email.html')
|
||||
with open(temp_html, 'w') as f:
|
||||
f.write(html_content)
|
||||
|
||||
# Build the send command
|
||||
cmd = [
|
||||
'node', smtp_script, 'send',
|
||||
'--to', to_email,
|
||||
'--from', from_email,
|
||||
'--subject', subject,
|
||||
'--html-file', temp_html
|
||||
]
|
||||
|
||||
print(f"📧 Sending email to {to_email}...")
|
||||
print(f" Subject: {subject}")
|
||||
|
||||
try:
|
||||
result = subprocess.run(
|
||||
cmd,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
cwd=skill_path,
|
||||
timeout=60
|
||||
)
|
||||
|
||||
if result.returncode == 0:
|
||||
print("✅ Email sent successfully!")
|
||||
return True
|
||||
else:
|
||||
print(f"❌ Email send failed:")
|
||||
print(f" stdout: {result.stdout}")
|
||||
print(f" stderr: {result.stderr}")
|
||||
return False
|
||||
|
||||
except subprocess.TimeoutExpired:
|
||||
print("❌ Email send timed out")
|
||||
return False
|
||||
except Exception as e:
|
||||
print(f"❌ Error sending email: {e}")
|
||||
return False
|
||||
finally:
|
||||
# Clean up temp file
|
||||
if os.path.exists(temp_html):
|
||||
os.remove(temp_html)
|
||||
|
||||
def main():
|
||||
"""Main function to generate and send digest email"""
|
||||
|
||||
# Parse arguments
|
||||
digest_file = sys.argv[1] if len(sys.argv) > 1 else '/home/openclaw/.openclaw/workspace/automations/openclaw-digest/output/digest.json'
|
||||
to_email = sys.argv[2] if len(sys.argv) > 2 else 'anthony@martinwa.org'
|
||||
from_email = sys.argv[3] if len(sys.argv) > 3 else 'krillyclaw@gmail.com'
|
||||
|
||||
output_dir = '/home/openclaw/.openclaw/workspace/automations/openclaw-digest/output'
|
||||
|
||||
print("🦀 OpenClaw Daily Digest - Email Generator")
|
||||
print("=" * 50)
|
||||
|
||||
# Load digest data
|
||||
print(f"\n📂 Loading digest from: {digest_file}")
|
||||
try:
|
||||
with open(digest_file, 'r') as f:
|
||||
digest_data = json.load(f)
|
||||
except Exception as e:
|
||||
print(f"❌ Error loading digest: {e}")
|
||||
return False
|
||||
|
||||
# Generate email content
|
||||
print("\n✍️ Generating email content...")
|
||||
html_content, text_content = generate_email_content(digest_data)
|
||||
|
||||
# Save to files
|
||||
html_path, text_path = save_email_files(html_content, text_content, output_dir)
|
||||
print(f" HTML: {html_path}")
|
||||
print(f" Text: {text_path}")
|
||||
|
||||
# Send email
|
||||
print("\n📤 Sending email...")
|
||||
success = send_email(html_path, text_path, to_email, from_email)
|
||||
|
||||
# Save metadata
|
||||
metadata = {
|
||||
"sent_at": datetime.utcnow().isoformat(),
|
||||
"to": to_email,
|
||||
"from": from_email,
|
||||
"success": success,
|
||||
"html_file": html_path,
|
||||
"text_file": text_path,
|
||||
"stats": digest_data.get('stats', {})
|
||||
}
|
||||
|
||||
metadata_path = os.path.join(output_dir, 'last_send_metadata.json')
|
||||
with open(metadata_path, 'w') as f:
|
||||
json.dump(metadata, f, indent=2)
|
||||
|
||||
print(f"\n{'✅' if success else '❌'} Email delivery {'successful' if success else 'failed'}")
|
||||
return success
|
||||
|
||||
if __name__ == '__main__':
|
||||
success = main()
|
||||
sys.exit(0 if success else 1)
|
||||
Binary file not shown.
Binary file not shown.
180
automations/openclaw-digest/sources/news_fetcher.py
Normal file
180
automations/openclaw-digest/sources/news_fetcher.py
Normal file
@@ -0,0 +1,180 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
News Aggregation Fetcher for OpenClaw Daily Digest
|
||||
Fetches from GitHub releases, Hacker News, and tech news sources
|
||||
"""
|
||||
|
||||
import requests
|
||||
import json
|
||||
import feedparser
|
||||
from datetime import datetime, timedelta
|
||||
from typing import List, Dict, Any
|
||||
|
||||
# News sources configuration
|
||||
SOURCES = {
|
||||
"github_releases": {
|
||||
"url": "https://github.com/openclaw/openclaw/releases.atom",
|
||||
"type": "rss"
|
||||
},
|
||||
"hn_search": {
|
||||
"url": "https://hn.algolia.com/api/v1/search",
|
||||
"type": "hackernews",
|
||||
"query": "openclaw"
|
||||
}
|
||||
}
|
||||
|
||||
def fetch_github_releases() -> List[Dict[str, Any]]:
|
||||
"""Fetch latest OpenClaw releases from GitHub Atom feed"""
|
||||
try:
|
||||
feed = feedparser.parse(SOURCES["github_releases"]["url"])
|
||||
releases = []
|
||||
|
||||
cutoff = datetime.utcnow() - timedelta(hours=24)
|
||||
|
||||
for entry in feed.entries[:5]: # Last 5 releases
|
||||
try:
|
||||
# Try parsed date first, fallback to string parsing
|
||||
if hasattr(entry, 'published_parsed') and entry.published_parsed:
|
||||
published = datetime(*entry.published_parsed[:6])
|
||||
elif hasattr(entry, 'updated_parsed') and entry.updated_parsed:
|
||||
published = datetime(*entry.updated_parsed[:6])
|
||||
else:
|
||||
# Parse ISO format string
|
||||
date_str = entry.get('published', entry.get('updated', ''))
|
||||
published = datetime.fromisoformat(date_str.replace('Z', '+00:00').replace('+00:00', ''))
|
||||
|
||||
if published >= cutoff:
|
||||
releases.append({
|
||||
"id": entry.id,
|
||||
"title": entry.title,
|
||||
"url": entry.link,
|
||||
"published": published.isoformat(),
|
||||
"summary": entry.get("summary", "")[:300] + "..." if len(entry.get("summary", "")) > 300 else entry.get("summary", ""),
|
||||
"source": "GitHub",
|
||||
"source_icon": "🐙",
|
||||
"category": "Release"
|
||||
})
|
||||
except Exception as e:
|
||||
print(f" Skipping entry due to date parse error: {e}")
|
||||
continue
|
||||
|
||||
return releases
|
||||
except Exception as e:
|
||||
print(f"Error fetching GitHub releases: {e}")
|
||||
return []
|
||||
|
||||
def fetch_hackernews() -> List[Dict[str, Any]]:
|
||||
"""Fetch OpenClaw-related stories from Hacker News (last 24h)"""
|
||||
try:
|
||||
# Algolia HN search API - last 24 hours
|
||||
params = {
|
||||
"query": SOURCES["hn_search"]["query"],
|
||||
"tags": "story",
|
||||
"numericFilters": "created_at_i>" + str(int((datetime.utcnow() - timedelta(hours=24)).timestamp()))
|
||||
}
|
||||
|
||||
response = requests.get(SOURCES["hn_search"]["url"], params=params, timeout=30)
|
||||
response.raise_for_status()
|
||||
data = response.json()
|
||||
|
||||
stories = []
|
||||
for hit in data.get("hits", [])[:10]: # Top 10 stories
|
||||
stories.append({
|
||||
"id": hit.get("objectID"),
|
||||
"title": hit.get("title"),
|
||||
"url": hit.get("url") or f"https://news.ycombinator.com/item?id={hit.get('objectID')}",
|
||||
"hn_url": f"https://news.ycombinator.com/item?id={hit.get('objectID')}",
|
||||
"published": datetime.fromtimestamp(hit.get("created_at_i", 0)).isoformat(),
|
||||
"author": hit.get("author"),
|
||||
"points": hit.get("points", 0),
|
||||
"num_comments": hit.get("num_comments", 0),
|
||||
"summary": hit.get("story_text", "")[:200] + "..." if hit.get("story_text") else "",
|
||||
"source": "Hacker News",
|
||||
"source_icon": "🟠",
|
||||
"category": "Discussion"
|
||||
})
|
||||
|
||||
return stories
|
||||
except Exception as e:
|
||||
print(f"Error fetching Hacker News: {e}")
|
||||
return []
|
||||
|
||||
def fetch_google_news() -> List[Dict[str, Any]]:
|
||||
"""Fetch OpenClaw news from Google News RSS"""
|
||||
try:
|
||||
# Google News RSS for OpenClaw
|
||||
url = "https://news.google.com/rss/search?q=OpenClaw+AI+agent&hl=en-US&gl=US&ceid=US:en"
|
||||
feed = feedparser.parse(url)
|
||||
|
||||
news = []
|
||||
cutoff = datetime.utcnow() - timedelta(hours=24)
|
||||
|
||||
for entry in feed.entries[:10]:
|
||||
try:
|
||||
published = datetime(*entry.published_parsed[:6])
|
||||
if published >= cutoff:
|
||||
news.append({
|
||||
"id": entry.id,
|
||||
"title": entry.title,
|
||||
"url": entry.link,
|
||||
"published": published.isoformat(),
|
||||
"source": entry.get("source", {}).get("title", "Google News"),
|
||||
"source_icon": "📰",
|
||||
"category": "News"
|
||||
})
|
||||
except:
|
||||
continue
|
||||
|
||||
return news
|
||||
except Exception as e:
|
||||
print(f"Error fetching Google News: {e}")
|
||||
return []
|
||||
|
||||
def fetch_news_content(hours: int = 24) -> Dict[str, Any]:
|
||||
"""Main function to fetch all news content"""
|
||||
print(f"🔍 Fetching news from last {hours} hours...")
|
||||
|
||||
# Fetch from all sources
|
||||
print(" 📡 GitHub releases...")
|
||||
github = fetch_github_releases()
|
||||
print(f" Found {len(github)} releases")
|
||||
|
||||
print(" 📡 Hacker News...")
|
||||
hn = fetch_hackernews()
|
||||
print(f" Found {len(hn)} stories")
|
||||
|
||||
print(" 📡 Google News...")
|
||||
gnews = fetch_google_news()
|
||||
print(f" Found {len(gnews)} articles")
|
||||
|
||||
# Combine and sort by published date
|
||||
all_items = github + hn + gnews
|
||||
all_items.sort(key=lambda x: x.get("published", ""), reverse=True)
|
||||
|
||||
return {
|
||||
"source": "news",
|
||||
"fetched_at": datetime.utcnow().isoformat(),
|
||||
"time_window_hours": hours,
|
||||
"total_items": len(all_items),
|
||||
"github_releases": github,
|
||||
"hackernews": hn,
|
||||
"google_news": gnews,
|
||||
"all_items": all_items[:15] # Top 15 overall
|
||||
}
|
||||
|
||||
if __name__ == "__main__":
|
||||
import sys
|
||||
|
||||
hours = int(sys.argv[1]) if len(sys.argv) > 1 else 24
|
||||
output_file = sys.argv[2] if len(sys.argv) > 2 else "/home/openclaw/.openclaw/workspace/automations/openclaw-digest/output/news.json"
|
||||
|
||||
content = fetch_news_content(hours=hours)
|
||||
|
||||
with open(output_file, "w") as f:
|
||||
json.dump(content, f, indent=2)
|
||||
|
||||
print(f"\n✅ News content saved to {output_file}")
|
||||
print(f" Total items: {content['total_items']}")
|
||||
print(f" GitHub releases: {len(content['github_releases'])}")
|
||||
print(f" Hacker News: {len(content['hackernews'])}")
|
||||
print(f" Google News: {len(content['google_news'])}")
|
||||
147
automations/openclaw-digest/sources/reddit_fetcher.py
Normal file
147
automations/openclaw-digest/sources/reddit_fetcher.py
Normal file
@@ -0,0 +1,147 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Reddit Content Fetcher for OpenClaw Daily Digest
|
||||
Fetches posts from OpenClaw-related subreddits using Reddit's JSON API
|
||||
No authentication required for read-only public access
|
||||
"""
|
||||
|
||||
import requests
|
||||
import json
|
||||
import time
|
||||
from datetime import datetime, timedelta
|
||||
from typing import List, Dict, Any
|
||||
|
||||
# Reddit API endpoints (JSON API - no auth needed for read-only)
|
||||
SUBREDDITS = [
|
||||
"openclaw",
|
||||
"LocalLLaMA",
|
||||
"vibecoding",
|
||||
"selfhosted",
|
||||
"homeautomation"
|
||||
]
|
||||
|
||||
REDDIT_JSON_URL = "https://www.reddit.com/r/{subreddit}.json"
|
||||
|
||||
def fetch_subreddit(subreddit: str, limit: int = 25) -> List[Dict[str, Any]]:
|
||||
"""Fetch posts from a subreddit using Reddit JSON API"""
|
||||
url = REDDIT_JSON_URL.format(subreddit=subreddit)
|
||||
headers = {
|
||||
"User-Agent": "OpenClaw-Digest-Bot/1.0 (by /u/krillyclaw)"
|
||||
}
|
||||
|
||||
try:
|
||||
response = requests.get(url, headers=headers, params={"limit": limit}, timeout=30)
|
||||
response.raise_for_status()
|
||||
data = response.json()
|
||||
|
||||
posts = []
|
||||
for child in data.get("data", {}).get("children", []):
|
||||
post = child.get("data", {})
|
||||
posts.append({
|
||||
"id": post.get("id"),
|
||||
"title": post.get("title"),
|
||||
"author": post.get("author"),
|
||||
"subreddit": post.get("subreddit"),
|
||||
"score": post.get("score", 0),
|
||||
"num_comments": post.get("num_comments", 0),
|
||||
"created_utc": post.get("created_utc", 0),
|
||||
"url": f"https://reddit.com{post.get('permalink', '')}",
|
||||
"selftext": post.get("selftext", "")[:500] + "..." if len(post.get("selftext", "")) > 500 else post.get("selftext", ""),
|
||||
"is_self": post.get("is_self", False),
|
||||
"link_flair_text": post.get("link_flair_text", ""),
|
||||
"upvote_ratio": post.get("upvote_ratio", 0)
|
||||
})
|
||||
return posts
|
||||
except Exception as e:
|
||||
print(f"Error fetching r/{subreddit}: {e}")
|
||||
return []
|
||||
|
||||
def filter_by_time(posts: List[Dict], hours: int = 24) -> List[Dict]:
|
||||
"""Filter posts to only include those from last N hours"""
|
||||
cutoff = datetime.utcnow() - timedelta(hours=hours)
|
||||
cutoff_timestamp = cutoff.timestamp()
|
||||
|
||||
filtered = []
|
||||
for post in posts:
|
||||
if post["created_utc"] >= cutoff_timestamp:
|
||||
post["created_datetime"] = datetime.utcfromtimestamp(post["created_utc"]).strftime("%Y-%m-%d %H:%M UTC")
|
||||
filtered.append(post)
|
||||
return filtered
|
||||
|
||||
def filter_openclaw_related(posts: List[Dict]) -> List[Dict]:
|
||||
"""Filter posts to only include OpenClaw-related content"""
|
||||
keywords = ["openclaw", "clawdbot", "open claw", "clawd"]
|
||||
filtered = []
|
||||
|
||||
for post in posts:
|
||||
text = f"{post.get('title', '')} {post.get('selftext', '')}".lower()
|
||||
if any(keyword in text for keyword in keywords):
|
||||
filtered.append(post)
|
||||
|
||||
return filtered
|
||||
|
||||
def score_post(post: Dict) -> float:
|
||||
"""Calculate relevance score based on engagement"""
|
||||
score = post.get("score", 0)
|
||||
comments = post.get("num_comments", 0)
|
||||
upvote_ratio = post.get("upvote_ratio", 0.5)
|
||||
|
||||
# Weighted scoring: comments matter more than upvotes
|
||||
# Upvote ratio indicates quality (avoid controversial posts)
|
||||
return (score * 0.3) + (comments * 2) + (upvote_ratio * 50)
|
||||
|
||||
def fetch_reddit_content(hours: int = 24, limit_per_sub: int = 25) -> Dict[str, Any]:
|
||||
"""Main function to fetch all Reddit content"""
|
||||
all_posts = []
|
||||
|
||||
print(f"🔍 Fetching Reddit posts from last {hours} hours...")
|
||||
|
||||
for subreddit in SUBREDDITS:
|
||||
print(f" 📡 r/{subreddit}...")
|
||||
posts = fetch_subreddit(subreddit, limit=limit_per_sub)
|
||||
|
||||
# Filter by time
|
||||
recent_posts = filter_by_time(posts, hours)
|
||||
|
||||
# For non-OpenClaw subreddits, filter for OpenClaw mentions
|
||||
if subreddit.lower() != "openclaw":
|
||||
recent_posts = filter_openclaw_related(recent_posts)
|
||||
|
||||
print(f" Found {len(recent_posts)} recent OpenClaw-related posts")
|
||||
all_posts.extend(recent_posts)
|
||||
|
||||
# Rate limiting - be nice to Reddit
|
||||
time.sleep(0.5)
|
||||
|
||||
# Sort by engagement score
|
||||
all_posts.sort(key=score_post, reverse=True)
|
||||
|
||||
# Separate into categories
|
||||
openclaw_subreddit = [p for p in all_posts if p["subreddit"].lower() == "openclaw"]
|
||||
other_subreddits = [p for p in all_posts if p["subreddit"].lower() != "openclaw"]
|
||||
|
||||
return {
|
||||
"source": "reddit",
|
||||
"fetched_at": datetime.utcnow().isoformat(),
|
||||
"time_window_hours": hours,
|
||||
"total_posts": len(all_posts),
|
||||
"openclaw_subreddit": openclaw_subreddit[:5], # Top 5 from r/OpenClaw
|
||||
"other_subreddits": other_subreddits[:5], # Top 5 from elsewhere
|
||||
"all_posts": all_posts[:10] # Top 10 overall
|
||||
}
|
||||
|
||||
if __name__ == "__main__":
|
||||
import sys
|
||||
|
||||
hours = int(sys.argv[1]) if len(sys.argv) > 1 else 24
|
||||
output_file = sys.argv[2] if len(sys.argv) > 2 else "/home/openclaw/.openclaw/workspace/automations/openclaw-digest/output/reddit.json"
|
||||
|
||||
content = fetch_reddit_content(hours=hours)
|
||||
|
||||
with open(output_file, "w") as f:
|
||||
json.dump(content, f, indent=2)
|
||||
|
||||
print(f"\n✅ Reddit content saved to {output_file}")
|
||||
print(f" Total posts: {content['total_posts']}")
|
||||
print(f" From r/OpenClaw: {len(content['openclaw_subreddit'])}")
|
||||
print(f" From other subs: {len(content['other_subreddits'])}")
|
||||
175
automations/openclaw-digest/templates/email-spark-safe.html
Normal file
175
automations/openclaw-digest/templates/email-spark-safe.html
Normal file
@@ -0,0 +1,175 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>OpenClaw Daily Digest</title>
|
||||
</head>
|
||||
<body style="margin: 0; padding: 20px 10px; background-color: #1a1a2e; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; font-size: 16px; line-height: 1.6; color: #e4e4e4;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="max-width: 680px; margin: 0 auto; background-color: #0f0f1a; border-radius: 16px; overflow: hidden;">
|
||||
<!-- Header -->
|
||||
<tr>
|
||||
<td style="background: #ee5a24; padding: 48px 32px; text-align: center;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td style="text-align: center;">
|
||||
<span style="font-size: 56px; display: block; margin-bottom: 12px;">🦀</span>
|
||||
<h1 style="margin: 0 0 8px 0; color: #ffffff; font-size: 32px; font-weight: 800; letter-spacing: -0.5px;">OpenClaw Daily</h1>
|
||||
<p style="color: rgba(255,255,255,0.9); font-size: 15px; margin: 0;">The best OpenClaw discussions, curated daily</p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin: 20px auto 0 auto;">
|
||||
<tr>
|
||||
<td style="background-color: rgba(255,255,255,0.2); padding: 10px 24px; border-radius: 30px; border: 1px solid rgba(255,255,255,0.3);">
|
||||
<span style="font-size: 14px; font-weight: 600; color: #ffffff;">{{DATE}}</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Stats Bar -->
|
||||
<tr>
|
||||
<td style="background-color: #1a1a2e; padding: 28px 32px; border-bottom: 1px solid #2a2a3e;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td width="33%" style="text-align: center;">
|
||||
<span style="font-size: 32px; font-weight: 800; color: #ff6b6b; line-height: 1;">{{REDDIT_COUNT}}</span>
|
||||
<p style="font-size: 12px; color: #888; text-transform: uppercase; letter-spacing: 1px; margin: 6px 0 0 0;">Reddit</p>
|
||||
</td>
|
||||
<td width="33%" style="text-align: center;">
|
||||
<span style="font-size: 32px; font-weight: 800; color: #ff6b6b; line-height: 1;">{{NEWS_COUNT}}</span>
|
||||
<p style="font-size: 12px; color: #888; text-transform: uppercase; letter-spacing: 1px; margin: 6px 0 0 0;">News</p>
|
||||
</td>
|
||||
<td width="33%" style="text-align: center;">
|
||||
<span style="font-size: 32px; font-weight: 800; color: #ff6b6b; line-height: 1;">{{TWITTER_COUNT}}</span>
|
||||
<p style="font-size: 12px; color: #888; text-transform: uppercase; letter-spacing: 1px; margin: 6px 0 0 0;">X/Twitter</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Top Topics Banner -->
|
||||
<tr>
|
||||
<td style="padding: 20px 32px 0 32px;">
|
||||
{{TOP_TOPICS}}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Reddit Section -->
|
||||
<tr>
|
||||
<td style="padding: 40px 32px;">
|
||||
<!-- Section Header -->
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin-bottom: 24px; padding-bottom: 12px; border-bottom: 2px solid #2a2a3e;">
|
||||
<tr>
|
||||
<td width="40" style="padding-right: 12px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td style="width: 40px; height: 40px; background-color: #ff4500; border-radius: 12px; text-align: center; vertical-align: middle;">
|
||||
<span style="font-size: 20px;">🔥</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td>
|
||||
<h2 style="font-size: 20px; font-weight: 700; color: #fff; margin: 0;">Reddit Highlights</h2>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{{REDDIT_STORIES}}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Divider -->
|
||||
<tr>
|
||||
<td style="padding: 0 32px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="height: 1px; background-color: #2a2a3e;">
|
||||
<tr><td></td></tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- News Section -->
|
||||
<tr>
|
||||
<td style="padding: 40px 32px;">
|
||||
<!-- Section Header -->
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin-bottom: 24px; padding-bottom: 12px; border-bottom: 2px solid #2a2a3e;">
|
||||
<tr>
|
||||
<td width="40" style="padding-right: 12px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td style="width: 40px; height: 40px; background-color: #ff6600; border-radius: 12px; text-align: center; vertical-align: middle;">
|
||||
<span style="font-size: 20px;">🟧</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td>
|
||||
<h2 style="font-size: 20px; font-weight: 700; color: #fff; margin: 0;">News & Hacker News</h2>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{{NEWS_STORIES}}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Divider -->
|
||||
<tr>
|
||||
<td style="padding: 0 32px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="height: 1px; background-color: #2a2a3e;">
|
||||
<tr><td></td></tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- X Section -->
|
||||
<tr>
|
||||
<td style="padding: 40px 32px;">
|
||||
<!-- Section Header -->
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%" style="margin-bottom: 24px; padding-bottom: 12px; border-bottom: 2px solid #2a2a3e;">
|
||||
<tr>
|
||||
<td width="40" style="padding-right: 12px;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td style="width: 40px; height: 40px; background-color: #1da1f2; border-radius: 12px; text-align: center; vertical-align: middle;">
|
||||
<span style="font-size: 20px; color: #fff;">𝕏</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td>
|
||||
<h2 style="font-size: 20px; font-weight: 700; color: #fff; margin: 0;">From X</h2>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{{TWITTER_STORIES}}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Footer -->
|
||||
<tr>
|
||||
<td style="background-color: #0a0a12; padding: 40px 32px; text-align: center; border-top: 1px solid #2a2a3e;">
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin: 0 auto 16px auto;">
|
||||
<tr>
|
||||
<td style="width: 64px; height: 64px; background-color: #ee5a24; border-radius: 50%; text-align: center; vertical-align: middle;">
|
||||
<span style="font-size: 32px;">🦀</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="font-size: 18px; font-weight: 700; color: #fff; margin: 0 0 6px 0;">Curated daily for Anthony Martin</p>
|
||||
<p style="font-size: 14px; color: #888; margin: 0 0 20px 0;">by Krilly the Crab</p>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" style="margin: 20px auto 0 auto;">
|
||||
<tr>
|
||||
<td style="padding: 0 12px;"><a href="https://github.com/openclaw/openclaw" style="color: #74b9ff; text-decoration: none; font-size: 14px;">GitHub</a></td>
|
||||
<td style="padding: 0 12px;"><a href="https://reddit.com/r/openclaw" style="color: #74b9ff; text-decoration: none; font-size: 14px;">Reddit</a></td>
|
||||
<td style="padding: 0 12px;"><a href="https://docs.openclaw.ai" style="color: #74b9ff; text-decoration: none; font-size: 14px;">Docs</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="font-size: 12px; color: #555; margin-top: 20px;">{{GENERATED_AT}} UTC</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
396
automations/openclaw-digest/templates/email-v2.html
Normal file
396
automations/openclaw-digest/templates/email-v2.html
Normal file
@@ -0,0 +1,396 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="color-scheme" content="light dark">
|
||||
<meta name="supported-color-schemes" content="light dark">
|
||||
<title>OpenClaw Daily Digest</title>
|
||||
<style>
|
||||
/* Reset for email clients */
|
||||
body, table, td, a { -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
|
||||
table, td { mso-table-lspace: 0pt; mso-table-rspace: 0pt; }
|
||||
img { -ms-interpolation-mode: bicubic; border: 0; outline: none; text-decoration: none; }
|
||||
|
||||
/* Dark theme base */
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
|
||||
font-size: 16px;
|
||||
line-height: 1.6;
|
||||
color: #e4e4e4;
|
||||
}
|
||||
|
||||
/* Container */
|
||||
.email-wrapper {
|
||||
width: 100%;
|
||||
max-width: 680px;
|
||||
margin: 0 auto;
|
||||
background: #0f0f1a;
|
||||
border-radius: 16px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 20px 60px rgba(0,0,0,0.4);
|
||||
}
|
||||
|
||||
/* Header - Gradient with crab */
|
||||
.header {
|
||||
background: linear-gradient(135deg, #ff6b6b 0%, #ee5a24 50%, #ff9f43 100%);
|
||||
padding: 48px 32px;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
}
|
||||
.header-icon {
|
||||
font-size: 56px;
|
||||
margin-bottom: 12px;
|
||||
display: inline-block;
|
||||
}
|
||||
.header h1 {
|
||||
margin: 0 0 8px 0;
|
||||
color: #ffffff;
|
||||
font-size: 32px;
|
||||
font-weight: 800;
|
||||
letter-spacing: -0.5px;
|
||||
}
|
||||
.header-subtitle {
|
||||
color: rgba(255,255,255,0.9);
|
||||
font-size: 15px;
|
||||
margin: 0;
|
||||
}
|
||||
.header-date {
|
||||
display: inline-block;
|
||||
background: rgba(255,255,255,0.2);
|
||||
backdrop-filter: blur(10px);
|
||||
padding: 10px 24px;
|
||||
border-radius: 30px;
|
||||
margin-top: 20px;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
color: #fff;
|
||||
border: 1px solid rgba(255,255,255,0.3);
|
||||
}
|
||||
|
||||
/* Stats bar */
|
||||
.stats-bar {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 48px;
|
||||
padding: 28px 32px;
|
||||
background: #1a1a2e;
|
||||
border-bottom: 1px solid #2a2a3e;
|
||||
}
|
||||
.stat {
|
||||
text-align: center;
|
||||
}
|
||||
.stat-number {
|
||||
font-size: 32px;
|
||||
font-weight: 800;
|
||||
background: linear-gradient(135deg, #ff6b6b, #ff9f43);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
background-clip: text;
|
||||
line-height: 1;
|
||||
}
|
||||
.stat-label {
|
||||
font-size: 12px;
|
||||
color: #888;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
margin-top: 6px;
|
||||
}
|
||||
|
||||
/* Section headers */
|
||||
.section {
|
||||
padding: 0 32px;
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
.section-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
margin: 40px 0 24px 0;
|
||||
padding-bottom: 12px;
|
||||
border-bottom: 2px solid #2a2a3e;
|
||||
}
|
||||
.section-icon {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 12px;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 20px;
|
||||
}
|
||||
.reddit-icon { background: linear-gradient(135deg, #ff4500, #ff6347); }
|
||||
.hackernews-icon { background: linear-gradient(135deg, #ff6600, #ff8533); }
|
||||
.twitter-icon { background: linear-gradient(135deg, #1da1f2, #0d8bd9); }
|
||||
.section-title {
|
||||
font-size: 20px;
|
||||
font-weight: 700;
|
||||
color: #fff;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* Story cards - injected by aggregate.py */
|
||||
.story {
|
||||
background: linear-gradient(145deg, #1a1a2e 0%, #151525 100%);
|
||||
border-radius: 12px;
|
||||
padding: 24px;
|
||||
margin-bottom: 16px;
|
||||
border: 1px solid #2a2a3e;
|
||||
}
|
||||
.story:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
/* Source tag */
|
||||
.source-tag {
|
||||
display: inline-block;
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
padding: 6px 12px;
|
||||
border-radius: 6px;
|
||||
margin-bottom: 14px;
|
||||
}
|
||||
.tag-reddit { background: rgba(255, 69, 0, 0.15); color: #ff6b6b; }
|
||||
.tag-hn { background: rgba(255, 102, 0, 0.15); color: #ff9f43; }
|
||||
.tag-github { background: rgba(139, 148, 158, 0.15); color: #a29bfe; }
|
||||
.tag-news { background: rgba(116, 185, 255, 0.15); color: #74b9ff; }
|
||||
|
||||
/* Story title */
|
||||
.story-title {
|
||||
margin: 0 0 12px 0;
|
||||
font-size: 17px;
|
||||
font-weight: 600;
|
||||
line-height: 1.5;
|
||||
color: #fff;
|
||||
}
|
||||
.story-title a {
|
||||
color: #74b9ff;
|
||||
text-decoration: none;
|
||||
transition: color 0.2s;
|
||||
}
|
||||
.story-title a:hover {
|
||||
color: #ff6b6b;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* Story meta */
|
||||
.story-meta {
|
||||
font-size: 14px;
|
||||
color: #888;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
.author {
|
||||
color: #a29bfe;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* Story excerpt */
|
||||
.story-excerpt {
|
||||
font-size: 14px;
|
||||
line-height: 1.6;
|
||||
color: #aaa;
|
||||
margin: 0 0 14px 0;
|
||||
}
|
||||
|
||||
/* Engagement badges */
|
||||
.engagement {
|
||||
font-size: 13px;
|
||||
}
|
||||
.badge {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
padding: 4px 10px;
|
||||
border-radius: 20px;
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
margin-right: 8px;
|
||||
}
|
||||
.badge-upvotes {
|
||||
background: rgba(255, 107, 107, 0.15);
|
||||
color: #ff6b6b;
|
||||
}
|
||||
.badge-comments {
|
||||
background: rgba(116, 185, 255, 0.15);
|
||||
color: #74b9ff;
|
||||
}
|
||||
|
||||
/* Empty state */
|
||||
.empty-state {
|
||||
text-align: center;
|
||||
padding: 40px 32px;
|
||||
color: #666;
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
/* Divider */
|
||||
.divider {
|
||||
height: 1px;
|
||||
background: #2a2a3e;
|
||||
margin: 0 32px;
|
||||
}
|
||||
|
||||
/* Coming soon banner */
|
||||
.coming-soon {
|
||||
background: linear-gradient(135deg, #2d3436 0%, #1a1a2e 100%);
|
||||
border: 2px dashed #444;
|
||||
border-radius: 12px;
|
||||
padding: 40px;
|
||||
text-align: center;
|
||||
color: #888;
|
||||
font-size: 15px;
|
||||
}
|
||||
.coming-soon-icon {
|
||||
font-size: 36px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
/* Footer */
|
||||
.footer {
|
||||
background: #0a0a12;
|
||||
padding: 40px 32px;
|
||||
text-align: center;
|
||||
margin-top: 48px;
|
||||
border-top: 1px solid #2a2a3e;
|
||||
}
|
||||
.footer-avatar {
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
background: linear-gradient(135deg, #ff6b6b, #ff9f43);
|
||||
border-radius: 50%;
|
||||
margin: 0 auto 16px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 32px;
|
||||
}
|
||||
.footer-brand {
|
||||
font-size: 18px;
|
||||
font-weight: 700;
|
||||
color: #fff;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
.footer-text {
|
||||
font-size: 14px;
|
||||
color: #888;
|
||||
margin: 0 0 20px 0;
|
||||
}
|
||||
.footer-links {
|
||||
margin-top: 20px;
|
||||
}
|
||||
.footer-links a {
|
||||
color: #74b9ff;
|
||||
text-decoration: none;
|
||||
font-size: 14px;
|
||||
margin: 0 12px;
|
||||
}
|
||||
.footer-links a:hover {
|
||||
color: #ff6b6b;
|
||||
text-decoration: underline;
|
||||
}
|
||||
.footer-time {
|
||||
font-size: 12px;
|
||||
color: #555;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
/* Mobile */
|
||||
@media screen and (max-width: 640px) {
|
||||
.header { padding: 36px 24px; }
|
||||
.header h1 { font-size: 26px; }
|
||||
.header-icon { font-size: 44px; }
|
||||
.stats-bar { gap: 32px; padding: 24px; }
|
||||
.stat-number { font-size: 28px; }
|
||||
.section { padding: 0 24px; margin-bottom: 32px; }
|
||||
.section-header { margin-top: 32px; }
|
||||
.story { padding: 20px; }
|
||||
.story-title { font-size: 16px; }
|
||||
.footer { padding: 32px 24px; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td align="center" style="padding: 20px 10px;">
|
||||
<div class="email-wrapper">
|
||||
|
||||
<!-- Header -->
|
||||
<div class="header">
|
||||
<div class="header-icon">🦀</div>
|
||||
<h1>OpenClaw Daily</h1>
|
||||
<p class="header-subtitle">The best OpenClaw discussions, curated daily</p>
|
||||
<div class="header-date">{{DATE}}</div>
|
||||
</div>
|
||||
|
||||
<!-- Stats -->
|
||||
<div class="stats-bar">
|
||||
<div class="stat">
|
||||
<div class="stat-number">{{REDDIT_COUNT}}</div>
|
||||
<div class="stat-label">Reddit</div>
|
||||
</div>
|
||||
<div class="stat">
|
||||
<div class="stat-number">{{NEWS_COUNT}}</div>
|
||||
<div class="stat-label">News</div>
|
||||
</div>
|
||||
<div class="stat">
|
||||
<div class="stat-number">{{TWITTER_COUNT}}</div>
|
||||
<div class="stat-label">X/Twitter</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Reddit Section -->
|
||||
<div class="section">
|
||||
<div class="section-header">
|
||||
<span class="section-icon reddit-icon">🔥</span>
|
||||
<h2 class="section-title">Reddit Highlights</h2>
|
||||
</div>
|
||||
{{REDDIT_STORIES}}
|
||||
</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
|
||||
<!-- News Section -->
|
||||
<div class="section">
|
||||
<div class="section-header">
|
||||
<span class="section-icon hackernews-icon">🟧</span>
|
||||
<h2 class="section-title">News & Hacker News</h2>
|
||||
</div>
|
||||
{{NEWS_STORIES}}
|
||||
</div>
|
||||
|
||||
<div class="divider"></div>
|
||||
|
||||
<!-- X Section -->
|
||||
<div class="section">
|
||||
<div class="section-header">
|
||||
<span class="section-icon twitter-icon">𝕏</span>
|
||||
<h2 class="section-title">From X</h2>
|
||||
</div>
|
||||
{{TWITTER_STORIES}}
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
<div class="footer">
|
||||
<div class="footer-avatar">🦀</div>
|
||||
<div class="footer-brand">Curated daily for Anthony Martin</div>
|
||||
<p class="footer-text">by Krilly the Crab</p>
|
||||
<div class="footer-links">
|
||||
<a href="https://github.com/openclaw/openclaw">GitHub</a>
|
||||
<a href="https://reddit.com/r/openclaw">Reddit</a>
|
||||
<a href="https://docs.openclaw.ai">Docs</a>
|
||||
</div>
|
||||
<p class="footer-time">{{GENERATED_AT}} UTC</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
305
automations/openclaw-digest/templates/email.html
Normal file
305
automations/openclaw-digest/templates/email.html
Normal file
@@ -0,0 +1,305 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>OpenClaw Daily Digest</title>
|
||||
<style>
|
||||
/* Reset styles */
|
||||
body, table, td, p, a, li, blockquote {
|
||||
-webkit-text-size-adjust: 100%;
|
||||
-ms-text-size-adjust: 100%;
|
||||
}
|
||||
table, td {
|
||||
mso-table-lspace: 0pt;
|
||||
mso-table-rspace: 0pt;
|
||||
}
|
||||
img {
|
||||
-ms-interpolation-mode: bicubic;
|
||||
border: 0;
|
||||
height: auto;
|
||||
line-height: 100%;
|
||||
outline: none;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* Base styles */
|
||||
body {
|
||||
margin: 0 !important;
|
||||
padding: 0 !important;
|
||||
background-color: #f5f5f5;
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
/* Container */
|
||||
.container {
|
||||
max-width: 600px;
|
||||
margin: 0 auto;
|
||||
background-color: #ffffff;
|
||||
}
|
||||
|
||||
/* Header */
|
||||
.header {
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
padding: 40px 30px;
|
||||
text-align: center;
|
||||
}
|
||||
.header h1 {
|
||||
margin: 0;
|
||||
color: #ffffff;
|
||||
font-size: 28px;
|
||||
font-weight: 700;
|
||||
}
|
||||
.header .tagline {
|
||||
color: rgba(255,255,255,0.9);
|
||||
font-size: 14px;
|
||||
margin-top: 8px;
|
||||
}
|
||||
.header .date {
|
||||
color: rgba(255,255,255,0.8);
|
||||
font-size: 12px;
|
||||
margin-top: 12px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
/* Section headers */
|
||||
.section-header {
|
||||
background-color: #f8f9fa;
|
||||
padding: 20px 30px;
|
||||
border-left: 4px solid #667eea;
|
||||
}
|
||||
.section-header h2 {
|
||||
margin: 0;
|
||||
font-size: 18px;
|
||||
font-weight: 600;
|
||||
color: #333333;
|
||||
}
|
||||
.section-header .emoji {
|
||||
font-size: 20px;
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
/* Story cards */
|
||||
.stories {
|
||||
padding: 0 30px;
|
||||
}
|
||||
.story-card {
|
||||
padding: 24px 0;
|
||||
border-bottom: 1px solid #eeeeee;
|
||||
}
|
||||
.story-card:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
/* Source badge */
|
||||
.source-badge {
|
||||
display: inline-block;
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
padding: 4px 10px;
|
||||
border-radius: 12px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.badge-reddit { background-color: #ff4500; color: white; }
|
||||
.badge-hackernews { background-color: #ff6600; color: white; }
|
||||
.badge-github { background-color: #24292e; color: white; }
|
||||
.badge-news { background-color: #4285f4; color: white; }
|
||||
.badge-twitter { background-color: #1da1f2; color: white; }
|
||||
|
||||
/* Story content */
|
||||
.story-title {
|
||||
margin: 0 0 10px 0;
|
||||
font-size: 17px;
|
||||
font-weight: 600;
|
||||
line-height: 1.4;
|
||||
}
|
||||
.story-title a {
|
||||
color: #333333;
|
||||
text-decoration: none;
|
||||
}
|
||||
.story-title a:hover {
|
||||
color: #667eea;
|
||||
}
|
||||
.story-meta {
|
||||
font-size: 12px;
|
||||
color: #666666;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.story-excerpt {
|
||||
font-size: 14px;
|
||||
line-height: 1.6;
|
||||
color: #555555;
|
||||
margin: 0;
|
||||
}
|
||||
.engagement {
|
||||
display: inline-block;
|
||||
font-size: 12px;
|
||||
color: #888888;
|
||||
margin-top: 10px;
|
||||
}
|
||||
.engagement span {
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
/* CTA Button */
|
||||
.cta-button {
|
||||
display: inline-block;
|
||||
background-color: #667eea;
|
||||
color: #ffffff !important;
|
||||
text-decoration: none;
|
||||
padding: 12px 24px;
|
||||
border-radius: 6px;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
margin-top: 10px;
|
||||
}
|
||||
.cta-button:hover {
|
||||
background-color: #5568d3;
|
||||
}
|
||||
|
||||
/* Stats summary */
|
||||
.stats {
|
||||
background-color: #f8f9fa;
|
||||
padding: 20px 30px;
|
||||
text-align: center;
|
||||
border-top: 1px solid #eeeeee;
|
||||
}
|
||||
.stat-item {
|
||||
display: inline-block;
|
||||
margin: 0 20px;
|
||||
text-align: center;
|
||||
}
|
||||
.stat-number {
|
||||
font-size: 24px;
|
||||
font-weight: 700;
|
||||
color: #667eea;
|
||||
}
|
||||
.stat-label {
|
||||
font-size: 11px;
|
||||
color: #888888;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
|
||||
/* Footer */
|
||||
.footer {
|
||||
background-color: #333333;
|
||||
padding: 30px;
|
||||
text-align: center;
|
||||
}
|
||||
.footer p {
|
||||
margin: 0;
|
||||
color: #999999;
|
||||
font-size: 12px;
|
||||
}
|
||||
.footer .brand {
|
||||
color: #ffffff;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
.footer a {
|
||||
color: #667eea;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* Mobile responsiveness */
|
||||
@media screen and (max-width: 600px) {
|
||||
.container {
|
||||
width: 100% !important;
|
||||
}
|
||||
.header {
|
||||
padding: 30px 20px;
|
||||
}
|
||||
.header h1 {
|
||||
font-size: 24px;
|
||||
}
|
||||
.section-header, .stories, .stats {
|
||||
padding-left: 20px;
|
||||
padding-right: 20px;
|
||||
}
|
||||
.story-title {
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td align="center" style="padding: 20px 0;">
|
||||
<div class="container">
|
||||
|
||||
<!-- Header -->
|
||||
<div class="header">
|
||||
<h1>🦀 OpenClaw Daily Digest</h1>
|
||||
<div class="tagline">Your daily dose of OpenClaw discussions, use cases & news</div>
|
||||
<div class="date">{{DATE}}</div>
|
||||
</div>
|
||||
|
||||
<!-- Stats Summary -->
|
||||
<div class="stats">
|
||||
<div class="stat-item">
|
||||
<div class="stat-number">{{REDDIT_COUNT}}</div>
|
||||
<div class="stat-label">Reddit Posts</div>
|
||||
</div>
|
||||
<div class="stat-item">
|
||||
<div class="stat-number">{{NEWS_COUNT}}</div>
|
||||
<div class="stat-label">News Stories</div>
|
||||
</div>
|
||||
<div class="stat-item">
|
||||
<div class="stat-number">{{TWITTER_COUNT}}</div>
|
||||
<div class="stat-label">X Threads</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Reddit Highlights Section -->
|
||||
<div class="section-header">
|
||||
<h2><span class="emoji">🔥</span>Reddit Highlights</h2>
|
||||
</div>
|
||||
<div class="stories">
|
||||
{{REDDIT_STORIES}}
|
||||
</div>
|
||||
|
||||
<!-- News Roundup Section -->
|
||||
<div class="section-header">
|
||||
<h2><span class="emoji">📰</span>News Roundup</h2>
|
||||
</div>
|
||||
<div class="stories">
|
||||
{{NEWS_STORIES}}
|
||||
</div>
|
||||
|
||||
<!-- X Threads Section -->
|
||||
<div class="section-header">
|
||||
<h2><span class="emoji">𝕏</span>X Threads</h2>
|
||||
</div>
|
||||
<div class="stories">
|
||||
{{TWITTER_STORIES}}
|
||||
<p style="text-align: center; color: #888; font-size: 14px; padding: 20px 0;">
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
<div class="footer">
|
||||
<div class="brand">🦀 Krilly the Crab</div>
|
||||
<p>Daily digest compiled for Anthony Martin</p>
|
||||
<p style="margin-top: 10px;">
|
||||
<a href="https://github.com/openclaw/openclaw">OpenClaw on GitHub</a> •
|
||||
<a href="https://reddit.com/r/openclaw">r/OpenClaw</a>
|
||||
</p>
|
||||
<p style="margin-top: 15px; font-size: 11px; color: #666;">
|
||||
Generated at {{GENERATED_AT}} UTC
|
||||
</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
40
automations/openclaw-digest/templates/email.txt
Normal file
40
automations/openclaw-digest/templates/email.txt
Normal file
@@ -0,0 +1,40 @@
|
||||
🦀 OPENCLAW DAILY DIGEST
|
||||
Your daily dose of OpenClaw discussions, use cases & news
|
||||
|
||||
Date: {{DATE}}
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
📊 TODAY'S SUMMARY
|
||||
• {{REDDIT_COUNT}} Reddit Posts
|
||||
• {{NEWS_COUNT}} News Stories
|
||||
• {{TWITTER_COUNT}} X Threads
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
🔥 REDDIT HIGHLIGHTS
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
{{REDDIT_STORIES_TEXT}}
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
📰 NEWS ROUNDUP
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
{{NEWS_STORIES_TEXT}}
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
𝕏 X THREADS
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
{{TWITTER_STORIES_TEXT}}
|
||||
|
||||
🚧 X/Twitter integration coming soon - requires API setup
|
||||
|
||||
═══════════════════════════════════════════════════════════
|
||||
|
||||
🦀 Krilly the Crab
|
||||
Daily digest compiled for Anthony Martin
|
||||
|
||||
OpenClaw on GitHub: https://github.com/openclaw/openclaw
|
||||
r/OpenClaw: https://reddit.com/r/openclaw
|
||||
|
||||
Generated at {{GENERATED_AT}} UTC
|
||||
53
automations/x-no-api-bot/README.md
Normal file
53
automations/x-no-api-bot/README.md
Normal file
@@ -0,0 +1,53 @@
|
||||
# X No-API Bot (Starter)
|
||||
|
||||
Safe starter for using X without official API.
|
||||
|
||||
## What this does
|
||||
- `login`: saves browser session cookie/state
|
||||
- `fetch`: read-only fetch from X search timeline
|
||||
- `post`: optional posting (disabled by default)
|
||||
|
||||
## Setup
|
||||
```bash
|
||||
cd /home/openclaw/.openclaw/workspace/automations/x-no-api-bot
|
||||
cp .env.example .env
|
||||
npm install
|
||||
npx playwright install chromium
|
||||
```
|
||||
|
||||
## 1) Login once
|
||||
```bash
|
||||
npm run login
|
||||
```
|
||||
A browser opens. Log in to X manually, then press Enter in terminal.
|
||||
|
||||
## 2) Read-only fetch
|
||||
```bash
|
||||
npm run fetch
|
||||
```
|
||||
Outputs JSON and saves a log under `logs/`.
|
||||
|
||||
## 3) Optional posting (off by default)
|
||||
Edit `.env`:
|
||||
```ini
|
||||
ENABLE_POSTING=true
|
||||
```
|
||||
Then draft a post:
|
||||
```bash
|
||||
npm run post -- "Hello from no-API automation"
|
||||
```
|
||||
Publish only with explicit confirm:
|
||||
```bash
|
||||
npm run post -- "Hello from no-API automation" --confirm
|
||||
```
|
||||
|
||||
## Cron (read-only)
|
||||
Example every 30 min:
|
||||
```cron
|
||||
*/30 * * * * cd /home/openclaw/.openclaw/workspace/automations/x-no-api-bot && /usr/bin/npm run fetch >> logs/cron.log 2>&1
|
||||
```
|
||||
|
||||
## Notes
|
||||
- UI can change and break selectors.
|
||||
- Keep activity low-volume to reduce account risk.
|
||||
- Prefer read-only monitoring unless you explicitly need posting.
|
||||
72
automations/x-no-api-bot/package-lock.json
generated
Normal file
72
automations/x-no-api-bot/package-lock.json
generated
Normal file
@@ -0,0 +1,72 @@
|
||||
{
|
||||
"name": "x-no-api-bot",
|
||||
"version": "0.1.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "x-no-api-bot",
|
||||
"version": "0.1.0",
|
||||
"dependencies": {
|
||||
"dotenv": "^16.4.5",
|
||||
"playwright": "^1.52.0"
|
||||
}
|
||||
},
|
||||
"node_modules/dotenv": {
|
||||
"version": "16.6.1",
|
||||
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz",
|
||||
"integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
|
||||
"license": "BSD-2-Clause",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://dotenvx.com"
|
||||
}
|
||||
},
|
||||
"node_modules/fsevents": {
|
||||
"version": "2.3.2",
|
||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
|
||||
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/playwright": {
|
||||
"version": "1.58.2",
|
||||
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz",
|
||||
"integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"playwright-core": "1.58.2"
|
||||
},
|
||||
"bin": {
|
||||
"playwright": "cli.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"fsevents": "2.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/playwright-core": {
|
||||
"version": "1.58.2",
|
||||
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz",
|
||||
"integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==",
|
||||
"license": "Apache-2.0",
|
||||
"bin": {
|
||||
"playwright-core": "cli.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
16
automations/x-no-api-bot/package.json
Normal file
16
automations/x-no-api-bot/package.json
Normal file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"name": "x-no-api-bot",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"description": "No-API X automation starter using Playwright (read-only by default)",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"login": "node src/login.js",
|
||||
"fetch": "node src/fetch.js",
|
||||
"post": "node src/post.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"dotenv": "^16.4.5",
|
||||
"playwright": "^1.52.0"
|
||||
}
|
||||
}
|
||||
28
automations/x-no-api-bot/src/common.js
Normal file
28
automations/x-no-api-bot/src/common.js
Normal file
@@ -0,0 +1,28 @@
|
||||
import fs from 'node:fs';
|
||||
import path from 'node:path';
|
||||
import dotenv from 'dotenv';
|
||||
|
||||
dotenv.config();
|
||||
|
||||
export const ROOT = process.cwd();
|
||||
export const STATE_DIR = path.join(ROOT, 'state');
|
||||
export const LOG_DIR = path.join(ROOT, 'logs');
|
||||
export const SESSION_FILE = path.join(STATE_DIR, 'x-session.json');
|
||||
|
||||
if (!fs.existsSync(STATE_DIR)) fs.mkdirSync(STATE_DIR, { recursive: true });
|
||||
if (!fs.existsSync(LOG_DIR)) fs.mkdirSync(LOG_DIR, { recursive: true });
|
||||
|
||||
export const ENABLE_POSTING = String(process.env.ENABLE_POSTING || 'false').toLowerCase() === 'true';
|
||||
export const X_QUERY = process.env.X_QUERY || '(AI OR OpenClaw) lang:en -is:retweet';
|
||||
export const MAX_TWEETS = Number(process.env.MAX_TWEETS || 10);
|
||||
export const USER_AGENT = process.env.USER_AGENT;
|
||||
|
||||
export function nowStamp() {
|
||||
return new Date().toISOString();
|
||||
}
|
||||
|
||||
export function writeJsonLog(name, data) {
|
||||
const file = path.join(LOG_DIR, `${name}-${Date.now()}.json`);
|
||||
fs.writeFileSync(file, JSON.stringify(data, null, 2));
|
||||
return file;
|
||||
}
|
||||
65
automations/x-no-api-bot/src/fetch.js
Normal file
65
automations/x-no-api-bot/src/fetch.js
Normal file
@@ -0,0 +1,65 @@
|
||||
import fs from 'node:fs';
|
||||
import { chromium } from 'playwright';
|
||||
import {
|
||||
SESSION_FILE,
|
||||
USER_AGENT,
|
||||
X_QUERY,
|
||||
MAX_TWEETS,
|
||||
nowStamp,
|
||||
writeJsonLog
|
||||
} from './common.js';
|
||||
|
||||
const hasSession = fs.existsSync(SESSION_FILE);
|
||||
if (!hasSession) {
|
||||
console.error('No session found. Run: npm run login');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const browser = await chromium.launch({ headless: true });
|
||||
const context = await browser.newContext({
|
||||
storageState: SESSION_FILE,
|
||||
userAgent: USER_AGENT || undefined,
|
||||
viewport: { width: 1366, height: 900 }
|
||||
});
|
||||
|
||||
const page = await context.newPage();
|
||||
const url = `https://x.com/search?q=${encodeURIComponent(X_QUERY)}&src=typed_query&f=live`;
|
||||
await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 60000 });
|
||||
|
||||
await page.waitForTimeout(2500);
|
||||
|
||||
const tweets = await page.evaluate((maxTweets) => {
|
||||
const out = [];
|
||||
const articles = Array.from(document.querySelectorAll('article'));
|
||||
|
||||
for (const a of articles) {
|
||||
if (out.length >= maxTweets) break;
|
||||
|
||||
const textNode = a.querySelector('[data-testid="tweetText"]');
|
||||
const userNode = a.querySelector('a[role="link"][href*="/"]');
|
||||
const timeNode = a.querySelector('time');
|
||||
const linkNode = a.querySelector('a[href*="/status/"]');
|
||||
|
||||
const text = textNode?.innerText?.trim();
|
||||
const user = userNode?.getAttribute('href') || null;
|
||||
const when = timeNode?.getAttribute('datetime') || null;
|
||||
const link = linkNode ? `https://x.com${linkNode.getAttribute('href')}` : null;
|
||||
|
||||
if (text) out.push({ text, user, when, link });
|
||||
}
|
||||
|
||||
return out;
|
||||
}, MAX_TWEETS);
|
||||
|
||||
const payload = {
|
||||
ts: nowStamp(),
|
||||
query: X_QUERY,
|
||||
count: tweets.length,
|
||||
tweets
|
||||
};
|
||||
|
||||
const file = writeJsonLog('x-fetch', payload);
|
||||
console.log(JSON.stringify(payload, null, 2));
|
||||
console.log(`\nSaved log: ${file}`);
|
||||
|
||||
await browser.close();
|
||||
26
automations/x-no-api-bot/src/login.js
Normal file
26
automations/x-no-api-bot/src/login.js
Normal file
@@ -0,0 +1,26 @@
|
||||
import fs from 'node:fs';
|
||||
import { chromium } from 'playwright';
|
||||
import { SESSION_FILE, USER_AGENT } from './common.js';
|
||||
|
||||
console.log('Starting X login capture...');
|
||||
console.log('A browser will open. Log in manually, then press ENTER here to save session.');
|
||||
|
||||
const browser = await chromium.launch({ headless: false });
|
||||
const context = await browser.newContext({
|
||||
userAgent: USER_AGENT || undefined,
|
||||
viewport: { width: 1366, height: 900 }
|
||||
});
|
||||
const page = await context.newPage();
|
||||
await page.goto('https://x.com/i/flow/login', { waitUntil: 'domcontentloaded' });
|
||||
|
||||
process.stdin.resume();
|
||||
await new Promise((resolve) => {
|
||||
process.stdout.write('\nPress ENTER after login completes in browser...\n');
|
||||
process.stdin.once('data', () => resolve());
|
||||
});
|
||||
|
||||
await context.storageState({ path: SESSION_FILE });
|
||||
console.log(`Saved session to ${SESSION_FILE}`);
|
||||
|
||||
await browser.close();
|
||||
process.exit(0);
|
||||
45
automations/x-no-api-bot/src/post.js
Normal file
45
automations/x-no-api-bot/src/post.js
Normal file
@@ -0,0 +1,45 @@
|
||||
import fs from 'node:fs';
|
||||
import { chromium } from 'playwright';
|
||||
import { ENABLE_POSTING, SESSION_FILE, USER_AGENT } from './common.js';
|
||||
|
||||
const text = process.argv.slice(2).join(' ').trim();
|
||||
if (!text) {
|
||||
console.error('Usage: npm run post -- "your post text"');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
if (!ENABLE_POSTING) {
|
||||
console.error('Posting is disabled. Set ENABLE_POSTING=true in .env to enable.');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
if (!fs.existsSync(SESSION_FILE)) {
|
||||
console.error('No session found. Run: npm run login');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const browser = await chromium.launch({ headless: true });
|
||||
const context = await browser.newContext({
|
||||
storageState: SESSION_FILE,
|
||||
userAgent: USER_AGENT || undefined,
|
||||
viewport: { width: 1366, height: 900 }
|
||||
});
|
||||
|
||||
const page = await context.newPage();
|
||||
await page.goto('https://x.com/compose/post', { waitUntil: 'domcontentloaded', timeout: 60000 });
|
||||
await page.waitForSelector('[data-testid="tweetTextarea_0"]', { timeout: 20000 });
|
||||
await page.fill('[data-testid="tweetTextarea_0"]', text);
|
||||
|
||||
// Safety: we require explicit --confirm to actually click Post
|
||||
const confirmed = process.argv.includes('--confirm');
|
||||
if (!confirmed) {
|
||||
console.log('Draft prepared, not posted. Re-run with --confirm to publish.');
|
||||
await browser.close();
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
await page.click('[data-testid="tweetButtonInline"]');
|
||||
await page.waitForTimeout(2000);
|
||||
|
||||
console.log('Post submitted.');
|
||||
await browser.close();
|
||||
Reference in New Issue
Block a user