Deploy NewsBlur

RSS reader that learns which stories you want to read

Deploy NewsBlur

Just deployed

mongodb

mongo:5.0

Just deployed

/data/db

Just deployed

Just deployed

/var/lib/postgresql/data

Just deployed

/usr/share/elasticsearch/data

Just deployed

/data

Deploy and Host NewsBlur on Railway

NewsBlur is a personal news reader that learns what you want to read. It pulls your RSS and Atom subscriptions, shows each story in the original site's layout, and lets you train it on the authors, tags and titles you like or dislike. Developed in the open by Samuel Clay since 2009, it powers newsblur.com and its free mobile apps, and the server is MIT licensed. Self-host NewsBlur for unlimited feeds, a reading history nobody else mines, and a social layer inside your own account.

Deploy NewsBlur on Railway and you get the full production shape. The newsblur service is the public origin, splitting one hostname across three backends: web runs Django under gunicorn, node serves favicons, article extraction and the Socket.IO stream that pushes new stories into an open tab, and imageproxy resizes remote images behind an HMAC signature. tasks runs the Celery worker that fetches your feeds on a timer. Four data services hold the state: Postgres for accounts and subscriptions, mongodb for stories and read states, redis for unread counts, sessions and the queue, and elasticsearch for search.

Diagram of the NewsBlur services deployed on Railway

Getting Started with NewsBlur on Railway

Deploy the template, then open the public URL on the newsblur service. One administrator account is created from NEWSBLUR_ADMIN_USERNAME and NEWSBLUR_ADMIN_PASSWORD — the username defaults to admin and the password is generated at deploy time, so read it from the web service's variables before logging in. It is both a Django administrator (at /admin/) and an ordinary reader account.

The first useful thing to do is add a feed. Click Add + Discover Sites in the sidebar, paste a site or feed URL, and save. Within a minute or two the worker fetches the feed and its recent archive and the story list fills in. Adding two or three sites is the quickest end-to-end health check: a story only appears once PostgreSQL, MongoDB, Redis and the worker have each done their part. Then open a story and use the Train control, or switch between the Feed, Text and Story views.

Registration is open by default, which is what makes NewsBlur's social side work. To approve people yourself, set NEWSBLUR_AUTO_ENABLE_NEW_USERS to false on web and tasks; accounts are then inactive until enabled in the Django admin.

NewsBlur dashboard listing Hacker News stories and account statistics

Split-view reader showing a Hacker News story beside the feed list

NewsBlur Intelligence Trainer explaining how story filtering is trained

About Hosting NewsBlur

Most feed readers give you headlines and stop there. NewsBlur's idea is training: a thumbs-up or thumbs-down on any author, tag or title teaches a per-feed classifier, and over a few weeks the intelligence slider becomes a real filter.

Key features:

  • Intelligence training on titles, authors, tags and feeds
  • Original site view rendering the publisher's page beside the text
  • Full-text search across every story in every feed you subscribe to
  • Saved stories and tags, plus saved searches that act like feeds
  • Shared stories and blurblogs with per-story privacy
  • Story change tracking, showing how a post was edited after publishing
  • Email newsletters and YouTube channels as real subscriptions
  • A documented HTTP API and free iOS, macOS and Android apps

The multi-service shape matters: feed fetching is expensive and runs on its own schedule, so it belongs on tasks rather than inside a request, and article extraction and favicons are Node programs upstream ships separately — a slow crawl never blocks a reader.

Why Deploy NewsBlur on Railway

Railway runs the whole topology from one template, with no manual wiring.

  • Nine services, four volumes and the private network configured for you
  • PostgreSQL, MongoDB, Redis and Elasticsearch come up alongside the app
  • The public hostname is issued at deploy time and injected where needed
  • Migrations, the site record and the first administrator run on first boot
  • Scale the web and worker tiers without redeploying

Common Use Cases

  • A private reader for a few hundred feeds, with no per-feed pricing
  • A shared team reader, with blurblogs as an internal link digest
  • A research archive of tagged saved stories, searchable for years
  • A programmable feed backend for dashboards or alerts, through the HTTP API

Dependencies for NewsBlur

  • newsblurcaddy:2-alpine, the public origin routing one hostname to three backends
  • web — Django on gunicorn, from newsblur/newsblur_python3 plus the upstream source
  • tasks — the same image running celery worker -B: fetching, indexing, scheduled jobs
  • node — Node servers from newsblur/newsblur_node: favicons, text extraction, Socket.IO
  • imageproxyghcr.io/willnorris/imageproxy:latest, signature-gated image resizing
  • Postgres — accounts, feeds, subscriptions and classifiers
  • mongodbmongo:5.0, stories, read states, feed pages and site icons
  • redisredis:8-alpine, unread counts, story hashes, sessions, Celery broker
  • elasticsearchelasticsearch:7.17.28, the feed, story and discovery indices

Environment Variables Reference

VariableServicePurpose
NEWSBLUR_URLweb, tasksPublic base URL; drives cookies and links
SECRET_KEYweb, tasksDjango signing key; changing it logs everyone out
IMAGES_SECRET_KEYweb, tasksHMAC key for proxied images; matches IMAGEPROXY_SIGNATUREKEY
NEWSBLUR_ADMIN_USERNAME / _PASSWORDwebFirst administrator, created once
NEWSBLUR_AUTO_ENABLE_NEW_USERSweb, tasksfalse makes new signups inactive
NEWSBLUR_DAYS_OF_UNREADweb, tasksHow long unread stories are retained
GUNICORN_WORKERSwebWeb worker processes; raise with memory
OPENAI_API_KEYweb, tasksOptional; related-site discovery and AI summaries
EMAIL_HOSTweb, tasksOptional SMTP relay for password resets

Deployment Dependencies

Hardware Requirements for Self-Hosting NewsBlur

ResourceMinimumRecommended
CPU2 vCPU total4+ vCPU
RAM4 GB total8 GB total (Elasticsearch wants 1 GB)
Storage5 GB per volume10 GB+ for MongoDB as the archive grows
RuntimePython 3.9, Node 22Same, pinned by the images

MongoDB grows fastest, since every story body lives there for the retention window. Elasticsearch sets the memory floor; its heap is capped at 1 GB, raised with ES_JAVA_OPTS.

Self-Hosting NewsBlur

Upstream ships a Docker Compose environment; running it gives a local instance at https://localhost:

git clone https://github.com/samuelclay/NewsBlur.git
cd NewsBlur
make

Configuration is a Python settings file, not a .env. Create newsblur_web/local_settings.py to override the shipped docker_local_settings.py:

NEWSBLUR_URL = "https://reader.example.com"
SESSION_COOKIE_DOMAIN = None
AUTO_ENABLE_NEW_USERS = False
DAYS_OF_UNREAD = 60

The Railway template does the same from environment variables, so no file needs editing.

Is NewsBlur Free to Self-Host?

NewsBlur's server is MIT licensed and free to run, with no feature gates, seat limits or licence key in the self-hosted build. The hosted newsblur.com service is free for 64 sites with paid tiers above that; none of that applies to your instance, where the template puts every account on the premium feature level. On Railway you pay only for the compute and storage the nine services use.

FAQ

What is NewsBlur? An open-source RSS and Atom reader with intelligence training, full-text search, an original-site view and a social layer of shared stories and blurblogs. MIT licensed.

What does this Railway template deploy? Nine services: a Caddy origin, the Django app, a Celery worker, NewsBlur's Node servers, an image proxy, PostgreSQL, MongoDB, Redis and Elasticsearch — with volumes, networking and the first administrator configured.

Why does NewsBlur need four different databases? Each holds something different: PostgreSQL for accounts and subscriptions, MongoDB for story bodies and read states (which grow far faster), Redis for unread counts, sessions and the queue, Elasticsearch for search. Upstream runs the same four in production.

How do I log in the first time after deploying NewsBlur? Open the public URL and sign in with NEWSBLUR_ADMIN_USERNAME and NEWSBLUR_ADMIN_PASSWORD from the web service's variables.

Can I stop other people from registering on my instance? Yes. Set NEWSBLUR_AUTO_ENABLE_NEW_USERS to false on web and tasks; new signups are then inactive until you enable them from /admin/. To import an existing OPML file, use Import sites in the account menu.

Do I need an OpenAI API key to run self-hosted NewsBlur? No. Reading, training, search and sharing all work without one. OPENAI_API_KEY additionally enables the related-sites recommender and AI summaries.


Template Content

More templates in this category

View Template
Rocky Linux
Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀

codestorm
47
View Template
Foundry Virtual Tabletop
A Self-Hosted & Modern Roleplaying Platform

Lucas
71
View Template
Letta Code Remote
Run a Letta Code agent 24/7. No inbound ports, just deploy.

Letta
50