Skip to main content

Autonomous content discovery and delivery engine

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.1.0.tar.gz (22.6 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.1.0-py3-none-any.whl (24.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: pebbles_core-0.1.0.tar.gz
  • Upload date:
  • Size: 22.6 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.1.0.tar.gz
Algorithm Hash digest
SHA256 1139e381e5f7ab70942522869ebd998f3ad54098af29ca2843a1f129193e75b7
MD5 d6d13622cc51b923788c3031031b6520
BLAKE2b-256 0fed851867f5f40314cc213fdcac107af558a03be94ced8c0b717681c2dde464

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pebbles_core-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 24.7 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.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 80543f580f51d49298bbb4abb51e0628cafb67ecb65511f7334dd82cbedc5e1a
MD5 faeae95ec1ecd13a11096fc082124327
BLAKE2b-256 c001e168d92ce2ac682d073723582275af06d47e4f7ee60c8a79ae2baa5c98a4

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