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:
- Chrome: Search “Karakeep” in the Chrome Web Store
- Firefox: Install from Firefox Add-ons
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:
- iOS: App Store
- Android: Google Play
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:
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.comto a “GitHub Repos” list - Auto-tag any bookmark containing “docker” with a
containerstag - 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)
- 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
| Feature | Karakeep | Linkwarden | Wallabag |
|---|---|---|---|
| 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 | ❌ |
| Database | SQLite | PostgreSQL | PostgreSQL/SQLite |
| Resource Usage | Medium | Medium | Low |
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.