My attempt at an RSS aggregator
  • Elixir 92.7%
  • HTML 5.1%
  • JavaScript 0.8%
  • CSS 0.8%
  • Dockerfile 0.5%
  • Other 0.1%
Find a file
2026-01-24 19:40:43 -05:00
.cog chore: setup workflows & cog 2026-01-03 08:16:34 -05:00
.github/workflows ci: fix changelog extraction for gh releases 2026-01-03 14:28:02 -05:00
assets fix: reset scroll of article view on change 2026-01-24 09:05:38 -05:00
config fix(greader): ID parsing issue causing test failure 2026-01-24 19:40:18 -05:00
docker fix: configurable from email, fix examples to handle url env vars with 2026-01-03 14:00:35 -05:00
docs fix: Google Reader API compatibility and API password UI improvements 2026-01-21 12:58:40 -05:00
lib chore: formatting 2026-01-24 19:40:43 -05:00
priv feat: Google Reader API 2026-01-20 21:38:24 -05:00
rel/overlays/bin chore: setup for container building 2026-01-02 13:58:13 -05:00
test chore: formatting 2026-01-24 19:40:43 -05:00
.dockerignore chore: setup for container building 2026-01-02 13:58:13 -05:00
.env.docker.example fix: configurable from email, fix examples to handle url env vars with 2026-01-03 14:00:35 -05:00
.env.example fix: configurable from email, fix examples to handle url env vars with 2026-01-03 14:00:35 -05:00
.formatter.exs feat: skeleton of app & plan docs 2025-12-30 09:22:49 -05:00
.gitignore fix: configurable from email, fix examples to handle url env vars with 2026-01-03 14:00:35 -05:00
AGENTS.md chore: attempt to reduce stupidity in AI 2026-01-03 08:33:57 -05:00
CHANGELOG.md chore: bump version to 0.2.0 2026-01-24 09:06:07 -05:00
cog.toml chore: setup workflows & cog 2026-01-03 08:16:34 -05:00
Dockerfile fix: inability to configure mailer fix: lack of inconsistent docs/naming 2026-01-03 13:37:03 -05:00
mise.toml fix: failures on SQLite & MySQL, also some missed formatting 2026-01-02 10:32:37 -05:00
mix.exs chore: bump version to 0.2.0 2026-01-24 09:06:07 -05:00
mix.lock fix: feed scheduler worker with SQL error 2026-01-20 20:31:01 -05:00
README.md fix: configurable from email, fix examples to handle url env vars with 2026-01-03 14:00:35 -05:00

FuzzyRss

My attempt at an RSS aggregator more in line with what I'd like to see in one.

FuzzyRss Screenshot

Features

  • Lightweight, fast, and easy to use
  • Import/export feeds (OPML) & starred articles (JSON)
  • Dual reader layout options, vertical or 3 pane horizontal
  • MySQL/MariaDB, PostgreSQL, & SQLite support for DB

Getting Started

# Quick start with PostgreSQL
docker compose -f docker/postgres.yml up

# Or choose a different database
docker compose -f docker/mariadb.yml up
docker compose -f docker/sqlite.yml up

The app will be available at http://localhost:4000

To configure mail: See docker/README.md or copy .env.docker.example to .env and edit.

Local Development

Requires Elixir 1.19 & Erlang OTP 28 installed.

mix deps.get
mix ecto.setup
mix phx.server

Configuration

All configuration is done via environment variables. See .env.example for a complete list.

Server

PHX_HOST=example.com               # Hostname for URLs (required for production)
PORT=4000                          # Internal port to listen on (default: 4000)
SECRET_KEY_BASE=...                # Secret key (generate with: mix phx.gen.secret)

# Optional (for TLS-terminating proxy setups)
PHX_URL_SCHEME=https               # URL scheme (default: https)
PHX_URL_PORT=443                   # External port (default: 443)
CHECK_ORIGIN=                      # WebSocket origin check (default: matches PHX_HOST)

Database

DATABASE_ADAPTER=sqlite            # sqlite, postgresql, or mysql (default: sqlite)

# SQLite (default)
SQLITE_DATABASE_URL=/path/to/db.db

# PostgreSQL
POSTGRES_DATABASE_URL=ecto://user:pass@host/dbname
# or use DATABASE_URL for auto-detection
DATABASE_URL=ecto://user:pass@host/dbname

# MySQL
MYSQL_DATABASE_URL=mysql://user:pass@host/dbname
# or use DATABASE_URL for auto-detection
DATABASE_URL=mysql://user:pass@host/dbname

# Optional
POOL_SIZE=10                       # Connection pool size (default: 10)
DATABASE_SSL=false                 # Enable SSL for database (default: false)

Mail

MAIL_ADAPTER=local                 # local, smtp, mailgun, sendgrid, postmark, gmail
MAIL_FROM_NAME=FuzzyRss            # Sender name (default: FuzzyRss)
MAIL_FROM_EMAIL=noreply@example.com # Sender email (required for production)

# SMTP (any SMTP provider)
MAIL_SMTP_RELAY=smtp.example.com
MAIL_SMTP_USERNAME=username
MAIL_SMTP_PASSWORD=password
MAIL_SMTP_PORT=587                 # Optional (default: 587)
MAIL_SMTP_TLS=always              # Optional: always, never, if_available
MAIL_SMTP_SSL=false               # Optional: use SSL instead of TLS
MAIL_SMTP_AUTH=always             # Optional: always, never, if_available
MAIL_SMTP_RETRIES=1               # Optional (default: 1)

# Mailgun
MAIL_MAILGUN_API_KEY=key-xxx
MAIL_MAILGUN_DOMAIN=mg.example.com
MAIL_MAILGUN_BASE_URL=...         # Optional: for EU region

# SendGrid
MAIL_SENDGRID_API_KEY=SG.xxx

# Postmark
MAIL_POSTMARK_API_KEY=xxx

# Gmail API (OAuth2)
MAIL_GMAIL_ACCESS_TOKEN=ya29.xxx

Authentication

DISABLE_MAGIC_LINK=false           # Disable magic link auth (default: false)
SIGNUP_ENABLED=true                # Allow signups (default: true, false = one-time signup)

# OIDC (optional)
OIDC_ENABLED=false
OIDC_CLIENT_ID=...
OIDC_CLIENT_SECRET=...
OIDC_DISCOVERY_URL=...

TODO

  • OIDC support
  • APIs
  • Mobile/PWA support