Skip to main content

Autonomous content discovery and delivery engine — with primitives for principal-shaped agent capabilities

Project description

🪨 Pebbles

A smart content discovery engine that brings you interesting things from across the web — like a penguin bringing pebbles to its mate.

Pebbles monitors multiple sources (Hacker News, Reddit, RSS feeds, YouTube, Letterboxd), matches content against your interests using keyword or semantic matching, and delivers personalized recommendations via Telegram or email. Set daily limits, priority interests, and negative keywords to stay informed without getting overwhelmed.


Quick Start

Installation

pip install pebbles-core

Configuration

Create ~/.config/pebbles/config.yaml:

recipients:
  - name: "Jake"
    telegram_id: 123456789
    max_daily_pebbles: 3
    interests:
      - tags: ["surfing", "ocean"]
        keywords: ["surf", "wave", "ocean", "swell"]
        priority: 2
      - tags: ["climbing"]
        keywords: ["climbing", "bouldering", "crag"]
        negative_keywords: ["indoor"]
        priority: 1

sources:
  hackernews:
    enabled: true
  reddit:
    enabled: true
    subreddits: ["surfing", "climbing"]

delivery:
  telegram:
    bot_token: "your-bot-token-here"

matching:
  use_semantic_matching: false
  semantic_threshold: 0.35

Run

# One-time fetch
pebbles run

# Continuous loop (checks every 30 minutes)
pebbles run --loop

Configuration Reference

Recipients

Each recipient defines who receives pebbles and what they care about:

recipients:
  - name: "Jake"                    # Display name
    telegram_id: 123456789          # Optional: Telegram user ID
    email: "jake@example.com"       # Optional: Email address
    max_daily_pebbles: 3            # Daily limit (default: 5)
    interests:
      - tags: ["surfing"]           # Category tags
        keywords: ["surf", "wave"]  # Match keywords
        negative_keywords: ["pool"] # Exclude keywords
        priority: 2                 # 1=normal, 2=high, 3=must-have

At least one of telegram_id or email must be provided per recipient.

Sources

Hacker News

sources:
  hackernews:
    enabled: true

Reddit

sources:
  reddit:
    enabled: true
    subreddits:
      - "surfing"
      - "climbing"
      - "technology"

RSS Feeds

sources:
  rss:
    enabled: true
    feeds:
      - "https://example.com/feed.xml"
      - "https://blog.example.com/rss"

YouTube

sources:
  youtube:
    enabled: true
    api_key: "your-youtube-api-key"
    queries:
      - "surf documentary"
      - "climbing training"

Letterboxd

sources:
  letterboxd:
    enabled: true
    usernames:
      - "username1"
      - "username2"

Delivery

Telegram

delivery:
  telegram:
    bot_token: "your-telegram-bot-token"

Email

delivery:
  email:
    smtp_host: "smtp.gmail.com"
    smtp_port: 587
    smtp_user: "you@gmail.com"
    smtp_password: "your-app-password"
    smtp_from: "Pebbles <you@gmail.com>"  # Optional

Matching

matching:
  use_semantic_matching: false    # Enable AI-powered matching
  semantic_threshold: 0.35        # Similarity threshold (0.0-1.0)

Semantic matching uses sentence-transformers (all-MiniLM-L6-v2) for contextual understanding. Falls back to keyword matching if unavailable.


Deployment

Docker

docker run -d \
  --name pebbles \
  -v $(pwd)/config:/root/.config/pebbles \
  -v $(pwd)/data:/root/.local/share/pebbles \
  --env-file .env \
  pebbles-core:latest

Docker Compose

services:
  pebbles:
    image: pebbles-core:latest
    volumes:
      - ./config:/root/.config/pebbles
      - ./data:/root/.local/share/pebbles
    env_file: .env
    restart: unless-stopped

Create .env:

TELEGRAM_BOT_TOKEN=your-token
SMTP_PASSWORD=your-password

Roadmap

Pebbles was built in phases:

  • Phase 1: Core engine + HackerNews source
  • Phase 2: Production hardening (logging, retries, error handling)
  • Phase 3: Multi-source expansion (Reddit, RSS, YouTube, Letterboxd)
  • Phase 4: Smart matching (semantic understanding, priority scoring, frequency caps)
  • Phase 5: Polish + ship (email delivery, Docker deployment, docs)

Future ideas: Mastodon source, Discord delivery, web dashboard, collaborative filtering.


Contributing

See CONTRIBUTING.md for how to add sources, delivery adapters, or improve matching.


License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pebbles_core-0.2.0.tar.gz (46.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pebbles_core-0.2.0-py3-none-any.whl (42.2 kB view details)

Uploaded Python 3

File details

Details for the file pebbles_core-0.2.0.tar.gz.

File metadata

  • Download URL: pebbles_core-0.2.0.tar.gz
  • Upload date:
  • Size: 46.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for pebbles_core-0.2.0.tar.gz
Algorithm Hash digest
SHA256 37f31df5754557c32c533cf8cc8a6575dd3531dbbf77247fa5879de8f5520ab3
MD5 44bc6b67c0656341899f05f5642df6d4
BLAKE2b-256 3c647e4d5b4e015e8b57c10bc0de3349981b9d668fe5938fd62ad352511ed1a6

See more details on using hashes here.

File details

Details for the file pebbles_core-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: pebbles_core-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 42.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for pebbles_core-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f85648c29d82d71de4a24d3f9cf50e76dbfb3794948d7dc68e9d44163057bcca
MD5 de7cc5bfe13080bad8ebcc636262a011
BLAKE2b-256 2932f583602bf1af0dae813e90d09822561f531a4d620ba96fa5fc139a59b2d6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page