From aradotso-trending-skills-37
Delivers AI-generated daily reports aggregating 300+ signals from HN, GitHub, Product Hunt, HuggingFace, Google Trends, Reddit into actionable build ideas including 2-hour projects for indie hackers.
npx claudepluginhub joshuarweaver/cascade-ai-ml-agents-misc-1 --plugin aradotso-trending-skills-37This skill uses the workspace's default tool permissions.
```markdown
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Generates original PNG/PDF visual art via design philosophy manifestos for posters, graphics, and static designs on user request.
---
name: builderpulse-daily-intelligence
description: AI-powered daily build intelligence for indie hackers — aggregates 300+ signals from HN, GitHub, Product Hunt, HuggingFace, Google Trends, and Reddit into actionable "what to build today" reports.
triggers:
- "what should I build today"
- "show me today's builderpulse report"
- "find trending build opportunities"
- "what are indie hackers building right now"
- "analyze signals from hacker news and github"
- "generate a builder intelligence report"
- "what problems can I build in 2 hours"
- "find underserved markets from trending topics"
---
# BuilderPulse Daily Intelligence
> Skill by [ara.so](https://ara.so) — Daily 2026 Skills collection.
BuilderPulse aggregates 300+ signals daily from Hacker News, GitHub Trending, Product Hunt, HuggingFace, Google Trends, and Reddit to surface actionable build opportunities for indie hackers and solo builders. Every morning it publishes a structured report (in English and Chinese) answering: _"What should you build today?"_ — including a flagship "2-hour build" idea, trend analysis, and a 20-question intelligence brief.
---
## How It Works
The project is a **GitHub repository as a publishing platform**:
- Daily Markdown reports are committed to `en/YYYY/YYYY-MM-DD.md` and `zh/YYYY/YYYY-MM-DD.md`
- An RSS feed is available via GitHub's commit atom feed: `../../commits/main.atom`
- Reports reference signals sourced from 10+ platforms and synthesised by AI
- The README always shows the latest report with badge links
---
## Consuming Reports Programmatically
### Fetch Today's Report via GitHub Raw API
```python
import httpx
from datetime import date
REPO = "BuilderPulse/BuilderPulse"
TODAY = date.today().strftime("%Y-%m-%d")
YEAR = date.today().strftime("%Y")
url = f"https://raw.githubusercontent.com/{REPO}/main/en/{YEAR}/{TODAY}.md"
response = httpx.get(url)
if response.status_code == 200:
report_md = response.text
print(report_md[:2000]) # preview first 2000 chars
else:
print(f"No report yet for {TODAY} (status {response.status_code})")
import httpx
import base64
import os
GITHUB_TOKEN = os.environ["GITHUB_TOKEN"] # optional, increases rate limit
REPO = "BuilderPulse/BuilderPulse"
TODAY = "2026-04-16"
YEAR = "2026"
headers = {"Authorization": f"Bearer {GITHUB_TOKEN}"} if GITHUB_TOKEN else {}
url = f"https://api.github.com/repos/{REPO}/contents/en/{YEAR}/{TODAY}.md"
resp = httpx.get(url, headers=headers)
data = resp.json()
content = base64.b64decode(data["content"]).decode("utf-8")
print(content)
https://github.com/BuilderPulse/BuilderPulse/commits/main.atom
Parse with any RSS library:
import feedparser
feed = feedparser.parse(
"https://github.com/BuilderPulse/BuilderPulse/commits/main.atom"
)
for entry in feed.entries[:5]:
print(entry.title)
print(entry.link)
print(entry.updated)
print("---")
BuilderPulse/BuilderPulse
├── README.md ← always current, links to today
├── en/
│ ├── index.md ← full English archive index
│ └── 2026/
│ ├── 2026-04-16.md
│ ├── 2026-04-15.md
│ └── ...
└── zh/
├── index.md ← full Chinese archive index
└── 2026/
├── 2026-04-16.md
└── ...
import httpx
import os
GITHUB_TOKEN = os.environ["GITHUB_TOKEN"]
REPO = "BuilderPulse/BuilderPulse"
YEAR = "2026"
headers = {"Authorization": f"Bearer {GITHUB_TOKEN}"}
url = f"https://api.github.com/repos/{REPO}/contents/en/{YEAR}"
resp = httpx.get(url, headers=headers)
files = resp.json()
report_dates = sorted([f["name"].replace(".md", "") for f in files if f["name"].endswith(".md")])
print(f"Available reports: {len(report_dates)}")
for d in report_dates[-7:]: # last 7
print(f" {d} → https://github.com/{REPO}/blob/main/en/{YEAR}/{d}.md")
A BuilderPulse report follows a consistent Markdown schema you can parse:
import re
def parse_builderpulse_report(markdown: str) -> dict:
"""Extract key sections from a BuilderPulse daily report."""
result = {}
# Extract the headline summary (bold line near top)
headline = re.search(r"\*\*Today: (.+?)\*\*", markdown)
if headline:
result["headline"] = headline.group(1)
# Extract the 2-hour build idea
build_idea = re.search(r"💡 \*\*If you had 2 hours, (.+?)\*\*", markdown)
if build_idea:
result["two_hour_build"] = build_idea.group(1)
# Extract all H2/H3 section headings (signal categories)
sections = re.findall(r"^#{2,3} (.+)$", markdown, re.MULTILINE)
result["sections"] = sections
# Extract all URLs referenced
urls = re.findall(r"\(https?://[^\)]+\)", markdown)
result["urls"] = [u.strip("()") for u in urls]
# Extract signal source mentions
sources = ["Hacker News", "GitHub", "Product Hunt", "HuggingFace",
"Google Trends", "Reddit"]
result["sources_mentioned"] = [s for s in sources if s in markdown]
return result
# Usage
with open("2026-04-16.md") as f:
md = f.read()
report = parse_builderpulse_report(md)
print(report["two_hour_build"])
# → "build a self-hosted social media scheduler deployable on a $10/month VPS for small agencies"
Use BuilderPulse as a data source for your own AI-enhanced workflow:
import httpx
import base64
import os
from datetime import date
from anthropic import Anthropic
GITHUB_TOKEN = os.environ["GITHUB_TOKEN"]
ANTHROPIC_API_KEY = os.environ["ANTHROPIC_API_KEY"]
def fetch_todays_report() -> str:
today = date.today()
year = today.strftime("%Y")
day = today.strftime("%Y-%m-%d")
repo = "BuilderPulse/BuilderPulse"
headers = {"Authorization": f"Bearer {GITHUB_TOKEN}"}
url = f"https://api.github.com/repos/{repo}/contents/en/{year}/{day}.md"
resp = httpx.get(url, headers=headers)
if resp.status_code != 200:
raise ValueError(f"No report for {day}")
data = resp.json()
return base64.b64decode(data["content"]).decode("utf-8")
def personalize_digest(report: str, your_skills: str, your_interests: str) -> str:
client = Anthropic()
message = client.messages.create(
model="claude-opus-4-5",
max_tokens=1024,
messages=[
{
"role": "user",
"content": f"""Here is today's BuilderPulse report:
{report}
My skills: {your_skills}
My interests: {your_interests}
Based on this report, give me:
1. The top 3 build opportunities most relevant to me
2. Why each one fits my skills/interests
3. A concrete first step I could take today
Keep it under 300 words.""",
}
],
)
return message.content[0].text
# Run it
report = fetch_todays_report()
digest = personalize_digest(
report,
your_skills="Python, React, solo developer",
your_interests="developer tools, SaaS, automation"
)
print(digest)
# .github/workflows/daily-digest.yml
name: Daily BuilderPulse Digest
on:
schedule:
- cron: "0 8 * * *" # 8 AM UTC every day
workflow_dispatch:
jobs:
fetch-and-notify:
runs-on: ubuntu-latest
steps:
- name: Fetch today's BuilderPulse report
id: fetch
run: |
TODAY=$(date +%Y-%m-%d)
YEAR=$(date +%Y)
URL="https://raw.githubusercontent.com/BuilderPulse/BuilderPulse/main/en/${YEAR}/${TODAY}.md"
CONTENT=$(curl -sf "$URL" || echo "NO_REPORT")
echo "content<<EOF" >> $GITHUB_OUTPUT
echo "$CONTENT" | head -30 >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
echo "date=$TODAY" >> $GITHUB_OUTPUT
- name: Post to Discord
if: steps.fetch.outputs.content != 'NO_REPORT'
run: |
DATE="${{ steps.fetch.outputs.date }}"
MSG="📡 **BuilderPulse $DATE**\nhttps://github.com/BuilderPulse/BuilderPulse/blob/main/en/${DATE:0:4}/${DATE}.md"
curl -X POST "${{ secrets.DISCORD_WEBHOOK_URL }}" \
-H "Content-Type: application/json" \
-d "{\"content\": \"$MSG\"}"
#!/usr/bin/env python3
"""Run with: python digest.py | mail -s "BuilderPulse $(date +%Y-%m-%d)" you@example.com"""
import httpx
import base64
import os
import sys
from datetime import date
def main():
today = date.today()
year = today.strftime("%Y")
day = today.strftime("%Y-%m-%d")
token = os.environ.get("GITHUB_TOKEN", "")
headers = {"Authorization": f"Bearer {token}"} if token else {}
url = f"https://api.github.com/repos/BuilderPulse/BuilderPulse/contents/en/{year}/{day}.md"
resp = httpx.get(url, headers=headers, timeout=10)
if resp.status_code == 404:
print(f"No BuilderPulse report yet for {day}. Check back later.")
sys.exit(0)
resp.raise_for_status()
content = base64.b64decode(resp.json()["content"]).decode("utf-8")
print(content)
if __name__ == "__main__":
main()
import httpx
import base64
import os
import re
from datetime import date, timedelta
GITHUB_TOKEN = os.environ["GITHUB_TOKEN"]
REPO = "BuilderPulse/BuilderPulse"
def fetch_report(day: str) -> str | None:
year = day[:4]
headers = {"Authorization": f"Bearer {GITHUB_TOKEN}"}
url = f"https://api.github.com/repos/{REPO}/contents/en/{year}/{day}.md"
resp = httpx.get(url, headers=headers)
if resp.status_code != 200:
return None
return base64.b64decode(resp.json()["content"]).decode("utf-8")
def extract_two_hour_build(report: str) -> str | None:
m = re.search(r"💡 \*\*If you had 2 hours, (.+?)\*\*", report)
return m.group(1) if m else None
# Pull last 7 days of build ideas
today = date.today()
print("📡 BuilderPulse — Last 7 'Two Hour Build' Ideas\n")
for i in range(7):
day = (today - timedelta(days=i)).strftime("%Y-%m-%d")
report = fetch_report(day)
if report:
idea = extract_two_hour_build(report)
print(f" {day}: {idea or '(not found)'}")
else:
print(f" {day}: (no report)")
| Variable | Required | Purpose |
|---|---|---|
GITHUB_TOKEN | Recommended | Raises GitHub API rate limit from 60 to 5000 req/hr |
ANTHROPIC_API_KEY | For AI features | Personalise reports with Claude |
DISCORD_WEBHOOK_URL | For Discord bots | Post daily digest to a channel |
SLACK_WEBHOOK_URL | For Slack bots | Post daily digest to a channel |
Create a .env file (never commit it):
GITHUB_TOKEN=ghp_...
ANTHROPIC_API_KEY=sk-ant-...
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/...
Load with:
from dotenv import load_dotenv
load_dotenv()
from datetime import date
import httpx
def report_is_live(lang="en") -> bool:
today = date.today()
url = (
f"https://raw.githubusercontent.com/BuilderPulse/BuilderPulse/main/"
f"{lang}/{today.year}/{today.strftime('%Y-%m-%d')}.md"
)
return httpx.head(url).status_code == 200
import httpx, time, os
GITHUB_TOKEN = os.environ["GITHUB_TOKEN"]
last_sha = None
while True:
headers = {"Authorization": f"Bearer {GITHUB_TOKEN}"}
resp = httpx.get(
"https://api.github.com/repos/BuilderPulse/BuilderPulse/commits?per_page=1",
headers=headers
)
latest_sha = resp.json()[0]["sha"]
if latest_sha != last_sha and last_sha is not None:
print(f"🆕 New BuilderPulse commit: {latest_sha[:8]}")
# trigger your digest pipeline here
last_sha = latest_sha
time.sleep(300) # poll every 5 minutes
import httpx, base64, os, json
from pathlib import Path
GITHUB_TOKEN = os.environ["GITHUB_TOKEN"]
CACHE_DIR = Path(".builderpulse_cache")
CACHE_DIR.mkdir(exist_ok=True)
def get_report(day: str, lang="en") -> str:
cache_file = CACHE_DIR / f"{lang}_{day}.md"
if cache_file.exists():
return cache_file.read_text()
year = day[:4]
headers = {"Authorization": f"Bearer {GITHUB_TOKEN}"}
url = f"https://api.github.com/repos/BuilderPulse/BuilderPulse/contents/{lang}/{year}/{day}.md"
resp = httpx.get(url, headers=headers)
if resp.status_code != 200:
return ""
content = base64.b64decode(resp.json()["content"]).decode("utf-8")
cache_file.write_text(content)
return content
# Check your current rate limit status
curl -H "Authorization: Bearer $GITHUB_TOKEN" \
https://api.github.com/rate_limit
Always pass a GITHUB_TOKEN — unauthenticated requests are limited to 60/hr.
Reports are published each morning (timezone: roughly UTC+8, Shanghai). If it's early UTC, the report may not be live yet. Use report_is_live() to check before fetching.
GitHub API returns base64-encoded content. Always decode:
import base64
content = base64.b64decode(api_response["content"]).decode("utf-8")
GitHub's atom feed at https://github.com/BuilderPulse/BuilderPulse/commits/main.atom has aggressive CDN caching. If you need real-time updates, poll the commits API directly rather than the feed URL.