Linkding + Miniflux: A Self-Hosted Read-It-Later Stack

RSS for discovery, bookmarks for storage. Two self-hosted tools that replace Pocket, Instapaper, and Feedly in a workflow that feeds reading data into a personal analytics dashboard.

Linkding + Miniflux: A Self-Hosted Read-It-Later Stack

The modern web has a reading problem. You find an article worth reading, but you are in a meeting. You save it to a browser tab, and it joins the graveyard of 47 other tabs. You email it to yourself, and it drowns in your inbox. You add it to a "Read Later" bookmark folder that you never open.

I solved this with two self-hosted tools that work together: Miniflux for discovering content via RSS, and Linkding for saving and organizing it. Together, they replace Pocket, Instapaper, Feedly, and Raindrop in a workflow that is entirely self-hosted and feeds reading data into my personal analytics dashboard.

The Workflow

  1. Discover in Miniflux. My 60 RSS feeds surface articles from sources I trust. I scroll through them during morning coffee.
  2. Read now or save for later. If I have time, I read the article directly in Miniflux (it has a clean reader view). If not, I save it to Linkding.
  3. Save to Linkding. One click via the browser extension adds the URL, title, and description. I add tags (kubernetes, security, career, cooking) and optionally archive the full page content.
  4. Read later from Linkding. The "unread" filter shows everything I saved but have not read. After reading, I mark it as read or archive it for future reference.
  5. Track via Life Hub. The Miniflux collector captures what I read (articles marked as read in Miniflux). Linkding bookmarks are accessible via its API for future integration.

The key insight is that discovery and storage are different activities that benefit from different tools. Miniflux is optimized for scanning many items quickly (keyboard shortcuts, mark-all-as-read, minimal UI). Linkding is optimized for organizing and retrieving saved items (full-text search, tags, archiving).

Linkding on Kubernetes

apiVersion: apps/v1
kind: Deployment
metadata:
  name: linkding
  namespace: linkding
spec:
  replicas: 1
  template:
    spec:
      securityContext:
        runAsNonRoot: true
        runAsUser: 1000
      containers:
      - name: linkding
        image: sissbruecker/linkding:1.36.0
        ports:
        - containerPort: 9090
        env:
        - name: LD_SUPERUSER_NAME
          value: admin
        - name: LD_ENABLE_OIDC
          value: "True"
        - name: OIDC_OP_AUTHORIZATION_ENDPOINT
          value: https://auth.naviauxlab.com/application/o/authorize/
        - name: OIDC_OP_TOKEN_ENDPOINT
          value: https://auth.naviauxlab.com/application/o/token/
        - name: OIDC_OP_USER_ENDPOINT
          value: https://auth.naviauxlab.com/application/o/userinfo/
        - name: OIDC_RP_CLIENT_ID
          valueFrom:
            secretKeyRef:
              name: linkding-oidc
              key: client-id
        - name: OIDC_RP_CLIENT_SECRET
          valueFrom:
            secretKeyRef:
              name: linkding-oidc
              key: client-secret
        volumeMounts:
        - name: data
          mountPath: /etc/linkding/data
        resources:
          requests:
            cpu: 25m
            memory: 64Mi
          limits:
            cpu: 200m
            memory: 128Mi

Linkding is lightweight: a Django application backed by SQLite. It uses about 50 MB of RAM at idle. The OIDC integration with Authentik works well here (unlike Mealie's), auto-creating users on first login.

OIDC That Actually Works

Linkding's OIDC implementation is one of the better ones I have encountered in self-hosted software. It uses the standard Django OIDC library, which handles token refresh, session management, and user provisioning correctly. I configured it with explicit endpoint URLs rather than the discovery URL (Linkding supports both), which made debugging easier.

The redirect loop issue I documented in an earlier post? That was Linkding. The fix was ensuring the OIDC_RP_SIGN_ALGO matched Authentik's token signing algorithm (RS256) and that the cookie domain covered both the Authentik host and the Linkding host. Once those were aligned, OIDC worked flawlessly and has not broken since.

The Browser Extension

Linkding includes a browser extension (available for Chrome and Firefox) that adds a toolbar button for quick bookmarking. Click it on any page, and it pre-fills the URL, title, and description. You add tags, toggle "unread," and save. The bookmark is immediately available on all devices via the web UI.

The extension connects directly to the Linkding API via a personal token. This means it works even when I am on a different network. The request goes through Cloudflare Tunnel to the Linkding instance in the cluster.

Compared to Pocket's extension, it is slightly less polished (no "recommended tags" suggestions), but it does the essential job: one-click save with tagging.

Full-Text Search and Archiving

Linkding can archive the full HTML content of bookmarked pages. This means you can search not just titles and descriptions but the actual content of saved articles. If I remember reading something about "Cilium eBPF policy enforcement" but cannot remember which article it was in, full-text search finds it.

Archiving is also insurance against link rot. Web pages disappear. Blogs shut down. URLs change. The archived copy in Linkding survives independently of the original source. For technical articles that I reference months or years later, this is invaluable.

The tradeoff is storage. Archived pages with images can be several MB each. With a few hundred bookmarks, the database grows to 100-200 MB. On a Longhorn PVC, this is negligible.

Integration Between Miniflux and Linkding

Miniflux does not have a native Linkding integration, but the workflow connects them through two paths:

Manual (current): When I find an article in Miniflux worth saving, I open it in a new tab and use the Linkding browser extension. Two clicks: open, save. This is slightly more friction than Pocket's "save from Feedly" button, but it works reliably.

Automation (planned): Miniflux supports webhook notifications on specific events (star, save, share). A webhook that fires on starred articles, posting to Linkding's API, would automate the save step. Star in Miniflux, bookmark appears in Linkding. I have not built this yet because the manual workflow is fast enough.

Tags as a Shared Taxonomy

I use the same tag vocabulary across both tools:

  • kubernetes, security, networking, gitops: technical topics
  • career, leadership, writing: professional development
  • cooking, health, philosophy: personal interests
  • reference: articles I expect to re-read or cite
  • tool: software I want to evaluate or remember

Consistent tags across Miniflux feeds and Linkding bookmarks mean I can mentally filter my reading regardless of which tool I am in. "What security content have I consumed recently?" is answerable by checking either tool.

Why Not Just Use Pocket / Raindrop?

Pocket was acquired by Mozilla and has become increasingly ad-supported. "Sponsored stories" appear in the feed. The recommendation algorithm suggests content based on what is popular, not what is relevant to my interests. Also, Pocket's export is a static HTML file, not an API-queryable database.

Raindrop.io is a good product. The UI is polished, the browser extension is excellent, and it has full-featured tagging and collections. But it is a SaaS product with a $3/month Pro tier for features like full-text search and nested collections. Linkding provides the same features self-hosted for free.

The integration argument applies here too. Linkding's data is in a SQLite file on my Longhorn volume. I can query it directly, export it anytime, and potentially feed bookmark data into Life Hub for "what I found interesting" analytics. SaaS bookmark managers lock that data behind their API, on their terms.

Lessons

Separate discovery from storage. RSS readers are good at surfacing new content. Bookmark managers are good at organizing saved content. Using one tool for both (Feedly's "boards," Pocket's "feed") creates a mediocre experience for both activities.

Archive everything you save. The marginal storage cost of archiving full page content is negligible (a few hundred KB per page). The value when a page disappears six months later is enormous. Enable archiving by default.

Tags beat folders. An article about Kubernetes security monitoring belongs in three categories simultaneously. Tags handle this naturally. Folders force a single-hierarchy decision that loses information.

The browser extension is the UX. The quality of the save experience determines whether you actually use the tool. If saving a bookmark takes more than two clicks, you will fall back to browser tabs. Linkding's extension is minimal but sufficient.

The read-it-later stack is one of those setups where each tool does one thing well and the combination is greater than the sum. Miniflux discovers. Linkding saves. Life Hub tracks. All self-hosted, all under my control, all feeding into a system that helps me read more intentionally.