My attempt at an RSS aggregator
- Elixir 92.7%
- HTML 5.1%
- JavaScript 0.8%
- CSS 0.8%
- Dockerfile 0.5%
- Other 0.1%
| .cog | ||
| .github/workflows | ||
| assets | ||
| config | ||
| docker | ||
| docs | ||
| lib | ||
| priv | ||
| rel/overlays/bin | ||
| test | ||
| .dockerignore | ||
| .env.docker.example | ||
| .env.example | ||
| .formatter.exs | ||
| .gitignore | ||
| AGENTS.md | ||
| CHANGELOG.md | ||
| cog.toml | ||
| Dockerfile | ||
| mise.toml | ||
| mix.exs | ||
| mix.lock | ||
| README.md | ||
FuzzyRss
My attempt at an RSS aggregator more in line with what I'd like to see in one.
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
Docker (Recommended)
# 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_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
