Skip to main content

🪨 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

Metadata

Release files for pebbles-core 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pebbles-core 0.2.0
File Size Uploaded Provenance Actions
pebbles_core-0.2.0.tar.gz 46.3 kB Without provenance Details for pebbles_core-0.2.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for pebbles-core 0.2.0
File Interpreter ABI Platform Actions
pebbles_core-0.2.0-py3-none-any.whl Python 3 none any Details for pebbles_core-0.2.0-py3-none-any.whl

Total release size: 88.5 kB

Release files / pebbles_core-0.2.0.tar.gz

Download URL pebbles_core-0.2.0.tar.gz
Size 46.3 kB
Tags Source
SHA-256 checksum
How to use checksums
37f31df5754557c32c533cf8cc8a6575dd3531dbbf77247fa5879de8f5520ab3
BLAKE2b-256 checksum
How to use checksums
3c647e4d5b4e015e8b57c10bc0de3349981b9d668fe5938fd62ad352511ed1a6
Upload date
Uploaded using Trusted Publishing?
What is 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}

Release files / pebbles_core-0.2.0-py3-none-any.whl

Download URL pebbles_core-0.2.0-py3-none-any.whl
Size 42.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f85648c29d82d71de4a24d3f9cf50e76dbfb3794948d7dc68e9d44163057bcca
BLAKE2b-256 checksum
How to use checksums
2932f583602bf1af0dae813e90d09822561f531a4d620ba96fa5fc139a59b2d6
Upload date
Uploaded using Trusted Publishing?
What is 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}

Security for pebbles-core 0.2.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page