Update: This blog now has its own feeds here (ATOM) and here (RSS).


I recently set up a self-hosted RSS/ATOM feed aggregator on my personal server. My reasons for doing so:

  1. A nice technical project that could be completed within a day.
  2. Independence from similar 3rd-party services.
  3. Go all in on a new (and rather retro!) way of exploring the web.
  4. More easily follow specific people's blogs and other interesting content sources.
  5. No opaque algorithmic recommendations or advertising.
  6. Re-focus my online information intake to long-form reads.
  7. Re-discover the "blogosphere".

On point number two, other services are also (likely) data brokers tracking my browsing behavior to sell, especially if they're free—and often even if they're paid for. And with all the noise around Twitter's public implosion, I was reminded of how such services are ultimately at the whim of people far removed from my interests. An infamous historical example before my time: Google Reader was an admired product back in the 2000s, and Google simply killed it. Such a sudden disappearance could happen to Feedly, the RSS reader I was using before. Feedly also distracts by injecting "sponsored content" (aka, ads) into my primary feed, which was another strike against it vis-a-vie point number five.

Many of the remaining reasons communicate a more positive motivation, however: To surf the web in a more intentional way, one that requires explicit opt-in, rather than being passively inundated with content from all the irrelevant yet perniciously attention-grabbing online equivalents of carnival sideshows.

Some criteria for what I wanted to build:

After searching around for some open-source readers, I ultimately settled on Miniflux for its "minimalist and opinionated" design philosophy. I use Microflux for mobile reading.

The documentation is decent and has enough to give a skeleton of how to use it with Docker. (To see my docker compose configuration file, see the end of this post.) Since I necessarily need to login to the reader, I reverse proxy it using Caddy, which gives me auto-HTTPS (also now the case with this blog!) for a basic level of security.

I have a slew of sites I'm following, with many more added since I spun up my own aggregator. Here's a select few as recommendations:

I also follow the blogs of some people I know or have met. All of them have had at least one post of their's go viral, so it's pretty cool to have been personally acquainted with individuals who have experienced their 15 minutes of internet fame (the good kind). There is also something to be said of following content from specific individuals: When someone has a sense of ownership over their site and writings, conferred when no organization or bureaucracy exists as an intermediary (e.g. The New York Times), the content delivered is—or at least feels—more authentic and idiosyncratic. It's pretty refreshing. It's not surprising to me then why individual journalists and writers garner large followings on personal blogging platforms like Substack.

As a natural follow-up project, I plan to create a feed for this blog. But more importantly, I want to more regularly write. My cadence of writing has been incredibly sluggish, compared to previous eras of my life. The reasons for why are varied, from reasonable tradeoffs in favor of other (also loved) hobbies, to obsessively and unnecessarily spending time on small technical tweaks to the site.

All that said, I'm feeling a strong desire to resume a regular writing practice. Here's to a new year of blogging!


Personal configuration file for docker compose:

version: '3.4' services: miniflux: image: miniflux/miniflux:2.0.40 container_name: miniflux restart: always ports: - ${READER_PORT}:8080 depends_on: - miniflux-pg environment: - DATABASE_URL="postgres://${READER_DB_USER}:${READER_DB_PASS}@miniflux-pg/${READER_DB}?sslmode=disable" - RUN_MIGRATIONS=1 - CREATE_ADMIN=1 - ADMIN_USERNAME=${READER_ADMIN_USER} - ADMIN_PASSWORD=${READER_ADMIN_PASS} - DEBUG=1 miniflux-pg: image: postgres:15 container_name: postgres environment: - POSTGRES_DB=${READER_DB} - POSTGRES_USER=${READER_DB_USER} - POSTGRES_PASSWORD=${READER_DB_PASS} volumes: - miniflux-db:"/var/lib/postgresql/data" healthcheck: test: ["CMD", "pg_isready", "-U", "${READER_DB_USER}"] interval: 10s start_period: 30s volumes: miniflux-db: