Skip to main content

rss2socials

PyPI version Python versions Build Status Coverage Status License: MIT Downloads

rss2socials is a modular Python CLI tool that automatically posts new entries from an RSS or Atom feed to one or more social media platforms. It is designed to be easily extensible, robust, and safe for automation and CI/CD workflows.

Features

  • Dynamic connector system: Add new social media platforms by simply dropping a connector module in src/rss2socials/connector/.
  • Automatic deduplication: Tracks posted links to avoid reposting.
  • OpenAI-powered summaries: Generates concise, platform-appropriate summaries for each post.
  • Flexible CLI: Configure via command-line arguments or environment variables.
  • Comprehensive logging: Supports configurable log levels for debugging and automation.
  • Tested and maintainable: 100% test coverage for core modules, with robust error handling.

Installation

From PyPI

pip install rss2socials

From Source (Recommended for Development)

Clone the repository and install all dependencies (main + dev) using pip-tools and a pinned requirements file for reproducibility:

git clone https://github.com/ugns/rss2socials.git
cd rss2socials
pip install pip-tools
pip-compile --extra dev --strip-extras --output-file=requirements.txt pyproject.toml
pip install -r requirements.txt
  • This will install the package in editable mode along with all development tools (pytest, flake8, etc.).
  • You can also use make dev to automate these steps.

Requirements

  • Python 3.9 or newer is required.

Usage

Using the CLI Entrypoint

After installation, you can use the CLI entrypoint (if installed from PyPI or with pip):

rss2socials --feed-url https://example.com/feed.xml --platform bluesky

Or, if you prefer to use the Python module directly:

python -m rss2socials --feed-url https://example.com/feed.xml --platform bluesky

Both commands are equivalent and will invoke the CLI interface.

As a Library

You can also use rss2socials as a Python library in your own scripts:

from rss2socials.cli import main

# Call main() with sys.argv-style arguments
main([
    "--feed-url", "https://example.com/feed.xml",
    "--platform", "bluesky"
])

CLI Options

  • --feed-url (or FEED_URL env): RSS/Atom feed URL (required)
  • --platform: One or more platforms to post to (default: bluesky; auto-discovers available platforms)
  • --seen-file: File to track posted links (default: seen_rss_posts.txt)
  • --post-age-limit-days: Only post entries newer than this many days (default: 7)
  • --log-level: Logging level (default: INFO)

Dynamic Connector System

To add support for a new social media platform:

  1. Create a new Python file in src/rss2socials/connector/ (e.g., myplatform.py).
  2. Implement a post(summary, link, fetch_page_metadata) function and set a PLATFORM string (e.g., PLATFORM = "myplatform").
  3. Optionally, set MAX_GRAPHEMES for platform-specific length limits.

The CLI will automatically discover and make your platform available as a --platform option. No changes to the core code are required.

Example connector skeleton:

PLATFORM = "myplatform"
MAX_GRAPHEMES = 300

def post(summary, link, fetch_page_metadata):
    # Implement posting logic here
    return True  # Return True if successful

Environment Variables

  • OPENAI_API_KEY: Required for summary generation
  • FEED_URL, SEEN_FILE, POST_AGE_LIMIT_DAYS, LOG_LEVEL, PLATFORM: Optional, override CLI args
  • Connector-specific variables:
    • For Bluesky:
      • BLUESKY_HANDLE: Your Bluesky username (required)
      • BLUESKY_APP_PASSWORD: Your Bluesky app password (required)
    • Other connectors may require their own environment variables; see the connector's documentation or source code for details.

Development & Testing

  • Install all dependencies: make dev
  • Run tests: make test (uses tox for all supported Python versions)
  • Lint: make lint
  • Coverage: make coverage
  • Add new connectors in src/rss2socials/connector/
  • Regenerate constraints after dependency changes: make freeze

License

MIT

Contributing

Contributions are welcome! Please use Conventional Commits and ensure all tests pass before submitting a PR.

Metadata

Release files for rss2socials 1.1.26

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

Source distribution (sdist)

Source distribution for rss2socials 1.1.26
File Size Uploaded
rss2socials-1.1.26.tar.gz 18.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for rss2socials 1.1.26
File Interpreter ABI Platform
rss2socials-1.1.26-py3-none-any.whl Python 3 none any Details

Total release size: 32.5 kB

Release files / rss2socials-1.1.26.tar.gz

Download URL rss2socials-1.1.26.tar.gz
Size 18.9 kB
Tags Source
SHA-256 checksum
How to use checksums
fca817649f61e70ec33b2b1b0c8c0edf848ec829f8731b2a177d2f854e5b95be
BLAKE2b-256 checksum
How to use checksums
c487bf55f65ae856991bce80dd515cc2ac46e1bb13cc994f78aea87444e12fff
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 27, 2026.

Transparency log

Release files / rss2socials-1.1.26-py3-none-any.whl

Download URL rss2socials-1.1.26-py3-none-any.whl
Size 13.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6abc43c88f358a47113648224235a9863f9bfe4ad11ba1aa86cd213c4fd15ffc
BLAKE2b-256 checksum
How to use checksums
389cac0fce3b57717a17bc0429b038bca6c364a1a18453599f98e05bc062eb13
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 27, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.1.26 This release

2 release files

1.1.25

2 release files

1.1.24

2 release files

1.1.23

2 release files

1.1.22

2 release files

1.1.20

2 release files

1.1.19

2 release files

1.1.18

2 release files

1.1.17

2 release files

1.1.16

2 release files

1.1.15

2 release files

1.1.9

2 release files

1.1.8

2 release files

1.1.7

2 release files

1.1.6

2 release files

1.1.5

2 release files

1.1.4

2 release files

1.1.3

2 release files

1.1.2

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.2

2 release files

1.0.1

2 release files

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