Feed + Diarium (Latin for `diary / newspaper` )
Feedarium is an elegant, modern open-source RSS reader built with Laravel and Vue.js. It allows you to subscribe to your favorite websites and blogs, organizing all your reading in one beautiful, distraction-free interface.- Clean, Minimalist Interface: Focus on what matters—your content.
- Feed Management: Easily add, organize, and categorize your RSS feeds.
- Article Filtering & Search: Quickly find the content you're looking for.
- Reading Experience: Comfortable reading view with adjustable text size and theme options.
- Mobile Friendly: Responsive design that works on all your devices.
- Self-Hosted: Own your data and reading habits by hosting Feedarium on your own server.
- PHP 8.4 or higher
- Composer
- Node.js & NPM
- Docker & Docker Compose (for Docker installation)
Feedarium ships with a dev helper script that wraps all Docker Compose commands.
Make it executable once after cloning:
chmod +x dev- Clone the repository
git clone https://github.com/kodorama/feedarium.git
cd feedarium- Build and start the environment
This single command copies .env.example, builds the images, starts all containers,
installs dependencies, generates the application key, and runs the migrations:
./dev build- Access Feedarium
Visit http://localhost:8080 in your browser.
The default port is
8080. Override it by settingNGINX_PORTin your.envfile.
Pass the --pgsql flag to include the PostgreSQL service:
./dev build --pgsqlThen update your .env file to use PostgreSQL:
DB_CONNECTION=pgsql
DB_HOST=pgsql
DB_PORT=5432
DB_DATABASE=feedarium
DB_USERNAME=laravel
DB_PASSWORD=secretPass the --meilisearch flag to include the MeiliSearch service:
./dev build --meilisearchThen set the Scout driver in your .env file:
SCOUT_DRIVER=meilisearch
MEILISEARCH_HOST=http://meilisearch:7700
MEILISEARCH_KEY=masterKeyFlags can be combined:
./dev build --pgsql --meilisearch| Command | Description |
|---|---|
./dev up |
Start all containers (add --pgsql / --meilisearch as needed) |
./dev down |
Stop and remove all containers |
./dev workspace |
Open a bash shell inside the app container |
- Clone the repository
git clone https://github.com/kodorama/feedarium.git
cd feedarium- Install dependencies
composer install
npm install- Copy the environment file and generate key
cp .env.example .env
php artisan key:generate- Set up the database
Configure your database connection in the .env file, then run:
php artisan migrate- Build assets
npm run build- Start the development server
php artisan serve- Access Feedarium
Visit http://localhost:8000 in your browser.
The GitHub Actions workflow automatically builds a single, self-contained image and pushes it to the GitHub Container Registry on every published GitHub Release.
The image bundles nginx, PHP-FPM, the queue worker, and the task scheduler in one container managed by supervisord. You do not need to clone the repository — just paste one of the compose snippets below.
The container's entrypoint performs these steps automatically before supervisord starts the web server:
- Creates writable
storage/andbootstrap/cache/directory scaffolding inside any mounted volumes (Docker volumes start empty). - Generates and persists
APP_KEYtostorage/app_keyinside the storage volume ifAPP_KEYis not set in the environment — the key survives container upgrades. - Runs
php artisan migrate --force(retries up to 15× to wait for slow-starting databases). - Runs
php artisan config:cache,route:cache, andview:cachefor production performance. - When
SCOUT_DRIVER=meilisearch, runsphp artisan scout:sync-index-settingsto configure filterable and sortable attributes automatically.
Variable substitution: all environment values use
${VAR:-default}syntax. In Portainer, CasaOS, or a.envfile next to yourcompose.yml, set only the variables you want to override — everything else falls back to the shown defaults.
APP_KEYhas no default and must be set explicitly. Generate one with:docker run --rm ghcr.io/kodorama/feedarium:latest \ php artisan key:generate --show
services:
app:
image: ghcr.io/kodorama/feedarium:latest
restart: unless-stopped
ports:
- "${APP_PORT:-8080}:80"
environment:
APP_KEY: "${APP_KEY:-}"
APP_URL: "${APP_URL:-http://YOUR_SERVER_IP:8080}"
DB_CONNECTION: "${DB_CONNECTION:-sqlite}"
REDIS_HOST: "${REDIS_HOST:-redis}"
volumes:
- feedarium-storage:/var/www/html/storage # logs, sessions, view cache
- feedarium-db:/var/www/html/database # SQLite database file
depends_on:
- redis
redis:
image: redis:alpine
restart: unless-stopped
volumes:
- feedarium-redis:/data
volumes:
feedarium-storage:
feedarium-db:
feedarium-redis:services:
app:
image: ghcr.io/kodorama/feedarium:latest
restart: unless-stopped
ports:
- "${APP_PORT:-8080}:80"
environment:
APP_KEY: "${APP_KEY:-}"
APP_URL: "${APP_URL:-http://YOUR_SERVER_IP:8080}"
DB_CONNECTION: "${DB_CONNECTION:-pgsql}"
DB_HOST: "${DB_HOST:-postgres}"
DB_PORT: "${DB_PORT:-5432}"
DB_DATABASE: "${DB_DATABASE:-feedarium}"
DB_USERNAME: "${DB_USERNAME:-feedarium}"
DB_PASSWORD: "${DB_PASSWORD:-change-me}"
REDIS_HOST: "${REDIS_HOST:-redis}"
volumes:
- feedarium-storage:/var/www/html/storage
depends_on:
- postgres
- redis
postgres:
image: postgres:15-alpine
restart: unless-stopped
environment:
POSTGRES_DB: "${DB_DATABASE:-feedarium}"
POSTGRES_USER: "${DB_USERNAME:-feedarium}"
POSTGRES_PASSWORD: "${DB_PASSWORD:-change-me}"
volumes:
- feedarium-pgsql:/var/lib/postgresql/data
redis:
image: redis:alpine
restart: unless-stopped
volumes:
- feedarium-redis:/data
volumes:
feedarium-storage:
feedarium-pgsql:
feedarium-redis:Append the meilisearch service to either compose file above and add the
corresponding environment variables to the app service.
Additional service:
meilisearch:
image: getmeili/meilisearch:v1.8
restart: unless-stopped
environment:
MEILI_MASTER_KEY: "${MEILISEARCH_KEY:-change-me-meilisearch-key}"
MEILI_ENV: production
volumes:
- feedarium-meilisearch:/meili_dataAdditional app environment variables:
SCOUT_DRIVER: "${SCOUT_DRIVER:-meilisearch}"
MEILISEARCH_HOST: "${MEILISEARCH_HOST:-http://meilisearch:7700}"
MEILISEARCH_KEY: "${MEILISEARCH_KEY:-change-me-meilisearch-key}"Additional volume:
feedarium-meilisearch:MeiliSearch index settings are synced automatically on every container start. You can also trigger a manual sync from the Admin → Settings → Search Index panel.
A single ready-to-paste compose file that combines Options B and C.
services:
app:
image: ghcr.io/kodorama/feedarium:latest
restart: unless-stopped
ports:
- "${APP_PORT:-8080}:80"
environment:
APP_KEY: "${APP_KEY:-}"
APP_URL: "${APP_URL:-http://YOUR_SERVER_IP:8080}"
DB_CONNECTION: "${DB_CONNECTION:-pgsql}"
DB_HOST: "${DB_HOST:-postgres}"
DB_PORT: "${DB_PORT:-5432}"
DB_DATABASE: "${DB_DATABASE:-feedarium}"
DB_USERNAME: "${DB_USERNAME:-feedarium}"
DB_PASSWORD: "${DB_PASSWORD:-change-me}"
REDIS_HOST: "${REDIS_HOST:-redis}"
SCOUT_DRIVER: "${SCOUT_DRIVER:-meilisearch}"
MEILISEARCH_HOST: "${MEILISEARCH_HOST:-http://meilisearch:7700}"
MEILISEARCH_KEY: "${MEILISEARCH_KEY:-change-me-meilisearch-key}"
volumes:
- feedarium-storage:/var/www/html/storage
depends_on:
- postgres
- redis
- meilisearch
postgres:
image: postgres:15-alpine
restart: unless-stopped
environment:
POSTGRES_DB: "${DB_DATABASE:-feedarium}"
POSTGRES_USER: "${DB_USERNAME:-feedarium}"
POSTGRES_PASSWORD: "${DB_PASSWORD:-change-me}"
volumes:
- feedarium-pgsql:/var/lib/postgresql/data
redis:
image: redis:alpine
restart: unless-stopped
volumes:
- feedarium-redis:/data
meilisearch:
image: getmeili/meilisearch:v1.8
restart: unless-stopped
environment:
MEILI_MASTER_KEY: "${MEILISEARCH_KEY:-change-me-meilisearch-key}"
MEILI_ENV: production
volumes:
- feedarium-meilisearch:/meili_data
volumes:
feedarium-storage:
feedarium-pgsql:
feedarium-redis:
feedarium-meilisearch:MeiliSearch index settings are synced automatically on every container start. To import existing articles into the index after first deploy, use the Admin → Settings → Search Index → Import All Articles button.
Pull the new image and recreate the container. The entrypoint will automatically run any new migrations.
docker compose pull
docker compose up -dThe workflow at .github/workflows/docker-publish.yml builds and pushes the image
automatically.
| Trigger | Image tags produced |
|---|---|
GitHub Release published (e.g. v20260406, v20260406-1) |
:20260406 / :20260406-1, :latest |
Manual (workflow_dispatch) |
same as release |
Builds target linux/amd64 and linux/arm64 so the image runs on both
x86 servers and ARM boards (Raspberry Pi, Odroid, etc.).
No secrets need to be configured — the workflow uses the built-in
GITHUB_TOKEN to authenticate with GHCR.
./dev upTo open a shell inside the app container:
./dev workspaceAll artisan, composer, and npm commands can be run from within that shell.
./dev workspace
php artisan test --compactvendor/bin/pint --dirtycomposer require --dev phpstan/phpstan
./vendor/bin/phpstan analyseContributions are welcome and greatly appreciated!
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/amazing-feature) - Commit your Changes (
git commit -m 'Add some amazing feature') - Push to the Branch (
git push origin feature/amazing-feature) - Open a Pull Request
Distributed under the GNU Affero General Public License v3.0 (AGPL-3.0). See LICENSE for more information.
- GitHub Issues for bug reports and feature requests
- GitHub Discussions for community support and ideas
Made with ❤️ by the Feedarium community