You’ve been saving links for years. Your browser bookmarks are a graveyard. You’ve got 47 browser tabs open. Your Pocket queue is 6 months behind. Your Discord links channel is unsearchable. You know there’s a better way — you just need to pick the right tool.
Here’s the thing: there’s no one “best” self-hosted bookmark manager. There’s just three very different philosophies, and you need to figure out which one matches how you actually consume content.
Linkding: The Minimal Index Card
Linkding is what happens when you ask “what’s the absolute minimum a bookmark manager needs to do?”
The answer: save the URL and tag it. That’s it. No bloat. No AI. No content scraping. Just a SQLite database, a Django backend, and a snappy web UI that gets out of your way.
The philosophy: A bookmark manager shouldn’t own your content — the internet does. Linkding’s job is to help you find the link again when you need it. The URL is your source of truth.
What you get:
- Lightweight (runs on a potato)
- Instant tag search
- Browser extension that works
- Read-later markers
- URL title + description only
- Multi-user support
- Share bookmarks as public lists
- Dark mode (because it’s 2026)
What you don’t get:
- AI auto-tagging
- Full-text content search
- Article scraping/cleaning
- ePub export
- Mobile app (web-only)
- PDF download
Docker Compose Setup
version: '3.8'services: linkding: image: sissbruecker/linkding:latest container_name: linkding ports: - "9090:9090" environment: - LD_SUPERUSER_NAME=admin - LD_SUPERUSER_PASSWORD=changeme123 - LD_CSRF_TRUSTED_ORIGINS=https://bookmarks.example.com - LD_PUBLIC_REGISTRATION_ENABLED=false volumes: - linkding_data:/etc/linkding/data restart: unless-stopped
volumes: linkding_data:Spin it up, hit http://localhost:9090, log in, grab the browser extension. You’re done in 5 minutes.
Resource footprint: 80 MB RAM idle, <100 MB with 10k bookmarks. SQLite on disk. No background workers. This runs on your Raspberry Pi in the corner.
The Browser Extension
Drop the extension URL into your browser (http://localhost:9090/settings/integrations/ gives you the manifest URL), and you get a popup that captures the page title + current URL. You can add tags right there, or tag later. Search works instantly across all your bookmarks.
It’s the same extension story for all three tools — so this becomes a non-differentiator.
Hoarder (Rebranded Karakeep): The AI Content Vault
Hoarder is what you want if you’re a “save everything” person with a home lab that can run LLMs.
Built on TypeScript (Node + React), Hoarder isn’t content-agnostic — it wants your content. It scrapes the full HTML, extracts readable text via Readability, generates summaries, detects bookmarks inside URLs, OCRs images, and runs them past an LLM for auto-tagging.
The philosophy: Bookmarks aren’t about the link — they’re about the knowledge you captured. Let’s build a searchable knowledge vault.
What you get:
- Full-text HTML content scrape (with fallback to Readability)
- AI auto-tagging (via Ollama, OpenAI, or local models)
- Text extraction + OCR on images
- Bookmark detection inside pages
- iOS + Android apps (native Kotlin/Swift, not web-only)
- Search across saved content
- Workspace organization
- Mobile quick-capture
- Link preview generation
What you don’t get:
- ePub/PDF export (no read-later export story)
- As lightweight as Linkding (needs compute for LLM)
- Distraction-free reading UX (it’s a vault, not a reader)
Docker Compose Setup
version: '3.8'services: hoarder: image: ghcr.io/hoarder-app/hoarder:latest container_name: hoarder ports: - "3000:3000" environment: - NEXTAUTH_SECRET=generate-a-random-secret-here - NEXTAUTH_URL=https://hoarder.example.com - DATA_DIR=/data - MEILI_URL=http://meilisearch:7700 - OLLAMA_BASE_URL=http://ollama:11434 # optional volumes: - hoarder_data:/data depends_on: - meilisearch restart: unless-stopped
meilisearch: image: getmeili/meilisearch:latest container_name: hoarder_search environment: - MEILI_NO_ANALYTICS=true volumes: - meilisearch_data:/meili_data restart: unless-stopped
ollama: image: ollama/ollama:latest container_name: hoarder_ollama # Optional: for local LLM tagging # Pull a model: ollama pull mistral volumes: - ollama_data:/root/.ollama restart: unless-stopped
volumes: hoarder_data: meilisearch_data: ollama_data:The Meilisearch dependency is required — that’s what powers the full-text search. If you want AI auto-tagging, point it at a local Ollama instance or your OpenAI API key.
Resource footprint: 250+ MB RAM (Node + Meilisearch + optional Ollama). Disk usage grows per captured content (full HTML + extracted text). Not a potato box — you need modern enough hardware.
AI Auto-Tagging in Action
Set up an Ollama connection, and Hoarder can auto-tag incoming bookmarks using a lightweight model (Mistral 7B runs fine). Prompt Hoarder to suggest tags like #productivity, #devops, #gaming based on the content you just saved.
You still manually confirm them, but it saves the “what category does this belong to?” tax. Over time, it learns your tagging patterns.
Mobile is Legit
Unlike Linkding, Hoarder has native iOS and Android apps — full capture, search, and reading right on your phone. This is a big advantage if you’re out and want to save something quickly.
Wallabag: The Read-It-Later Reader
Wallabag is Pocket, but self-hosted. Born as a Symfony/PHP app, it’s built around the idea that bookmarks are articles you haven’t read yet.
The philosophy: Reading matters. Distraction-free reading matters. Let’s clean up the article, handle ePub/PDF export, and let you actually get through your reading queue without advertisements and cookie banners.
What you get:
- Full-text article extraction (via Mercury Parser)
- Distraction-free reading UI
- ePub + PDF export
- Full-text search
- Read/unread status
- Archiving (soft delete)
- Highlight + annotation support
- Browser extension
- Mobile apps (iOS, Android, KDE)
- Multi-user + sharing
- Email-to-Wallabag forwarding (great for newsletters)
- Filter + mass operations
What you don’t get:
- AI auto-tagging
- OCR
- Image processing
- The lightweight footprint of Linkding
Docker Compose Setup
version: '3.8'services: wallabag: image: wallabag/wallabag:latest container_name: wallabag ports: - "8080:80" environment: - SYMFONY_ENV=prod - DOMAIN_NAME=https://wallabag.example.com - POSTGRES_DB=wallabag - POSTGRES_USER=wallabag - POSTGRES_PASSWORD=changeme123 - MYSQL_ROOT_PASSWORD=changeme123 volumes: - wallabag_data:/var/www/wallabag/data - wallabag_images:/var/www/wallabag/web/assets/images depends_on: - postgres restart: unless-stopped
postgres: image: postgres:15-alpine container_name: wallabag_db environment: - POSTGRES_DB=wallabag - POSTGRES_USER=wallabag - POSTGRES_PASSWORD=changeme123 volumes: - postgres_data:/var/lib/postgresql/data restart: unless-stopped
volumes: wallabag_data: wallabag_images: postgres_data:Resource footprint: 150–200 MB RAM. Postgres on the backend. Disk usage scales with article count (but Wallabag doesn’t store the full HTML by default — just extracted text + metadata). Lighter than Hoarder, heavier than Linkding.
The Killer Feature: ePub Export
Wallabag lets you batch-export your read list as ePub. Throw it on your e-reader, read offline. This is genuinely useful if you’re the kind of person who accumulates reading lists and actually wants to get through them.
The Comparison Matrix
| Feature | Linkding | Hoarder/Karakeep | Wallabag |
|---|---|---|---|
| Core purpose | Tag index | Content vault | Read-it-later |
| Storage model | URL + tags only | Full HTML + text | Article text + metadata |
| Search scope | Tags only | Full-text content | Full-text content + tags |
| AI tagging | No | Yes (Ollama/OpenAI) | No |
| ePub/PDF export | No | No | Yes |
| Mobile apps | No (web only) | iOS + Android native | iOS + Android + KDE |
| Reading UI | N/A | N/A | Distraction-free |
| Distraction-free view | No | No | Yes |
| OCR + image processing | No | Yes | No |
| Multi-user | Yes | Yes | Yes |
| Resource footprint | 80 MB | 250+ MB | 150 MB |
| Database | SQLite | Postgres + Meilisearch | Postgres |
| Complexity | Minimal | Medium | Medium |
Which One is Right for You?
Pick Linkding if:
- You save links compulsively and never look at them again (you know who you are)
- You tag ruthlessly and search by tag
- You want the simplest possible setup
- Your home lab can’t spare the RAM
- You like “just the URL” philosophy
Linkding is the index card system. Your bookmarks are tags, your tags are your memory. It’s fast, it’s reliable, it won’t surprise you.
Pick Hoarder/Karakeep if:
- You want to “save and forget,” trusting the system to organize it
- You have Ollama or OpenAI integration available
- You use mobile heavily and want native apps
- You want AI to auto-tag everything
- You’re OK spending the RAM/compute budget
Hoarder is the knowledge vault. Throw everything at it, and it will make it searchable. Great for research spirals and “I read this somewhere” hunts.
Pick Wallabag if:
- You actually want to read your bookmarks (novel concept, I know)
- You need ePub export for your e-reader
- You accumulate reading lists and want distraction-free reading
- You forward newsletters to your bookmark manager
- You want the “Pocket replacement” experience without the cloud
Wallabag is the reading list. You’re not drowning in 10k links — you’re curating a queue of articles worth your time.
The Real Talk
Here’s the honest take: most people would benefit from two tools.
Linkding for quick “save this technical doc” captures (tags: #docker, #security, #2am-fix). Then Wallabag for “articles worth reading” — actual long-form pieces, essays, tutorials you plan to sit down with.
But if you’re running a tight ship and can only fit one, pick based on your actual behavior: Are you a tagger or a reader? Do you capture or consume? Do you trust systems or humans?
That’s your answer right there.
Full examples: Working Docker Compose files for all three, plus extension setup guides, are at github.com/KingPin/sumguy-examples/productivity/linkding-vs-hoarder-vs-wallabag/