Self-Hosting Karakeep (formerly Hoarder): AI-Powered Bookmark Manager

You find an interesting article on Hacker News. A useful GitHub repo on your phone. A recipe someone shared on Reddit. You tell yourself you’ll read it later — and then it vanishes into the void of browser tabs you’ll never reopen.

Karakeep (formerly known as Hoarder) solves this. It’s a self-hosted bookmark manager that saves links, notes, images, and PDFs, then uses AI to automatically tag and categorize everything. Think of it as Pocket meets Linkwarden, but with an AI brain that actually organizes your chaos.

Why Karakeep Over Other Bookmark Managers

The self-hosted bookmark space has solid options — Linkwarden, Shiori, Wallabag. Here’s what sets Karakeep apart:

  • AI-powered tagging — Save a bookmark and Karakeep automatically generates relevant tags using OpenAI or a local Ollama model. No manual sorting.
  • Full-text search — Powered by Meilisearch, you can search the actual content of every bookmarked page, not just titles and URLs.
  • Everything hoarding — Not just links. Save notes, images, PDFs, and even archive full pages against link rot using Monolith.
  • Video archiving — Automatically downloads and stores videos via yt-dlp.
  • Browser extensions and mobile apps — Chrome, Firefox, iOS, and Android apps for instant bookmarking from anywhere.
  • RSS feed ingestion — Automatically hoard content from your favorite RSS feeds.
  • OCR built in — Extracts text from images, making screenshots searchable.
  • Rule engine — Set up automated workflows: auto-tag, auto-archive, or auto-sort based on custom rules.

The trade-off: Karakeep requires Meilisearch and a headless Chrome instance alongside the main app, so it uses more resources than lightweight alternatives like Shiori. For most home servers, this is negligible — and the search and AI features are worth it.

Prerequisites

  • A Linux server with Docker and Docker Compose installed
  • At least 1 GB of free RAM (Meilisearch needs breathing room)
  • An OpenAI API key (optional, but recommended for AI tagging)
  • A domain name if you want external access with HTTPS

Step 1: Create the Project Directory

mkdir karakeep && cd karakeep

Step 2: Create the Docker Compose File

Create docker-compose.yml:

services:
  web:
    image: ghcr.io/karakeep-app/karakeep:${KARAKEEP_VERSION:-release}
    restart: unless-stopped
    volumes:
      - data:/data
    ports:
      - 3000:3000
    env_file:
      - .env
    environment:
      MEILI_ADDR: http://meilisearch:7700
      BROWSER_WEB_URL: http://chrome:9222
      DATA_DIR: /data

  chrome:
    image: gcr.io/zenika-hub/alpine-chrome:124
    restart: unless-stopped
    command:
      - --no-sandbox
      - --disable-gpu
      - --disable-dev-shm-usage
      - --remote-debugging-address=0.0.0.0
      - --remote-debugging-port=9222
      - --hide-scrollbars

  meilisearch:
    image: getmeili/meilisearch:v1.37.0
    restart: unless-stopped
    env_file:
      - .env
    environment:
      MEILI_NO_ANALYTICS: "true"
    volumes:
      - meilisearch:/meili_data

volumes:
  meilisearch:
  data:

Three containers work together: the main Karakeep web app, a headless Chrome instance for crawling bookmarked pages, and Meilisearch for full-text search indexing.

Step 3: Configure Environment Variables

Create a .env file with your configuration:

# App version - pin to a specific release for controlled upgrades
KARAKEEP_VERSION=release

# Authentication secrets - generate with: openssl rand -base64 36
NEXTAUTH_SECRET=your_random_secret_here
MEILI_MASTER_KEY=your_meili_key_here

# Server URL - change to your domain or server IP
NEXTAUTH_URL=http://localhost:3000

# Optional: OpenAI for AI tagging
# OPENAI_API_KEY=sk-your-key-here

# Optional: Use Ollama instead of OpenAI
# OLLAMA_BASE_URL=http://host.docker.internal:11434
# INFERENCE_TEXT_MODEL=ollama/llama3.2
# INFERENCE_IMAGE_MODEL=ollama/llava

# Performance: enable WAL mode for better SQLite performance
DB_WAL_MODE=true

Generate your secrets:

echo "NEXTAUTH_SECRET=$(openssl rand -base64 36)" >> .env
echo "MEILI_MASTER_KEY=$(openssl rand -base64 36 | tr -dc 'A-Za-z0-9')" >> .env

Step 4: Start the Stack

docker compose up -d

Wait about 30 seconds for all services to initialize, then visit http://your-server-ip:3000. You’ll see the sign-up page — the first account you create becomes the admin.

Step 5: Configure AI Tagging

Karakeep’s killer feature is AI-powered automatic tagging. You have two options:

Option A: OpenAI (Easiest)

Add your API key to .env:

OPENAI_API_KEY=sk-your-key-here

Cost is minimal — typically under $0.50/month for moderate bookmarking. Each bookmark uses a small GPT call for tag generation.

Option B: Ollama (Free, Local)

If you’re running Ollama on your server, point Karakeep at it:

OLLAMA_BASE_URL=http://host.docker.internal:11434
INFERENCE_TEXT_MODEL=ollama/llama3.2
INFERENCE_IMAGE_MODEL=ollama/llava

Local inference is free but slower. A model like Llama 3.2 works well for tagging. Add llava if you want AI descriptions of bookmarked images.

After changing .env, restart the stack:

docker compose up -d

Setting Up Browser Extensions

Install the official extensions for one-click bookmarking:

In the extension settings, enter your Karakeep server URL and an API key (generate one from Settings → API Keys in the web UI). Now you can save any page with a single click.

Mobile Apps

Karakeep has native apps for both platforms:

The mobile apps support the share sheet — share any link from your browser, Twitter, Reddit, or any app directly into Karakeep.

Reverse Proxy with Caddy

To access Karakeep over HTTPS with a custom domain, add this to your Caddyfile:

b}ookmraervkesr.syeo_uprrdooxmyailno.ccaolmho{st:3000

Update NEXTAUTH_URL in your .env to match:

NEXTAUTH_URL=https://bookmarks.yourdomain.com

Then restart:

docker compose up -d

Organizing Your Bookmarks

Lists

Create lists to group related bookmarks — “DevOps Tools”, “Recipes to Try”, “Research Papers”. You can share lists with other users on your instance for collaborative hoarding.

Smart Tagging with the Rule Engine

Karakeep includes a rule engine for automated organization. Examples:

  • Auto-add bookmarks from github.com to a “GitHub Repos” list
  • Auto-tag any bookmark containing “docker” with a containers tag
  • Auto-archive bookmarks older than 30 days

Configure rules from Settings → Rules in the web UI.

RSS Feed Hoarding

Automatically save articles from your favorite sources. Add RSS feeds from Settings → RSS Feeds. Karakeep will periodically fetch new items and save them as bookmarks, complete with AI tagging.

Full Page Archival

Karakeep can archive complete copies of bookmarked pages using Monolith, protecting against link rot. Enable it by adding to your .env:

CRAWLER_FULL_PAGE_ARCHIVE_ENABLED=true

This stores a self-contained HTML copy of every page you bookmark. The archived version is accessible even if the original site goes down.

Backup and Restore

Karakeep stores everything in Docker volumes. Back them up with:

#!/bin/bash
# backup-karakeep.sh
BACKUP_DIR="/backups/karakeep/$(date +%Y-%m-%d)"
mkdir -p "$BACKUP_DIR"

docker compose stop
docker run --rm \
  -v karakeep_data:/data \
  -v "$BACKUP_DIR":/backup \
  alpine tar czf /backup/karakeep-data.tar.gz -C /data .
docker run --rm \
  -v karakeep_meilisearch:/data \
  -v "$BACKUP_DIR":/backup \
  alpine tar czf /backup/meilisearch-data.tar.gz -C /data .
docker compose up -d

echo "Backup saved to $BACKUP_DIR"

Importing Existing Bookmarks

Migrating from another service? Karakeep supports imports from:

  • Chrome bookmarks (exported HTML)
  • Pocket
  • Linkwarden
  • Omnivore
  • Tab Session Manager

You can also sync with your browser bookmarks via Floccus for ongoing two-way sync.

Troubleshooting

Meilisearch won’t start: Check that MEILI_MASTER_KEY is set and doesn’t contain special characters. Generate a clean one: openssl rand -base64 36 | tr -dc 'A-Za-z0-9'.

AI tagging not working: Verify your OpenAI key or Ollama URL. Check logs with docker compose logs web and look for inference errors.

Chrome container crashing: The headless Chrome container needs adequate memory. If it’s OOM-killed, increase your server’s available RAM or add swap.

Bookmarks not being crawled: Ensure the Chrome container is running (docker compose ps). The BROWSER_WEB_URL must point to the correct internal address.

Search returns no results: Meilisearch needs time to index. After first setup, wait a few minutes. If search stays broken, check docker compose logs meilisearch for errors.

Karakeep vs Linkwarden vs Wallabag

FeatureKarakeepLinkwardenWallabag
AI Tagging✅ OpenAI + Ollama
Full-Text Search✅ Meilisearch✅ PostgreSQL✅ Built-in
Browser Extensions✅ Chrome + Firefox✅ Chrome + Firefox✅ Chrome + Firefox
Mobile Apps✅ iOS + Android❌ (PWA only)✅ iOS + Android
RSS Feeds
Video Archiving✅ yt-dlp
Full Page Archive✅ Monolith✅ Built-in✅ Built-in
OCR
Rule Engine✅ (Tagging rules)
Collaboration✅ Shared lists✅ Teams
DatabaseSQLitePostgreSQLPostgreSQL/SQLite
Resource UsageMediumMediumLow

Karakeep wins on AI features and media handling. Linkwarden has a cleaner UI and better team collaboration. Wallabag is the most mature for pure read-it-later use.

Conclusion

Karakeep turns digital hoarding from a guilty habit into an organized system. The AI tagging alone saves hours of manual categorization — you just save things and the AI figures out where they belong. Combined with full-text search, browser extensions, mobile apps, and RSS ingestion, it’s the most feature-complete self-hosted bookmark manager available.

Save a link from your phone at lunch. Search for it by content three months later. That’s the workflow Karakeep delivers — and it all runs on your own hardware.