fedi feed router is a self-hosted tool for routing content from RSS/Atom feeds to the fediverse.
Find a file
2025-07-10 11:01:01 +02:00
.github/workflows Fresh Laravel + Sail install 2025-06-29 08:50:03 +02:00
app Add enable/disable 2025-07-10 11:01:01 +02:00
bootstrap Consolidate containers, set up horizon 2025-07-05 01:10:54 +02:00
config Add tests + clean up front end assets 2025-07-06 10:21:42 +02:00
database Add enable/disable 2025-07-10 11:01:01 +02:00
docker Consolidate containers, set up horizon 2025-07-05 01:10:54 +02:00
public Fresh Laravel + Sail install 2025-06-29 08:50:03 +02:00
resources Add enable/disable 2025-07-10 11:01:01 +02:00
routes Add enable/disable 2025-07-10 11:01:01 +02:00
storage Fresh Laravel + Sail install 2025-06-29 08:50:03 +02:00
tests Raise PHPStan level tp 7 2025-07-07 02:48:46 +02:00
.dockerignore Fix compose issues 2025-07-03 21:16:57 +02:00
.editorconfig Fresh Laravel + Sail install 2025-06-29 08:50:03 +02:00
.env.example Add updated at timestamp 2025-06-29 17:13:18 +02:00
.gitattributes Fresh Laravel + Sail install 2025-06-29 08:50:03 +02:00
.gitignore Consolidate containers, set up horizon 2025-07-05 01:10:54 +02:00
.prettierignore Fresh Laravel + Sail install 2025-06-29 08:50:03 +02:00
.prettierrc Fresh Laravel + Sail install 2025-06-29 08:50:03 +02:00
artisan Fresh Laravel + Sail install 2025-06-29 08:50:03 +02:00
components.json Fresh Laravel + Sail install 2025-06-29 08:50:03 +02:00
composer.json Set up PHPStan 2025-07-06 10:53:37 +02:00
docker-compose.yml Add factories 2025-07-06 01:35:59 +02:00
Dockerfile Consolidate containers, set up horizon 2025-07-05 01:10:54 +02:00
eslint.config.js Fresh Laravel + Sail install 2025-06-29 08:50:03 +02:00
package.json Add tests + clean up front end assets 2025-07-06 10:21:42 +02:00
phpstan.neon Raise PHPStan level tp 7 2025-07-07 02:48:46 +02:00
phpunit.xml Fresh Laravel + Sail install 2025-06-29 08:50:03 +02:00
README.md Update for name change 2025-07-09 22:04:11 +02:00
tsconfig.json Fresh Laravel + Sail install 2025-06-29 08:50:03 +02:00
vite.config.js Add tests + clean up front end assets 2025-07-06 10:21:42 +02:00
vite.config.ts Fresh Laravel + Sail install 2025-06-29 08:50:03 +02:00

Lemmy Poster

ffr is a self-hosted tool for routing content from RSS/Atom feeds to the fediverse.

It watches feeds, matches entries based on keywords or rules, and publishes them to platforms like Lemmy, Mastodon, or anything ActivityPub-compatible.

📰🔍🌐

Features

  • Keyword-based routing from any RSS/Atom feed
  • Publish to Lemmy, Mastodon, or other fediverse services
  • YAML or JSON route configs
  • CLI and/or daemon mode
  • Self-hosted, privacy-first, no SaaS dependencies

Docker Deployment

Building the Image

docker build -t your-registry/lemmy-poster:latest .
docker push your-registry/lemmy-poster:latest

Docker Compose

Create a docker-compose.yml file:

services:
  app-web:
    image: your-registry/lemmy-poster:latest
    command: ["web"]
    ports:
      - "8000:8000"
    environment:
      - DB_DATABASE=${DB_DATABASE}
      - DB_USERNAME=${DB_USERNAME}
      - DB_PASSWORD=${DB_PASSWORD}
      - LEMMY_INSTANCE=${LEMMY_INSTANCE}
      - LEMMY_USERNAME=${LEMMY_USERNAME}
      - LEMMY_PASSWORD=${LEMMY_PASSWORD}
      - LEMMY_COMMUNITY=${LEMMY_COMMUNITY}
    depends_on:
      - mysql
    volumes:
      - storage_data:/var/www/html/storage/app
    restart: unless-stopped

  app-queue:
    image: your-registry/lemmy-poster:latest
    command: ["queue"]
    environment:
      - DB_DATABASE=${DB_DATABASE}
      - DB_USERNAME=${DB_USERNAME}
      - DB_PASSWORD=${DB_PASSWORD}
      - LEMMY_INSTANCE=${LEMMY_INSTANCE}
      - LEMMY_USERNAME=${LEMMY_USERNAME}
      - LEMMY_PASSWORD=${LEMMY_PASSWORD}
      - LEMMY_COMMUNITY=${LEMMY_COMMUNITY}
    depends_on:
      - mysql
    volumes:
      - storage_data:/var/www/html/storage/app
    restart: unless-stopped

  mysql:
    image: mysql:8.0
    command: --host-cache-size=0 --innodb-use-native-aio=0 --sql-mode=STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION --log-error-verbosity=1
    environment:
      - MYSQL_DATABASE=${DB_DATABASE}
      - MYSQL_USER=${DB_USERNAME}
      - MYSQL_PASSWORD=${DB_PASSWORD}
      - MYSQL_ROOT_PASSWORD=${DB_PASSWORD}
      - TZ=UTC
    volumes:
      - mysql_data:/var/lib/mysql
    restart: unless-stopped

volumes:
  mysql_data:
  storage_data:

Environment Variables

Create a .env file with:

# Database Settings
DB_DATABASE=lemmy_poster
DB_USERNAME=lemmy_user
DB_PASSWORD=your-password

# Lemmy Settings
LEMMY_INSTANCE=your-lemmy-instance.com
LEMMY_USERNAME=your-lemmy-username
LEMMY_PASSWORD=your-lemmy-password
LEMMY_COMMUNITY=your-target-community

Deployment

  1. Build and push the image to your registry
  2. Copy the docker-compose.yml to your server
  3. Create the .env file with your environment variables
  4. Run: docker compose up -d

The application will automatically:

  • Wait for the database to be ready
  • Run database migrations on first startup
  • Start the queue worker after migrations complete
  • Handle race conditions between web and queue containers

Initial Setup

After deployment, the article refresh will run every hour. To trigger the initial article fetch manually:

docker compose exec app-web php artisan article:refresh

The application will then automatically:

  • Fetch new articles every hour
  • Publish valid articles every 5 minutes
  • Sync community posts every 10 minutes

The web interface will be available on port 8000.

Architecture

The application uses a multi-container setup:

  • app-web: Serves the Laravel web interface and handles HTTP requests
  • app-queue: Processes background jobs (article fetching, Lemmy posting)
  • mysql: Database storage for articles, logs, and application data

Both app containers use the same Docker image but with different commands (web or queue). Environment variables are passed from your .env file to configure database access and Lemmy integration.