Trending-skills builderpulse-daily-intelligence

```markdown

install
source · Clone the upstream repo
git clone https://github.com/Aradotso/trending-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/Aradotso/trending-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/builderpulse-daily-intelligence" ~/.claude/skills/aradotso-trending-skills-builderpulse-daily-intelligence && rm -rf "$T"
manifest: skills/builderpulse-daily-intelligence/SKILL.md
source content
---
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})")

Fetch via GitHub Contents API (with metadata)

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)

Subscribe to RSS / Atom Feed

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("---")

Navigating the Report Archive

Directory Structure

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
        └── ...

List All Available Reports

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")

Parsing Report Structure

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"

Building a Personal Daily Digest Agent

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)

Setting Up a Daily Notification Bot

GitHub Actions — Daily Slack/Discord Alert

# .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\"}"

Python Cron Script (local)

#!/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()

Trend Tracking Across Multiple Days

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)")

Configuration & Environment Variables

VariableRequiredPurpose
GITHUB_TOKEN
RecommendedRaises GitHub API rate limit from 60 to 5000 req/hr
ANTHROPIC_API_KEY
For AI featuresPersonalise reports with Claude
DISCORD_WEBHOOK_URL
For Discord botsPost daily digest to a channel
SLACK_WEBHOOK_URL
For Slack botsPost 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()

Common Patterns

Pattern 1 — Check if today's report is live

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

Pattern 2 — Watch for new commits (polling)

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

Pattern 3 — Build a searchable local cache

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

Troubleshooting

"403 rate limit exceeded" from GitHub API

# 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.

"404 Not Found" for today's report

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.

Report content looks garbled

GitHub API returns base64-encoded content. Always decode:

import base64
content = base64.b64decode(api_response["content"]).decode("utf-8")

RSS feed not updating

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.


Resources