🔍 Add powerful semantic/vector search to your Karakeep bookmarks
Karakeep is great for hoarding bookmarks, but its search is keyword-based. This sidecar service adds semantic search - find bookmarks by meaning, not just exact words.
- Semantic search: Find "that article about getting things done" even if it never mentions those exact words
- Vector embeddings: Converts your bookmark content into searchable vectors
- Auto-sync: Watches Karakeep for new bookmarks and indexes them automatically
- Simple API: Query via REST or integrate with tools like Clawdis
# Clone the repo
git clone https://github.com/jamesbrooksco/karakeep-semantic-search.git
cd karakeep-semantic-search
# Copy the example env file
cp .env.example .env
# Edit .env with your settings
nano .env
# Start everything
docker compose up -d| Variable | Required | Default | Description |
|---|---|---|---|
KARAKEEP_URL |
Yes | - | Your Karakeep instance URL (e.g., http://karakeep:3000) |
KARAKEEP_API_KEY |
Yes | - | API key from Karakeep settings |
OPENAI_API_KEY |
Yes* | - | OpenAI API key for embeddings |
OLLAMA_URL |
No | - | Ollama URL if using local embeddings instead |
EMBEDDING_MODEL |
No | text-embedding-3-small |
Model for generating embeddings |
SYNC_INTERVAL_MINUTES |
No | 5 |
How often to check for new bookmarks |
QDRANT_URL |
No | http://qdrant:6333 |
Qdrant vector DB URL |
*Either OPENAI_API_KEY or OLLAMA_URL is required.
GET /search?q=productivity+techniques&limit=10Response:
{
"results": [
{
"bookmarkId": "abc123",
"score": 0.89,
"title": "The GTD Method Explained",
"url": "https://example.com/gtd"
}
],
"query": "productivity techniques",
"took_ms": 45
}POST /syncGET /health┌─────────────┐ ┌─────────────────────┐ ┌─────────────┐
│ Karakeep │────▶│ Semantic Search │────▶│ Qdrant │
│ │ │ (this app) │ │ (vector DB) │
└─────────────┘ └─────────────────────┘ └─────────────┘
│
▼
┌─────────────────┐
│ OpenAI / Ollama │
│ (embeddings) │
└─────────────────┘
Single container - Qdrant is bundled inside, no separate database needed!
services:
karakeep-semantic:
image: ghcr.io/jamesbrooksco/karakeep-semantic-search:latest
environment:
- KARAKEEP_URL=http://your-karakeep-ip:3000
- KARAKEEP_API_KEY=your-api-key
- OPENAI_API_KEY=sk-your-key
ports:
- "3001:3000"
volumes:
- karakeep_semantic_data:/qdrant/storage
volumes:
karakeep_semantic_data:- Add container from Docker Hub / ghcr.io
- Repository:
ghcr.io/jamesbrooksco/karakeep-semantic-search:latest - Port: 3001 → 3000
- Path:
/qdrant/storage→/mnt/user/appdata/karakeep-semantic - Variables:
KARAKEEP_URL= your Karakeep URLKARAKEEP_API_KEY= from Karakeep settingsOPENAI_API_KEY= your OpenAI key
# Install dependencies
pnpm install
# Run in dev mode
pnpm dev
# Run tests
pnpm test
# Build
pnpm buildA ready-to-use skill is included in the skill/ folder. Copy skill/SKILL.md to your Clawdis skills directory and update the URL.
- Open your Karakeep instance
- Go to Settings → API Keys
- Create a new API key
- Copy it to your
KARAKEEP_API_KEYenvironment variable
- Basic semantic search
- Auto-sync from Karakeep
- Clawdis skill
- Webhook support for instant indexing
- Hybrid search (semantic + keyword)
- "Find similar" bookmarks
- Tag/date/domain filtering
MIT